From ce60f87a9bdbf475eccfd94f947b3da7afe0f478 Mon Sep 17 00:00:00 2001 From: violet Date: Mon, 31 Aug 2026 13:25:07 -0400 Subject: [PATCH 01/16] Upgrade functions and toolchain to node 22 nodejs20 is decommissioned 2026-10-30; past that date firebase-tools hard-fails every `deploy --only functions` regardless of what changed. This is #2224 (reverted in #2229) plus the piece it was missing. "Node 22" in this repo is four things that must move together: 1. Toolchain: engines ^22, .nvmrc, setup-repo default. 2. Dev images: infra/Dockerfile.node, infra/Dockerfile.firebase. 3. Runtime declaration: firebase.json AND infra/firebase.compose.json (mounted as /app/firebase.json by the dev stack; bumping one without the other is how these drift). 4. Deploy builder: w9jds/firebase-action v13.18.0 -> v15.28.1 in both deploy workflows. This is what #2224 missed: v13.x is a node:20-buster container, so predeploy `yarn build:functions` ran node 20 against an engines-strict ^22 repo and the deploy went red. v15.x is timbru31/java-node:21-jdk-jod (Node 22 LTS). The pin moves for the container's node, not CLI runtime support (13.18.0 already lists nodejs22). Also bumps the stale nodejs18 key in functions/.runtimeconfig.json as pointing at a decommissioned runtime). Deliberately excluded, unlike #2224: @types/node stays ^20 (dev-only types, green on node 22, keeps yarn.lock out of the diff - follow-up hygiene), and mcp-server/Dockerfile (separate Cloud Run service with its own deploy; bumping it here widens the blast radius of this PR's one deploy test). v14/v15 firebase-tools breaking changes checked against this repo: strict timeout validation is safe (max timeoutSeconds in functions/src is 540, the v1 ceiling), .bolt is unused, the emulator's Java 21 floor is deploy-irrelevant. Root and functions firebase-tools stay ^13.18.0 - they drive emulators, not the deploy. Verified with firebase-tools@15 against this config: "Using node@22 from host", all 59 functions initialized. Co-Authored-By: Claude Fable 5 --- .github/actions/setup-repo/action.yml | 2 +- .github/workflows/deploy-backend-dev.yml | 2 +- .github/workflows/deploy-prod.yml | 2 +- .nvmrc | 2 +- firebase.json | 2 +- functions/.runtimeconfig.json | 2 +- infra/Dockerfile.firebase | 2 +- infra/Dockerfile.node | 2 +- infra/firebase.compose.json | 2 +- package.json | 2 +- 10 files changed, 10 insertions(+), 10 deletions(-) diff --git a/.github/actions/setup-repo/action.yml b/.github/actions/setup-repo/action.yml index 869ec4af0..860fb9872 100644 --- a/.github/actions/setup-repo/action.yml +++ b/.github/actions/setup-repo/action.yml @@ -4,7 +4,7 @@ inputs: node-version: description: "Version used by actions/setup-node" required: true - default: "20" + default: "22" yarn-version: description: "Version of Yarn used to install dependencies" required: true diff --git a/.github/workflows/deploy-backend-dev.yml b/.github/workflows/deploy-backend-dev.yml index 1131c1f63..8b22c4592 100644 --- a/.github/workflows/deploy-backend-dev.yml +++ b/.github/workflows/deploy-backend-dev.yml @@ -22,7 +22,7 @@ jobs: - name: Setup Build Environment uses: ./.github/actions/setup-repo - name: Build and Deploy to Firebase - uses: w9jds/firebase-action@v13.18.0 + uses: w9jds/firebase-action@v15.28.1 with: args: deploy --force --only firestore,functions:maple,storage env: diff --git a/.github/workflows/deploy-prod.yml b/.github/workflows/deploy-prod.yml index a4a79defd..36018cf4d 100644 --- a/.github/workflows/deploy-prod.yml +++ b/.github/workflows/deploy-prod.yml @@ -16,7 +16,7 @@ jobs: - name: Setup Build Environment uses: ./.github/actions/setup-repo - name: Build and Deploy to Firebase - uses: w9jds/firebase-action@v13.18.0 + uses: w9jds/firebase-action@v15.28.1 with: args: deploy --force --only firestore,functions:maple,storage env: diff --git a/.nvmrc b/.nvmrc index 209e3ef4b..2bd5a0a98 100644 --- a/.nvmrc +++ b/.nvmrc @@ -1 +1 @@ -20 +22 diff --git a/firebase.json b/firebase.json index b2ddccc3a..7f8927b97 100644 --- a/firebase.json +++ b/firebase.json @@ -9,7 +9,7 @@ "predeploy": ["yarn build:functions"], "source": "functions", "codebase": "maple", - "runtime": "nodejs20", + "runtime": "nodejs22", "runtimeConfig": ".runtimeconfig.json" }, { diff --git a/functions/.runtimeconfig.json b/functions/.runtimeconfig.json index e51e1e869..55b436d3e 100644 --- a/functions/.runtimeconfig.json +++ b/functions/.runtimeconfig.json @@ -1,6 +1,6 @@ { "runtime": { - "nodejs18": { + "nodejs22": { "apt": { "packages": ["ffmpeg"] } diff --git a/infra/Dockerfile.firebase b/infra/Dockerfile.firebase index bc17a8e08..fdc5f0c1b 100644 --- a/infra/Dockerfile.firebase +++ b/infra/Dockerfile.firebase @@ -1,4 +1,4 @@ -FROM andreysenov/firebase-tools:latest-node-20 +FROM andreysenov/firebase-tools:latest-node-22 USER root RUN apt update && apt install -y curl python3 python3-pip python3-venv ffmpeg diff --git a/infra/Dockerfile.node b/infra/Dockerfile.node index 6acce9d1a..e5d1e5ea7 100644 --- a/infra/Dockerfile.node +++ b/infra/Dockerfile.node @@ -1,4 +1,4 @@ -FROM node:20-alpine +FROM node:22-alpine USER root RUN apk update && apk add curl diff --git a/infra/firebase.compose.json b/infra/firebase.compose.json index d7be73a19..385236ec8 100644 --- a/infra/firebase.compose.json +++ b/infra/firebase.compose.json @@ -9,7 +9,7 @@ "predeploy": ["yarn build:functions"], "source": "functions", "codebase": "maple", - "runtime": "nodejs20" + "runtime": "nodejs22" }, { "predeploy": [ diff --git a/package.json b/package.json index 6d2d70fd3..5ef1ce0a4 100644 --- a/package.json +++ b/package.json @@ -48,7 +48,7 @@ "setRole": "ts-node -P tsconfig.script.json scripts/firebase-admin/setRole.ts" }, "engines": { - "node": "^20", + "node": "^22", "yarn": "^1.22.19" }, "browserslist": { From 352ca5bfa6926399c3d24e2ba86d5427542fe033 Mon Sep 17 00:00:00 2001 From: violet Date: Mon, 31 Aug 2026 15:09:47 -0400 Subject: [PATCH 02/16] searchHealthCheck: 256MB, the nodejs22 bundle no longer loads in 128MB The node-22 deploy (#2231 rerun, attempt 2) landed 58/59 functions on nodejs22; the one failure was searchHealthCheck with "function load attempt timed out". It is the only function in the repo pinned to 128MB (everything else is 256MB+ or the 256MB gen1 default). Every gen1 function loads the whole functions bundle at startup - index.ts re-exports all codebases - and node 22's larger baseline footprint pushes that load past what a 128MB instance can do before the load timeout. Identical code loaded fine in the other 58 functions at 256MB. The old nodejs20 version of searchHealthCheck is still serving in dev (failed updates keep the previous version), so the health check itself never stopped; this just lets the nodejs22 version actually come up. Cost delta is noise: a 30s-timeout function running every 30 minutes. Co-Authored-By: Claude Fable 5 --- functions/src/search/searchHealthCheck.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/functions/src/search/searchHealthCheck.ts b/functions/src/search/searchHealthCheck.ts index 6990aaaa5..5db36f4e6 100644 --- a/functions/src/search/searchHealthCheck.ts +++ b/functions/src/search/searchHealthCheck.ts @@ -10,7 +10,7 @@ const connectionTimeoutSeconds = 5, export const searchHealthCheck = runWith({ secrets: ["TYPESENSE_API_KEY"], timeoutSeconds: functionTimeoutSeconds, - memory: "128MB" + memory: "256MB" }) .pubsub.schedule("every 30 minutes") .retryConfig({ From 4e4cf432ab9971434de1a51927a478547afb7488 Mon Sep 17 00:00:00 2001 From: violet Date: Wed, 26 Aug 2026 15:20:43 -0400 Subject: [PATCH 03/16] search-eval: relevance harness and golden query set for bills (#79) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - scripts/search-eval: seed/run/label/compare CLI scoring recall@10, MRR, nDCG@10 per category against the app's exact bill-search params - Corpus: 7337 real bills extracted from tests/integration/exportedTestData via the production search converter (regenerate: yarn search-eval:corpus; hash-pinned in committed meta.json, JSONL itself gitignored) - Golden set: 70 queries (exact-bill-id, topic, synonym, misspelling, member-committee) with rot-proof predicate labels + provisional graded ids - Baseline scorecard recorded vs Typesense 0.24.0 (pre-upgrade defaults) - searchTop10 spreads the shared billsSearchParams (minus exclude_fields, which conflicts with the eval's pinned include_fields), so ranking params added to the shared module reach Typesense in the eval; rule-based label resolution stays unweighted — it resolves ground truth, not the ranking under test - useBillSort wired to the shared billsRelevanceSort constant Co-Authored-By: Claude Fable 5 --- .gitignore | 3 + components/search/bills/BillSearch.tsx | 6 +- components/search/bills/useBillSort.tsx | 3 +- components/search/searchParams.ts | 14 + package.json | 2 + scripts/firebase-admin/exportSearchCorpus.ts | 85 + scripts/search-eval/corpus.ts | 105 ++ scripts/search-eval/goldens.ts | 169 ++ scripts/search-eval/index.ts | 298 ++++ scripts/search-eval/metrics.ts | 69 + scripts/search-eval/report.ts | 141 ++ scripts/typesense-admin.ts | 48 +- scripts/typesense-env.ts | 50 + .../baselines/main-typesense-0.24.json | 1516 +++++++++++++++++ tests/search-eval/corpus/meta.json | 10 + tests/search-eval/corpus/schema.json | 91 + tests/search-eval/goldens/bills.json | 725 ++++++++ 17 files changed, 3289 insertions(+), 46 deletions(-) create mode 100644 components/search/searchParams.ts create mode 100644 scripts/firebase-admin/exportSearchCorpus.ts create mode 100644 scripts/search-eval/corpus.ts create mode 100644 scripts/search-eval/goldens.ts create mode 100644 scripts/search-eval/index.ts create mode 100644 scripts/search-eval/metrics.ts create mode 100644 scripts/search-eval/report.ts create mode 100644 scripts/typesense-env.ts create mode 100644 tests/search-eval/baselines/main-typesense-0.24.json create mode 100644 tests/search-eval/corpus/meta.json create mode 100644 tests/search-eval/corpus/schema.json create mode 100644 tests/search-eval/goldens/bills.json diff --git a/.gitignore b/.gitignore index f2e2b9fb1..f3834a250 100644 --- a/.gitignore +++ b/.gitignore @@ -102,3 +102,6 @@ CLAUDE.md #gcloud .gcloudignore +# search-eval: regenerate with `yarn search-eval:corpus`; labeling sheet is authoring scratch +tests/search-eval/corpus/bills.jsonl.gz +tests/search-eval/labeling-sheet.md diff --git a/components/search/bills/BillSearch.tsx b/components/search/bills/BillSearch.tsx index 748907f25..6ee7bdfb8 100644 --- a/components/search/bills/BillSearch.tsx +++ b/components/search/bills/BillSearch.tsx @@ -23,16 +23,14 @@ import { BillHit } from "./BillHit" import { useBillRefinements } from "./useBillRefinements" import { SortBy, SortByWithConfigurationItem } from "../SortBy" import { getServerConfig, VirtualFilters } from "../common" +import { billsSearchParams } from "../searchParams" import { useBillSort } from "./useBillSort" import { FC, useState } from "react" import { pathToSearchState, searchStateToUrl } from "../routingHelpers" const searchClient = new TypesenseInstantSearchAdapter({ server: getServerConfig(), - additionalSearchParameters: { - query_by: "number,title,body", - exclude_fields: "body" - } + additionalSearchParameters: billsSearchParams }).searchClient const extractLastSegmentOfRefinements = (items: any[]) => { diff --git a/components/search/bills/useBillSort.tsx b/components/search/bills/useBillSort.tsx index ca73c151e..1cd5d219a 100644 --- a/components/search/bills/useBillSort.tsx +++ b/components/search/bills/useBillSort.tsx @@ -1,6 +1,7 @@ import { useMemo, useRef } from "react" import { SortByWithConfigurationItem } from "../SortBy" import { useTranslation } from "next-i18next" +import { billsRelevanceSort } from "../searchParams" export const useBillSort = () => { const now = useRef(new Date().getTime()) @@ -16,7 +17,7 @@ export const useBillSort = () => { }, { label: t("sort_by.relevance"), - value: "bills/sort/_text_match:desc,testimonyCount:desc" + value: `bills/sort/${billsRelevanceSort}` }, { label: t("sort_by.testimony_count"), diff --git a/components/search/searchParams.ts b/components/search/searchParams.ts new file mode 100644 index 000000000..80a65a46f --- /dev/null +++ b/components/search/searchParams.ts @@ -0,0 +1,14 @@ +/** Ranking-relevant Typesense search parameters shared between the app's + * search pages and the relevance eval harness (scripts/search-eval). Keep this + * module free of React/Next imports so it can be loaded from ts-node scripts. + */ +export const billsSearchParams = { + query_by: "number,title,body", + exclude_fields: "body" +} + +/** The app's "Relevance" sort option (see useBillSort.tsx). The eval harness + * must use this sort; the UI's default latestTestimonyAt:desc sort does not + * measure text relevance. + */ +export const billsRelevanceSort = "_text_match:desc,testimonyCount:desc" diff --git a/package.json b/package.json index 5ef1ce0a4..6d93381f8 100644 --- a/package.json +++ b/package.json @@ -21,6 +21,8 @@ "dev:backfill": "sh ./scripts/backfill-dev.sh", "emulators:start": "firebase --project demo-dtp emulators:start --only auth,functions,pubsub,firestore,storage --import tests/integration/exportedTestData", "typesense-admin": "ts-node --swc -P tsconfig.script.json scripts/typesense-admin.ts", + "search-eval": "ts-node --swc -P tsconfig.script.json scripts/search-eval", + "search-eval:corpus": "firebase --project demo-dtp emulators:exec --only firestore --import tests/integration/exportedTestData \"yarn firebase-admin run-script exportSearchCorpus --env local\"", "firebase-admin": "ts-node --swc -P tsconfig.script.json scripts/firebase-admin", "generate-stories": "ts-node -P tsconfig.script.json scripts/generate-stories", "compose": "docker compose -f infra/docker-compose.yml", diff --git a/scripts/firebase-admin/exportSearchCorpus.ts b/scripts/firebase-admin/exportSearchCorpus.ts new file mode 100644 index 000000000..829bb9e95 --- /dev/null +++ b/scripts/firebase-admin/exportSearchCorpus.ts @@ -0,0 +1,85 @@ +import { createHash } from "crypto" +import { mkdirSync, writeFileSync } from "fs" +import { last } from "lodash" +import { join } from "path" +import { gzipSync } from "zlib" +import "../../functions/src/bills/search" +import { getRegisteredConfigs } from "../../functions/src/search/config" +import { Script } from "./types" + +const outDir = join(__dirname, "../../tests/search-eval/corpus") +const batchSize = 500 + +/** Extracts the bills search corpus from Firestore (run under + * `firebase emulators:exec --import tests/integration/exportedTestData` via + * `yarn search-eval:corpus`) using the production search converter, so the + * eval harness indexes exactly what the app's search pipeline would. + */ +export const script: Script = async () => { + const config = getRegisteredConfigs().find(c => c.alias === "bills") + if (!config) throw Error("bills search config not registered") + + const docs: { id: string; court: number }[] = [] + const lines = new Map() + let failures = 0 + + let token: string | undefined = "" + while (token !== undefined) { + const batch = await config.sourceCollection + .orderBy(config.idField) + .startAfter(token) + .limit(batchSize) + .get() + const batchDocs = batch.docs.filter(d => d.exists) + token = last(batchDocs)?.id + for (const d of batchDocs) { + try { + const data = d.data() + if (config.filter && !config.filter(data)) continue + const doc = config.convert(data) as { id: string; court: number } + docs.push(doc) + lines.set(doc.id, JSON.stringify(doc)) + } catch (error: any) { + failures++ + console.error(`Failed to convert ${d.ref.path}: ${error.message}`) + } + } + } + + const jsonl = + Array.from(lines.keys()) + .sort() + .map(id => lines.get(id)) + .join("\n") + "\n" + + const courts: Record = {} + for (const doc of docs) { + const court = String(doc.court) + courts[court] = (courts[court] ?? 0) + 1 + } + + mkdirSync(outDir, { recursive: true }) + writeFileSync(join(outDir, "bills.jsonl.gz"), gzipSync(jsonl)) + writeFileSync( + join(outDir, "schema.json"), + JSON.stringify(config.schema, null, 2) + "\n" + ) + writeFileSync( + join(outDir, "meta.json"), + JSON.stringify( + { + collection: "bills", + source: "tests/integration/exportedTestData", + count: lines.size, + courts, + jsonlMd5: createHash("md5").update(jsonl).digest("hex") + }, + null, + 2 + ) + "\n" + ) + + console.log( + `Wrote ${lines.size} docs to ${outDir} (${failures} conversion failures)` + ) +} diff --git a/scripts/search-eval/corpus.ts b/scripts/search-eval/corpus.ts new file mode 100644 index 000000000..6e3a03ad8 --- /dev/null +++ b/scripts/search-eval/corpus.ts @@ -0,0 +1,105 @@ +import { createHash } from "crypto" +import { existsSync, readFileSync } from "fs" +import { join } from "path" +import { gunzipSync } from "zlib" +import { createClient } from "../../functions/src/search/client" + +export const corpusDir = join(__dirname, "../../tests/search-eval/corpus") + +export type CorpusDoc = { + id: string + court: number + number: string + title: string + body?: string + primarySponsor?: string + cosponsors: string[] + currentCommittee?: string +} + +export type CorpusMeta = { + collection: string + source: string + count: number + courts: Record + jsonlMd5: string +} + +export function readMeta(): CorpusMeta { + return JSON.parse(readFileSync(join(corpusDir, "meta.json"), "utf8")) +} + +/** The court the eval filters on, mirroring the app's court refinement: + * the court with the most bills in the corpus. + */ +export function majorityCourt(meta: CorpusMeta): number { + const courts = Object.entries(meta.courts).sort((a, b) => b[1] - a[1]) + if (!courts.length) throw Error("corpus meta lists no courts") + return Number(courts[0][0]) +} + +export function readCorpus(): { docs: CorpusDoc[]; jsonl: string } { + const path = join(corpusDir, "bills.jsonl.gz") + if (!existsSync(path)) { + throw Error( + `${path} not found. Generate it with: yarn search-eval:corpus (requires the firebase CLI; takes a minute or two)` + ) + } + const jsonl = gunzipSync(readFileSync(path)).toString("utf8") + + const meta = readMeta() + const md5 = createHash("md5").update(jsonl).digest("hex") + if (md5 !== meta.jsonlMd5) { + throw Error( + `Corpus hash mismatch: bills.jsonl.gz has md5 ${md5} but meta.json expects ${meta.jsonlMd5}. Regenerate with: yarn search-eval:corpus` + ) + } + + const docs = jsonl + .split("\n") + .filter(Boolean) + .map(line => JSON.parse(line) as CorpusDoc) + if (docs.length !== meta.count) + throw Error( + `Corpus has ${docs.length} docs, meta.json expects ${meta.count}` + ) + return { docs, jsonl } +} + +/** Drops and recreates `collection` from the committed schema, then imports + * the corpus. Uses a dedicated collection (default bills_eval) so the + * dev-workflow "bills" alias is never touched. + */ +export async function seedCollection( + client: ReturnType, + collection: string +): Promise { + const { docs, jsonl } = readCorpus() + const schema = JSON.parse( + readFileSync(join(corpusDir, "schema.json"), "utf8") + ) + + const existing = await client.collections().retrieve() + if (existing.some((c: { name: string }) => c.name === collection)) { + await client.collections(collection).delete() + } + await client.collections().create({ name: collection, ...schema }) + + const lines = jsonl.split("\n").filter(Boolean) + const chunkSize = 1000 + for (let i = 0; i < lines.length; i += chunkSize) { + // Raw JSONL string form works identically on typesense client 1.x and 3.x + await client + .collections(collection) + .documents() + .import(lines.slice(i, i + chunkSize).join("\n"), { action: "create" }) + } + + const created = await client.collections(collection).retrieve() + if (created.num_documents !== docs.length) { + throw Error( + `Seeded ${created.num_documents} documents, expected ${docs.length}` + ) + } + console.log(`Seeded ${created.num_documents} docs into "${collection}"`) +} diff --git a/scripts/search-eval/goldens.ts b/scripts/search-eval/goldens.ts new file mode 100644 index 000000000..7370f6e45 --- /dev/null +++ b/scripts/search-eval/goldens.ts @@ -0,0 +1,169 @@ +import { readFileSync } from "fs" +import { join } from "path" +import { + Array as A, + Boolean as B, + Literal as L, + Number as N, + Optional, + Record as R, + Static, + String as S, + Union +} from "runtypes" +import { CorpusDoc } from "./corpus" +import { Judgments } from "./metrics" + +export const goldensPath = join( + __dirname, + "../../tests/search-eval/goldens/bills.json" +) + +const Rule = R({ + field: Optional(S), + anyField: Optional(A(S)), + equals: Optional(S), + contains: Optional(S) +}) + +const RelevantEntry = R({ + docId: Optional(S), + rule: Optional(Rule), + grade: N +}) + +export const Category = Union( + L("exact-bill-id"), + L("topic"), + L("synonym"), + L("misspelling"), + L("member-committee") +) + +const GoldenQuery = R({ + id: S, + category: Category, + query: S, + relevant: Optional(A(RelevantEntry)), + sameAs: Optional(S), + courtFilter: Optional(B) +}) + +const GoldenSet = R({ + collection: S, + defaults: R({ sort_by: S, courtFilter: B }), + queries: A(GoldenQuery) +}) + +export type GoldenQuery = Static +export type GoldenSet = Static +export type Rule = Static + +export function loadGoldens(): GoldenSet { + const goldens = GoldenSet.check(JSON.parse(readFileSync(goldensPath, "utf8"))) + const ids = new Set(goldens.queries.map(q => q.id)) + if (ids.size !== goldens.queries.length) + throw Error("Duplicate query ids in golden set") + for (const q of goldens.queries) { + if (!q.relevant && !q.sameAs) + throw Error(`Query ${q.id} has neither relevant labels nor sameAs`) + if (q.sameAs && !ids.has(q.sameAs)) + throw Error(`Query ${q.id} sameAs references unknown id ${q.sameAs}`) + } + return goldens +} + +/** Normalization applied to rule values and doc fields (NOT to the query text + * sent to Typesense — tokenizer behavior on raw input is part of what's + * measured): uppercase, drop everything but letters and digits. + */ +export const normalize = (value: string) => + value.toUpperCase().replace(/[^A-Z0-9]/g, "") + +function ruleFields(rule: Rule): string[] { + const fields = rule.anyField ?? (rule.field ? [rule.field] : []) + if (!fields.length) throw Error("Rule specifies no field") + return fields +} + +function ruleMatches(rule: Rule, doc: CorpusDoc): boolean { + const values = ruleFields(rule) + .flatMap(field => { + const value = (doc as Record)[field] + return Array.isArray(value) ? value : [value] + }) + .filter((v): v is string => typeof v === "string") + .map(normalize) + + if (rule.equals !== undefined) { + const expected = normalize(rule.equals) + return values.some(v => v === expected) + } + if (rule.contains !== undefined) { + const expected = normalize(rule.contains) + return values.some(v => v.includes(expected)) + } + throw Error("Rule specifies neither equals nor contains") +} + +export const labels = (query: GoldenQuery, goldens: GoldenSet) => { + const source = query.sameAs + ? goldens.queries.find(q => q.id === query.sameAs)! + : query + if (!source.relevant) throw Error(`Query ${source.id} has no relevant labels`) + return source.relevant +} + +/** Resolves a query's judgments against the corpus. Docs outside `court` are + * excluded when the query uses the court filter, matching what the search + * itself can return. + */ +export function resolveJudgments( + query: GoldenQuery, + goldens: GoldenSet, + docs: CorpusDoc[], + court: number | undefined +): Judgments { + const judgments: Judgments = new Map() + const inScope = + court === undefined ? docs : docs.filter(d => d.court === court) + + for (const entry of labels(query, goldens)) { + if (entry.docId) { + judgments.set(entry.docId, entry.grade) + } else if (entry.rule) { + for (const doc of inScope.filter(d => ruleMatches(entry.rule!, d))) { + judgments.set(doc.id, Math.max(judgments.get(doc.id) ?? 0, entry.grade)) + } + } else { + throw Error(`Query ${query.id} has a label with neither docId nor rule`) + } + } + return judgments +} + +/** Rule resolution for live (dev/prod) targets where the local corpus is not + * authoritative: search the rule's fields for the rule value and keep the + * results the rule actually matches. + */ +export async function resolveRuleViaSearch( + rule: Rule, + grade: number, + search: (params: { + q: string + query_by: string + per_page: number + }) => Promise +): Promise { + const value = rule.equals ?? rule.contains + if (value === undefined) + throw Error("Rule specifies neither equals nor contains") + const found = await search({ + q: value, + query_by: ruleFields(rule).join(","), + per_page: 250 + }) + return new Map( + found.filter(doc => ruleMatches(rule, doc)).map(doc => [doc.id, grade]) + ) +} diff --git a/scripts/search-eval/index.ts b/scripts/search-eval/index.ts new file mode 100644 index 000000000..f852224e3 --- /dev/null +++ b/scripts/search-eval/index.ts @@ -0,0 +1,298 @@ +import { execSync } from "child_process" +import { writeFileSync } from "fs" +import { join } from "path" +import yargs, { Arguments } from "yargs" +import { hideBin } from "yargs/helpers" +import { billsSearchParams } from "../../components/search/searchParams" +import { TypesenseConnectionArgs, resolveClient } from "../typesense-env" +import { + CorpusDoc, + majorityCourt, + readCorpus, + readMeta, + seedCollection +} from "./corpus" +import { + GoldenQuery, + GoldenSet, + labels, + loadGoldens, + resolveJudgments, + resolveRuleViaSearch +} from "./goldens" +import { Judgments, computeMetrics } from "./metrics" +import { + QueryResult, + buildResults, + compare, + printScorecard, + writeResults +} from "./report" + +type Args = Arguments< + TypesenseConnectionArgs & { + collection?: string + out?: string + courtFilter?: boolean + only?: string + threshold?: number + } +> + +const resolveCollection = (args: Args) => + args.collection ?? (args.env === "local" ? "bills_eval" : "bills") + +const includeFields = "id,court,number,title,primarySponsor,currentCommittee" + +function createSearcher(args: Args, collection: string) { + const client = resolveClient(args) + return { + client, + search: async (params: { + q: string + query_by: string + per_page: number + query_by_weights?: string + num_typos?: string + drop_tokens_threshold?: number + sort_by?: string + filter_by?: string + }): Promise => { + const result = await client + .collections(collection) + .documents() + .search({ include_fields: includeFields, ...params }) + return (result.hits ?? []).map(h => h.document as CorpusDoc) + } + } +} + +/** The court filter applied to a query, mirroring the app's court refinement. */ +function courtFor( + query: GoldenQuery, + goldens: GoldenSet, + args: Args, + majority: number +): number | undefined { + const enabled = + args.courtFilter !== false && + (query.courtFilter ?? goldens.defaults.courtFilter) + return enabled ? majority : undefined +} + +// The ranking params under test: everything the app sends except +// exclude_fields, which conflicts with the eval's pinned include_fields. +const { exclude_fields: _, ...billsRankingParams } = billsSearchParams + +const searchTop10 = ( + search: ReturnType["search"], + query: GoldenQuery, + goldens: GoldenSet, + court: number | undefined +) => + search({ + ...billsRankingParams, + q: query.query, + sort_by: goldens.defaults.sort_by, + filter_by: court === undefined ? undefined : `court:=${court}`, + per_page: 10 + }) + +async function judgmentsFor( + query: GoldenQuery, + goldens: GoldenSet, + args: Args, + court: number | undefined, + search: ReturnType["search"], + localDocs: CorpusDoc[] | undefined +): Promise { + if (localDocs) return resolveJudgments(query, goldens, localDocs, court) + + // Live (dev/prod) target: the local corpus is not authoritative there, so + // explicit labels pass through and rules resolve by searching the live index. + const judgments: Judgments = new Map() + for (const entry of labels(query, goldens)) { + if (entry.docId) { + judgments.set(entry.docId, entry.grade) + } else if (entry.rule) { + const resolved = await resolveRuleViaSearch(entry.rule, entry.grade, p => + search({ + ...p, + filter_by: court === undefined ? undefined : `court:=${court}` + }) + ) + resolved.forEach((grade, id) => + judgments.set(id, Math.max(judgments.get(id) ?? 0, grade)) + ) + } + } + return judgments.size ? judgments : undefined +} + +async function runEval(args: Args) { + const goldens = loadGoldens() + const collection = resolveCollection(args) + const { client, search } = createSearcher(args, collection) + const localDocs = args.env === "local" ? readCorpus().docs : undefined + const meta = readMeta() + const majority = majorityCourt(meta) + + const results: QueryResult[] = [] + const skipped: string[] = [] + for (const query of goldens.queries) { + const court = courtFor(query, goldens, args, majority) + const judgments = await judgmentsFor( + query, + goldens, + args, + court, + search, + localDocs + ) + if (!judgments || judgments.size === 0) { + skipped.push(query.id) + continue + } + + const top10 = await searchTop10(search, query, goldens, court) + const topIds = top10.map(d => d.id) + results.push({ + id: query.id, + category: query.category, + query: query.query, + metrics: computeMetrics(topIds, judgments), + top10: topIds, + relevantCount: judgments.size + }) + } + + const serverVersion = await client.debug + .retrieve() + .then((d: { version?: string }) => d.version ?? "unknown") + .catch(() => "unknown") + const gitSha = execSync("git rev-parse HEAD").toString().trim() + + const evalResults = buildResults( + { + env: args.env ?? "custom", + url: args.url ?? "", + collection, + serverVersion, + corpusMd5: meta.jsonlMd5, + gitSha, + timestamp: new Date().toISOString(), + sortBy: goldens.defaults.sort_by, + court: + args.courtFilter === false || !goldens.defaults.courtFilter + ? undefined + : majority, + skippedQueries: skipped + }, + results + ) + printScorecard(evalResults) + if (args.out) writeResults(evalResults, args.out) +} + +async function writeLabelingSheet(args: Args) { + const goldens = loadGoldens() + const collection = resolveCollection(args) + const { search } = createSearcher(args, collection) + const queries = goldens.queries.filter( + q => !args.only || q.category === args.only + ) + + const sections: string[] = [ + "# Search eval labeling sheet", + "", + `Top 10 results per golden query (collection "${collection}", sort "${goldens.defaults.sort_by}").`, + "Grade each result: 3 = exactly what the searcher wanted, 1 = relevant, 0/blank = not relevant.", + "Merge grades into tests/search-eval/goldens/bills.json as explicit docId entries.", + "" + ] + const majority = majorityCourt(readMeta()) + for (const query of queries) { + const court = courtFor(query, goldens, args, majority) + const top10 = await searchTop10(search, query, goldens, court) + sections.push( + `## ${query.id} (${query.category}): "${query.query}"`, + "", + "| grade | rank | docId | number | title | primarySponsor |", + "| --- | --- | --- | --- | --- | --- |", + ...top10.map( + (d, i) => + `| | ${i + 1} | ${d.id} | ${d.number} | ${(d.title ?? "").replace( + /\|/g, + "/" + )} | ${d.primarySponsor ?? ""} |` + ), + "" + ) + } + + const path = join(__dirname, "../../tests/search-eval/labeling-sheet.md") + writeFileSync(path, sections.join("\n")) + console.log(`Wrote labeling sheet for ${queries.length} queries to ${path}`) +} + +yargs(hideBin(process.argv)) + .scriptName("search-eval") + .command( + "seed", + "create and import the eval collection from the corpus snapshot", + {}, + async (args: Args) => { + await seedCollection(resolveClient(args), resolveCollection(args)) + } + ) + .command( + "run", + "run the golden queries and print the relevance scorecard", + yargs => + yargs.options({ + out: { string: true, describe: "write results JSON to this path" }, + "court-filter": { + boolean: true, + default: true, + describe: "filter to the corpus majority court, like the app does" + } + }), + (args: Args) => runEval(args) + ) + .command( + "label", + "write a labeling sheet with each query's top 10 results", + yargs => + yargs.options({ + only: { string: true, describe: "restrict to one category" } + }), + (args: Args) => writeLabelingSheet(args) + ) + .command( + "compare ", + "print metric deltas between two results files", + yargs => + yargs.options({ + threshold: { + number: true, + default: 0.05, + describe: "flag per-query and overall nDCG@10 drops above this" + } + }), + (args: Args & { baseline?: string; candidate?: string }) => { + const ok = compare(args.baseline!, args.candidate!, args.threshold!) + if (!ok) process.exitCode = 1 + } + ) + .options({ + url: { string: true, alias: "u" }, + key: { string: true, alias: "k" }, + env: { choices: ["local", "dev", "prod"], alias: "e" }, + collection: { + string: true, + describe: + "target collection (default: bills_eval locally, bills on dev/prod)" + } + }) + .demandCommand(1) + .strictCommands().argv diff --git a/scripts/search-eval/metrics.ts b/scripts/search-eval/metrics.ts new file mode 100644 index 000000000..e9a6f725f --- /dev/null +++ b/scripts/search-eval/metrics.ts @@ -0,0 +1,69 @@ +/** Relevance judgments for one query: docId -> grade (grade > 0 = relevant). */ +export type Judgments = Map + +export type QueryMetrics = { + recallAt10: number + mrr: number + ndcgAt10: number +} + +const K = 10 + +/** Capped recall@10: relevant results in the top 10 over min(|relevant|, 10), + * so a query with more than 10 relevant docs can still score 1.0. + */ +export function recallAtK(resultIds: string[], judgments: Judgments): number { + const denominator = Math.min(judgments.size, K) + if (denominator === 0) return 0 + const hits = resultIds + .slice(0, K) + .filter(id => (judgments.get(id) ?? 0) > 0).length + return hits / denominator +} + +/** Reciprocal rank of the first relevant result, 0 if none appear. */ +export function mrr(resultIds: string[], judgments: Judgments): number { + const rank = resultIds.findIndex(id => (judgments.get(id) ?? 0) > 0) + return rank === -1 ? 0 : 1 / (rank + 1) +} + +/** nDCG@10 with exponential gain (2^grade - 1). */ +export function ndcgAtK(resultIds: string[], judgments: Judgments): number { + const gain = (grade: number) => Math.pow(2, grade) - 1 + const discount = (rank: number) => 1 / Math.log2(rank + 2) + + const dcg = resultIds + .slice(0, K) + .reduce((sum, id, i) => sum + gain(judgments.get(id) ?? 0) * discount(i), 0) + + const idealDcg = Array.from(judgments.values()) + .sort((a, b) => b - a) + .slice(0, K) + .reduce((sum, grade, i) => sum + gain(grade) * discount(i), 0) + + return idealDcg === 0 ? 0 : dcg / idealDcg +} + +export function computeMetrics( + resultIds: string[], + judgments: Judgments +): QueryMetrics { + return { + recallAt10: recallAtK(resultIds, judgments), + mrr: mrr(resultIds, judgments), + ndcgAt10: ndcgAtK(resultIds, judgments) + } +} + +export function averageMetrics(all: QueryMetrics[]): QueryMetrics & { + queryCount: number +} { + const avg = (select: (m: QueryMetrics) => number) => + all.length ? all.reduce((sum, m) => sum + select(m), 0) / all.length : 0 + return { + recallAt10: avg(m => m.recallAt10), + mrr: avg(m => m.mrr), + ndcgAt10: avg(m => m.ndcgAt10), + queryCount: all.length + } +} diff --git a/scripts/search-eval/report.ts b/scripts/search-eval/report.ts new file mode 100644 index 000000000..3b8ce8174 --- /dev/null +++ b/scripts/search-eval/report.ts @@ -0,0 +1,141 @@ +import { readFileSync, writeFileSync } from "fs" +import { QueryMetrics, averageMetrics } from "./metrics" + +export type QueryResult = { + id: string + category: string + query: string + metrics: QueryMetrics + top10: string[] + relevantCount: number +} + +export type EvalResults = { + meta: { + env: string + url: string + collection: string + serverVersion: string + corpusMd5: string + gitSha: string + timestamp: string + sortBy: string + court: number | undefined + skippedQueries: string[] + } + overall: QueryMetrics & { queryCount: number } + categories: Record + queries: QueryResult[] +} + +export function buildResults( + meta: EvalResults["meta"], + queries: QueryResult[] +): EvalResults { + const categories: EvalResults["categories"] = {} + const categoryNames = Array.from(new Set(queries.map(q => q.category))).sort() + for (const category of categoryNames) { + categories[category] = averageMetrics( + queries.filter(q => q.category === category).map(q => q.metrics) + ) + } + return { + meta, + overall: averageMetrics(queries.map(q => q.metrics)), + categories, + queries + } +} + +const row = (label: string, m: QueryMetrics & { queryCount: number }) => ({ + category: label, + queries: m.queryCount, + "recall@10": m.recallAt10.toFixed(3), + MRR: m.mrr.toFixed(3), + "nDCG@10": m.ndcgAt10.toFixed(3) +}) + +export function printScorecard(results: EvalResults) { + console.log( + `\nSearch relevance scorecard — server ${results.meta.serverVersion}, ` + + `collection ${results.meta.collection}, sort "${results.meta.sortBy}"` + + (results.meta.court !== undefined ? `, court ${results.meta.court}` : "") + ) + console.table([ + ...Object.entries(results.categories).map(([category, m]) => + row(category, m) + ), + row("OVERALL", results.overall) + ]) + if (results.meta.skippedQueries.length) + console.log( + `Skipped ${results.meta.skippedQueries.length} queries: ` + + results.meta.skippedQueries.join(", ") + ) +} + +export function writeResults(results: EvalResults, path: string) { + writeFileSync(path, JSON.stringify(results, null, 2) + "\n") + console.log(`Wrote results to ${path}`) +} + +export function compare( + baselinePath: string, + candidatePath: string, + threshold: number +): boolean { + const baseline: EvalResults = JSON.parse(readFileSync(baselinePath, "utf8")) + const candidate: EvalResults = JSON.parse(readFileSync(candidatePath, "utf8")) + + console.log( + `\nComparing ${candidatePath} (server ${candidate.meta.serverVersion})` + + ` against ${baselinePath} (server ${baseline.meta.serverVersion})` + ) + if (baseline.meta.corpusMd5 !== candidate.meta.corpusMd5) + console.warn("WARNING: corpus hashes differ — not an apples-to-apples run") + + const delta = (b: QueryMetrics, c: QueryMetrics) => ({ + "Δrecall@10": (c.recallAt10 - b.recallAt10).toFixed(3), + ΔMRR: (c.mrr - b.mrr).toFixed(3), + "ΔnDCG@10": (c.ndcgAt10 - b.ndcgAt10).toFixed(3) + }) + + const categories = Array.from( + new Set([ + ...Object.keys(baseline.categories), + ...Object.keys(candidate.categories) + ]) + ).sort() + console.table([ + ...categories + .filter(c => baseline.categories[c] && candidate.categories[c]) + .map(c => ({ + category: c, + ...delta(baseline.categories[c], candidate.categories[c]) + })), + { category: "OVERALL", ...delta(baseline.overall, candidate.overall) } + ]) + + const baselineQueries = new Map(baseline.queries.map(q => [q.id, q])) + const regressions = candidate.queries.filter(q => { + const before = baselineQueries.get(q.id) + return before && before.metrics.ndcgAt10 - q.metrics.ndcgAt10 > threshold + }) + if (regressions.length) { + console.log(`\nPer-query nDCG@10 regressions > ${threshold}:`) + console.table( + regressions.map(q => ({ + id: q.id, + query: q.query, + before: baselineQueries.get(q.id)!.metrics.ndcgAt10.toFixed(3), + after: q.metrics.ndcgAt10.toFixed(3) + })) + ) + } + + const overallRegressed = + baseline.overall.ndcgAt10 - candidate.overall.ndcgAt10 > threshold + if (overallRegressed) + console.error(`Overall nDCG@10 regressed by more than ${threshold}`) + return !overallRegressed +} diff --git a/scripts/typesense-admin.ts b/scripts/typesense-admin.ts index be9eaa67e..6abded539 100644 --- a/scripts/typesense-admin.ts +++ b/scripts/typesense-admin.ts @@ -1,26 +1,18 @@ -import { execSync } from "child_process" import repl from "repl" import yargs, { Arguments } from "yargs" import { hideBin } from "yargs/helpers" import { createClient } from "../functions/src/search/client" +import { + TypesenseConnectionArgs, + resolveClient, + typesenseEnvs +} from "./typesense-env" declare global { var client: ReturnType } -const envs: Record = { - local: { url: "http://localhost:8108", key: "test-api-key" }, - dev: { - url: "https://o89yhjf824.execute-api.us-east-1.amazonaws.com/search", - alias: "default" - }, - prod: { - url: "https://yyd73lsw3h.execute-api.us-east-1.amazonaws.com/search", - alias: "prod" - } -} - -type Args = Arguments<{ url?: string; key?: string; env?: string }> +type Args = Arguments yargs(hideBin(process.argv)) .scriptName("typesense-admin") .command( @@ -62,7 +54,7 @@ yargs(hideBin(process.argv)) .options({ url: { string: true, alias: "u" }, key: { string: true, alias: "k" }, - env: { choices: Object.keys(envs), alias: "e" } + env: { choices: Object.keys(typesenseEnvs), alias: "e" } }) .check(argv => { if (!argv.env && !argv.url) return "Must specify env or url" @@ -70,29 +62,3 @@ yargs(hideBin(process.argv)) return true }) .strictCommands().argv - -function resolveClient(args: Args) { - let key: string | undefined, url: string | undefined - if (args.env) { - const env = envs[args.env] - if (!env) throw Error(`Invalid env, allowed values: ${Object.keys(envs)}`) - url = env.url - if (env.key) { - key = env.key - } else if (env.alias) { - key = execSync( - `yarn -s firebase --project ${env.alias} functions:secrets:access TYPESENSE_API_KEY` - ) - .toString() - .trim() - } else { - throw Error("Couldn't resolve env") - } - } - if (args.url) url = args.url - if (args.key) key = args.key - - if (!url || !key) throw new Error("Couldn't resolve url or key") - - return createClient({ apiUrl: url, apiKey: key }) -} diff --git a/scripts/typesense-env.ts b/scripts/typesense-env.ts new file mode 100644 index 000000000..e3862a10d --- /dev/null +++ b/scripts/typesense-env.ts @@ -0,0 +1,50 @@ +import { execSync } from "child_process" +import { createClient } from "../functions/src/search/client" + +export const typesenseEnvs: Record< + string, + { url: string; key?: string; alias?: string } +> = { + local: { url: "http://localhost:8108", key: "test-api-key" }, + dev: { + url: "https://o89yhjf824.execute-api.us-east-1.amazonaws.com/search", + alias: "default" + }, + prod: { + url: "https://yyd73lsw3h.execute-api.us-east-1.amazonaws.com/search", + alias: "prod" + } +} + +export type TypesenseConnectionArgs = { + url?: string + key?: string + env?: string +} + +export function resolveClient(args: TypesenseConnectionArgs) { + let key: string | undefined, url: string | undefined + if (args.env) { + const env = typesenseEnvs[args.env] + if (!env) + throw Error(`Invalid env, allowed values: ${Object.keys(typesenseEnvs)}`) + url = env.url + if (env.key) { + key = env.key + } else if (env.alias) { + key = execSync( + `yarn -s firebase --project ${env.alias} functions:secrets:access TYPESENSE_API_KEY` + ) + .toString() + .trim() + } else { + throw Error("Couldn't resolve env") + } + } + if (args.url) url = args.url + if (args.key) key = args.key + + if (!url || !key) throw new Error("Couldn't resolve url or key") + + return createClient({ apiUrl: url, apiKey: key }) +} diff --git a/tests/search-eval/baselines/main-typesense-0.24.json b/tests/search-eval/baselines/main-typesense-0.24.json new file mode 100644 index 000000000..84522f4e5 --- /dev/null +++ b/tests/search-eval/baselines/main-typesense-0.24.json @@ -0,0 +1,1516 @@ +{ + "meta": { + "env": "local", + "url": "", + "collection": "bills_eval", + "serverVersion": "0.24.0", + "corpusMd5": "a0499d7bb8597f88dbd737893bcd8a4d", + "gitSha": "6495fdbb614c9de0c04188cc4ddda29bb92556d8", + "timestamp": "2026-08-18T18:34:49.611Z", + "sortBy": "_text_match:desc,testimonyCount:desc", + "court": 192, + "skippedQueries": [] + }, + "overall": { + "recallAt10": 0.6514285714285716, + "mrr": 0.7673015873015874, + "ndcgAt10": 0.5251301729907821, + "queryCount": 70 + }, + "categories": { + "exact-bill-id": { + "recallAt10": 0.8, + "mrr": 0.8, + "ndcgAt10": 0.8, + "queryCount": 15 + }, + "member-committee": { + "recallAt10": 0.09333333333333334, + "mrr": 0.2733333333333333, + "ndcgAt10": 0.11884984315846131, + "queryCount": 15 + }, + "misspelling": { + "recallAt10": 0.8699999999999999, + "mrr": 1, + "ndcgAt10": 0.4985867229196039, + "queryCount": 10 + }, + "synonym": { + "recallAt10": 0.7899999999999999, + "mrr": 0.9, + "ndcgAt10": 0.8262463153675897, + "queryCount": 10 + }, + "topic": { + "recallAt10": 0.78, + "mrr": 0.9305555555555556, + "ndcgAt10": 0.4864017039552942, + "queryCount": 20 + } + }, + "queries": [ + { + "id": "exact-001", + "category": "exact-bill-id", + "query": "H.100", + "metrics": { + "recallAt10": 1, + "mrr": 1, + "ndcgAt10": 1 + }, + "top10": [ + "192-H100", + "192-H1002", + "192-H1001", + "192-H1000", + "192-H1006", + "192-H1004", + "192-H1003", + "192-H1009", + "192-H1008", + "192-H1007" + ], + "relevantCount": 1 + }, + { + "id": "exact-002", + "category": "exact-bill-id", + "query": "h100", + "metrics": { + "recallAt10": 1, + "mrr": 1, + "ndcgAt10": 1 + }, + "top10": [ + "192-H100", + "192-H1002", + "192-H1001", + "192-H1000", + "192-H1006", + "192-H1004", + "192-H1003", + "192-H1009", + "192-H1008", + "192-H1007" + ], + "relevantCount": 1 + }, + { + "id": "exact-003", + "category": "exact-bill-id", + "query": "H 100", + "metrics": { + "recallAt10": 0, + "mrr": 0, + "ndcgAt10": 0 + }, + "top10": [ + "192-S904", + "192-S9", + "192-S898", + "192-S873", + "192-S805", + "192-S804", + "192-S782", + "192-S771", + "192-S766", + "192-S675" + ], + "relevantCount": 1 + }, + { + "id": "exact-004", + "category": "exact-bill-id", + "query": "S.9", + "metrics": { + "recallAt10": 1, + "mrr": 1, + "ndcgAt10": 1 + }, + "top10": [ + "192-S9", + "192-S995", + "192-S971", + "192-S955", + "192-S951", + "192-S922", + "192-S913", + "192-S911", + "192-S91", + "192-S905" + ], + "relevantCount": 1 + }, + { + "id": "exact-005", + "category": "exact-bill-id", + "query": "s9", + "metrics": { + "recallAt10": 1, + "mrr": 1, + "ndcgAt10": 1 + }, + "top10": [ + "192-S9", + "192-S995", + "192-S971", + "192-S955", + "192-S951", + "192-S922", + "192-S913", + "192-S911", + "192-S91", + "192-S905" + ], + "relevantCount": 1 + }, + { + "id": "exact-006", + "category": "exact-bill-id", + "query": "S 2564", + "metrics": { + "recallAt10": 0, + "mrr": 0, + "ndcgAt10": 0 + }, + "top10": [ + "192-H4352" + ], + "relevantCount": 1 + }, + { + "id": "exact-007", + "category": "exact-bill-id", + "query": "S2564", + "metrics": { + "recallAt10": 1, + "mrr": 1, + "ndcgAt10": 1 + }, + "top10": [ + "192-S2564" + ], + "relevantCount": 1 + }, + { + "id": "exact-008", + "category": "exact-bill-id", + "query": "H.4374", + "metrics": { + "recallAt10": 1, + "mrr": 1, + "ndcgAt10": 1 + }, + "top10": [ + "192-H4374" + ], + "relevantCount": 1 + }, + { + "id": "exact-009", + "category": "exact-bill-id", + "query": "h.73", + "metrics": { + "recallAt10": 1, + "mrr": 1, + "ndcgAt10": 1 + }, + "top10": [ + "192-H73", + "192-H739", + "192-H737", + "192-H736", + "192-H735", + "192-H734", + "192-H733", + "192-H732", + "192-H731", + "192-H730" + ], + "relevantCount": 1 + }, + { + "id": "exact-010", + "category": "exact-bill-id", + "query": "H3999", + "metrics": { + "recallAt10": 1, + "mrr": 1, + "ndcgAt10": 1 + }, + "top10": [ + "192-H3999" + ], + "relevantCount": 1 + }, + { + "id": "exact-011", + "category": "exact-bill-id", + "query": "S.1333", + "metrics": { + "recallAt10": 1, + "mrr": 1, + "ndcgAt10": 1 + }, + "top10": [ + "192-S1333" + ], + "relevantCount": 1 + }, + { + "id": "exact-012", + "category": "exact-bill-id", + "query": "s 2475", + "metrics": { + "recallAt10": 0, + "mrr": 0, + "ndcgAt10": 0 + }, + "top10": [ + "192-S2170", + "192-S2158", + "192-H3372", + "192-H3302" + ], + "relevantCount": 1 + }, + { + "id": "exact-013", + "category": "exact-bill-id", + "query": "H600", + "metrics": { + "recallAt10": 1, + "mrr": 1, + "ndcgAt10": 1 + }, + "top10": [ + "192-H600" + ], + "relevantCount": 1 + }, + { + "id": "exact-014", + "category": "exact-bill-id", + "query": "H.1", + "metrics": { + "recallAt10": 1, + "mrr": 1, + "ndcgAt10": 1 + }, + "top10": [ + "192-H1", + "192-S736", + "192-S451", + "192-S2759", + "192-S1841", + "192-S1633", + "192-S147", + "192-S130", + "192-S119", + "192-H4154" + ], + "relevantCount": 1 + }, + { + "id": "exact-015", + "category": "exact-bill-id", + "query": "S.1563", + "metrics": { + "recallAt10": 1, + "mrr": 1, + "ndcgAt10": 1 + }, + "top10": [ + "192-S1563" + ], + "relevantCount": 1 + }, + { + "id": "mc-001", + "category": "member-committee", + "query": "Diana DiZoglio", + "metrics": { + "recallAt10": 0.1, + "mrr": 1, + "ndcgAt10": 0.22009176629808017 + }, + "top10": [ + "192-S1698" + ], + "relevantCount": 444 + }, + { + "id": "mc-002", + "category": "member-committee", + "query": "Bruce Tarr", + "metrics": { + "recallAt10": 0, + "mrr": 0, + "ndcgAt10": 0 + }, + "top10": [ + "192-H4316", + "192-S2018", + "192-H3166" + ], + "relevantCount": 290 + }, + { + "id": "mc-003", + "category": "member-committee", + "query": "Jason Lewis", + "metrics": { + "recallAt10": 0, + "mrr": 0, + "ndcgAt10": 0 + }, + "top10": [ + "192-S1" + ], + "relevantCount": 527 + }, + { + "id": "mc-004", + "category": "member-committee", + "query": "Tackey Chan", + "metrics": { + "recallAt10": 0, + "mrr": 0, + "ndcgAt10": 0 + }, + "top10": [ + "192-S733", + "192-S571", + "192-S2737", + "192-S2523", + "192-S1796", + "192-S143", + "192-H877", + "192-H4433", + "192-H2908", + "192-H2833" + ], + "relevantCount": 198 + }, + { + "id": "mc-005", + "category": "member-committee", + "query": "Julian Cyr", + "metrics": { + "recallAt10": 0, + "mrr": 0, + "ndcgAt10": 0 + }, + "top10": [ + "192-S44", + "192-H3765" + ], + "relevantCount": 306 + }, + { + "id": "mc-006", + "category": "member-committee", + "query": "Cynthia Creem", + "metrics": { + "recallAt10": 0, + "mrr": 0, + "ndcgAt10": 0 + }, + "top10": [ + "192-H2756" + ], + "relevantCount": 106 + }, + { + "id": "mc-007", + "category": "member-committee", + "query": "Marjorie Decker", + "metrics": { + "recallAt10": 0, + "mrr": 0, + "ndcgAt10": 0 + }, + "top10": [], + "relevantCount": 143 + }, + { + "id": "mc-008", + "category": "member-committee", + "query": "Michael Moore", + "metrics": { + "recallAt10": 0.1, + "mrr": 1, + "ndcgAt10": 0.22009176629808017 + }, + "top10": [ + "192-S15", + "192-S2580" + ], + "relevantCount": 557 + }, + { + "id": "mc-009", + "category": "member-committee", + "query": "Patrick O'Connor", + "metrics": { + "recallAt10": 0, + "mrr": 0, + "ndcgAt10": 0 + }, + "top10": [ + "192-H4341", + "192-S7", + "192-S2544", + "192-H3476" + ], + "relevantCount": 663 + }, + { + "id": "mc-010", + "category": "member-committee", + "query": "Aaron Michlewitz", + "metrics": { + "recallAt10": 0, + "mrr": 0, + "ndcgAt10": 0 + }, + "top10": [ + "192-S2544", + "192-H3476" + ], + "relevantCount": 4 + }, + { + "id": "mc-011", + "category": "member-committee", + "query": "Ways and Means Committee", + "metrics": { + "recallAt10": 0, + "mrr": 0, + "ndcgAt10": 0 + }, + "top10": [ + "192-S1534", + "192-S1220", + "192-H629", + "192-H3415", + "192-H1968", + "192-S82", + "192-S785", + "192-S771", + "192-S364", + "192-S2626" + ], + "relevantCount": 715 + }, + { + "id": "mc-012", + "category": "member-committee", + "query": "Health Care Financing", + "metrics": { + "recallAt10": 0.8, + "mrr": 1, + "ndcgAt10": 0.8415908474314976 + }, + "top10": [ + "192-S798", + "192-S791", + "192-S787", + "192-S785", + "192-S782", + "192-S779", + "192-S770", + "192-S758", + "192-S743", + "192-S675" + ], + "relevantCount": 264 + }, + { + "id": "mc-013", + "category": "member-committee", + "query": "Committee on Revenue", + "metrics": { + "recallAt10": 0, + "mrr": 0, + "ndcgAt10": 0 + }, + "top10": [ + "192-S2743", + "192-S2070", + "192-S1866", + "192-S1731", + "192-S1730", + "192-H4518", + "192-H4513", + "192-H4429", + "192-H4428", + "192-H3803" + ], + "relevantCount": 111 + }, + { + "id": "mc-014", + "category": "member-committee", + "query": "Education Committee", + "metrics": { + "recallAt10": 0.3, + "mrr": 1, + "ndcgAt10": 0.43735247915031 + }, + "top10": [ + "192-S1220", + "192-H1968", + "192-S2769", + "192-S2756", + "192-S2755", + "192-S846", + "192-S387", + "192-S381", + "192-S378", + "192-S365" + ], + "relevantCount": 63 + }, + { + "id": "mc-015", + "category": "member-committee", + "query": "Telecommunications Utilities and Energy", + "metrics": { + "recallAt10": 0.1, + "mrr": 0.1, + "ndcgAt10": 0.06362078819895171 + }, + "top10": [ + "192-S2715", + "192-S2711", + "192-S2647", + "192-H4488", + "192-H4455", + "192-H4400", + "192-S568", + "192-S566", + "192-S2229", + "192-S2222" + ], + "relevantCount": 120 + }, + { + "id": "topic-001", + "category": "topic", + "query": "gun control", + "metrics": { + "recallAt10": 0.4, + "mrr": 0.5, + "ndcgAt10": 0.12111401772315426 + }, + "top10": [ + "192-H2527", + "192-S942", + "192-H1734", + "192-S939", + "192-S514", + "192-S1130", + "192-S1009", + "192-H43", + "192-H308", + "192-H2635" + ], + "relevantCount": 93 + }, + { + "id": "topic-002", + "category": "topic", + "query": "mental health", + "metrics": { + "recallAt10": 1, + "mrr": 1, + "ndcgAt10": 0.3170853252047272 + }, + "top10": [ + "192-S820", + "192-S703", + "192-S675", + "192-S636", + "192-S292", + "192-S2790", + "192-S2584", + "192-S2572", + "192-S2528", + "192-S2514" + ], + "relevantCount": 66 + }, + { + "id": "topic-003", + "category": "topic", + "query": "climate change", + "metrics": { + "recallAt10": 1, + "mrr": 1, + "ndcgAt10": 0.4491790547278348 + }, + "top10": [ + "192-S571", + "192-S2737", + "192-S1796", + "192-H877", + "192-H2908", + "192-H2833", + "192-H258", + "192-H2159", + "192-S1853", + "192-H2890" + ], + "relevantCount": 27 + }, + { + "id": "topic-004", + "category": "topic", + "query": "offshore wind", + "metrics": { + "recallAt10": 1, + "mrr": 1, + "ndcgAt10": 0.6186468626657726 + }, + "top10": [ + "192-S2227", + "192-S2154", + "192-H953", + "192-H4348", + "192-H3310", + "192-H3303", + "192-H3302", + "192-H3266", + "192-H2924", + "192-H4524" + ], + "relevantCount": 12 + }, + { + "id": "topic-005", + "category": "topic", + "query": "marijuana", + "metrics": { + "recallAt10": 1, + "mrr": 1, + "ndcgAt10": 0.3170853252047272 + }, + "top10": [ + "192-S76", + "192-S74", + "192-S73", + "192-S64", + "192-S2663", + "192-S2529", + "192-S1828", + "192-S1583", + "192-H4026", + "192-H3079" + ], + "relevantCount": 57 + }, + { + "id": "topic-006", + "category": "topic", + "query": "minimum wage", + "metrics": { + "recallAt10": 1, + "mrr": 1, + "ndcgAt10": 0.902688816176951 + }, + "top10": [ + "192-S1176", + "192-H1994", + "192-S1159", + "192-H2043", + "192-S1213", + "192-S1179", + "192-H1971", + "192-H1964", + "192-H1959", + "192-S805" + ], + "relevantCount": 4 + }, + { + "id": "topic-007", + "category": "topic", + "query": "charter schools", + "metrics": { + "recallAt10": 0.8, + "mrr": 1, + "ndcgAt10": 0.6172182802301824 + }, + "top10": [ + "192-S371", + "192-S353", + "192-S343", + "192-H712", + "192-H696", + "192-S386", + "192-S372", + "192-S286", + "192-H718", + "192-H672" + ], + "relevantCount": 13 + }, + { + "id": "topic-008", + "category": "topic", + "query": "affordable housing", + "metrics": { + "recallAt10": 1, + "mrr": 1, + "ndcgAt10": 0.3170853252047272 + }, + "top10": [ + "192-S903", + "192-S895", + "192-S888", + "192-S882", + "192-S868", + "192-S867", + "192-S2025", + "192-S1985", + "192-S1853", + "192-S1808" + ], + "relevantCount": 40 + }, + { + "id": "topic-009", + "category": "topic", + "query": "homelessness", + "metrics": { + "recallAt10": 1, + "mrr": 1, + "ndcgAt10": 0.43812463509980126 + }, + "top10": [ + "192-S874", + "192-S82", + "192-S142", + "192-S110", + "192-H3959", + "192-H3838", + "192-H3778", + "192-H264", + "192-H229", + "192-H1436" + ], + "relevantCount": 26 + }, + { + "id": "topic-010", + "category": "topic", + "query": "opioid addiction", + "metrics": { + "recallAt10": 0.4, + "mrr": 1, + "ndcgAt10": 0.7945202298211209 + }, + "top10": [ + "192-H2086", + "192-H2071", + "192-S2", + "192-S347", + "192-S2472", + "192-S2467", + "192-H2097", + "192-H2405", + "192-H3796", + "192-H2101" + ], + "relevantCount": 21 + }, + { + "id": "topic-011", + "category": "topic", + "query": "student loan forgiveness", + "metrics": { + "recallAt10": 0.3, + "mrr": 1, + "ndcgAt10": 0.48664114167177874 + }, + "top10": [ + "192-S1827", + "192-H2883", + "192-H1320", + "192-H3030", + "192-H1366", + "192-S2580" + ], + "relevantCount": 21 + }, + { + "id": "topic-012", + "category": "topic", + "query": "domestic violence", + "metrics": { + "recallAt10": 1, + "mrr": 1, + "ndcgAt10": 0.3170853252047272 + }, + "top10": [ + "192-S951", + "192-S702", + "192-S2678", + "192-S2417", + "192-S190", + "192-S176", + "192-S1123", + "192-S1076", + "192-S1023", + "192-S1015" + ], + "relevantCount": 26 + }, + { + "id": "topic-013", + "category": "topic", + "query": "sexual assault", + "metrics": { + "recallAt10": 1, + "mrr": 1, + "ndcgAt10": 0.3170853252047272 + }, + "top10": [ + "192-S939", + "192-S2678", + "192-S190", + "192-S176", + "192-S1488", + "192-S1134", + "192-S1087", + "192-S1073", + "192-H4330", + "192-H4013" + ], + "relevantCount": 26 + }, + { + "id": "topic-014", + "category": "topic", + "query": "solar energy", + "metrics": { + "recallAt10": 1, + "mrr": 1, + "ndcgAt10": 0.3170853252047272 + }, + "top10": [ + "192-S2208", + "192-S2203", + "192-S2180", + "192-S2174", + "192-S2168", + "192-S2145", + "192-S1896", + "192-S1326", + "192-H4044", + "192-H3346" + ], + "relevantCount": 34 + }, + { + "id": "topic-015", + "category": "topic", + "query": "eviction", + "metrics": { + "recallAt10": 0.5, + "mrr": 1, + "ndcgAt10": 0.5933275909929555 + }, + "top10": [ + "192-S921", + "192-H4505", + "192-H1808", + "192-H1911", + "192-S904", + "192-S891", + "192-S886", + "192-S883", + "192-S874", + "192-S865" + ], + "relevantCount": 24 + }, + { + "id": "topic-016", + "category": "topic", + "query": "vaccines", + "metrics": { + "recallAt10": 0.2, + "mrr": 1, + "ndcgAt10": 0.7237527203934739 + }, + "top10": [ + "192-H2411", + "192-H2394", + "192-S2626", + "192-S2622", + "192-S251", + "192-S2472", + "192-S2467", + "192-S2079", + "192-S2", + "192-S1755" + ], + "relevantCount": 12 + }, + { + "id": "topic-017", + "category": "topic", + "query": "telehealth", + "metrics": { + "recallAt10": 1, + "mrr": 1, + "ndcgAt10": 0.6310385047070085 + }, + "top10": [ + "192-S678", + "192-H125", + "192-H1101", + "192-S770", + "192-S766", + "192-S682", + "192-S2774", + "192-S2656", + "192-S2", + "192-S1470" + ], + "relevantCount": 3 + }, + { + "id": "topic-018", + "category": "topic", + "query": "voting by mail", + "metrics": { + "recallAt10": 0.6, + "mrr": 1, + "ndcgAt10": 0.40293031154000103 + }, + "top10": [ + "192-S28", + "192-H71", + "192-H73", + "192-S484", + "192-S451", + "192-H834", + "192-H805", + "192-H3950", + "192-S459", + "192-H4367" + ], + "relevantCount": 5 + }, + { + "id": "topic-019", + "category": "topic", + "query": "school lunch", + "metrics": { + "recallAt10": 0.4, + "mrr": 0.1111111111111111, + "ndcgAt10": 0.04633996212748669 + }, + "top10": [ + "192-S363", + "192-S349", + "192-S314", + "192-H714", + "192-H686", + "192-H580", + "192-H564", + "192-H547", + "192-S298", + "192-S2532" + ], + "relevantCount": 5 + }, + { + "id": "topic-020", + "category": "topic", + "query": "renewable energy", + "metrics": { + "recallAt10": 1, + "mrr": 1, + "ndcgAt10": 1 + }, + "top10": [ + "192-S590", + "192-S2738", + "192-S2153", + "192-S1940", + "192-H3330", + "192-H3269", + "192-H2159", + "192-H2145", + "192-S2157", + "192-H3964" + ], + "relevantCount": 21 + }, + { + "id": "syn-001", + "category": "synonym", + "query": "firearms", + "metrics": { + "recallAt10": 1, + "mrr": 1, + "ndcgAt10": 1 + }, + "top10": [ + "192-S2762", + "192-S1568", + "192-S1563", + "192-S1561", + "192-H43", + "192-H3847", + "192-H3846", + "192-H2635", + "192-H2533", + "192-H2505" + ], + "relevantCount": 93 + }, + { + "id": "syn-002", + "category": "synonym", + "query": "guns", + "metrics": { + "recallAt10": 0.8, + "mrr": 1, + "ndcgAt10": 0.8643145546088337 + }, + "top10": [ + "192-H2470", + "192-S1540", + "192-H2874", + "192-H2491", + "192-H2488", + "192-H2439", + "192-S942", + "192-S939", + "192-S1615", + "192-S1562" + ], + "relevantCount": 93 + }, + { + "id": "syn-003", + "category": "synonym", + "query": "educator", + "metrics": { + "recallAt10": 0.8, + "mrr": 1, + "ndcgAt10": 0.8701249883466593 + }, + "top10": [ + "192-S366", + "192-S2748", + "192-H682", + "192-H642", + "192-H127", + "192-S285", + "192-H675", + "192-H1620", + "192-S384", + "192-S377" + ], + "relevantCount": 39 + }, + { + "id": "syn-004", + "category": "synonym", + "query": "teachers", + "metrics": { + "recallAt10": 1, + "mrr": 1, + "ndcgAt10": 1 + }, + "top10": [ + "192-S1953", + "192-S1791", + "192-S1778", + "192-S1721", + "192-H628", + "192-H594", + "192-H2759", + "192-H2688", + "192-H2655", + "192-H2620" + ], + "relevantCount": 39 + }, + { + "id": "syn-005", + "category": "synonym", + "query": "cannabis", + "metrics": { + "recallAt10": 1, + "mrr": 1, + "ndcgAt10": 1 + }, + "top10": [ + "192-S77", + "192-S69", + "192-S63", + "192-S2664", + "192-S2662", + "192-S2661", + "192-S2660", + "192-H4507", + "192-H4440", + "192-H2056" + ], + "relevantCount": 57 + }, + { + "id": "syn-006", + "category": "synonym", + "query": "doctors", + "metrics": { + "recallAt10": 0, + "mrr": 0, + "ndcgAt10": 0 + }, + "top10": [ + "192-S2600", + "192-S2079", + "192-S1458", + "192-S1436", + "192-S1420", + "192-S1399", + "192-S1134", + "192-S1009", + "192-H4510", + "192-H437" + ], + "relevantCount": 15 + }, + { + "id": "syn-007", + "category": "synonym", + "query": "elderly", + "metrics": { + "recallAt10": 1, + "mrr": 1, + "ndcgAt10": 1 + }, + "top10": [ + "192-S878", + "192-S1948", + "192-H760", + "192-H730", + "192-H2911", + "192-H2846", + "192-H2820", + "192-H2773", + "192-S900", + "192-S399" + ], + "relevantCount": 27 + }, + { + "id": "syn-008", + "category": "synonym", + "query": "senior citizens", + "metrics": { + "recallAt10": 0.7, + "mrr": 1, + "ndcgAt10": 0.800693766409882 + }, + "top10": [ + "192-H723", + "192-S1961", + "192-H734", + "192-H732", + "192-H3734", + "192-H2903", + "192-H2947", + "192-S766", + "192-S252", + "192-H500" + ], + "relevantCount": 41 + }, + { + "id": "syn-009", + "category": "synonym", + "query": "liquor", + "metrics": { + "recallAt10": 1, + "mrr": 1, + "ndcgAt10": 1 + }, + "top10": [ + "192-S2215", + "192-H353", + "192-S2566", + "192-S2477", + "192-S246", + "192-S228", + "192-S227", + "192-S199", + "192-H473", + "192-H472" + ], + "relevantCount": 82 + }, + { + "id": "syn-010", + "category": "synonym", + "query": "childcare", + "metrics": { + "recallAt10": 0.6, + "mrr": 1, + "ndcgAt10": 0.727329844310522 + }, + "top10": [ + "192-S339", + "192-H649", + "192-H2884", + "192-H200", + "192-H1590", + "192-S1912", + "192-S852", + "192-S822", + "192-S358", + "192-S349" + ], + "relevantCount": 15 + }, + { + "id": "mis-001", + "category": "misspelling", + "query": "mental helth", + "metrics": { + "recallAt10": 1, + "mrr": 1, + "ndcgAt10": 0.3170853252047272 + }, + "top10": [ + "192-S820", + "192-S703", + "192-S675", + "192-S636", + "192-S292", + "192-S2790", + "192-S2584", + "192-S2572", + "192-S2528", + "192-S2514" + ], + "relevantCount": 66 + }, + { + "id": "mis-002", + "category": "misspelling", + "query": "clmate change", + "metrics": { + "recallAt10": 1, + "mrr": 1, + "ndcgAt10": 0.4491790547278348 + }, + "top10": [ + "192-S571", + "192-S2737", + "192-S1796", + "192-H877", + "192-H2908", + "192-H2833", + "192-H258", + "192-H2159", + "192-S1853", + "192-H2890" + ], + "relevantCount": 27 + }, + { + "id": "mis-003", + "category": "misspelling", + "query": "marijuanna", + "metrics": { + "recallAt10": 1, + "mrr": 1, + "ndcgAt10": 0.3170853252047272 + }, + "top10": [ + "192-S76", + "192-S74", + "192-S73", + "192-S64", + "192-S2663", + "192-S2529", + "192-S1828", + "192-S1583", + "192-H4026", + "192-H3079" + ], + "relevantCount": 57 + }, + { + "id": "mis-004", + "category": "misspelling", + "query": "afordable housing", + "metrics": { + "recallAt10": 1, + "mrr": 1, + "ndcgAt10": 0.3170853252047272 + }, + "top10": [ + "192-S903", + "192-S895", + "192-S888", + "192-S882", + "192-S868", + "192-S867", + "192-S2025", + "192-S1985", + "192-S1853", + "192-S1808" + ], + "relevantCount": 40 + }, + { + "id": "mis-005", + "category": "misspelling", + "query": "homelesness", + "metrics": { + "recallAt10": 1, + "mrr": 1, + "ndcgAt10": 0.43812463509980126 + }, + "top10": [ + "192-S874", + "192-S82", + "192-S142", + "192-S110", + "192-H3959", + "192-H3838", + "192-H3778", + "192-H264", + "192-H229", + "192-H1436" + ], + "relevantCount": 26 + }, + { + "id": "mis-006", + "category": "misspelling", + "query": "opiod", + "metrics": { + "recallAt10": 1, + "mrr": 1, + "ndcgAt10": 0.6104531109861133 + }, + "top10": [ + "192-S347", + "192-S1304", + "192-S1302", + "192-H2496", + "192-H2405", + "192-H2110", + "192-H2096", + "192-H2086", + "192-H2071", + "192-H2068" + ], + "relevantCount": 21 + }, + { + "id": "mis-007", + "category": "misspelling", + "query": "domestic violance", + "metrics": { + "recallAt10": 1, + "mrr": 1, + "ndcgAt10": 0.3170853252047272 + }, + "top10": [ + "192-S951", + "192-S702", + "192-S2678", + "192-S2417", + "192-S190", + "192-S176", + "192-S1123", + "192-S1076", + "192-S1023", + "192-S1015" + ], + "relevantCount": 26 + }, + { + "id": "mis-008", + "category": "misspelling", + "query": "evicton", + "metrics": { + "recallAt10": 0.5, + "mrr": 1, + "ndcgAt10": 0.5933275909929555 + }, + "top10": [ + "192-S921", + "192-H4505", + "192-H1808", + "192-H1911", + "192-S904", + "192-S891", + "192-S886", + "192-S883", + "192-S874", + "192-S865" + ], + "relevantCount": 24 + }, + { + "id": "mis-009", + "category": "misspelling", + "query": "vacines", + "metrics": { + "recallAt10": 0.2, + "mrr": 1, + "ndcgAt10": 0.7237527203934739 + }, + "top10": [ + "192-H2411", + "192-H2394", + "192-S2626", + "192-S2622", + "192-S251", + "192-S2472", + "192-S2467", + "192-S2079", + "192-S2", + "192-S1755" + ], + "relevantCount": 12 + }, + { + "id": "mis-010", + "category": "misspelling", + "query": "minimun wage", + "metrics": { + "recallAt10": 1, + "mrr": 1, + "ndcgAt10": 0.902688816176951 + }, + "top10": [ + "192-S1176", + "192-H1994", + "192-S1159", + "192-H2043", + "192-S1213", + "192-S1179", + "192-H1971", + "192-H1964", + "192-H1959", + "192-S805" + ], + "relevantCount": 4 + } + ] +} diff --git a/tests/search-eval/corpus/meta.json b/tests/search-eval/corpus/meta.json new file mode 100644 index 000000000..0f50fe9b6 --- /dev/null +++ b/tests/search-eval/corpus/meta.json @@ -0,0 +1,10 @@ +{ + "collection": "bills", + "source": "tests/integration/exportedTestData", + "count": 7337, + "courts": { + "192": 7334, + "193": 3 + }, + "jsonlMd5": "a0499d7bb8597f88dbd737893bcd8a4d" +} diff --git a/tests/search-eval/corpus/schema.json b/tests/search-eval/corpus/schema.json new file mode 100644 index 000000000..4396b1d02 --- /dev/null +++ b/tests/search-eval/corpus/schema.json @@ -0,0 +1,91 @@ +{ + "fields": [ + { + "name": "number", + "type": "string", + "facet": false + }, + { + "name": "court", + "type": "int32", + "facet": true + }, + { + "name": "title", + "type": "string", + "facet": false + }, + { + "name": "body", + "type": "string", + "facet": false, + "optional": true + }, + { + "name": "city", + "type": "string", + "facet": true, + "optional": true + }, + { + "name": "currentCommittee", + "type": "string", + "facet": true, + "optional": true + }, + { + "name": "testimonyCount", + "type": "int32" + }, + { + "name": "primarySponsor", + "type": "string", + "facet": true, + "optional": true + }, + { + "name": "cosponsors", + "type": "string[]", + "facet": true + }, + { + "name": "cosponsorCount", + "type": "int32" + }, + { + "name": "nextHearingAt", + "type": "int64", + "optional": true + }, + { + "name": "latestTestimonyAt", + "type": "int64", + "optional": true + }, + { + "name": "endorseCount", + "type": "int32" + }, + { + "name": "opposeCount", + "type": "int32" + }, + { + "name": "neutralCount", + "type": "int32" + }, + { + "name": "topics.lvl0", + "type": "string[]", + "facet": true, + "optional": true + }, + { + "name": "topics.lvl1", + "type": "string[]", + "facet": true, + "optional": true + } + ], + "default_sorting_field": "testimonyCount" +} diff --git a/tests/search-eval/goldens/bills.json b/tests/search-eval/goldens/bills.json new file mode 100644 index 000000000..017165774 --- /dev/null +++ b/tests/search-eval/goldens/bills.json @@ -0,0 +1,725 @@ +{ + "collection": "bills", + "defaults": { + "sort_by": "_text_match:desc,testimonyCount:desc", + "courtFilter": true + }, + "queries": [ + { + "id": "exact-001", + "category": "exact-bill-id", + "query": "H.100", + "relevant": [ + { "rule": { "field": "number", "equals": "H100" }, "grade": 3 } + ] + }, + { + "id": "exact-002", + "category": "exact-bill-id", + "query": "h100", + "relevant": [ + { "rule": { "field": "number", "equals": "H100" }, "grade": 3 } + ] + }, + { + "id": "exact-003", + "category": "exact-bill-id", + "query": "H 100", + "relevant": [ + { "rule": { "field": "number", "equals": "H100" }, "grade": 3 } + ] + }, + { + "id": "exact-004", + "category": "exact-bill-id", + "query": "S.9", + "relevant": [ + { "rule": { "field": "number", "equals": "S9" }, "grade": 3 } + ] + }, + { + "id": "exact-005", + "category": "exact-bill-id", + "query": "s9", + "relevant": [ + { "rule": { "field": "number", "equals": "S9" }, "grade": 3 } + ] + }, + { + "id": "exact-006", + "category": "exact-bill-id", + "query": "S 2564", + "relevant": [ + { "rule": { "field": "number", "equals": "S2564" }, "grade": 3 } + ] + }, + { + "id": "exact-007", + "category": "exact-bill-id", + "query": "S2564", + "relevant": [ + { "rule": { "field": "number", "equals": "S2564" }, "grade": 3 } + ] + }, + { + "id": "exact-008", + "category": "exact-bill-id", + "query": "H.4374", + "relevant": [ + { "rule": { "field": "number", "equals": "H4374" }, "grade": 3 } + ] + }, + { + "id": "exact-009", + "category": "exact-bill-id", + "query": "h.73", + "relevant": [ + { "rule": { "field": "number", "equals": "H73" }, "grade": 3 } + ] + }, + { + "id": "exact-010", + "category": "exact-bill-id", + "query": "H3999", + "relevant": [ + { "rule": { "field": "number", "equals": "H3999" }, "grade": 3 } + ] + }, + { + "id": "exact-011", + "category": "exact-bill-id", + "query": "S.1333", + "relevant": [ + { "rule": { "field": "number", "equals": "S1333" }, "grade": 3 } + ] + }, + { + "id": "exact-012", + "category": "exact-bill-id", + "query": "s 2475", + "relevant": [ + { "rule": { "field": "number", "equals": "S2475" }, "grade": 3 } + ] + }, + { + "id": "exact-013", + "category": "exact-bill-id", + "query": "H600", + "relevant": [ + { "rule": { "field": "number", "equals": "H600" }, "grade": 3 } + ] + }, + { + "id": "exact-014", + "category": "exact-bill-id", + "query": "H.1", + "relevant": [ + { "rule": { "field": "number", "equals": "H1" }, "grade": 3 } + ] + }, + { + "id": "exact-015", + "category": "exact-bill-id", + "query": "S.1563", + "relevant": [ + { "rule": { "field": "number", "equals": "S1563" }, "grade": 3 } + ] + }, + + { + "id": "mc-001", + "category": "member-committee", + "query": "Diana DiZoglio", + "relevant": [ + { + "rule": { + "anyField": ["primarySponsor", "cosponsors"], + "equals": "Diana DiZoglio" + }, + "grade": 1 + } + ] + }, + { + "id": "mc-002", + "category": "member-committee", + "query": "Bruce Tarr", + "relevant": [ + { + "rule": { + "anyField": ["primarySponsor", "cosponsors"], + "equals": "Bruce E. Tarr" + }, + "grade": 1 + } + ] + }, + { + "id": "mc-003", + "category": "member-committee", + "query": "Jason Lewis", + "relevant": [ + { + "rule": { + "anyField": ["primarySponsor", "cosponsors"], + "equals": "Jason M. Lewis" + }, + "grade": 1 + } + ] + }, + { + "id": "mc-004", + "category": "member-committee", + "query": "Tackey Chan", + "relevant": [ + { + "rule": { + "anyField": ["primarySponsor", "cosponsors"], + "equals": "Tackey Chan" + }, + "grade": 1 + } + ] + }, + { + "id": "mc-005", + "category": "member-committee", + "query": "Julian Cyr", + "relevant": [ + { + "rule": { + "anyField": ["primarySponsor", "cosponsors"], + "equals": "Julian Cyr" + }, + "grade": 1 + } + ] + }, + { + "id": "mc-006", + "category": "member-committee", + "query": "Cynthia Creem", + "relevant": [ + { + "rule": { + "anyField": ["primarySponsor", "cosponsors"], + "equals": "Cynthia Stone Creem" + }, + "grade": 1 + } + ] + }, + { + "id": "mc-007", + "category": "member-committee", + "query": "Marjorie Decker", + "relevant": [ + { + "rule": { + "anyField": ["primarySponsor", "cosponsors"], + "equals": "Marjorie C. Decker" + }, + "grade": 1 + } + ] + }, + { + "id": "mc-008", + "category": "member-committee", + "query": "Michael Moore", + "relevant": [ + { + "rule": { + "anyField": ["primarySponsor", "cosponsors"], + "equals": "Michael O. Moore" + }, + "grade": 1 + } + ] + }, + { + "id": "mc-009", + "category": "member-committee", + "query": "Patrick O'Connor", + "relevant": [ + { + "rule": { + "anyField": ["primarySponsor", "cosponsors"], + "equals": "Patrick M. O'Connor" + }, + "grade": 1 + } + ] + }, + { + "id": "mc-010", + "category": "member-committee", + "query": "Aaron Michlewitz", + "relevant": [ + { + "rule": { + "anyField": ["primarySponsor", "cosponsors"], + "equals": "Aaron Michlewitz" + }, + "grade": 1 + } + ] + }, + { + "id": "mc-011", + "category": "member-committee", + "query": "Ways and Means Committee", + "relevant": [ + { + "rule": { "field": "currentCommittee", "contains": "Ways and Means" }, + "grade": 1 + } + ] + }, + { + "id": "mc-012", + "category": "member-committee", + "query": "Health Care Financing", + "relevant": [ + { + "rule": { + "field": "currentCommittee", + "contains": "Health Care Financing" + }, + "grade": 1 + } + ] + }, + { + "id": "mc-013", + "category": "member-committee", + "query": "Committee on Revenue", + "relevant": [ + { + "rule": { + "field": "currentCommittee", + "contains": "Committee on Revenue" + }, + "grade": 1 + } + ] + }, + { + "id": "mc-014", + "category": "member-committee", + "query": "Education Committee", + "relevant": [ + { + "rule": { "field": "currentCommittee", "contains": "Education" }, + "grade": 1 + } + ] + }, + { + "id": "mc-015", + "category": "member-committee", + "query": "Telecommunications Utilities and Energy", + "relevant": [ + { + "rule": { + "field": "currentCommittee", + "contains": "Telecommunications" + }, + "grade": 1 + } + ] + }, + + { + "id": "topic-001", + "category": "topic", + "query": "gun control", + "relevant": [ + { "rule": { "field": "title", "contains": "firearm" }, "grade": 1 }, + { "rule": { "field": "title", "contains": "gun" }, "grade": 1 }, + { "docId": "192-H4038", "grade": 3 }, + { "docId": "192-S1563", "grade": 3 } + ] + }, + { + "id": "topic-002", + "category": "topic", + "query": "mental health", + "relevant": [ + { + "rule": { "field": "title", "contains": "mental health" }, + "grade": 1 + }, + { "docId": "192-H1090", "grade": 3 }, + { "docId": "192-H1039", "grade": 3 } + ] + }, + { + "id": "topic-003", + "category": "topic", + "query": "climate change", + "relevant": [ + { "rule": { "field": "title", "contains": "climate" }, "grade": 1 }, + { "docId": "192-S9", "grade": 3 }, + { "docId": "192-H2159", "grade": 3 } + ] + }, + { + "id": "topic-004", + "category": "topic", + "query": "offshore wind", + "relevant": [ + { + "rule": { "field": "title", "contains": "offshore wind" }, + "grade": 1 + }, + { "docId": "192-H3302", "grade": 3 }, + { "docId": "192-H3310", "grade": 3 } + ] + }, + { + "id": "topic-005", + "category": "topic", + "query": "marijuana", + "relevant": [ + { "rule": { "field": "title", "contains": "marijuana" }, "grade": 1 }, + { "rule": { "field": "title", "contains": "cannabis" }, "grade": 1 }, + { "docId": "192-H154", "grade": 3 }, + { "docId": "192-H145", "grade": 3 } + ] + }, + { + "id": "topic-006", + "category": "topic", + "query": "minimum wage", + "relevant": [ + { + "rule": { "field": "title", "contains": "minimum wage" }, + "grade": 1 + }, + { "docId": "192-S1176", "grade": 3 }, + { "docId": "192-H2043", "grade": 3 } + ] + }, + { + "id": "topic-007", + "category": "topic", + "query": "charter schools", + "relevant": [ + { + "rule": { "field": "title", "contains": "charter school" }, + "grade": 1 + }, + { "docId": "192-H712", "grade": 3 }, + { "docId": "192-H696", "grade": 3 } + ] + }, + { + "id": "topic-008", + "category": "topic", + "query": "affordable housing", + "relevant": [ + { + "rule": { "field": "title", "contains": "affordable housing" }, + "grade": 1 + }, + { "docId": "192-H1384", "grade": 3 }, + { "docId": "192-H1386", "grade": 3 } + ] + }, + { + "id": "topic-009", + "category": "topic", + "query": "homelessness", + "relevant": [ + { "rule": { "field": "title", "contains": "homeless" }, "grade": 1 }, + { "docId": "192-H1436", "grade": 3 }, + { "docId": "192-H1385", "grade": 3 } + ] + }, + { + "id": "topic-010", + "category": "topic", + "query": "opioid addiction", + "relevant": [ + { "rule": { "field": "title", "contains": "opioid" }, "grade": 1 }, + { "docId": "192-H2086", "grade": 3 } + ] + }, + { + "id": "topic-011", + "category": "topic", + "query": "student loan forgiveness", + "relevant": [ + { + "rule": { "field": "title", "contains": "student loan" }, + "grade": 1 + }, + { "docId": "192-H1320", "grade": 3 } + ] + }, + { + "id": "topic-012", + "category": "topic", + "query": "domestic violence", + "relevant": [ + { + "rule": { "field": "title", "contains": "domestic violence" }, + "grade": 1 + }, + { "docId": "192-H1643", "grade": 3 }, + { "docId": "192-H1510", "grade": 3 } + ] + }, + { + "id": "topic-013", + "category": "topic", + "query": "sexual assault", + "relevant": [ + { + "rule": { "field": "title", "contains": "sexual assault" }, + "grade": 1 + }, + { "docId": "192-H1644", "grade": 3 }, + { "docId": "192-H1701", "grade": 3 } + ] + }, + { + "id": "topic-014", + "category": "topic", + "query": "solar energy", + "relevant": [ + { "rule": { "field": "title", "contains": "solar" }, "grade": 1 }, + { "docId": "192-H3260", "grade": 3 }, + { "docId": "192-H2164", "grade": 3 } + ] + }, + { + "id": "topic-015", + "category": "topic", + "query": "eviction", + "relevant": [ + { "rule": { "field": "title", "contains": "evict" }, "grade": 1 }, + { "docId": "192-H1808", "grade": 3 }, + { "docId": "192-H1911", "grade": 3 } + ] + }, + { + "id": "topic-016", + "category": "topic", + "query": "vaccines", + "relevant": [ + { "rule": { "field": "title", "contains": "vaccin" }, "grade": 1 }, + { "docId": "192-H2411", "grade": 3 } + ] + }, + { + "id": "topic-017", + "category": "topic", + "query": "telehealth", + "relevant": [ + { "rule": { "field": "title", "contains": "telehealth" }, "grade": 1 }, + { + "rule": { "field": "title", "contains": "telemedicine" }, + "grade": 1 + }, + { "docId": "192-H1101", "grade": 3 } + ] + }, + { + "id": "topic-018", + "category": "topic", + "query": "voting by mail", + "relevant": [ + { + "rule": { "field": "title", "contains": "voting by mail" }, + "grade": 1 + }, + { + "rule": { "field": "title", "contains": "mail in voting" }, + "grade": 1 + }, + { "docId": "192-H73", "grade": 3 }, + { "docId": "192-H787", "grade": 3 } + ] + }, + { + "id": "topic-019", + "category": "topic", + "query": "school lunch", + "relevant": [ + { + "rule": { "field": "title", "contains": "student nutrition" }, + "grade": 1 + }, + { "docId": "192-H3999", "grade": 3 }, + { "docId": "192-H715", "grade": 3 } + ] + }, + { + "id": "topic-020", + "category": "topic", + "query": "renewable energy", + "relevant": [ + { "rule": { "field": "title", "contains": "renewable" }, "grade": 1 } + ] + }, + + { + "id": "syn-001", + "category": "synonym", + "query": "firearms", + "relevant": [ + { "rule": { "field": "title", "contains": "firearm" }, "grade": 1 }, + { "rule": { "field": "title", "contains": "gun" }, "grade": 1 } + ] + }, + { + "id": "syn-002", + "category": "synonym", + "query": "guns", + "relevant": [ + { "rule": { "field": "title", "contains": "firearm" }, "grade": 1 }, + { "rule": { "field": "title", "contains": "gun" }, "grade": 1 } + ] + }, + { + "id": "syn-003", + "category": "synonym", + "query": "educator", + "relevant": [ + { "rule": { "field": "title", "contains": "educator" }, "grade": 1 }, + { "rule": { "field": "title", "contains": "teacher" }, "grade": 1 } + ] + }, + { + "id": "syn-004", + "category": "synonym", + "query": "teachers", + "relevant": [ + { "rule": { "field": "title", "contains": "educator" }, "grade": 1 }, + { "rule": { "field": "title", "contains": "teacher" }, "grade": 1 } + ] + }, + { + "id": "syn-005", + "category": "synonym", + "query": "cannabis", + "relevant": [ + { "rule": { "field": "title", "contains": "cannabis" }, "grade": 1 }, + { "rule": { "field": "title", "contains": "marijuana" }, "grade": 1 } + ] + }, + { + "id": "syn-006", + "category": "synonym", + "query": "doctors", + "relevant": [ + { "rule": { "field": "title", "contains": "physician" }, "grade": 1 } + ] + }, + { + "id": "syn-007", + "category": "synonym", + "query": "elderly", + "relevant": [ + { "rule": { "field": "title", "contains": "elderly" }, "grade": 1 }, + { "rule": { "field": "title", "contains": "older adult" }, "grade": 1 } + ] + }, + { + "id": "syn-008", + "category": "synonym", + "query": "senior citizens", + "relevant": [ + { + "rule": { "field": "title", "contains": "senior citizen" }, + "grade": 1 + }, + { "rule": { "field": "title", "contains": "elderly" }, "grade": 1 } + ] + }, + { + "id": "syn-009", + "category": "synonym", + "query": "liquor", + "relevant": [ + { "rule": { "field": "title", "contains": "liquor" }, "grade": 1 }, + { + "rule": { "field": "title", "contains": "alcoholic beverage" }, + "grade": 1 + } + ] + }, + { + "id": "syn-010", + "category": "synonym", + "query": "childcare", + "relevant": [ + { "rule": { "field": "title", "contains": "childcare" }, "grade": 1 } + ] + }, + + { + "id": "mis-001", + "category": "misspelling", + "query": "mental helth", + "sameAs": "topic-002" + }, + { + "id": "mis-002", + "category": "misspelling", + "query": "clmate change", + "sameAs": "topic-003" + }, + { + "id": "mis-003", + "category": "misspelling", + "query": "marijuanna", + "sameAs": "topic-005" + }, + { + "id": "mis-004", + "category": "misspelling", + "query": "afordable housing", + "sameAs": "topic-008" + }, + { + "id": "mis-005", + "category": "misspelling", + "query": "homelesness", + "sameAs": "topic-009" + }, + { + "id": "mis-006", + "category": "misspelling", + "query": "opiod", + "sameAs": "topic-010" + }, + { + "id": "mis-007", + "category": "misspelling", + "query": "domestic violance", + "sameAs": "topic-012" + }, + { + "id": "mis-008", + "category": "misspelling", + "query": "evicton", + "sameAs": "topic-015" + }, + { + "id": "mis-009", + "category": "misspelling", + "query": "vacines", + "sameAs": "topic-016" + }, + { + "id": "mis-010", + "category": "misspelling", + "query": "minimun wage", + "sameAs": "topic-006" + } + ] +} From 246ab4feeccc0152ed25a69b30c23b35263b1eac Mon Sep 17 00:00:00 2001 From: violet Date: Wed, 26 Aug 2026 15:20:59 -0400 Subject: [PATCH 04/16] Upgrade Typesense 0.24 -> 30.2: server pins, JS client 3.x, bundled adapter MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - typesense/typesense image 0.24.0 -> 30.2 in infra/Dockerfile.search (local docker-compose) and the repo-checks CI service container; the dormant k8s chart's 0.24.0 pin is marked not-deployed and the two live pins cross-referenced so they stay in sync - typesense JS client ^1.2.2 -> ^3.0.6 in root and functions (+ @babel/runtime peer dep); typesense-instantsearch-adapter ^2.4.0 -> ^3.0.2 - SearchIndexer: use documents(id).delete() (3.x reserves documents().delete() for delete-by-query); narrow import failures via filter(!success) and log the fail response's top-level id, falling back to document.id - functions typescript 4.5.5 -> 5.3.3 (typesense 3.x type defs require TS >= 5.0). Adapter 3.x requires node >= 22; this branch sits on the standalone node-22 bump that provides it (engines, CI, runtime, deploy action) - transpilePackages the adapter: 3.0.2 ships ESM syntax in .js files with extensionless relative imports under a CJS package.json, so Next's server externalization hit ERR_MODULE_NOT_FOUND and /bills, /testimony and /hearings returned 500; webpack resolves the extensionless imports fine The live dev/prod Typesense servers (AWS ECS, managed in maple-testimony/ infra) must be upgraded to 30.2 before deploying the functions in this change. Eval scorecard recorded: relevance-neutral vs the 0.24 baseline — zero delta on recall@10/MRR/nDCG@10 across all categories (overall 0.651/0.767/0.525 unchanged); only 4/70 queries differ in top-10 and none move a relevant document. Closes the eval gate on #77. Also verified locally against 30.2: functions typecheck and unit tests, the skipped search integration suite run unskipped, and the full CI integration test list (51/51). Co-Authored-By: Claude Fable 5 --- .github/workflows/repo-checks.yml | 3 +- functions/package.json | 4 +- functions/src/search/SearchIndexer.ts | 21 +- functions/yarn.lock | 84 +- infra/Dockerfile.search | 3 +- infra/app/templates/typesense-deployment.yml | 2 + next.config.js | 6 + package.json | 4 +- tests/search-eval/baselines/typesense-30.json | 1514 +++++++++++++++++ yarn.lock | 80 +- 10 files changed, 1657 insertions(+), 64 deletions(-) create mode 100644 tests/search-eval/baselines/typesense-30.json diff --git a/.github/workflows/repo-checks.yml b/.github/workflows/repo-checks.yml index 85786ce0e..77087d21b 100644 --- a/.github/workflows/repo-checks.yml +++ b/.github/workflows/repo-checks.yml @@ -49,7 +49,8 @@ jobs: services: typesense: - image: typesense/typesense:0.24.0 + # Keep in sync with infra/Dockerfile.search + image: typesense/typesense:30.2 ports: - 8108:8108 env: diff --git a/functions/package.json b/functions/package.json index 21b337856..d16819f27 100644 --- a/functions/package.json +++ b/functions/package.json @@ -33,7 +33,7 @@ "pdf-parse": "1.1.1", "runtypes": "6.6.0", "ssl-root-cas": "^1.3.1", - "typesense": "^1.2.2", + "typesense": "^3.0.6", "unzipper": "^0.12.3", "zod": "^3.20.2" }, @@ -51,7 +51,7 @@ "jest": "^29.7.0", "rimraf": "^3.0.2", "ts-jest": "^29.2.5", - "typescript": "4.5.5" + "typescript": "5.3.3" }, "private": true } diff --git a/functions/src/search/SearchIndexer.ts b/functions/src/search/SearchIndexer.ts index b1488edba..4328f162a 100644 --- a/functions/src/search/SearchIndexer.ts +++ b/functions/src/search/SearchIndexer.ts @@ -2,7 +2,6 @@ import { Change } from "firebase-functions" import { isEqual, last } from "lodash" import hash from "object-hash" import Collection from "typesense/lib/Typesense/Collection" -import { ImportResponse } from "typesense/lib/Typesense/Documents" import { ImportError, ObjectNotFound } from "typesense/lib/Typesense/Errors" import { db, DocumentData, DocumentSnapshot, QuerySnapshot } from "../firebase" import { createClient } from "./client" @@ -83,7 +82,7 @@ export class SearchIndexer { if (!afterData || !this.passesFilter(afterData)) { if (beforeData && this.passesFilter(beforeData)) { const { id } = this.config.convert(beforeData) - await (await this.getCollection()).documents().delete(id) + await (await this.getCollection()).documents(id).delete() } return } @@ -150,18 +149,14 @@ export class SearchIndexer { await collection.documents().import(docs, { action: "upsert" }) } catch (e) { if (e instanceof ImportError) { - const results = e.importResults as unknown as ImportResponse[] console.error( - results - .map( - r => - !r.success && { - code: r.code, - error: r.error, - id: r.document.id - } - ) - .filter(Boolean) + e.importResults + .filter(r => !r.success) + .map(r => ({ + code: r.code, + error: r.error, + id: r.id ?? r.document?.id + })) ) } throw e diff --git a/functions/yarn.lock b/functions/yarn.lock index c4190ab58..bfd740395 100644 --- a/functions/yarn.lock +++ b/functions/yarn.lock @@ -400,6 +400,11 @@ dependencies: regenerator-runtime "^0.14.0" +"@babel/runtime@^7.24.1": + version "7.29.7" + resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.29.7.tgz#12022450c45a4da6d8d8287b18a4ff2ddb23f768" + integrity sha512-Nq8OhGWiZIZGV6hLHoyAKLLcJihP/xFeBMGJoUrxTX2psI8dCifzLhZISFb+VWS3wFMRDmCGw5R+dOySCqPLhw== + "@babel/template@^7.22.15", "@babel/template@^7.3.3": version "7.22.15" resolved "https://registry.npmjs.org/@babel/template/-/template-7.22.15.tgz" @@ -1885,12 +1890,15 @@ axios@^0.25.0: dependencies: follow-redirects "^1.14.7" -axios@^0.26.0: - version "0.26.1" - resolved "https://registry.npmjs.org/axios/-/axios-0.26.1.tgz" - integrity sha512-fPwcX4EvnSHuInCMItEhAGnaSEXRBjtzh9fOtsE6E1G6p7vl7edEeZe11QHf18+6+9gR5PbKV/sGKNaD8YaMeA== +axios@^1.15.0: + version "1.19.0" + resolved "https://registry.yarnpkg.com/axios/-/axios-1.19.0.tgz#ddf864d4c8233c0e6873746ab59361537d05ad39" + integrity sha512-ht/iuYZXEjFxLH/Hkezgd7m6JKlHHXEUSneaDz8uZe1Gj5QZtCnpyDsckvAiEnT89OEbCLmnte4R4sn7P0EKFw== dependencies: - follow-redirects "^1.14.8" + follow-redirects "^1.16.0" + form-data "^4.0.6" + https-proxy-agent "^5.0.1" + proxy-from-env "^2.1.0" b4a@^1.6.4: version "1.6.7" @@ -3477,11 +3485,16 @@ fn.name@1.x.x: resolved "https://registry.npmjs.org/fn.name/-/fn.name-1.1.0.tgz" integrity sha512-GRnmB5gPyJpAhTQdSZTSp9uaPSvl09KoYcMQtsB9rQoOmzs9dH6ffeccH+Z+cv6P68Hu5bC6JjRh4Ah/mHSNRw== -follow-redirects@^1.14.7, follow-redirects@^1.14.8: +follow-redirects@^1.14.7: version "1.15.3" resolved "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.3.tgz" integrity sha512-1VzOtuEM8pC9SFU1E+8KfTjZyMztRsgEfwQl44z8A25uy13jSzTj6dyK2Df52iV0vgHCfBwLhDWevLn95w5v6Q== +follow-redirects@^1.16.0: + version "1.16.0" + resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.16.0.tgz#28474a159d3b9d11ef62050a14ed60e4df6d61bc" + integrity sha512-y5rN/uOsadFT/JfYwhxRS5R7Qce+g3zG97+JrtFZlC9klX/W5hD7iiLzScI4nZqUS7DNUdhPgw4xI8W2LuXlUw== + foreground-child@^3.1.0: version "3.2.1" resolved "https://registry.npmjs.org/foreground-child/-/foreground-child-3.2.1.tgz" @@ -3512,6 +3525,17 @@ form-data@^4.0.1: es-set-tostringtag "^2.1.0" mime-types "^2.1.12" +form-data@^4.0.6: + version "4.0.6" + resolved "https://registry.yarnpkg.com/form-data/-/form-data-4.0.6.tgz#28e864e1b786dbebb68db1f452f9635278665827" + integrity sha512-vKatAh4SlVfgbv+YtmhiRjhEMJsYpsG1Y2rMQtR+SVSbytsSD1YGzDIcrAJmdFec88u/+VoGmxnl+80gL1tRCQ== + dependencies: + asynckit "^0.4.0" + combined-stream "^1.0.8" + es-set-tostringtag "^2.1.0" + hasown "^2.0.4" + mime-types "^2.1.35" + formdata-polyfill@^4.0.10: version "4.0.10" resolved "https://registry.yarnpkg.com/formdata-polyfill/-/formdata-polyfill-4.0.10.tgz#24807c31c9d402e002ab3d8c720144ceb8848423" @@ -4037,6 +4061,13 @@ hasown@^2.0.0, hasown@^2.0.2: dependencies: function-bind "^1.1.2" +hasown@^2.0.4: + version "2.0.4" + resolved "https://registry.yarnpkg.com/hasown/-/hasown-2.0.4.tgz#8c62d8cb90beb2aad5d0a5b67581ad9854c3f003" + integrity sha512-T2UbfbBEF32wiepXIsMlTW9+dDYC6wMh/t/vYA4tuOMKqWz/n3vr1NFSxQiyP+zk2mXsoMA/i/7qV6LKut1t1A== + dependencies: + function-bind "^1.1.2" + heap-js@^2.2.0: version "2.3.0" resolved "https://registry.npmjs.org/heap-js/-/heap-js-2.3.0.tgz" @@ -4102,7 +4133,7 @@ http-proxy-agent@^7.0.0, http-proxy-agent@^7.0.1, http-proxy-agent@^7.0.2: agent-base "^7.1.0" debug "^4.3.4" -https-proxy-agent@^5.0.0: +https-proxy-agent@^5.0.0, https-proxy-agent@^5.0.1: version "5.0.1" resolved "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz" integrity sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA== @@ -5251,10 +5282,10 @@ logform@^2.3.2, logform@^2.4.0: safe-stable-stringify "^2.3.1" triple-beam "^1.3.0" -loglevel@^1.8.0: - version "1.8.1" - resolved "https://registry.npmjs.org/loglevel/-/loglevel-1.8.1.tgz" - integrity sha512-tCRIJM51SHjAayKwC+QAg8hT8vg6z7GSgLJKGvzuPb1Wc+hLzqtuVLxp6/HzSPOozuK+8ErAhy7U/sVzw8Dgfg== +loglevel@^1.9.2: + version "1.9.2" + resolved "https://registry.yarnpkg.com/loglevel/-/loglevel-1.9.2.tgz#c2e028d6c757720107df4e64508530db6621ba08" + integrity sha512-HgMmCqIJSAKqo68l0rS2AanEWfkxaZ5wNiEFb5ggm08lDs9Xl2KxBlX3PTcaD2chBM1gXAYf491/M2Rv8Jwayg== long@^4.0.0: version "4.0.0" @@ -6390,6 +6421,11 @@ proxy-from-env@^1.1.0: resolved "https://registry.yarnpkg.com/proxy-from-env/-/proxy-from-env-1.1.0.tgz#e102f16ca355424865755d2c9e8ea4f24d58c3e2" integrity sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg== +proxy-from-env@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/proxy-from-env/-/proxy-from-env-2.1.0.tgz#a7487568adad577cfaaa7e88c49cab3ab3081aba" + integrity sha512-cJ+oHTW1VAEa8cJslgmUZrc+sjRKgAKl3Zyse6+PV38hZe/V6Z14TbCuXcan9F9ghlz4QrFr2c92TNF82UkYHA== + pump@^3.0.0: version "3.0.0" resolved "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz" @@ -7422,6 +7458,11 @@ tslib@^2.0.1, tslib@^2.1.0: resolved "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz" integrity sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q== +tslib@^2.8.1: + version "2.8.1" + resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.8.1.tgz#612efe4ed235d567e8aba5f2a5fab70280ade83f" + integrity sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w== + tsscmp@^1.0.6: version "1.0.6" resolved "https://registry.yarnpkg.com/tsscmp/-/tsscmp-1.0.6.tgz#85b99583ac3589ec4bfef825b5000aa911d605eb" @@ -7469,18 +7510,19 @@ typedarray-to-buffer@^3.1.5: dependencies: is-typedarray "^1.0.0" -typescript@4.5.5: - version "4.5.5" - resolved "https://registry.npmjs.org/typescript/-/typescript-4.5.5.tgz" - integrity sha512-TCTIul70LyWe6IJWT8QSYeA54WQe8EjQFU4wY52Fasj5UKx88LNYKCgBEHcOMOrFF1rKGbD8v/xcNWVUq9SymA== +typescript@5.3.3: + version "5.3.3" + resolved "https://registry.yarnpkg.com/typescript/-/typescript-5.3.3.tgz#b3ce6ba258e72e6305ba66f5c9b452aaee3ffe37" + integrity sha512-pXWcraxM0uxAS+tN0AG/BF2TyqmHO014Z070UsJ+pFvYuRSq8KH8DmWpnbXe0pEPDHXZV3FcAbJkijJ5oNEnWw== -typesense@^1.2.2: - version "1.7.2" - resolved "https://registry.npmjs.org/typesense/-/typesense-1.7.2.tgz" - integrity sha512-hgQESOiyNJq+w2mpRJa/a1UMhWtJ/+sb0p7NoeCDSkikm9sasisJdnc7uhQchM6vTWKw2sMLWUBNbAhItR6zUQ== +typesense@^3.0.6: + version "3.0.6" + resolved "https://registry.yarnpkg.com/typesense/-/typesense-3.0.6.tgz#41a4094d26b214bb8c1be52e7824eccf728764e8" + integrity sha512-d3LL1qOLS8FCRxgAOqH+uDuK+VVA+/HYI1frU9fjYVwOg68mg/dX6XTtZ4yKKAkDCasB/se5uh/ZpMdOz/uJNg== dependencies: - axios "^0.26.0" - loglevel "^1.8.0" + axios "^1.15.0" + loglevel "^1.9.2" + tslib "^2.8.1" uc.micro@^1.0.1, uc.micro@^1.0.5: version "1.0.6" diff --git a/infra/Dockerfile.search b/infra/Dockerfile.search index e5dfe7d8f..8ebce0bb1 100644 --- a/infra/Dockerfile.search +++ b/infra/Dockerfile.search @@ -1,3 +1,4 @@ -FROM typesense/typesense:0.24.0 +# Keep in sync with the typesense service image in .github/workflows/repo-checks.yml +FROM typesense/typesense:30.2 RUN apt update && apt install -y curl \ No newline at end of file diff --git a/infra/app/templates/typesense-deployment.yml b/infra/app/templates/typesense-deployment.yml index afb266e15..4bf84ce9b 100644 --- a/infra/app/templates/typesense-deployment.yml +++ b/infra/app/templates/typesense-deployment.yml @@ -17,6 +17,8 @@ spec: spec: containers: - name: typesense + # Dormant: this chart is not deployed. The live Typesense servers run + # on AWS ECS, managed in https://github.com/maple-testimony/infra. image: typesense/typesense:0.24.0 ports: - containerPort: 8108 diff --git a/next.config.js b/next.config.js index 154e17d70..81c66826a 100644 --- a/next.config.js +++ b/next.config.js @@ -1,6 +1,12 @@ const i18Config = require("./next-i18next.config") const config = { + /** typesense-instantsearch-adapter 3.x ships ESM syntax in .js files whose + * package main is not marked "type": "module", so Next's default server + * externalization require()s it and node fails on its extensionless relative + * imports — 500ing every search page. Transpiling bundles it instead. + */ + transpilePackages: ["typesense-instantsearch-adapter"], images: { loader: "custom" }, diff --git a/package.json b/package.json index 6d93381f8..1445e1eef 100644 --- a/package.json +++ b/package.json @@ -139,8 +139,8 @@ "runtypes": "6.6.0", "sidebar-v2": "^0.4.0", "styled-components": "^5.3.3", - "typesense": "^1.2.2", - "typesense-instantsearch-adapter": "^2.4.0", + "typesense": "^3.0.6", + "typesense-instantsearch-adapter": "^3.0.2", "usehooks-ts": "^2.5.3", "web-vitals": "^0.2.4", "zod": "^3.20.2" diff --git a/tests/search-eval/baselines/typesense-30.json b/tests/search-eval/baselines/typesense-30.json new file mode 100644 index 000000000..65bbcfcb4 --- /dev/null +++ b/tests/search-eval/baselines/typesense-30.json @@ -0,0 +1,1514 @@ +{ + "meta": { + "env": "local", + "url": "", + "collection": "bills_eval", + "serverVersion": "30.2", + "corpusMd5": "a0499d7bb8597f88dbd737893bcd8a4d", + "gitSha": "a1661656ddfb64d6c8f55aee9dc302a2929bf114", + "timestamp": "2026-08-18T19:08:05.186Z", + "sortBy": "_text_match:desc,testimonyCount:desc", + "court": 192, + "skippedQueries": [] + }, + "overall": { + "recallAt10": 0.6514285714285716, + "mrr": 0.7673015873015874, + "ndcgAt10": 0.5251301729907821, + "queryCount": 70 + }, + "categories": { + "exact-bill-id": { + "recallAt10": 0.8, + "mrr": 0.8, + "ndcgAt10": 0.8, + "queryCount": 15 + }, + "member-committee": { + "recallAt10": 0.09333333333333334, + "mrr": 0.2733333333333333, + "ndcgAt10": 0.11884984315846131, + "queryCount": 15 + }, + "misspelling": { + "recallAt10": 0.8699999999999999, + "mrr": 1, + "ndcgAt10": 0.4985867229196039, + "queryCount": 10 + }, + "synonym": { + "recallAt10": 0.7899999999999999, + "mrr": 0.9, + "ndcgAt10": 0.8262463153675897, + "queryCount": 10 + }, + "topic": { + "recallAt10": 0.78, + "mrr": 0.9305555555555556, + "ndcgAt10": 0.4864017039552942, + "queryCount": 20 + } + }, + "queries": [ + { + "id": "exact-001", + "category": "exact-bill-id", + "query": "H.100", + "metrics": { + "recallAt10": 1, + "mrr": 1, + "ndcgAt10": 1 + }, + "top10": [ + "192-H100", + "192-H1002", + "192-H1001", + "192-H1000", + "192-H1006", + "192-H1004", + "192-H1003", + "192-H1009", + "192-H1008", + "192-H1007" + ], + "relevantCount": 1 + }, + { + "id": "exact-002", + "category": "exact-bill-id", + "query": "h100", + "metrics": { + "recallAt10": 1, + "mrr": 1, + "ndcgAt10": 1 + }, + "top10": [ + "192-H100", + "192-H1002", + "192-H1001", + "192-H1000", + "192-H1006", + "192-H1004", + "192-H1003", + "192-H1009", + "192-H1008", + "192-H1007" + ], + "relevantCount": 1 + }, + { + "id": "exact-003", + "category": "exact-bill-id", + "query": "H 100", + "metrics": { + "recallAt10": 0, + "mrr": 0, + "ndcgAt10": 0 + }, + "top10": [ + "192-H1795", + "192-S904", + "192-S9", + "192-S898", + "192-S873", + "192-S805", + "192-S804", + "192-S782", + "192-S771", + "192-S766" + ], + "relevantCount": 1 + }, + { + "id": "exact-004", + "category": "exact-bill-id", + "query": "S.9", + "metrics": { + "recallAt10": 1, + "mrr": 1, + "ndcgAt10": 1 + }, + "top10": [ + "192-S9", + "192-S992", + "192-S99", + "192-S978", + "192-S973", + "192-S944", + "192-S94", + "192-S931", + "192-S909", + "192-S902" + ], + "relevantCount": 1 + }, + { + "id": "exact-005", + "category": "exact-bill-id", + "query": "s9", + "metrics": { + "recallAt10": 1, + "mrr": 1, + "ndcgAt10": 1 + }, + "top10": [ + "192-S9", + "192-S992", + "192-S99", + "192-S978", + "192-S973", + "192-S944", + "192-S94", + "192-S931", + "192-S909", + "192-S902" + ], + "relevantCount": 1 + }, + { + "id": "exact-006", + "category": "exact-bill-id", + "query": "S 2564", + "metrics": { + "recallAt10": 0, + "mrr": 0, + "ndcgAt10": 0 + }, + "top10": [ + "192-H4352" + ], + "relevantCount": 1 + }, + { + "id": "exact-007", + "category": "exact-bill-id", + "query": "S2564", + "metrics": { + "recallAt10": 1, + "mrr": 1, + "ndcgAt10": 1 + }, + "top10": [ + "192-S2564" + ], + "relevantCount": 1 + }, + { + "id": "exact-008", + "category": "exact-bill-id", + "query": "H.4374", + "metrics": { + "recallAt10": 1, + "mrr": 1, + "ndcgAt10": 1 + }, + "top10": [ + "192-H4374" + ], + "relevantCount": 1 + }, + { + "id": "exact-009", + "category": "exact-bill-id", + "query": "h.73", + "metrics": { + "recallAt10": 1, + "mrr": 1, + "ndcgAt10": 1 + }, + "top10": [ + "192-H73", + "192-H739", + "192-H737", + "192-H736", + "192-H735", + "192-H734", + "192-H733", + "192-H732", + "192-H731", + "192-H730" + ], + "relevantCount": 1 + }, + { + "id": "exact-010", + "category": "exact-bill-id", + "query": "H3999", + "metrics": { + "recallAt10": 1, + "mrr": 1, + "ndcgAt10": 1 + }, + "top10": [ + "192-H3999" + ], + "relevantCount": 1 + }, + { + "id": "exact-011", + "category": "exact-bill-id", + "query": "S.1333", + "metrics": { + "recallAt10": 1, + "mrr": 1, + "ndcgAt10": 1 + }, + "top10": [ + "192-S1333" + ], + "relevantCount": 1 + }, + { + "id": "exact-012", + "category": "exact-bill-id", + "query": "s 2475", + "metrics": { + "recallAt10": 0, + "mrr": 0, + "ndcgAt10": 0 + }, + "top10": [ + "192-S2170", + "192-S2158", + "192-H3372", + "192-H3302" + ], + "relevantCount": 1 + }, + { + "id": "exact-013", + "category": "exact-bill-id", + "query": "H600", + "metrics": { + "recallAt10": 1, + "mrr": 1, + "ndcgAt10": 1 + }, + "top10": [ + "192-H600" + ], + "relevantCount": 1 + }, + { + "id": "exact-014", + "category": "exact-bill-id", + "query": "H.1", + "metrics": { + "recallAt10": 1, + "mrr": 1, + "ndcgAt10": 1 + }, + "top10": [ + "192-H1", + "192-S736", + "192-S451", + "192-S2759", + "192-S1841", + "192-S1633", + "192-S147", + "192-S130", + "192-S119", + "192-H4154" + ], + "relevantCount": 1 + }, + { + "id": "exact-015", + "category": "exact-bill-id", + "query": "S.1563", + "metrics": { + "recallAt10": 1, + "mrr": 1, + "ndcgAt10": 1 + }, + "top10": [ + "192-S1563" + ], + "relevantCount": 1 + }, + { + "id": "mc-001", + "category": "member-committee", + "query": "Diana DiZoglio", + "metrics": { + "recallAt10": 0.1, + "mrr": 1, + "ndcgAt10": 0.22009176629808017 + }, + "top10": [ + "192-S1698" + ], + "relevantCount": 444 + }, + { + "id": "mc-002", + "category": "member-committee", + "query": "Bruce Tarr", + "metrics": { + "recallAt10": 0, + "mrr": 0, + "ndcgAt10": 0 + }, + "top10": [ + "192-H4316" + ], + "relevantCount": 290 + }, + { + "id": "mc-003", + "category": "member-committee", + "query": "Jason Lewis", + "metrics": { + "recallAt10": 0, + "mrr": 0, + "ndcgAt10": 0 + }, + "top10": [ + "192-S1" + ], + "relevantCount": 527 + }, + { + "id": "mc-004", + "category": "member-committee", + "query": "Tackey Chan", + "metrics": { + "recallAt10": 0, + "mrr": 0, + "ndcgAt10": 0 + }, + "top10": [ + "192-S733", + "192-S571", + "192-S2737", + "192-S2523", + "192-S1796", + "192-S143", + "192-H877", + "192-H4433", + "192-H2908", + "192-H2833" + ], + "relevantCount": 198 + }, + { + "id": "mc-005", + "category": "member-committee", + "query": "Julian Cyr", + "metrics": { + "recallAt10": 0, + "mrr": 0, + "ndcgAt10": 0 + }, + "top10": [ + "192-S44", + "192-H3765" + ], + "relevantCount": 306 + }, + { + "id": "mc-006", + "category": "member-committee", + "query": "Cynthia Creem", + "metrics": { + "recallAt10": 0, + "mrr": 0, + "ndcgAt10": 0 + }, + "top10": [ + "192-H2756" + ], + "relevantCount": 106 + }, + { + "id": "mc-007", + "category": "member-committee", + "query": "Marjorie Decker", + "metrics": { + "recallAt10": 0, + "mrr": 0, + "ndcgAt10": 0 + }, + "top10": [], + "relevantCount": 143 + }, + { + "id": "mc-008", + "category": "member-committee", + "query": "Michael Moore", + "metrics": { + "recallAt10": 0.1, + "mrr": 1, + "ndcgAt10": 0.22009176629808017 + }, + "top10": [ + "192-S15", + "192-S2580" + ], + "relevantCount": 557 + }, + { + "id": "mc-009", + "category": "member-committee", + "query": "Patrick O'Connor", + "metrics": { + "recallAt10": 0, + "mrr": 0, + "ndcgAt10": 0 + }, + "top10": [ + "192-H4341", + "192-S7", + "192-S2544", + "192-H3476" + ], + "relevantCount": 663 + }, + { + "id": "mc-010", + "category": "member-committee", + "query": "Aaron Michlewitz", + "metrics": { + "recallAt10": 0, + "mrr": 0, + "ndcgAt10": 0 + }, + "top10": [ + "192-S2544", + "192-H3476" + ], + "relevantCount": 4 + }, + { + "id": "mc-011", + "category": "member-committee", + "query": "Ways and Means Committee", + "metrics": { + "recallAt10": 0, + "mrr": 0, + "ndcgAt10": 0 + }, + "top10": [ + "192-S1534", + "192-S1220", + "192-H629", + "192-H3415", + "192-H1968", + "192-S82", + "192-S785", + "192-S771", + "192-S364", + "192-S2626" + ], + "relevantCount": 715 + }, + { + "id": "mc-012", + "category": "member-committee", + "query": "Health Care Financing", + "metrics": { + "recallAt10": 0.8, + "mrr": 1, + "ndcgAt10": 0.8415908474314976 + }, + "top10": [ + "192-S798", + "192-S791", + "192-S787", + "192-S785", + "192-S782", + "192-S779", + "192-S770", + "192-S758", + "192-S743", + "192-S675" + ], + "relevantCount": 264 + }, + { + "id": "mc-013", + "category": "member-committee", + "query": "Committee on Revenue", + "metrics": { + "recallAt10": 0, + "mrr": 0, + "ndcgAt10": 0 + }, + "top10": [ + "192-S2743", + "192-S2070", + "192-S1866", + "192-S1731", + "192-S1730", + "192-H4518", + "192-H4513", + "192-H4429", + "192-H4428", + "192-H3803" + ], + "relevantCount": 111 + }, + { + "id": "mc-014", + "category": "member-committee", + "query": "Education Committee", + "metrics": { + "recallAt10": 0.3, + "mrr": 1, + "ndcgAt10": 0.43735247915031 + }, + "top10": [ + "192-S1220", + "192-H1968", + "192-S2769", + "192-S2756", + "192-S2755", + "192-S846", + "192-S387", + "192-S381", + "192-S378", + "192-S365" + ], + "relevantCount": 63 + }, + { + "id": "mc-015", + "category": "member-committee", + "query": "Telecommunications Utilities and Energy", + "metrics": { + "recallAt10": 0.1, + "mrr": 0.1, + "ndcgAt10": 0.06362078819895171 + }, + "top10": [ + "192-S2715", + "192-S2711", + "192-S2647", + "192-H4488", + "192-H4455", + "192-H4400", + "192-S568", + "192-S566", + "192-S2229", + "192-S2222" + ], + "relevantCount": 120 + }, + { + "id": "topic-001", + "category": "topic", + "query": "gun control", + "metrics": { + "recallAt10": 0.4, + "mrr": 0.5, + "ndcgAt10": 0.12111401772315426 + }, + "top10": [ + "192-H2527", + "192-S942", + "192-H1734", + "192-S939", + "192-S514", + "192-S1130", + "192-S1009", + "192-H43", + "192-H308", + "192-H2635" + ], + "relevantCount": 93 + }, + { + "id": "topic-002", + "category": "topic", + "query": "mental health", + "metrics": { + "recallAt10": 1, + "mrr": 1, + "ndcgAt10": 0.3170853252047272 + }, + "top10": [ + "192-S820", + "192-S703", + "192-S675", + "192-S636", + "192-S292", + "192-S2790", + "192-S2584", + "192-S2572", + "192-S2528", + "192-S2514" + ], + "relevantCount": 66 + }, + { + "id": "topic-003", + "category": "topic", + "query": "climate change", + "metrics": { + "recallAt10": 1, + "mrr": 1, + "ndcgAt10": 0.4491790547278348 + }, + "top10": [ + "192-S571", + "192-S2737", + "192-S1796", + "192-H877", + "192-H2908", + "192-H2833", + "192-H258", + "192-H2159", + "192-S1853", + "192-H2890" + ], + "relevantCount": 27 + }, + { + "id": "topic-004", + "category": "topic", + "query": "offshore wind", + "metrics": { + "recallAt10": 1, + "mrr": 1, + "ndcgAt10": 0.6186468626657726 + }, + "top10": [ + "192-S2227", + "192-S2154", + "192-H953", + "192-H4348", + "192-H3310", + "192-H3303", + "192-H3302", + "192-H3266", + "192-H2924", + "192-H4524" + ], + "relevantCount": 12 + }, + { + "id": "topic-005", + "category": "topic", + "query": "marijuana", + "metrics": { + "recallAt10": 1, + "mrr": 1, + "ndcgAt10": 0.3170853252047272 + }, + "top10": [ + "192-S76", + "192-S74", + "192-S73", + "192-S64", + "192-S2663", + "192-S2529", + "192-S1828", + "192-S1583", + "192-H4026", + "192-H3079" + ], + "relevantCount": 57 + }, + { + "id": "topic-006", + "category": "topic", + "query": "minimum wage", + "metrics": { + "recallAt10": 1, + "mrr": 1, + "ndcgAt10": 0.902688816176951 + }, + "top10": [ + "192-S1176", + "192-H1994", + "192-S1159", + "192-H2043", + "192-S1213", + "192-S1179", + "192-H1971", + "192-H1964", + "192-H1959", + "192-S805" + ], + "relevantCount": 4 + }, + { + "id": "topic-007", + "category": "topic", + "query": "charter schools", + "metrics": { + "recallAt10": 0.8, + "mrr": 1, + "ndcgAt10": 0.6172182802301824 + }, + "top10": [ + "192-S371", + "192-S353", + "192-S343", + "192-H712", + "192-H696", + "192-S386", + "192-S372", + "192-S286", + "192-H718", + "192-H672" + ], + "relevantCount": 13 + }, + { + "id": "topic-008", + "category": "topic", + "query": "affordable housing", + "metrics": { + "recallAt10": 1, + "mrr": 1, + "ndcgAt10": 0.3170853252047272 + }, + "top10": [ + "192-S903", + "192-S895", + "192-S888", + "192-S882", + "192-S868", + "192-S867", + "192-S2025", + "192-S1985", + "192-S1853", + "192-S1808" + ], + "relevantCount": 40 + }, + { + "id": "topic-009", + "category": "topic", + "query": "homelessness", + "metrics": { + "recallAt10": 1, + "mrr": 1, + "ndcgAt10": 0.43812463509980126 + }, + "top10": [ + "192-S874", + "192-S82", + "192-S142", + "192-S110", + "192-H3959", + "192-H3838", + "192-H3778", + "192-H264", + "192-H229", + "192-H1436" + ], + "relevantCount": 26 + }, + { + "id": "topic-010", + "category": "topic", + "query": "opioid addiction", + "metrics": { + "recallAt10": 0.4, + "mrr": 1, + "ndcgAt10": 0.7945202298211209 + }, + "top10": [ + "192-H2086", + "192-H2071", + "192-S2", + "192-S347", + "192-S2472", + "192-S2467", + "192-H2097", + "192-H2405", + "192-H3796", + "192-H2101" + ], + "relevantCount": 21 + }, + { + "id": "topic-011", + "category": "topic", + "query": "student loan forgiveness", + "metrics": { + "recallAt10": 0.3, + "mrr": 1, + "ndcgAt10": 0.48664114167177874 + }, + "top10": [ + "192-S1827", + "192-H2883", + "192-H1320", + "192-H3030", + "192-H1366", + "192-S2580" + ], + "relevantCount": 21 + }, + { + "id": "topic-012", + "category": "topic", + "query": "domestic violence", + "metrics": { + "recallAt10": 1, + "mrr": 1, + "ndcgAt10": 0.3170853252047272 + }, + "top10": [ + "192-S951", + "192-S702", + "192-S2678", + "192-S2417", + "192-S190", + "192-S176", + "192-S1123", + "192-S1076", + "192-S1023", + "192-S1015" + ], + "relevantCount": 26 + }, + { + "id": "topic-013", + "category": "topic", + "query": "sexual assault", + "metrics": { + "recallAt10": 1, + "mrr": 1, + "ndcgAt10": 0.3170853252047272 + }, + "top10": [ + "192-S939", + "192-S2678", + "192-S190", + "192-S176", + "192-S1488", + "192-S1134", + "192-S1087", + "192-S1073", + "192-H4330", + "192-H4013" + ], + "relevantCount": 26 + }, + { + "id": "topic-014", + "category": "topic", + "query": "solar energy", + "metrics": { + "recallAt10": 1, + "mrr": 1, + "ndcgAt10": 0.3170853252047272 + }, + "top10": [ + "192-S2208", + "192-S2203", + "192-S2180", + "192-S2174", + "192-S2168", + "192-S2145", + "192-S1896", + "192-S1326", + "192-H4044", + "192-H3346" + ], + "relevantCount": 34 + }, + { + "id": "topic-015", + "category": "topic", + "query": "eviction", + "metrics": { + "recallAt10": 0.5, + "mrr": 1, + "ndcgAt10": 0.5933275909929555 + }, + "top10": [ + "192-S921", + "192-H4505", + "192-H1808", + "192-H1911", + "192-S904", + "192-S891", + "192-S886", + "192-S883", + "192-S874", + "192-S865" + ], + "relevantCount": 24 + }, + { + "id": "topic-016", + "category": "topic", + "query": "vaccines", + "metrics": { + "recallAt10": 0.2, + "mrr": 1, + "ndcgAt10": 0.7237527203934739 + }, + "top10": [ + "192-H2411", + "192-H2394", + "192-S2626", + "192-S2622", + "192-S251", + "192-S2472", + "192-S2467", + "192-S2079", + "192-S2", + "192-S1755" + ], + "relevantCount": 12 + }, + { + "id": "topic-017", + "category": "topic", + "query": "telehealth", + "metrics": { + "recallAt10": 1, + "mrr": 1, + "ndcgAt10": 0.6310385047070085 + }, + "top10": [ + "192-S678", + "192-H125", + "192-H1101", + "192-S770", + "192-S766", + "192-S682", + "192-S2774", + "192-S2656", + "192-S2", + "192-S1470" + ], + "relevantCount": 3 + }, + { + "id": "topic-018", + "category": "topic", + "query": "voting by mail", + "metrics": { + "recallAt10": 0.6, + "mrr": 1, + "ndcgAt10": 0.40293031154000103 + }, + "top10": [ + "192-S28", + "192-H71", + "192-H73", + "192-S484", + "192-S451", + "192-H834", + "192-H805", + "192-H3950", + "192-S459", + "192-H4367" + ], + "relevantCount": 5 + }, + { + "id": "topic-019", + "category": "topic", + "query": "school lunch", + "metrics": { + "recallAt10": 0.4, + "mrr": 0.1111111111111111, + "ndcgAt10": 0.04633996212748669 + }, + "top10": [ + "192-S363", + "192-S349", + "192-S314", + "192-H714", + "192-H686", + "192-H580", + "192-H564", + "192-H547", + "192-S298", + "192-S2532" + ], + "relevantCount": 5 + }, + { + "id": "topic-020", + "category": "topic", + "query": "renewable energy", + "metrics": { + "recallAt10": 1, + "mrr": 1, + "ndcgAt10": 1 + }, + "top10": [ + "192-S590", + "192-S2738", + "192-S2153", + "192-S1940", + "192-H3330", + "192-H3269", + "192-H2159", + "192-H2145", + "192-S2157", + "192-H3964" + ], + "relevantCount": 21 + }, + { + "id": "syn-001", + "category": "synonym", + "query": "firearms", + "metrics": { + "recallAt10": 1, + "mrr": 1, + "ndcgAt10": 1 + }, + "top10": [ + "192-S2762", + "192-S1568", + "192-S1563", + "192-S1561", + "192-H43", + "192-H3847", + "192-H3846", + "192-H2635", + "192-H2533", + "192-H2505" + ], + "relevantCount": 93 + }, + { + "id": "syn-002", + "category": "synonym", + "query": "guns", + "metrics": { + "recallAt10": 0.8, + "mrr": 1, + "ndcgAt10": 0.8643145546088337 + }, + "top10": [ + "192-H2470", + "192-S1540", + "192-H2874", + "192-H2491", + "192-H2488", + "192-H2439", + "192-S942", + "192-S939", + "192-S1615", + "192-S1562" + ], + "relevantCount": 93 + }, + { + "id": "syn-003", + "category": "synonym", + "query": "educator", + "metrics": { + "recallAt10": 0.8, + "mrr": 1, + "ndcgAt10": 0.8701249883466593 + }, + "top10": [ + "192-S366", + "192-S2748", + "192-H682", + "192-H642", + "192-H127", + "192-S285", + "192-H675", + "192-H1620", + "192-S384", + "192-S377" + ], + "relevantCount": 39 + }, + { + "id": "syn-004", + "category": "synonym", + "query": "teachers", + "metrics": { + "recallAt10": 1, + "mrr": 1, + "ndcgAt10": 1 + }, + "top10": [ + "192-S1953", + "192-S1791", + "192-S1778", + "192-S1721", + "192-H628", + "192-H594", + "192-H2759", + "192-H2688", + "192-H2655", + "192-H2620" + ], + "relevantCount": 39 + }, + { + "id": "syn-005", + "category": "synonym", + "query": "cannabis", + "metrics": { + "recallAt10": 1, + "mrr": 1, + "ndcgAt10": 1 + }, + "top10": [ + "192-S77", + "192-S69", + "192-S63", + "192-S2664", + "192-S2662", + "192-S2661", + "192-S2660", + "192-H4507", + "192-H4440", + "192-H2056" + ], + "relevantCount": 57 + }, + { + "id": "syn-006", + "category": "synonym", + "query": "doctors", + "metrics": { + "recallAt10": 0, + "mrr": 0, + "ndcgAt10": 0 + }, + "top10": [ + "192-S2600", + "192-S2079", + "192-S1458", + "192-S1436", + "192-S1420", + "192-S1399", + "192-S1134", + "192-S1009", + "192-H4510", + "192-H437" + ], + "relevantCount": 15 + }, + { + "id": "syn-007", + "category": "synonym", + "query": "elderly", + "metrics": { + "recallAt10": 1, + "mrr": 1, + "ndcgAt10": 1 + }, + "top10": [ + "192-S878", + "192-S1948", + "192-H760", + "192-H730", + "192-H2911", + "192-H2846", + "192-H2820", + "192-H2773", + "192-S900", + "192-S399" + ], + "relevantCount": 27 + }, + { + "id": "syn-008", + "category": "synonym", + "query": "senior citizens", + "metrics": { + "recallAt10": 0.7, + "mrr": 1, + "ndcgAt10": 0.800693766409882 + }, + "top10": [ + "192-H723", + "192-S1961", + "192-H734", + "192-H732", + "192-H3734", + "192-H2903", + "192-H2947", + "192-S766", + "192-S252", + "192-H500" + ], + "relevantCount": 41 + }, + { + "id": "syn-009", + "category": "synonym", + "query": "liquor", + "metrics": { + "recallAt10": 1, + "mrr": 1, + "ndcgAt10": 1 + }, + "top10": [ + "192-S2215", + "192-H353", + "192-S2566", + "192-S2477", + "192-S246", + "192-S228", + "192-S227", + "192-S199", + "192-H473", + "192-H472" + ], + "relevantCount": 82 + }, + { + "id": "syn-010", + "category": "synonym", + "query": "childcare", + "metrics": { + "recallAt10": 0.6, + "mrr": 1, + "ndcgAt10": 0.727329844310522 + }, + "top10": [ + "192-S339", + "192-H649", + "192-H2884", + "192-H200", + "192-H1590", + "192-S1912", + "192-S852", + "192-S822", + "192-S358", + "192-S349" + ], + "relevantCount": 15 + }, + { + "id": "mis-001", + "category": "misspelling", + "query": "mental helth", + "metrics": { + "recallAt10": 1, + "mrr": 1, + "ndcgAt10": 0.3170853252047272 + }, + "top10": [ + "192-S820", + "192-S703", + "192-S675", + "192-S636", + "192-S292", + "192-S2790", + "192-S2584", + "192-S2572", + "192-S2528", + "192-S2514" + ], + "relevantCount": 66 + }, + { + "id": "mis-002", + "category": "misspelling", + "query": "clmate change", + "metrics": { + "recallAt10": 1, + "mrr": 1, + "ndcgAt10": 0.4491790547278348 + }, + "top10": [ + "192-S571", + "192-S2737", + "192-S1796", + "192-H877", + "192-H2908", + "192-H2833", + "192-H258", + "192-H2159", + "192-S1853", + "192-H2890" + ], + "relevantCount": 27 + }, + { + "id": "mis-003", + "category": "misspelling", + "query": "marijuanna", + "metrics": { + "recallAt10": 1, + "mrr": 1, + "ndcgAt10": 0.3170853252047272 + }, + "top10": [ + "192-S76", + "192-S74", + "192-S73", + "192-S64", + "192-S2663", + "192-S2529", + "192-S1828", + "192-S1583", + "192-H4026", + "192-H3079" + ], + "relevantCount": 57 + }, + { + "id": "mis-004", + "category": "misspelling", + "query": "afordable housing", + "metrics": { + "recallAt10": 1, + "mrr": 1, + "ndcgAt10": 0.3170853252047272 + }, + "top10": [ + "192-S903", + "192-S895", + "192-S888", + "192-S882", + "192-S868", + "192-S867", + "192-S2025", + "192-S1985", + "192-S1853", + "192-S1808" + ], + "relevantCount": 40 + }, + { + "id": "mis-005", + "category": "misspelling", + "query": "homelesness", + "metrics": { + "recallAt10": 1, + "mrr": 1, + "ndcgAt10": 0.43812463509980126 + }, + "top10": [ + "192-S874", + "192-S82", + "192-S142", + "192-S110", + "192-H3959", + "192-H3838", + "192-H3778", + "192-H264", + "192-H229", + "192-H1436" + ], + "relevantCount": 26 + }, + { + "id": "mis-006", + "category": "misspelling", + "query": "opiod", + "metrics": { + "recallAt10": 1, + "mrr": 1, + "ndcgAt10": 0.6104531109861133 + }, + "top10": [ + "192-S347", + "192-S1304", + "192-S1302", + "192-H2496", + "192-H2405", + "192-H2110", + "192-H2096", + "192-H2086", + "192-H2071", + "192-H2068" + ], + "relevantCount": 21 + }, + { + "id": "mis-007", + "category": "misspelling", + "query": "domestic violance", + "metrics": { + "recallAt10": 1, + "mrr": 1, + "ndcgAt10": 0.3170853252047272 + }, + "top10": [ + "192-S951", + "192-S702", + "192-S2678", + "192-S2417", + "192-S190", + "192-S176", + "192-S1123", + "192-S1076", + "192-S1023", + "192-S1015" + ], + "relevantCount": 26 + }, + { + "id": "mis-008", + "category": "misspelling", + "query": "evicton", + "metrics": { + "recallAt10": 0.5, + "mrr": 1, + "ndcgAt10": 0.5933275909929555 + }, + "top10": [ + "192-S921", + "192-H4505", + "192-H1808", + "192-H1911", + "192-S904", + "192-S891", + "192-S886", + "192-S883", + "192-S874", + "192-S865" + ], + "relevantCount": 24 + }, + { + "id": "mis-009", + "category": "misspelling", + "query": "vacines", + "metrics": { + "recallAt10": 0.2, + "mrr": 1, + "ndcgAt10": 0.7237527203934739 + }, + "top10": [ + "192-H2411", + "192-H2394", + "192-S2626", + "192-S2622", + "192-S251", + "192-S2472", + "192-S2467", + "192-S2079", + "192-S2", + "192-S1755" + ], + "relevantCount": 12 + }, + { + "id": "mis-010", + "category": "misspelling", + "query": "minimun wage", + "metrics": { + "recallAt10": 1, + "mrr": 1, + "ndcgAt10": 0.902688816176951 + }, + "top10": [ + "192-S1176", + "192-H1994", + "192-S1159", + "192-H2043", + "192-S1213", + "192-S1179", + "192-H1971", + "192-H1964", + "192-H1959", + "192-S805" + ], + "relevantCount": 4 + } + ] +} diff --git a/yarn.lock b/yarn.lock index 03bd7ee1c..9c3e3815a 100644 --- a/yarn.lock +++ b/yarn.lock @@ -6168,13 +6168,6 @@ axe-core@^4.10.0: resolved "https://registry.npmjs.org/axe-core/-/axe-core-4.10.0.tgz" integrity sha512-Mr2ZakwQ7XUAjp7pAwQWRhhK8mQQ6JAaNWSjmjxil0R8BPioMtQsTLOolGYkji1rcL++3dCqZA3zWqpT+9Ew6g== -axios@^0.26.0: - version "0.26.1" - resolved "https://registry.npmjs.org/axios/-/axios-0.26.1.tgz" - integrity sha512-fPwcX4EvnSHuInCMItEhAGnaSEXRBjtzh9fOtsE6E1G6p7vl7edEeZe11QHf18+6+9gR5PbKV/sGKNaD8YaMeA== - dependencies: - follow-redirects "^1.14.8" - axios@^0.27.2: version "0.27.2" resolved "https://registry.npmjs.org/axios/-/axios-0.27.2.tgz" @@ -6183,6 +6176,16 @@ axios@^0.27.2: follow-redirects "^1.14.9" form-data "^4.0.0" +axios@^1.15.0: + version "1.19.0" + resolved "https://registry.yarnpkg.com/axios/-/axios-1.19.0.tgz#ddf864d4c8233c0e6873746ab59361537d05ad39" + integrity sha512-ht/iuYZXEjFxLH/Hkezgd7m6JKlHHXEUSneaDz8uZe1Gj5QZtCnpyDsckvAiEnT89OEbCLmnte4R4sn7P0EKFw== + dependencies: + follow-redirects "^1.16.0" + form-data "^4.0.6" + https-proxy-agent "^5.0.1" + proxy-from-env "^2.1.0" + axobject-query@^3.2.1: version "3.2.1" resolved "https://registry.npmjs.org/axobject-query/-/axobject-query-3.2.1.tgz" @@ -9769,11 +9772,16 @@ fn.name@1.x.x: resolved "https://registry.npmjs.org/fn.name/-/fn.name-1.1.0.tgz" integrity sha512-GRnmB5gPyJpAhTQdSZTSp9uaPSvl09KoYcMQtsB9rQoOmzs9dH6ffeccH+Z+cv6P68Hu5bC6JjRh4Ah/mHSNRw== -follow-redirects@^1.14.8, follow-redirects@^1.14.9: +follow-redirects@^1.14.9: version "1.15.3" resolved "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.3.tgz" integrity sha512-1VzOtuEM8pC9SFU1E+8KfTjZyMztRsgEfwQl44z8A25uy13jSzTj6dyK2Df52iV0vgHCfBwLhDWevLn95w5v6Q== +follow-redirects@^1.16.0: + version "1.16.0" + resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.16.0.tgz#28474a159d3b9d11ef62050a14ed60e4df6d61bc" + integrity sha512-y5rN/uOsadFT/JfYwhxRS5R7Qce+g3zG97+JrtFZlC9klX/W5hD7iiLzScI4nZqUS7DNUdhPgw4xI8W2LuXlUw== + for-each@^0.3.3: version "0.3.3" resolved "https://registry.npmjs.org/for-each/-/for-each-0.3.3.tgz" @@ -9838,6 +9846,17 @@ form-data@^4.0.1: hasown "^2.0.2" mime-types "^2.1.12" +form-data@^4.0.6: + version "4.0.6" + resolved "https://registry.yarnpkg.com/form-data/-/form-data-4.0.6.tgz#28e864e1b786dbebb68db1f452f9635278665827" + integrity sha512-vKatAh4SlVfgbv+YtmhiRjhEMJsYpsG1Y2rMQtR+SVSbytsSD1YGzDIcrAJmdFec88u/+VoGmxnl+80gL1tRCQ== + dependencies: + asynckit "^0.4.0" + combined-stream "^1.0.8" + es-set-tostringtag "^2.1.0" + hasown "^2.0.4" + mime-types "^2.1.35" + forwarded@0.2.0: version "0.2.0" resolved "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz" @@ -10521,6 +10540,13 @@ hasown@^2.0.1, hasown@^2.0.2: dependencies: function-bind "^1.1.2" +hasown@^2.0.4: + version "2.0.4" + resolved "https://registry.yarnpkg.com/hasown/-/hasown-2.0.4.tgz#8c62d8cb90beb2aad5d0a5b67581ad9854c3f003" + integrity sha512-T2UbfbBEF32wiepXIsMlTW9+dDYC6wMh/t/vYA4tuOMKqWz/n3vr1NFSxQiyP+zk2mXsoMA/i/7qV6LKut1t1A== + dependencies: + function-bind "^1.1.2" + hast-util-whitespace@^2.0.0: version "2.0.1" resolved "https://registry.npmjs.org/hast-util-whitespace/-/hast-util-whitespace-2.0.1.tgz" @@ -12679,10 +12705,10 @@ logform@^2.3.2, logform@^2.4.0: safe-stable-stringify "^2.3.1" triple-beam "^1.3.0" -loglevel@^1.8.0: - version "1.8.1" - resolved "https://registry.npmjs.org/loglevel/-/loglevel-1.8.1.tgz" - integrity sha512-tCRIJM51SHjAayKwC+QAg8hT8vg6z7GSgLJKGvzuPb1Wc+hLzqtuVLxp6/HzSPOozuK+8ErAhy7U/sVzw8Dgfg== +loglevel@^1.9.2: + version "1.9.2" + resolved "https://registry.yarnpkg.com/loglevel/-/loglevel-1.9.2.tgz#c2e028d6c757720107df4e64508530db6621ba08" + integrity sha512-HgMmCqIJSAKqo68l0rS2AanEWfkxaZ5wNiEFb5ggm08lDs9Xl2KxBlX3PTcaD2chBM1gXAYf491/M2Rv8Jwayg== logrocket@^3.0.1: version "3.0.1" @@ -14982,6 +15008,11 @@ proxy-from-env@^1.0.0, proxy-from-env@^1.1.0: resolved "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz" integrity sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg== +proxy-from-env@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/proxy-from-env/-/proxy-from-env-2.1.0.tgz#a7487568adad577cfaaa7e88c49cab3ab3081aba" + integrity sha512-cJ+oHTW1VAEa8cJslgmUZrc+sjRKgAKl3Zyse6+PV38hZe/V6Z14TbCuXcan9F9ghlz4QrFr2c92TNF82UkYHA== + psl@^1.1.33: version "1.9.0" resolved "https://registry.npmjs.org/psl/-/psl-1.9.0.tgz" @@ -17573,7 +17604,7 @@ tslib@^2.0.0, tslib@^2.0.1, tslib@^2.0.3, tslib@^2.1.0, tslib@^2.3.0, tslib@^2.4 resolved "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz" integrity sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q== -tslib@^2.8.0: +tslib@^2.8.0, tslib@^2.8.1: version "2.8.1" resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.8.1.tgz#612efe4ed235d567e8aba5f2a5fab70280ade83f" integrity sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w== @@ -17759,20 +17790,21 @@ typescript@5.3.3: resolved "https://registry.npmjs.org/typescript/-/typescript-5.3.3.tgz" integrity sha512-pXWcraxM0uxAS+tN0AG/BF2TyqmHO014Z070UsJ+pFvYuRSq8KH8DmWpnbXe0pEPDHXZV3FcAbJkijJ5oNEnWw== -typesense-instantsearch-adapter@^2.4.0: - version "2.7.1" - resolved "https://registry.npmjs.org/typesense-instantsearch-adapter/-/typesense-instantsearch-adapter-2.7.1.tgz" - integrity sha512-GSEwkNzXoVcL4iSV/LDiZvjx/knctqfGLLKUNRe5twgzFprnoU07UUh2mQ5Z0/aP1moY/UpBF1bMKhTU6ECoAQ== +typesense-instantsearch-adapter@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/typesense-instantsearch-adapter/-/typesense-instantsearch-adapter-3.0.2.tgz#5a2fafd88eaeb5b9acab7d83a2879e0dc5969d7e" + integrity sha512-xVIXnzLAU4YsdTwJeRZqzPYeGOi1DHwFKBdTmsvHipZuOUfjSl9Ma8YUCBhjBeAkBkGuYEhEEPiiocr7g0WrfA== dependencies: - typesense "^1.7.0" + typesense "^3.0.3" -typesense@^1.2.2, typesense@^1.7.0: - version "1.7.2" - resolved "https://registry.npmjs.org/typesense/-/typesense-1.7.2.tgz" - integrity sha512-hgQESOiyNJq+w2mpRJa/a1UMhWtJ/+sb0p7NoeCDSkikm9sasisJdnc7uhQchM6vTWKw2sMLWUBNbAhItR6zUQ== +typesense@^3.0.3, typesense@^3.0.6: + version "3.0.6" + resolved "https://registry.yarnpkg.com/typesense/-/typesense-3.0.6.tgz#41a4094d26b214bb8c1be52e7824eccf728764e8" + integrity sha512-d3LL1qOLS8FCRxgAOqH+uDuK+VVA+/HYI1frU9fjYVwOg68mg/dX6XTtZ4yKKAkDCasB/se5uh/ZpMdOz/uJNg== dependencies: - axios "^0.26.0" - loglevel "^1.8.0" + axios "^1.15.0" + loglevel "^1.9.2" + tslib "^2.8.1" ufo@^1.3.2: version "1.4.0" From c3cb1bef2c11d9d8011016483ed8b49f76616272 Mon Sep 17 00:00:00 2001 From: violet Date: Wed, 26 Aug 2026 15:22:24 -0400 Subject: [PATCH 05/16] search: index versioning, chunked resumable backfill, status tooling MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Three pieces of reindex infrastructure (#85, #114): convertVersion escape hatch for stale index detection (#85). SearchIndexer names each collection after a hash of the config, but the hash covers convert.toString() only — the bodies of module-level helpers convert calls are invisible, so rewriting one changes what gets indexed without ever scheduling a reindex. Not hypothetical: ce137bdc (Nov 2024) rewrote buildTopicsForSearch and the live bills collection went per-document divergent for 21 months. CollectionConfig gains an optional convertVersion to force a rebuild; when unset the key is omitted from the hashed object, so introducing the field leaves every existing collection name untouched (verified: bills, hearings and publishedTestimony all hash exactly as before). Naming moves out of the constructor into searchCollectionName so the invariant is testable without firebase-admin or a Typesense client; one test pins a literal hash so an accidental key addition fails in CI rather than renaming all three collections in production. The one live blind spot is marked at buildTopicsForSearch, and the doc widened: the blind spot is the whole import graph convert reaches. Chunked backfill (#114). performUpgrade did create -> backfill -> upgradeAlias in one invocation with the cursor living only inside a generator: nothing resumed, nothing retried, and on dev bills is ~49,000 documents, so the run either fit in one timeout or never converged. The backfill is now a chain of chunk documents under the upgrade document, each carrying the cursor it resumes from (the scraper.ts idiom). upgradeSearchIndex only starts the run; runSearchBackfillChunk moves as much as its wall-clock budget allows, writes progress back, and either chains the next chunk or swaps the alias. failurePolicy gives retries; a chunk is idempotent (it upserts into a collection nothing is aliased to, from a cursor its own document fixes). Guards: a chunk from a superseded run is dropped (identity checked before the give-up age check), a chunk still failing after 30 minutes fails the run, the chain stops at 500. Chunk triggers are per-alias, emitted by createSearchIndexer with the config captured in the closure — no prefix sniffing, no registry lookup, no load-order requirement. Bookkeeping is absolute, not incremental, so a replayed chunk converges on the same totals (verified by verbatim replay: 30 batches / 7337 documents, not 59 / 14424). Firestore page size (250) is decoupled from the import payload, which is sliced by serialized bytes (6 MB against the AWS API Gateway 10 MB cap) and measured in bytes, not UTF-16 code units. The cursor is the last document's idField value — the value Firestore actually compares. numBatches keeps working as a whole-run budget, so {"check":true,"numBatches":1} still builds a one-page index and swaps the alias. The upgrade timeout takes the full 540s v1 ceiling. Verified end to end on the emulator against a local Typesense 30.2: full run, numBatches lever, resume from cursor, chunk replay, both supersede guards. Status tooling. typesense-admin status prints the server version, each alias with its live collection and document count, and any collection no alias points at — what an abandoned backfill leaves behind. yarn firebase-admin run-script searchUpgradeStatus prints each alias's run: status, target collection, documents and batches so far, and the cursor it is working from; it enumerates /search rather than hardcoding the alias triple, so a run left by a renamed alias still shows up. Verifying a deploy previously meant a REPL session against the cluster. Co-Authored-By: Claude Opus 5 --- functions/src/bills/search.ts | 10 +- functions/src/hearings/search.ts | 3 +- functions/src/index.ts | 3 + functions/src/search/SearchIndexer.test.ts | 154 ++++++++++++ functions/src/search/SearchIndexer.ts | 232 ++++++++++++------ functions/src/search/backfillRun.test.ts | 53 ++++ functions/src/search/backfillRun.ts | 122 +++++++++ functions/src/search/collectionName.test.ts | 99 ++++++++ functions/src/search/collectionName.ts | 39 +++ functions/src/search/config.ts | 6 + functions/src/search/createSearchIndexer.ts | 220 ++++++++++++++++- functions/src/testimony/search.ts | 3 +- scripts/firebase-admin/searchUpgradeStatus.ts | 58 +++++ scripts/typesense-admin.ts | 38 +++ tests/integration/search.test.ts | 6 +- 15 files changed, 961 insertions(+), 85 deletions(-) create mode 100644 functions/src/search/SearchIndexer.test.ts create mode 100644 functions/src/search/backfillRun.test.ts create mode 100644 functions/src/search/backfillRun.ts create mode 100644 functions/src/search/collectionName.test.ts create mode 100644 functions/src/search/collectionName.ts create mode 100644 scripts/firebase-admin/searchUpgradeStatus.ts diff --git a/functions/src/bills/search.ts b/functions/src/bills/search.ts index cfa7c5c09..0c34d2bf1 100644 --- a/functions/src/bills/search.ts +++ b/functions/src/bills/search.ts @@ -5,7 +5,8 @@ import { Bill, BillTopic } from "./types" export const { syncToSearchIndex: syncBillToSearchIndex, - upgradeSearchIndex: upgradeBillSearchIndex + upgradeSearchIndex: upgradeBillSearchIndex, + runBackfillChunk: runBillBackfillChunk } = createSearchIndexer({ sourceCollection: db.collectionGroup("bills"), documentTrigger: `generalCourts/{court}/bills/{id}`, @@ -71,6 +72,13 @@ export const { } }) +/** Called from `convert`, so the collection-name hash does not see this + * function's body (it hashes `convert.toString()` only). Rewriting it changes + * what gets indexed without scheduling a reindex — which is what happened in + * ce137bdc, leaving the live topic facets in the pre-Nov-2024 format until an + * unrelated schema change finally forced a rebuild. Set `convertVersion` on the + * config below when you edit this, or inline it into `convert`. + */ const buildTopicsForSearch = (billTopics: BillTopic[] = []) => { const categoriesSorted = billTopics.map(t => t.category).sort() diff --git a/functions/src/hearings/search.ts b/functions/src/hearings/search.ts index b36fe5e2f..2bcf8abc1 100644 --- a/functions/src/hearings/search.ts +++ b/functions/src/hearings/search.ts @@ -27,7 +27,8 @@ type HearingSearchRecord = { export const { syncToSearchIndex: syncHearingToSearchIndex, - upgradeSearchIndex: upgradeHearingSearchIndex + upgradeSearchIndex: upgradeHearingSearchIndex, + runBackfillChunk: runHearingBackfillChunk } = createSearchIndexer({ sourceCollection: db.collection("events").where("type", "==", "hearing"), documentTrigger: "events/{eventId}", diff --git a/functions/src/index.ts b/functions/src/index.ts index e11b30569..91138a764 100644 --- a/functions/src/index.ts +++ b/functions/src/index.ts @@ -3,6 +3,7 @@ export { backfillTestimonyCounts, fetchBillBatch, startBillBatches, + runBillBackfillChunk, syncBillToSearchIndex, updateBillReferences, updateBillSearchIndex, @@ -24,6 +25,7 @@ export { scrapeSingleHearingv2 } from "./events" export { + runHearingBackfillChunk, syncHearingToSearchIndex, upgradeHearingSearchIndex } from "./hearings/search" @@ -37,6 +39,7 @@ export { checkSearchIndexVersion, searchHealthCheck } from "./search" export { deleteTestimony, publishTestimony, + runTestimonyBackfillChunk, syncTestimonyToSearchIndex, upgradeTestimonySearchIndex, resolveReport as adminResolveReport diff --git a/functions/src/search/SearchIndexer.test.ts b/functions/src/search/SearchIndexer.test.ts new file mode 100644 index 000000000..5163dcfa5 --- /dev/null +++ b/functions/src/search/SearchIndexer.test.ts @@ -0,0 +1,154 @@ +import { CollectionConfig } from "./config" +import { IMPORT_BYTE_BUDGET, SearchIndexer } from "./SearchIndexer" + +jest.mock("../firebase", () => ({ + db: { doc: jest.fn(), recursiveDelete: jest.fn() }, + Timestamp: { now: () => ({}) } +})) + +const imports: any[][] = [] +jest.mock("./client", () => ({ + createClient: () => ({ + collections: () => ({ + exists: async () => true, + documents: () => ({ + import: async (docs: any[]) => { + imports.push(docs) + } + }) + }) + }) +})) + +/** A source that behaves like an ordered, cursor-paged Firestore query. */ +function fakeSource(docs: { id: string; body: string }[]) { + const build = (startAfter: string | null, pageSize: number): any => ({ + orderBy: () => build(startAfter, pageSize), + limit: (n: number) => build(startAfter, n), + startAfter: (cursor: string) => build(cursor, pageSize), + get: async () => { + const rest = + startAfter === null ? docs : docs.filter(d => d.id > startAfter) + const page = rest.slice(0, pageSize) + return { + size: page.length, + docs: page.map(d => ({ + exists: true, + id: d.id, + data: () => d, + get: (field: string) => (d as any)[field] + })) + } + } + }) + return build(null, 0) +} + +const pad = (n: number) => String(n).padStart(6, "0") + +const makeIndexer = (docs: { id: string; body: string }[]) => + new SearchIndexer({ + alias: "widgets", + schema: { fields: [{ name: "body", type: "string" }] }, + sourceCollection: fakeSource(docs) as any, + documentTrigger: "widgets/{id}", + idField: "id", + convert: (data: any) => ({ id: data.id, body: data.body }) + } as CollectionConfig) + +beforeEach(() => { + imports.length = 0 +}) + +describe("importInSlices", () => { + const chunk = { startAfter: null, budgetMs: 60_000 } + + it("imports a page that fits the byte budget in one call", async () => { + const docs = [1, 2, 3].map(n => ({ id: pad(n), body: "x".repeat(1000) })) + await makeIndexer(docs).backfillChunk(chunk) + expect(imports).toHaveLength(1) + expect(imports[0]).toHaveLength(3) + }) + + it("splits a page on the byte boundary, not the document count", async () => { + // Three documents at 40% of the budget each: two fit, the third does not. + const body = "x".repeat(Math.floor(IMPORT_BYTE_BUDGET * 0.4)) + const docs = [1, 2, 3].map(n => ({ id: pad(n), body })) + await makeIndexer(docs).backfillChunk(chunk) + expect(imports.map(i => i.length)).toEqual([2, 1]) + }) + + it("sends a single oversized document on its own", async () => { + const docs = [ + { id: pad(1), body: "x".repeat(1000) }, + { id: pad(2), body: "x".repeat(IMPORT_BYTE_BUDGET + 1) }, + { id: pad(3), body: "x".repeat(1000) } + ] + await makeIndexer(docs).backfillChunk(chunk) + expect(imports.map(i => i.map((d: any) => d.id))).toEqual([ + [pad(1)], + [pad(2)], + [pad(3)] + ]) + }) +}) + +describe("backfillChunk", () => { + const docs = Array.from({ length: 600 }, (_, n) => ({ + id: pad(n), + body: "x" + })) + + it("reports a null cursor and every document when the source is exhausted", async () => { + const result = await makeIndexer(docs).backfillChunk({ + startAfter: null, + budgetMs: 60_000 + }) + expect(result.cursor).toBeNull() + expect(result.batches).toBe(3) + expect(result.documents).toBe(600) + }) + + it("stops on the batch budget and hands back a resumable cursor", async () => { + const result = await makeIndexer(docs).backfillChunk({ + startAfter: null, + maxBatches: 1, + budgetMs: 60_000 + }) + expect(result.batches).toBe(1) + expect(result.documents).toBe(250) + expect(result.cursor).toBe(pad(249)) + }) + + it("resumes after the cursor it was handed", async () => { + const result = await makeIndexer(docs).backfillChunk({ + startAfter: pad(249), + budgetMs: 60_000 + }) + expect(result.documents).toBe(350) + expect(result.cursor).toBeNull() + expect(imports.flat().map(d => d.id)).not.toContain(pad(249)) + expect(imports.flat()[0].id).toBe(pad(250)) + }) + + it("counts documents that fail to convert without aborting the chunk", async () => { + const indexer = new SearchIndexer({ + alias: "widgets", + schema: { fields: [{ name: "body", type: "string" }] }, + sourceCollection: fakeSource(docs.slice(0, 3)) as any, + documentTrigger: "widgets/{id}", + idField: "id", + convert: (data: any) => { + if (data.id === pad(1)) throw Error("Invalid widget") + return { id: data.id, body: data.body } + } + } as CollectionConfig) + + const result = await indexer.backfillChunk({ + startAfter: null, + budgetMs: 60_000 + }) + expect(result.convertFailures).toBe(1) + expect(result.documents).toBe(2) + }) +}) diff --git a/functions/src/search/SearchIndexer.ts b/functions/src/search/SearchIndexer.ts index 4328f162a..34c81e755 100644 --- a/functions/src/search/SearchIndexer.ts +++ b/functions/src/search/SearchIndexer.ts @@ -1,39 +1,48 @@ import { Change } from "firebase-functions" import { isEqual, last } from "lodash" -import hash from "object-hash" import Collection from "typesense/lib/Typesense/Collection" import { ImportError, ObjectNotFound } from "typesense/lib/Typesense/Errors" -import { db, DocumentData, DocumentSnapshot, QuerySnapshot } from "../firebase" +import { + db, + DocumentData, + DocumentSnapshot, + QueryDocumentSnapshot +} from "../firebase" +import { BackfillConfig, upgradePath } from "./backfillRun" import { createClient } from "./client" +import { searchCollectionName } from "./collectionName" import { CollectionConfig } from "./config" -import { z } from "zod" import { Timestamp } from "../firebase" -export const BackfillConfig = z.object({ - numBatches: z.number().positive().optional() -}) -export type BackfillConfig = z.infer +/** Ceiling on one `documents().import()` body, held far enough under the 10 MB + * maximum payload of the AWS API Gateway HTTP API these collections sit behind + * that headers and encoding cannot push a batch over it. A batch over the cap + * is rejected outright and would fail the same way on every retry. Budgeting + * the import by serialized bytes rather than by document count is what makes + * that impossible: bills carry their full text in `body`, so a fixed count is + * safe at the mean and unsafe in the tail. + */ +export const IMPORT_BYTE_BUDGET = 6 * 1024 * 1024 + +export type BackfillChunkResult = { + /** `startAfter` value for the next chunk, or null when the source is spent. */ + cursor: string | null + batches: number + documents: number + convertFailures: number +} export class SearchIndexer { - private readonly batchSize = 100 + /** How many source documents to read per Firestore page. Independent of the + * import payload, which `importInSlices` sizes by bytes. */ + private readonly batchSize = 250 private readonly client = createClient() private readonly collectionName: string private collection: Collection | undefined constructor(private readonly config: CollectionConfig) { - const schemaHash = hash( - { - schema: config.schema, - filter: config.filter?.toString(), - convert: config.convert.toString() - }, - { - algorithm: "md5", - unorderedArrays: true - } - ) - this.collectionName = `${config.alias}_${schemaHash}` + this.collectionName = searchCollectionName(config) } private passesFilter(data: DocumentData | undefined) { @@ -47,7 +56,12 @@ export class SearchIndexer { } } - static upgradePath = (alias: string) => `/search/upgrade-${alias}` + /** The collection this config currently hashes to. A chunk compares it + * against the name recorded on the run to notice that the deployed code + * changed underneath an in-flight backfill. */ + get targetCollectionName() { + return this.collectionName + } async scheduleUpgradeIfNeeded(backfillConfig: unknown) { const config = BackfillConfig.parse(backfillConfig) @@ -57,8 +71,11 @@ export class SearchIndexer { console.log(`Index for alias ${alias} up to date: ${isCollectionUpToDate}`) if (!isCollectionUpToDate) { console.log(`Scheduling upgrade for alias ${alias}`) - const upgradeDoc = db.doc(SearchIndexer.upgradePath(alias)) - await upgradeDoc.delete() + const upgradeDoc = db.doc(upgradePath(alias)) + // Recursive, not a plain delete: deleting a document leaves its + // subcollections behind, and a surviving `chunks/0` from the previous run + // would make this run's `create` throw. + await db.recursiveDelete(upgradeDoc) await upgradeDoc.create({ createdAt: Timestamp.now(), ...config @@ -66,11 +83,14 @@ export class SearchIndexer { } } - async performUpgrade(backfillConfig: unknown) { - const config = BackfillConfig.parse(backfillConfig) - // Ensure collection exists + /** Ensures the target collection exists so chunks can import into it. */ + async beginUpgrade() { await this.getCollection() - await this.backfill(config) + } + + /** Points the alias at the freshly backfilled collection and drops the old + * one. Only called once the source is exhausted. */ + async finishUpgrade() { await this.upgradeAlias() } @@ -126,41 +146,100 @@ export class SearchIndexer { .create({ name: this.collectionName, ...this.config.schema }) } - private async backfill({ numBatches }: BackfillConfig) { + /** Moves as much of the source into the target collection as the given budget + * allows, starting after `startAfter`, and reports where it stopped. A null + * cursor in the result means the source is exhausted; anything else is the + * checkpoint the next chunk resumes from. + */ + async backfillChunk({ + startAfter, + maxBatches, + budgetMs + }: { + startAfter: string | null + maxBatches?: number + budgetMs: number + }): Promise { const { convert } = this.config - let currentBatch = 0 - for await (const batch of this.listCollection()) { - currentBatch++ - if (numBatches && currentBatch > numBatches) return - - const docs = batch.reduce((acc, d) => { - try { - const data = d.data() - if (!this.passesFilter(data)) return acc - const doc = convert(data) - acc.push(doc) - } catch (error: any) { - console.error(`Failed to convert document: ${error.message}`) - } - return acc - }, [] as any[]) - const collection = await this.getCollection() - try { - await collection.documents().import(docs, { action: "upsert" }) - } catch (e) { - if (e instanceof ImportError) { - console.error( - e.importResults - .filter(r => !r.success) - .map(r => ({ - code: r.code, - error: r.error, - id: r.id ?? r.document?.id - })) - ) - } - throw e + const deadline = Date.now() + budgetMs + let cursor: string | null = startAfter + let batches = 0 + let documents = 0 + let convertFailures = 0 + + while (maxBatches === undefined || batches < maxBatches) { + // Checked after the first page so a chunk always makes progress, however + // little budget it inherited. + if (batches > 0 && Date.now() >= deadline) break + + const page = await this.listPage(cursor) + cursor = page.cursor + + if (page.docs.length) { + batches++ + const docs = page.docs.reduce((acc, d) => { + try { + const data = d.data() + if (!this.passesFilter(data)) return acc + acc.push(convert(data)) + } catch (error: any) { + convertFailures++ + console.error(`Failed to convert document: ${error.message}`) + } + return acc + }, [] as any[]) + + await this.importInSlices(docs) + documents += docs.length } + + if (cursor === null) break + } + + return { cursor, batches, documents, convertFailures } + } + + private async importInSlices(docs: any[]) { + if (!docs.length) return + const collection = await this.getCollection() + let slice: any[] = [] + let bytes = 0 + + const flush = async () => { + if (!slice.length) return + await this.importDocuments(collection, slice) + slice = [] + bytes = 0 + } + + for (const doc of docs) { + // Bytes, not string length: the cap is on the encoded body, and `.length` + // counts UTF-16 units, which undercounts anything non-ASCII. +1 for the + // newline the client joins the JSONL body with. + const size = Buffer.byteLength(JSON.stringify(doc)) + 1 + if (slice.length && bytes + size > IMPORT_BYTE_BUDGET) await flush() + slice.push(doc) + bytes += size + } + await flush() + } + + private async importDocuments(collection: Collection, docs: any[]) { + try { + await collection.documents().import(docs, { action: "upsert" }) + } catch (e) { + if (e instanceof ImportError) { + console.error( + e.importResults + .filter(r => !r.success) + .map(r => ({ + code: r.code, + error: r.error, + id: r.id ?? r.document?.id + })) + ) + } + throw e } } @@ -186,18 +265,27 @@ export class SearchIndexer { } } - private async *listCollection() { - let token: string | undefined = "" - while (token !== undefined) { - const result: QuerySnapshot = await this.config.sourceCollection - .orderBy(this.config.idField) - .startAfter(token) - .limit(this.batchSize) - .get() - - const docs = result.docs.filter(d => d.exists) - token = last(docs)?.id - if (docs.length) yield docs + /** One ordered page of the source, with the cursor to resume after it — null + * once the source is exhausted, which a short page already tells us. + * + * The cursor is the last document's `idField` value, not its document id: the + * query orders by `idField`, so that is the value Firestore compares against, + * and it is the one that has to survive being written into a chunk document. + */ + private async listPage(startAfter: string | null): Promise<{ + docs: QueryDocumentSnapshot[] + cursor: string | null + }> { + let query = this.config.sourceCollection + .orderBy(this.config.idField) + .limit(this.batchSize) + if (startAfter !== null) query = query.startAfter(startAfter) + + const { docs } = await query.get() + const tail = docs.length < this.batchSize ? undefined : last(docs) + return { + docs, + cursor: tail ? tail.get(this.config.idField) ?? tail.id : null } } } diff --git a/functions/src/search/backfillRun.test.ts b/functions/src/search/backfillRun.test.ts new file mode 100644 index 000000000..bcf2deceb --- /dev/null +++ b/functions/src/search/backfillRun.test.ts @@ -0,0 +1,53 @@ +import { + aliasForUpgradeId, + chunkPath, + MAX_CHUNKS, + nextChunk, + upgradePath +} from "./backfillRun" + +const totals = { batches: 4, documents: 1000, convertFailures: 2 } +const run = { runId: "run-1", index: 0, cursor: "H1000", totals } + +describe("nextChunk", () => { + it("finishes when the source is exhausted", () => { + expect(nextChunk({ ...run, cursor: null })).toEqual({ type: "done" }) + }) + + it("chains the next chunk from the cursor and totals it was handed", () => { + expect(nextChunk(run)).toEqual({ + type: "next", + chunk: { runId: "run-1", index: 1, cursor: "H1000", before: totals } + }) + }) + + it("finishes once the numBatches budget is spent, mid-source", () => { + expect(nextChunk({ ...run, numBatches: 4 })).toEqual({ type: "done" }) + }) + + it("keeps chaining while the numBatches budget has room", () => { + expect(nextChunk({ ...run, numBatches: 5 })).toMatchObject({ + type: "next", + chunk: { index: 1, cursor: "H1000" } + }) + }) + + it("fails rather than chaining past the loop guard", () => { + expect(nextChunk({ ...run, index: MAX_CHUNKS - 1 })).toEqual({ + type: "failed", + error: expect.stringContaining("not advancing") + }) + }) +}) + +describe("paths", () => { + it("round trips the alias through the upgrade document id", () => { + expect(upgradePath("bills")).toBe("/search/upgrade-bills") + expect(aliasForUpgradeId("upgrade-bills")).toBe("bills") + expect(chunkPath("bills", 7)).toBe("/search/upgrade-bills/chunks/7") + }) + + it("ignores documents under /search that are not upgrade runs", () => { + expect(aliasForUpgradeId("billSearchIndex")).toBeNull() + }) +}) diff --git a/functions/src/search/backfillRun.ts b/functions/src/search/backfillRun.ts new file mode 100644 index 000000000..4ed9a2c2c --- /dev/null +++ b/functions/src/search/backfillRun.ts @@ -0,0 +1,122 @@ +import { z } from "zod" + +/** An index upgrade is a chain of bounded chunks rather than one invocation. + * + * The run lives at `/search/upgrade-`; each chunk is a document in that + * run's `chunks` subcollection, and finishing a chunk writes the next one. The + * chunk document is the checkpoint: it carries both the cursor to resume from + * and the run totals as of its creation, so a chunk that times out or throws is + * replayed from its own starting point and converges on the same numbers rather + * than adding its work to the run twice. + */ + +/** Wall-clock a single chunk spends paging before it hands off. The chunk + * function gets the 540s v1 ceiling; the remainder is room to write progress + * and create the successor after the budget runs out mid-page. */ +export const CHUNK_BUDGET_MS = 300_000 + +/** Loop guard. Nothing legitimate reaches this — bills is ~49k documents at 250 + * per batch, and one chunk covers hundreds of batches — so hitting it means the + * cursor stopped advancing, and the run fails loudly instead of chaining. */ +export const MAX_CHUNKS = 500 + +/** `failurePolicy: true` retries the same event for up to seven days. Past this + * age the chunk gives up and marks the run failed, so a poisoned chunk cannot + * retry indefinitely. */ +export const MAX_EVENT_AGE_MS = 30 * 60_000 + +const UPGRADE_PREFIX = "upgrade-" + +export const upgradePath = (alias: string) => + `/search/${UPGRADE_PREFIX}${alias}` + +export const chunkPath = (alias: string, index: number) => + `${upgradePath(alias)}/chunks/${index}` + +/** Recovers the alias from an upgrade document's id, or null for a document + * under `/search` that is not an upgrade run. */ +export const aliasForUpgradeId = (upgradeId: string) => + upgradeId.startsWith(UPGRADE_PREFIX) + ? upgradeId.slice(UPGRADE_PREFIX.length) + : null + +/** How much of the source a run has moved so far. Carried on the chunk document + * as the baseline for that chunk, and on the run as the live total. */ +export const Totals = z.object({ + batches: z.number().int().nonnegative(), + documents: z.number().int().nonnegative(), + convertFailures: z.number().int().nonnegative() +}) +export type Totals = z.infer + +export const NO_TOTALS: Totals = { + batches: 0, + documents: 0, + convertFailures: 0 +} + +/** The only knob a scheduled upgrade takes: a whole-run batch budget that builds + * a deliberately partial index and swaps the alias anyway. A batch is one source + * page, so the document count it corresponds to is `numBatches * batchSize` — + * see `SearchIndexer.batchSize`. */ +export const BackfillConfig = z.object({ + numBatches: z.number().positive().optional() +}) +export type BackfillConfig = z.infer + +export const ChunkDoc = z.object({ + runId: z.string(), + index: z.number().int().nonnegative(), + /** Exclusive `startAfter` value for `idField`; null starts from the top. */ + cursor: z.string().nullable(), + before: Totals +}) +export type ChunkDoc = z.infer + +/** The run document. Timestamps are written for operators and never parsed, so + * they stay out of the schema. */ +export const UpgradeRun = BackfillConfig.extend({ + runId: z.string(), + collectionName: z.string(), + status: z.enum(["running", "done", "failed"]), + cursor: z.string().nullable(), + totals: Totals, + chunks: z.number().int().positive() +}) +export type UpgradeRun = z.infer + +export type NextChunk = + | { type: "done" } + | { type: "failed"; error: string } + | { type: "next"; chunk: ChunkDoc } + +/** Decides what happens after a chunk finishes: swap the alias, chain another + * chunk, or fail the run. Kept pure so the `numBatches` budget and the loop + * guard are settled in one place that tests can reach without Firestore. + */ +export const nextChunk = ({ + runId, + index, + cursor, + totals, + numBatches +}: { + runId: string + index: number + cursor: string | null + totals: Totals + numBatches?: number +}): NextChunk => { + if (cursor === null) return { type: "done" } + if (numBatches !== undefined && totals.batches >= numBatches) + return { type: "done" } + if (index + 1 >= MAX_CHUNKS) + return { + type: "failed", + error: `Backfill exceeded ${MAX_CHUNKS} chunks at cursor ${cursor}; the cursor is not advancing` + } + return { + type: "next", + chunk: { runId, index: index + 1, cursor, before: totals } + } +} diff --git a/functions/src/search/collectionName.test.ts b/functions/src/search/collectionName.test.ts new file mode 100644 index 000000000..187849277 --- /dev/null +++ b/functions/src/search/collectionName.test.ts @@ -0,0 +1,99 @@ +import { CollectionVersionInputs, searchCollectionName } from "./collectionName" + +const base: CollectionVersionInputs = { + alias: "widgets", + schema: { + fields: [ + { name: "name", type: "string", facet: false }, + { name: "count", type: "int32" } + ], + default_sorting_field: "count" + }, + convert: (data: any) => ({ id: data.id, name: data.name, count: data.count }) +} + +describe("searchCollectionName", () => { + /** Pinned so that adding a key to the hashed object — the easy mistake, since + * it renames every collection at once and forces a full backfill of each — + * fails here rather than in production. Only `base` above, or something that + * changes how it is formatted or transpiled, should move this literal. + */ + it("hashes a fixed config to a stable name", () => { + expect(searchCollectionName(base)).toEqual( + "widgets_8efb32501b99da0cd32c2ef16fe735c7" + ) + }) + + it("distinguishes collections by alias", () => { + expect(searchCollectionName({ ...base, alias: "gadgets" })).not.toEqual( + searchCollectionName(base) + ) + }) + + it("changes when the schema changes", () => { + const schema = { + ...base.schema, + fields: [ + ...base.schema.fields, + { name: "color", type: "string" as const } + ] + } + expect(searchCollectionName({ ...base, schema })).not.toEqual( + searchCollectionName(base) + ) + }) + + it("changes when convert's own source changes", () => { + const convert = (data: any) => ({ + id: data.id, + name: data.name.trim(), + count: data.count + }) + expect(searchCollectionName({ ...base, convert })).not.toEqual( + searchCollectionName(base) + ) + }) + + it("changes when a filter is added or edited", () => { + const filtered = { ...base, filter: (data: any) => data.count > 0 } + expect(searchCollectionName(filtered)).not.toEqual( + searchCollectionName(base) + ) + expect( + searchCollectionName({ ...base, filter: (data: any) => data.count > 1 }) + ).not.toEqual(searchCollectionName(filtered)) + }) + + /** The reason convertVersion exists: convert.toString() covers only the + * function's own body, so a config whose convert delegates to a helper is + * blind to changes in that helper. + */ + it("is blind to a helper change until convertVersion is bumped", () => { + let build = (data: any) => ({ id: data.id, name: data.name }) + const convert = (data: any) => build(data) + + const before = searchCollectionName({ ...base, convert }) + build = (data: any) => ({ id: data.id, name: data.name.toUpperCase() }) + expect(searchCollectionName({ ...base, convert })).toEqual(before) + + // ...which is what bumping convertVersion is for. + expect( + searchCollectionName({ ...base, convert, convertVersion: 2 }) + ).not.toEqual(before) + }) + + describe("convertVersion", () => { + it("is omitted from the hash when unset, so existing collections keep their names", () => { + expect( + searchCollectionName({ ...base, convertVersion: undefined }) + ).toEqual(searchCollectionName(base)) + }) + + it("yields a distinct name for every value", () => { + const names = [undefined, 1, 2, "2", "rebuild-2026-08"].map( + convertVersion => searchCollectionName({ ...base, convertVersion }) + ) + expect(names).toEqual(Array.from(new Set(names))) + }) + }) +}) diff --git a/functions/src/search/collectionName.ts b/functions/src/search/collectionName.ts new file mode 100644 index 000000000..b5e736772 --- /dev/null +++ b/functions/src/search/collectionName.ts @@ -0,0 +1,39 @@ +import hash from "object-hash" +import type { CollectionConfig } from "./config" + +/** Everything about a config that determines the contents of its index. */ +export type CollectionVersionInputs = Pick< + CollectionConfig, + "alias" | "schema" | "convert" | "filter" | "convertVersion" +> + +/** Names a collection after a hash of the inputs that decide what ends up in + * it, so changing any of them yields a new name. SearchIndexer compares that + * name against the one the alias currently points at to decide whether to + * build and backfill a replacement. + * + * The hash sees `convert`'s own source text and nothing more, so changes it + * cannot see need `convertVersion` — see its doc comment in ./config.ts. + */ +export const searchCollectionName = ({ + alias, + schema, + convert, + filter, + convertVersion +}: CollectionVersionInputs) => { + const versionHash = hash( + { + schema, + // The shapes below are what the live collections already hash to: filter + // passes undefined when unset, convertVersion omits its key entirely. + // Making the two consistent, in either direction, renames every + // collection and forces a full backfill of each. + filter: filter?.toString(), + convert: convert.toString(), + ...(convertVersion === undefined ? {} : { convertVersion }) + }, + { algorithm: "md5", unorderedArrays: true } + ) + return `${alias}_${versionHash}` +} diff --git a/functions/src/search/config.ts b/functions/src/search/config.ts index e17da089e..3f26f437d 100644 --- a/functions/src/search/config.ts +++ b/functions/src/search/config.ts @@ -12,6 +12,12 @@ export type CollectionConfig = { readonly idField: string readonly convert: (data: DocumentData) => T readonly filter?: (data: DocumentData) => boolean + /** Bump to force a reindex when the indexed output changed but `convert`'s + * own source did not — the collection name hashes `convert.toString()`, which + * covers none of the helpers, validators or defaults `convert` imports from + * other modules. See searchCollectionName in ./collectionName.ts. + */ + readonly convertVersion?: string | number } const registered: CollectionConfig[] = [] diff --git a/functions/src/search/createSearchIndexer.ts b/functions/src/search/createSearchIndexer.ts index 8a6eee724..6f1fda1c3 100644 --- a/functions/src/search/createSearchIndexer.ts +++ b/functions/src/search/createSearchIndexer.ts @@ -1,4 +1,18 @@ -import { runWith } from "firebase-functions" +import { EventContext, runWith } from "firebase-functions" +import { nanoid } from "nanoid" +import { db, QueryDocumentSnapshot, Timestamp } from "../firebase" +import { + BackfillConfig, + ChunkDoc, + chunkPath, + CHUNK_BUDGET_MS, + MAX_EVENT_AGE_MS, + NO_TOTALS, + nextChunk, + Totals, + upgradePath, + UpgradeRun +} from "./backfillRun" import { BaseRecord, CollectionConfig, registerConfig } from "./config" import { SearchIndexer } from "./SearchIndexer" @@ -8,13 +22,32 @@ export function createSearchIndexer( registerConfig(config) return { upgradeSearchIndex: runWith({ - timeoutSeconds: 240, + /** This only starts the run — create the collection, record it, write the + * first chunk. The backfill itself is a chain of `runBackfillChunk` + * invocations, each with its own 540s budget and its own cursor, so the + * work no longer has to fit in one timeout to converge. + */ + timeoutSeconds: 120, secrets: ["TYPESENSE_API_KEY"] }) - .firestore.document(SearchIndexer.upgradePath(config.alias)) - .onCreate(async snap => { - await new SearchIndexer(config).performUpgrade(snap.data()) - }), + .firestore.document(upgradePath(config.alias)) + .onCreate(snap => startUpgrade(config, snap)), + + /** Runs one chunk of a backfill, then either chains the next chunk or swaps + * the alias. `failurePolicy` gives the retries: a chunk resumes from its own + * cursor, imports upserts into a collection nothing is aliased to yet, and + * writes totals relative to the baseline on its own document, so running it + * more than once converges rather than double-counting. + */ + runBackfillChunk: runWith({ + timeoutSeconds: 540, + memory: "512MB", + secrets: ["TYPESENSE_API_KEY"], + failurePolicy: true + }) + .firestore.document(`${upgradePath(config.alias)}/chunks/{chunkId}`) + .onCreate((snap, context) => advanceBackfill(config, snap, context)), + syncToSearchIndex: runWith({ timeoutSeconds: 30, secrets: ["TYPESENSE_API_KEY"] @@ -25,3 +58,178 @@ export function createSearchIndexer( }) } } + +async function startUpgrade( + config: CollectionConfig, + snap: QueryDocumentSnapshot +) { + const { numBatches } = BackfillConfig.parse(snap.data()) + const indexer = new SearchIndexer(config) + await indexer.beginUpgrade() + const runId = nanoid() + + const run: UpgradeRun = { + runId, + collectionName: indexer.targetCollectionName, + status: "running", + cursor: null, + totals: NO_TOTALS, + chunks: 1, + ...(numBatches === undefined ? {} : { numBatches }) + } + await snap.ref.set( + { ...run, startedAt: Timestamp.now(), updatedAt: Timestamp.now() }, + { merge: true } + ) + + const chunk: ChunkDoc = { runId, index: 0, cursor: null, before: NO_TOTALS } + await db.doc(chunkPath(config.alias, 0)).create(chunk) + console.log( + `Started backfill of ${run.collectionName} (run ${runId})`, + numBatches === undefined ? "" : `limited to ${numBatches} batches` + ) +} + +async function advanceBackfill( + config: CollectionConfig, + snap: QueryDocumentSnapshot, + context: EventContext +) { + const { alias } = config + const chunk = ChunkDoc.parse(snap.data()) + const runRef = snap.ref.parent.parent! + const indexer = new SearchIndexer(config) + + const run = await loadRun(runRef, chunk, indexer.targetCollectionName) + if (!run) return + + // Only now that the chunk is known to belong to the current run is it safe to + // write to the run document — including to fail it. + const age = Date.now() - Date.parse(context.timestamp) + if (age > MAX_EVENT_AGE_MS) { + const error = `Chunk ${chunk.index} still failing ${Math.round( + age / 60_000 + )} minutes after it was created; giving up` + console.error(error) + // Reported as success, which is what ends the retry chain. + await fail(runRef, error) + return + } + + try { + const result = await indexer.backfillChunk({ + startAfter: chunk.cursor, + maxBatches: + run.numBatches === undefined + ? undefined + : Math.max(run.numBatches - chunk.before.batches, 0), + budgetMs: CHUNK_BUDGET_MS + }) + + // Absolute, not incremental: a replayed chunk redoes exactly its own range, + // so baseline + result lands on the same totals however often it runs. + const totals: Totals = { + batches: chunk.before.batches + result.batches, + documents: chunk.before.documents + result.documents, + convertFailures: chunk.before.convertFailures + result.convertFailures + } + console.log( + `Chunk ${chunk.index} of ${alias}: ${result.batches} batches, ${result.documents} documents, cursor ${result.cursor}` + ) + + const progress = { + cursor: result.cursor, + totals, + updatedAt: Timestamp.now() + } + const next = nextChunk({ + runId: chunk.runId, + index: chunk.index, + cursor: result.cursor, + totals, + numBatches: run.numBatches + }) + + switch (next.type) { + case "done": + await indexer.finishUpgrade() + await runRef.set( + { ...progress, status: "done", finishedAt: Timestamp.now() }, + { merge: true } + ) + console.log( + `Backfill of ${run.collectionName} complete after ${totals.batches} batches` + ) + break + case "failed": + await fail(runRef, next.error, progress) + break + case "next": + await runRef.set( + { ...progress, chunks: next.chunk.index + 1 }, + { merge: true } + ) + await db.doc(chunkPath(alias, next.chunk.index)).create(next.chunk) + break + } + } catch (e: any) { + // Recorded for operators, then rethrown so the retry policy sees a failure + // and runs this chunk again from the same cursor. + await runRef.set( + { lastError: String(e?.message ?? e), updatedAt: Timestamp.now() }, + { merge: true } + ) + throw e + } +} + +/** Reads the run this chunk belongs to, or null when the chunk has been + * superseded — a second upgrade was scheduled, the run already finished, or the + * deployed config now hashes to a different collection. */ +async function loadRun( + runRef: FirebaseFirestore.DocumentReference, + chunk: ChunkDoc, + targetCollectionName: string +) { + const snap = await runRef.get() + if (!snap.exists) { + console.log(`Upgrade ${runRef.path} is gone; dropping chunk ${chunk.index}`) + return null + } + const run = UpgradeRun.parse(snap.data()) + if (run.runId !== chunk.runId) { + console.log( + `Chunk ${chunk.index} belongs to run ${chunk.runId}, but ${run.runId} is current; dropping it` + ) + return null + } + if (run.status !== "running") { + console.log( + `Run ${run.runId} is ${run.status}; dropping chunk ${chunk.index}` + ) + return null + } + if (run.collectionName !== targetCollectionName) { + console.log( + `Run ${run.runId} targets ${run.collectionName} but this deploy builds ${targetCollectionName}; dropping chunk ${chunk.index}` + ) + return null + } + return run +} + +async function fail( + runRef: FirebaseFirestore.DocumentReference, + error: string, + progress: object = {} +) { + await runRef.set( + { + ...progress, + status: "failed", + lastError: error, + finishedAt: Timestamp.now() + }, + { merge: true } + ) +} diff --git a/functions/src/testimony/search.ts b/functions/src/testimony/search.ts index 5947b7ae5..07b731d8d 100644 --- a/functions/src/testimony/search.ts +++ b/functions/src/testimony/search.ts @@ -4,7 +4,8 @@ import { Testimony, TestimonySearchRecord } from "./types" export const { syncToSearchIndex: syncTestimonyToSearchIndex, - upgradeSearchIndex: upgradeTestimonySearchIndex + upgradeSearchIndex: upgradeTestimonySearchIndex, + runBackfillChunk: runTestimonyBackfillChunk } = createSearchIndexer({ sourceCollection: db.collectionGroup("publishedTestimony"), documentTrigger: "users/{uid}/publishedTestimony/{id}", diff --git a/scripts/firebase-admin/searchUpgradeStatus.ts b/scripts/firebase-admin/searchUpgradeStatus.ts new file mode 100644 index 000000000..3229b0a62 --- /dev/null +++ b/scripts/firebase-admin/searchUpgradeStatus.ts @@ -0,0 +1,58 @@ +import { + aliasForUpgradeId, + UpgradeRun +} from "../../functions/src/search/backfillRun" +import { Script } from "./types" + +/** Prints the state of every search index upgrade run. + * + * The Firestore-side complement to `yarn typesense-admin status`, which sees + * only what Typesense holds. A backfill is a chain of chunk documents, so an + * in-flight run has a cursor and a batch count here long before the alias + * moves — which is the only way to tell "still working" from "stuck". + * + * Enumerates `/search` rather than taking the aliases from the config registry, + * so a run left behind by an alias that has since been renamed or removed still + * shows up — that run is exactly why an orphaned collection exists. + */ +const count = (n: number, one: string, many = `${one}s`) => + `${n} ${n === 1 ? one : many}` + +export const script: Script = async ({ db }) => { + const upgrades = await db.collection("search").listDocuments() + + for (const ref of upgrades) { + const alias = aliasForUpgradeId(ref.id) + if (!alias) continue + + const data = (await ref.get()).data() ?? {} + const run = UpgradeRun.partial().parse(data) + if (!run.runId || !run.totals) { + console.log(`${alias}: scheduled, not started`) + continue + } + + const { totals } = run + // Timestamps are written for operators and are not part of the schema. + const started = data.startedAt?.toDate() + const ended = data.finishedAt?.toDate() ?? data.updatedAt?.toDate() + const elapsed = + started && ended + ? `${Math.round((ended.getTime() - started.getTime()) / 1000)}s` + : "?" + console.log( + `${alias}: ${run.status} -> ${run.collectionName}\n` + + ` ${count(totals.documents, "document")} in ` + + `${count(totals.batches, "batch", "batches")} over ` + + `${count(run.chunks ?? 1, "chunk")}, ${elapsed}\n` + + ` cursor ${run.cursor ?? "(source exhausted)"}` + + (totals.convertFailures + ? `, ${count(totals.convertFailures, "convert failure")}` + : "") + + (run.numBatches ? `, limited to ${run.numBatches} batches` : "") + ) + if (data.lastError) console.log(` last error: ${data.lastError}`) + } + + if (!upgrades.length) console.log("no upgrades scheduled") +} diff --git a/scripts/typesense-admin.ts b/scripts/typesense-admin.ts index 6abded539..9ef9f96b0 100644 --- a/scripts/typesense-admin.ts +++ b/scripts/typesense-admin.ts @@ -38,6 +38,44 @@ yargs(hideBin(process.argv)) console.log("Created", key.value) } ) + .command( + "status", + "print the server version, every alias with its live collection and document count, and any orphaned collections", + {}, + async (args: Args) => { + const client = resolveClient(args) + + const { version } = await client.debug.retrieve() + console.log(`server: ${version}`) + + const { aliases } = await client.aliases().retrieve() + const live = new Set(aliases.map(a => a.collection_name)) + + if (aliases.length === 0) { + console.log("aliases: none — nothing is being served") + } + for (const { name, collection_name } of aliases) { + const { num_documents } = await client + .collections(collection_name) + .retrieve() + console.log(`${name} -> ${collection_name} ${num_documents} docs`) + } + + /** A collection with no alias pointing at it is a backfill that never + * reached `upgradeAlias` — a run that failed, or one superseded by a + * later deploy before it finished. The backfill resumes from its cursor + * rather than from the first batch, so an orphan that is still growing is + * a run in progress; one that is not is wreckage. `yarn firebase-admin + * run-script searchUpgradeStatus` says which, and why. + */ + const orphans = (await client.collections().retrieve()).filter( + c => !live.has(c.name) + ) + for (const { name, num_documents } of orphans) { + console.log(`(orphan) ${name} ${num_documents} docs`) + } + } + ) .command("list-keys", "list keys", {}, async (args: Args) => { const client = resolveClient(args) console.log(await client.keys().retrieve()) diff --git a/tests/integration/search.test.ts b/tests/integration/search.test.ts index 71431113b..87e34a30e 100644 --- a/tests/integration/search.test.ts +++ b/tests/integration/search.test.ts @@ -7,7 +7,7 @@ import { nanoid } from "nanoid" import { CollectionAliasSchema } from "typesense/lib/Typesense/Aliases" import { Timestamp } from "../../functions/src/firebase" import { createClient } from "../../functions/src/search/client" -import { SearchIndexer } from "../../functions/src/search/SearchIndexer" +import { upgradePath } from "../../functions/src/search/backfillRun" import { testDb } from "../testUtils" import { createFakeBill } from "./common" @@ -75,9 +75,7 @@ describe.skip("Upgrades", () => { } async function lastUpgradeTime(): Promise { - const existingUpgrade = await testDb - .doc(SearchIndexer.upgradePath(testAlias)) - .get() + const existingUpgrade = await testDb.doc(upgradePath(testAlias)).get() expect(existingUpgrade.exists).toBeTruthy() return existingUpgrade.data()!.createdAt } From 7ba68ce8d0c9a83007770f21c9225de5fc0808e2 Mon Sep 17 00:00:00 2001 From: violet Date: Wed, 26 Aug 2026 15:23:29 -0400 Subject: [PATCH 06/16] search: query weights for bills, testimony and hearings MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Bills: query_by gains primarySponsor, cosponsors, currentCommittee (already indexed as display names — no schema change) with weights 10,5,4,3,4,1. Member/committee queries were the worst eval category because those fields were unsearchable; number stays far above all so bill-number mentions in other bills' text can't outrank the bill itself, and title stays above committee so committee text doesn't crowd out topic matches (committee at 5 regressed 'mental health'). num_typos and drop_tokens_threshold probes were exact no-ops, so no typo knobs ship. Eval vs the typesense-30 baseline (committed as typesense-30-weights.json): member-committee recall@10 0.093 -> 0.887, nDCG@10 0.119 -> 0.864; overall nDCG@10 0.525 -> 0.687; all other categories unchanged (topic +0.008). Testimony: billId and author name matches now outrank incidental content mentions (10,6,3,1). Hearings: billNumbers/title/chairNames weighted above long agenda/description text (10,8,6,5,2,2,2) — hearings always sort by startsAt, so this governs matching/tie behavior, not ordering. All three pages' params verified accepted against the hosted dev gateway (still Typesense 0.24), so this is safe to ship ahead of the server upgrade. The params are hoisted to searchParams.ts and hardened after review: query_by/query_by_weights derive from one ordered field-to-weight map, so reordering fields can't silently reassign weights, and each export is checked with satisfies against the adapter's param type so misspelled param keys fail to compile. SearchPage keys its Typesense client memo on the params' JSON content instead of object identity — the inline literal in the hearings page was defeating the memo and recreating the client every render. search-eval types its params as the typesense client's own SearchParams, so future ranking knobs flow through without type edits. Cleanup verified behavior-identical: eval metrics and top-10s byte-equal to typesense-30-weights.json. Co-Authored-By: Claude Fable 5 --- components/search/hearings/HearingSearch.tsx | 7 +- components/search/searchParams.ts | 46 +- components/search/shared/SearchPage.tsx | 6 +- .../search/testimony/TestimonySearch.tsx | 6 +- scripts/search-eval/index.ts | 26 +- .../baselines/typesense-30-weights.json | 1594 +++++++++++++++++ 6 files changed, 1661 insertions(+), 24 deletions(-) create mode 100644 tests/search-eval/baselines/typesense-30-weights.json diff --git a/components/search/hearings/HearingSearch.tsx b/components/search/hearings/HearingSearch.tsx index 762809d42..df35d1672 100644 --- a/components/search/hearings/HearingSearch.tsx +++ b/components/search/hearings/HearingSearch.tsx @@ -8,6 +8,7 @@ import { formatCourtSubtitle } from "../courtSessions" import { useMemo, useRef } from "react" +import { hearingsSearchParams } from "../searchParams" /* carbon copy of type in functions/src/hearings/search.ts */ type HearingSearchRecord = { @@ -89,11 +90,7 @@ export const HearingSearch = () => { } } }} - searchParameters={{ - query_by: - "title,description,agendaTopics,billNumbers,chairNames,locationName,locationCity", - sort_by: "startsAt:asc" - }} + searchParameters={hearingsSearchParams} hitComponent={HearingHit} filterPanelConfig={{ filters: [ diff --git a/components/search/searchParams.ts b/components/search/searchParams.ts index 80a65a46f..3a6ffa08a 100644 --- a/components/search/searchParams.ts +++ b/components/search/searchParams.ts @@ -2,13 +2,55 @@ * search pages and the relevance eval harness (scripts/search-eval). Keep this * module free of React/Next imports so it can be loaded from ts-node scripts. */ +import type { TypesenseInstantsearchAdapterOptions } from "typesense-instantsearch-adapter" + +type SearchParameters = NonNullable< + TypesenseInstantsearchAdapterOptions["additionalSearchParameters"] +> + +/** Derives query_by + query_by_weights from one ordered field-to-weight map, + * so the two parallel comma-separated lists can't drift out of sync. + */ +const weighted = (fields: Record) => ({ + query_by: Object.keys(fields).join(","), + query_by_weights: Object.values(fields).join(",") +}) + export const billsSearchParams = { - query_by: "number,title,body", + ...weighted({ + number: 10, + title: 5, + primarySponsor: 4, + cosponsors: 3, + currentCommittee: 4, + body: 1 + }), exclude_fields: "body" -} +} satisfies SearchParameters /** The app's "Relevance" sort option (see useBillSort.tsx). The eval harness * must use this sort; the UI's default latestTestimonyAt:desc sort does not * measure text relevance. */ export const billsRelevanceSort = "_text_match:desc,testimonyCount:desc" + +export const testimonySearchParams = { + ...weighted({ billId: 10, authorDisplayName: 6, content: 3, authorRole: 1 }), + exclude_fields: "" +} satisfies SearchParameters + +/** Hearings always sort by startsAt (no _text_match sort option), so these + * weights govern which documents match and typo/tie behavior, not ordering. + */ +export const hearingsSearchParams = { + ...weighted({ + billNumbers: 10, + title: 8, + chairNames: 6, + agendaTopics: 5, + description: 2, + locationName: 2, + locationCity: 2 + }), + sort_by: "startsAt:asc" +} satisfies SearchParameters diff --git a/components/search/shared/SearchPage.tsx b/components/search/shared/SearchPage.tsx index 81276015a..cf96bc7b3 100644 --- a/components/search/shared/SearchPage.tsx +++ b/components/search/shared/SearchPage.tsx @@ -116,13 +116,17 @@ export const SearchPage = ({ return Array.from(items) }, [filtersWithDefaults, menuAttributes]) + // Keyed on the params' content, not object identity, so an inline + // searchParameters literal doesn't recreate the Typesense client per render. + const searchParametersKey = JSON.stringify(searchParameters) const searchClient = useMemo( () => new TypesenseInstantSearchAdapter({ server: getServerConfig(), additionalSearchParameters: searchParameters }).searchClient, - [searchParameters] + // eslint-disable-next-line react-hooks/exhaustive-deps + [searchParametersKey] ) return ( diff --git a/components/search/testimony/TestimonySearch.tsx b/components/search/testimony/TestimonySearch.tsx index cb45bd164..5efa09eea 100644 --- a/components/search/testimony/TestimonySearch.tsx +++ b/components/search/testimony/TestimonySearch.tsx @@ -25,6 +25,7 @@ import { SearchContainer } from "../SearchContainer" import { SearchErrorBoundary } from "../SearchErrorBoundary" import { SortBy } from "../SortBy" import { getServerConfig, VirtualFilters } from "../common" +import { testimonySearchParams } from "../searchParams" import { TestimonyHit } from "./TestimonyHit" import { useTestimonyRefinements } from "./useTestimonyRefinements" import { FollowContext, OrgFollowStatus } from "components/shared/FollowContext" @@ -33,10 +34,7 @@ import { useTranslation } from "next-i18next" const searchClient = new TypesenseInstantSearchAdapter({ server: getServerConfig(), - additionalSearchParameters: { - query_by: "billId,content,authorDisplayName,authorRole", - exclude_fields: "" - } + additionalSearchParameters: testimonySearchParams }).searchClient export const useTestimonySort = () => { diff --git a/scripts/search-eval/index.ts b/scripts/search-eval/index.ts index f852224e3..eeb8b2b93 100644 --- a/scripts/search-eval/index.ts +++ b/scripts/search-eval/index.ts @@ -1,6 +1,7 @@ import { execSync } from "child_process" import { writeFileSync } from "fs" import { join } from "path" +import type { SearchParams } from "typesense" import yargs, { Arguments } from "yargs" import { hideBin } from "yargs/helpers" import { billsSearchParams } from "../../components/search/searchParams" @@ -44,25 +45,26 @@ const resolveCollection = (args: Args) => const includeFields = "id,court,number,title,primarySponsor,currentCommittee" +/** The typesense client's own search params, with the fields every eval + * search must pin made required. New ranking knobs added to + * components/search/searchParams.ts flow through without edits here. + */ +type EvalSearchParams = SearchParams & { + q: string + query_by: string + per_page: number +} + function createSearcher(args: Args, collection: string) { const client = resolveClient(args) return { client, - search: async (params: { - q: string - query_by: string - per_page: number - query_by_weights?: string - num_typos?: string - drop_tokens_threshold?: number - sort_by?: string - filter_by?: string - }): Promise => { + search: async (params: EvalSearchParams): Promise => { const result = await client - .collections(collection) + .collections(collection) .documents() .search({ include_fields: includeFields, ...params }) - return (result.hits ?? []).map(h => h.document as CorpusDoc) + return (result.hits ?? []).map(h => h.document) } } } diff --git a/tests/search-eval/baselines/typesense-30-weights.json b/tests/search-eval/baselines/typesense-30-weights.json new file mode 100644 index 000000000..79ded4275 --- /dev/null +++ b/tests/search-eval/baselines/typesense-30-weights.json @@ -0,0 +1,1594 @@ +{ + "meta": { + "env": "local", + "url": "", + "collection": "bills_eval", + "serverVersion": "30.2", + "corpusMd5": "a0499d7bb8597f88dbd737893bcd8a4d", + "gitSha": "0d747ef1430b5ca4afcd9a85d7b2ba3b3e2f815d", + "timestamp": "2026-08-18T19:41:51.019Z", + "sortBy": "_text_match:desc,testimonyCount:desc", + "court": 192, + "skippedQueries": [] + }, + "overall": { + "recallAt10": 0.8214285714285714, + "mrr": 0.8917233560090704, + "ndcgAt10": 0.6871465359811022, + "queryCount": 70 + }, + "categories": { + "exact-bill-id": { + "recallAt10": 0.8, + "mrr": 0.8, + "ndcgAt10": 0.8, + "queryCount": 15 + }, + "member-committee": { + "recallAt10": 0.8866666666666667, + "mrr": 0.8539682539682539, + "ndcgAt10": 0.8641271505214204, + "queryCount": 15 + }, + "misspelling": { + "recallAt10": 0.8699999999999999, + "mrr": 1, + "ndcgAt10": 0.4985867229196039, + "queryCount": 10 + }, + "synonym": { + "recallAt10": 0.7899999999999999, + "mrr": 0.9, + "ndcgAt10": 0.8262463153675897, + "queryCount": 10 + }, + "topic": { + "recallAt10": 0.78, + "mrr": 0.9305555555555556, + "ndcgAt10": 0.4945009938991955, + "queryCount": 20 + } + }, + "queries": [ + { + "id": "exact-001", + "category": "exact-bill-id", + "query": "H.100", + "metrics": { + "recallAt10": 1, + "mrr": 1, + "ndcgAt10": 1 + }, + "top10": [ + "192-H100", + "192-H1002", + "192-H1001", + "192-H1000", + "192-H1006", + "192-H1004", + "192-H1003", + "192-H1009", + "192-H1008", + "192-H1007" + ], + "relevantCount": 1 + }, + { + "id": "exact-002", + "category": "exact-bill-id", + "query": "h100", + "metrics": { + "recallAt10": 1, + "mrr": 1, + "ndcgAt10": 1 + }, + "top10": [ + "192-H100", + "192-H1002", + "192-H1001", + "192-H1000", + "192-H1006", + "192-H1004", + "192-H1003", + "192-H1009", + "192-H1008", + "192-H1007" + ], + "relevantCount": 1 + }, + { + "id": "exact-003", + "category": "exact-bill-id", + "query": "H 100", + "metrics": { + "recallAt10": 0, + "mrr": 0, + "ndcgAt10": 0 + }, + "top10": [ + "192-H1795", + "192-S610", + "192-S2720", + "192-S2136", + "192-S1179", + "192-H878", + "192-H3288", + "192-H1959", + "192-H136", + "192-S904" + ], + "relevantCount": 1 + }, + { + "id": "exact-004", + "category": "exact-bill-id", + "query": "S.9", + "metrics": { + "recallAt10": 1, + "mrr": 1, + "ndcgAt10": 1 + }, + "top10": [ + "192-S9", + "192-S992", + "192-S99", + "192-S978", + "192-S973", + "192-S944", + "192-S94", + "192-S931", + "192-S909", + "192-S902" + ], + "relevantCount": 1 + }, + { + "id": "exact-005", + "category": "exact-bill-id", + "query": "s9", + "metrics": { + "recallAt10": 1, + "mrr": 1, + "ndcgAt10": 1 + }, + "top10": [ + "192-S9", + "192-S992", + "192-S99", + "192-S978", + "192-S973", + "192-S944", + "192-S94", + "192-S931", + "192-S909", + "192-S902" + ], + "relevantCount": 1 + }, + { + "id": "exact-006", + "category": "exact-bill-id", + "query": "S 2564", + "metrics": { + "recallAt10": 0, + "mrr": 0, + "ndcgAt10": 0 + }, + "top10": [ + "192-H4352", + "192-H564", + "192-H1961", + "192-H1762" + ], + "relevantCount": 1 + }, + { + "id": "exact-007", + "category": "exact-bill-id", + "query": "S2564", + "metrics": { + "recallAt10": 1, + "mrr": 1, + "ndcgAt10": 1 + }, + "top10": [ + "192-S2564" + ], + "relevantCount": 1 + }, + { + "id": "exact-008", + "category": "exact-bill-id", + "query": "H.4374", + "metrics": { + "recallAt10": 1, + "mrr": 1, + "ndcgAt10": 1 + }, + "top10": [ + "192-H4374" + ], + "relevantCount": 1 + }, + { + "id": "exact-009", + "category": "exact-bill-id", + "query": "h.73", + "metrics": { + "recallAt10": 1, + "mrr": 1, + "ndcgAt10": 1 + }, + "top10": [ + "192-H73", + "192-H739", + "192-H737", + "192-H736", + "192-H735", + "192-H734", + "192-H733", + "192-H732", + "192-H731", + "192-H730" + ], + "relevantCount": 1 + }, + { + "id": "exact-010", + "category": "exact-bill-id", + "query": "H3999", + "metrics": { + "recallAt10": 1, + "mrr": 1, + "ndcgAt10": 1 + }, + "top10": [ + "192-H3999" + ], + "relevantCount": 1 + }, + { + "id": "exact-011", + "category": "exact-bill-id", + "query": "S.1333", + "metrics": { + "recallAt10": 1, + "mrr": 1, + "ndcgAt10": 1 + }, + "top10": [ + "192-S1333" + ], + "relevantCount": 1 + }, + { + "id": "exact-012", + "category": "exact-bill-id", + "query": "s 2475", + "metrics": { + "recallAt10": 0, + "mrr": 0, + "ndcgAt10": 0 + }, + "top10": [ + "192-S2170", + "192-S2158", + "192-H3372", + "192-H3302", + "192-H2475", + "192-H2076", + "192-H1521", + "192-S2289", + "192-H4470", + "192-H4459" + ], + "relevantCount": 1 + }, + { + "id": "exact-013", + "category": "exact-bill-id", + "query": "H600", + "metrics": { + "recallAt10": 1, + "mrr": 1, + "ndcgAt10": 1 + }, + "top10": [ + "192-H600" + ], + "relevantCount": 1 + }, + { + "id": "exact-014", + "category": "exact-bill-id", + "query": "H.1", + "metrics": { + "recallAt10": 1, + "mrr": 1, + "ndcgAt10": 1 + }, + "top10": [ + "192-H1", + "192-S736", + "192-S451", + "192-S2759", + "192-S1841", + "192-S1633", + "192-S147", + "192-S130", + "192-S119", + "192-H4154" + ], + "relevantCount": 1 + }, + { + "id": "exact-015", + "category": "exact-bill-id", + "query": "S.1563", + "metrics": { + "recallAt10": 1, + "mrr": 1, + "ndcgAt10": 1 + }, + "top10": [ + "192-S1563" + ], + "relevantCount": 1 + }, + { + "id": "mc-001", + "category": "member-committee", + "query": "Diana DiZoglio", + "metrics": { + "recallAt10": 1, + "mrr": 1, + "ndcgAt10": 1 + }, + "top10": [ + "192-S1698", + "192-S99", + "192-S98", + "192-S882", + "192-S881", + "192-S880", + "192-S879", + "192-S878", + "192-S877", + "192-S876" + ], + "relevantCount": 444 + }, + { + "id": "mc-002", + "category": "member-committee", + "query": "Bruce Tarr", + "metrics": { + "recallAt10": 1, + "mrr": 1, + "ndcgAt10": 1 + }, + "top10": [ + "192-S910", + "192-S909", + "192-S908", + "192-S907", + "192-S856", + "192-S817", + "192-S816", + "192-S815", + "192-S814", + "192-S730" + ], + "relevantCount": 290 + }, + { + "id": "mc-003", + "category": "member-committee", + "query": "Jason Lewis", + "metrics": { + "recallAt10": 1, + "mrr": 1, + "ndcgAt10": 1 + }, + "top10": [ + "192-S895", + "192-S845", + "192-S844", + "192-S796", + "192-S795", + "192-S794", + "192-S793", + "192-S792", + "192-S791", + "192-S790" + ], + "relevantCount": 527 + }, + { + "id": "mc-004", + "category": "member-committee", + "query": "Tackey Chan", + "metrics": { + "recallAt10": 1, + "mrr": 1, + "ndcgAt10": 1 + }, + "top10": [ + "192-H867", + "192-H866", + "192-H865", + "192-H768", + "192-H767", + "192-H732", + "192-H731", + "192-H62", + "192-H559", + "192-H4388" + ], + "relevantCount": 198 + }, + { + "id": "mc-005", + "category": "member-committee", + "query": "Julian Cyr", + "metrics": { + "recallAt10": 1, + "mrr": 1, + "ndcgAt10": 1 + }, + "top10": [ + "192-S2618", + "192-S992", + "192-S991", + "192-S990", + "192-S989", + "192-S988", + "192-S95", + "192-S94", + "192-S873", + "192-S759" + ], + "relevantCount": 306 + }, + { + "id": "mc-006", + "category": "member-committee", + "query": "Cynthia Creem", + "metrics": { + "recallAt10": 1, + "mrr": 1, + "ndcgAt10": 1 + }, + "top10": [ + "192-S984", + "192-S983", + "192-S982", + "192-S981", + "192-S980", + "192-S979", + "192-S978", + "192-S977", + "192-S976", + "192-S975" + ], + "relevantCount": 106 + }, + { + "id": "mc-007", + "category": "member-committee", + "query": "Marjorie Decker", + "metrics": { + "recallAt10": 1, + "mrr": 1, + "ndcgAt10": 1 + }, + "top10": [ + "192-H881", + "192-H774", + "192-H570", + "192-H569", + "192-H568", + "192-H567", + "192-H566", + "192-H565", + "192-H4412", + "192-H4401" + ], + "relevantCount": 143 + }, + { + "id": "mc-008", + "category": "member-committee", + "query": "Michael Moore", + "metrics": { + "recallAt10": 1, + "mrr": 1, + "ndcgAt10": 1 + }, + "top10": [ + "192-S15", + "192-S852", + "192-S851", + "192-S850", + "192-S849", + "192-S807", + "192-S806", + "192-S805", + "192-S76", + "192-S712" + ], + "relevantCount": 557 + }, + { + "id": "mc-009", + "category": "member-committee", + "query": "Patrick O'Connor", + "metrics": { + "recallAt10": 1, + "mrr": 1, + "ndcgAt10": 1 + }, + "top10": [ + "192-S902", + "192-S854", + "192-S853", + "192-S78", + "192-S720", + "192-S719", + "192-S718", + "192-S717", + "192-S716", + "192-S715" + ], + "relevantCount": 663 + }, + { + "id": "mc-010", + "category": "member-committee", + "query": "Aaron Michlewitz", + "metrics": { + "recallAt10": 1, + "mrr": 1, + "ndcgAt10": 1 + }, + "top10": [ + "192-H95", + "192-H4430", + "192-H3771", + "192-H3720" + ], + "relevantCount": 4 + }, + { + "id": "mc-011", + "category": "member-committee", + "query": "Ways and Means Committee", + "metrics": { + "recallAt10": 0.5, + "mrr": 0.16666666666666666, + "ndcgAt10": 0.3510684246681534 + }, + "top10": [ + "192-S1534", + "192-S1220", + "192-H1968", + "192-H629", + "192-H3415", + "192-S2749", + "192-S2747", + "192-S2731", + "192-S2723", + "192-S2708" + ], + "relevantCount": 715 + }, + { + "id": "mc-012", + "category": "member-committee", + "query": "Health Care Financing", + "metrics": { + "recallAt10": 1, + "mrr": 1, + "ndcgAt10": 1 + }, + "top10": [ + "192-S2613", + "192-H4329", + "192-H4328", + "192-S820", + "192-S819", + "192-S817", + "192-S816", + "192-S813", + "192-S810", + "192-S806" + ], + "relevantCount": 264 + }, + { + "id": "mc-013", + "category": "member-committee", + "query": "Committee on Revenue", + "metrics": { + "recallAt10": 0.9, + "mrr": 0.5, + "ndcgAt10": 0.7799082337019199 + }, + "top10": [ + "192-S2743", + "192-S1812", + "192-H3085", + "192-H3081", + "192-H2973", + "192-H2928", + "192-H2895", + "192-H2826", + "192-S788", + "192-S1997" + ], + "relevantCount": 111 + }, + { + "id": "mc-014", + "category": "member-committee", + "query": "Education Committee", + "metrics": { + "recallAt10": 0.5, + "mrr": 1, + "ndcgAt10": 0.5582604437617528 + }, + "top10": [ + "192-S1220", + "192-H1968", + "192-S2769", + "192-S2756", + "192-S2755", + "192-S2749", + "192-S2747", + "192-S362", + "192-S358", + "192-S319" + ], + "relevantCount": 63 + }, + { + "id": "mc-015", + "category": "member-committee", + "query": "Telecommunications Utilities and Energy", + "metrics": { + "recallAt10": 0.4, + "mrr": 0.14285714285714285, + "ndcgAt10": 0.2726701556894781 + }, + "top10": [ + "192-S2715", + "192-S2711", + "192-S2647", + "192-H4488", + "192-H4455", + "192-H4400", + "192-S604", + "192-S2515", + "192-S2473", + "192-S2237" + ], + "relevantCount": 120 + }, + { + "id": "topic-001", + "category": "topic", + "query": "gun control", + "metrics": { + "recallAt10": 0.4, + "mrr": 0.5, + "ndcgAt10": 0.12111401772315426 + }, + "top10": [ + "192-H2527", + "192-S942", + "192-H1734", + "192-S939", + "192-S514", + "192-S1130", + "192-S1009", + "192-H43", + "192-H308", + "192-H2635" + ], + "relevantCount": 93 + }, + { + "id": "topic-002", + "category": "topic", + "query": "mental health", + "metrics": { + "recallAt10": 1, + "mrr": 1, + "ndcgAt10": 0.3170853252047272 + }, + "top10": [ + "192-S820", + "192-S636", + "192-S1318", + "192-S1310", + "192-S1300", + "192-S1297", + "192-S1284", + "192-S1283", + "192-S1267", + "192-S1257" + ], + "relevantCount": 66 + }, + { + "id": "topic-003", + "category": "topic", + "query": "climate change", + "metrics": { + "recallAt10": 1, + "mrr": 1, + "ndcgAt10": 0.4491790547278348 + }, + "top10": [ + "192-S571", + "192-S2737", + "192-S1796", + "192-H877", + "192-H2908", + "192-H2833", + "192-H258", + "192-H2159", + "192-S1853", + "192-H2890" + ], + "relevantCount": 27 + }, + { + "id": "topic-004", + "category": "topic", + "query": "offshore wind", + "metrics": { + "recallAt10": 1, + "mrr": 1, + "ndcgAt10": 0.6186468626657726 + }, + "top10": [ + "192-S2227", + "192-S2154", + "192-H953", + "192-H4348", + "192-H3310", + "192-H3303", + "192-H3302", + "192-H3266", + "192-H2924", + "192-H4524" + ], + "relevantCount": 12 + }, + { + "id": "topic-005", + "category": "topic", + "query": "marijuana", + "metrics": { + "recallAt10": 1, + "mrr": 1, + "ndcgAt10": 0.3170853252047272 + }, + "top10": [ + "192-S76", + "192-S74", + "192-S73", + "192-S64", + "192-S2663", + "192-S2529", + "192-S1828", + "192-S1583", + "192-H4026", + "192-H3079" + ], + "relevantCount": 57 + }, + { + "id": "topic-006", + "category": "topic", + "query": "minimum wage", + "metrics": { + "recallAt10": 1, + "mrr": 1, + "ndcgAt10": 0.902688816176951 + }, + "top10": [ + "192-S1176", + "192-H1994", + "192-S1159", + "192-H2043", + "192-S1213", + "192-S1179", + "192-H1971", + "192-H1964", + "192-H1959", + "192-S805" + ], + "relevantCount": 4 + }, + { + "id": "topic-007", + "category": "topic", + "query": "charter schools", + "metrics": { + "recallAt10": 0.8, + "mrr": 1, + "ndcgAt10": 0.6172182802301824 + }, + "top10": [ + "192-S371", + "192-S353", + "192-S343", + "192-H712", + "192-H696", + "192-S386", + "192-S372", + "192-S286", + "192-H718", + "192-H672" + ], + "relevantCount": 13 + }, + { + "id": "topic-008", + "category": "topic", + "query": "affordable housing", + "metrics": { + "recallAt10": 1, + "mrr": 1, + "ndcgAt10": 0.3170853252047272 + }, + "top10": [ + "192-S868", + "192-S867", + "192-H1377", + "192-H1373", + "192-S903", + "192-S895", + "192-S888", + "192-S882", + "192-S2025", + "192-S1985" + ], + "relevantCount": 40 + }, + { + "id": "topic-009", + "category": "topic", + "query": "homelessness", + "metrics": { + "recallAt10": 1, + "mrr": 1, + "ndcgAt10": 0.43812463509980126 + }, + "top10": [ + "192-S874", + "192-S82", + "192-S142", + "192-S110", + "192-H3959", + "192-H3838", + "192-H3778", + "192-H264", + "192-H229", + "192-H1436" + ], + "relevantCount": 26 + }, + { + "id": "topic-010", + "category": "topic", + "query": "opioid addiction", + "metrics": { + "recallAt10": 0.4, + "mrr": 1, + "ndcgAt10": 0.7945202298211209 + }, + "top10": [ + "192-H2086", + "192-H2071", + "192-S2", + "192-S347", + "192-S2472", + "192-S2467", + "192-H2097", + "192-H2405", + "192-H3796", + "192-H2101" + ], + "relevantCount": 21 + }, + { + "id": "topic-011", + "category": "topic", + "query": "student loan forgiveness", + "metrics": { + "recallAt10": 0.3, + "mrr": 1, + "ndcgAt10": 0.48664114167177874 + }, + "top10": [ + "192-S1827", + "192-H2883", + "192-H1320", + "192-H3030", + "192-H1366", + "192-S2580" + ], + "relevantCount": 21 + }, + { + "id": "topic-012", + "category": "topic", + "query": "domestic violence", + "metrics": { + "recallAt10": 1, + "mrr": 1, + "ndcgAt10": 0.3170853252047272 + }, + "top10": [ + "192-S951", + "192-S702", + "192-S2678", + "192-S2417", + "192-S190", + "192-S176", + "192-S1123", + "192-S1076", + "192-S1023", + "192-S1015" + ], + "relevantCount": 26 + }, + { + "id": "topic-013", + "category": "topic", + "query": "sexual assault", + "metrics": { + "recallAt10": 1, + "mrr": 1, + "ndcgAt10": 0.3170853252047272 + }, + "top10": [ + "192-S939", + "192-S2678", + "192-S190", + "192-S176", + "192-S1488", + "192-S1134", + "192-S1087", + "192-S1073", + "192-H4330", + "192-H4013" + ], + "relevantCount": 26 + }, + { + "id": "topic-014", + "category": "topic", + "query": "solar energy", + "metrics": { + "recallAt10": 1, + "mrr": 1, + "ndcgAt10": 0.47907112408275354 + }, + "top10": [ + "192-S2174", + "192-H4044", + "192-H3346", + "192-H3319", + "192-H3260", + "192-S2208", + "192-S2203", + "192-S2180", + "192-S2168", + "192-S2145" + ], + "relevantCount": 34 + }, + { + "id": "topic-015", + "category": "topic", + "query": "eviction", + "metrics": { + "recallAt10": 0.5, + "mrr": 1, + "ndcgAt10": 0.5933275909929555 + }, + "top10": [ + "192-S921", + "192-H4505", + "192-H1808", + "192-H1911", + "192-S904", + "192-S891", + "192-S886", + "192-S883", + "192-S874", + "192-S865" + ], + "relevantCount": 24 + }, + { + "id": "topic-016", + "category": "topic", + "query": "vaccines", + "metrics": { + "recallAt10": 0.2, + "mrr": 1, + "ndcgAt10": 0.7237527203934739 + }, + "top10": [ + "192-H2411", + "192-H2394", + "192-S2626", + "192-S2622", + "192-S251", + "192-S2472", + "192-S2467", + "192-S2079", + "192-S2", + "192-S1755" + ], + "relevantCount": 12 + }, + { + "id": "topic-017", + "category": "topic", + "query": "telehealth", + "metrics": { + "recallAt10": 1, + "mrr": 1, + "ndcgAt10": 0.6310385047070085 + }, + "top10": [ + "192-S678", + "192-H125", + "192-H1101", + "192-S770", + "192-S766", + "192-S682", + "192-S2774", + "192-S2656", + "192-S2", + "192-S1470" + ], + "relevantCount": 3 + }, + { + "id": "topic-018", + "category": "topic", + "query": "voting by mail", + "metrics": { + "recallAt10": 0.6, + "mrr": 1, + "ndcgAt10": 0.40293031154000103 + }, + "top10": [ + "192-S28", + "192-H71", + "192-H73", + "192-S484", + "192-S451", + "192-H834", + "192-H805", + "192-H3950", + "192-S459", + "192-H4367" + ], + "relevantCount": 5 + }, + { + "id": "topic-019", + "category": "topic", + "query": "school lunch", + "metrics": { + "recallAt10": 0.4, + "mrr": 0.1111111111111111, + "ndcgAt10": 0.04633996212748669 + }, + "top10": [ + "192-S363", + "192-S349", + "192-S314", + "192-H714", + "192-H686", + "192-H580", + "192-H564", + "192-H547", + "192-S298", + "192-S2532" + ], + "relevantCount": 5 + }, + { + "id": "topic-020", + "category": "topic", + "query": "renewable energy", + "metrics": { + "recallAt10": 1, + "mrr": 1, + "ndcgAt10": 1 + }, + "top10": [ + "192-H3269", + "192-H2145", + "192-S590", + "192-S2738", + "192-S2153", + "192-S1940", + "192-H3923", + "192-H3708", + "192-H3335", + "192-H3330" + ], + "relevantCount": 21 + }, + { + "id": "syn-001", + "category": "synonym", + "query": "firearms", + "metrics": { + "recallAt10": 1, + "mrr": 1, + "ndcgAt10": 1 + }, + "top10": [ + "192-S2762", + "192-S1568", + "192-S1563", + "192-S1561", + "192-H43", + "192-H3847", + "192-H3846", + "192-H2635", + "192-H2533", + "192-H2505" + ], + "relevantCount": 93 + }, + { + "id": "syn-002", + "category": "synonym", + "query": "guns", + "metrics": { + "recallAt10": 0.8, + "mrr": 1, + "ndcgAt10": 0.8643145546088337 + }, + "top10": [ + "192-H2470", + "192-S1540", + "192-H2874", + "192-H2491", + "192-H2488", + "192-H2439", + "192-S942", + "192-S939", + "192-S1615", + "192-S1562" + ], + "relevantCount": 93 + }, + { + "id": "syn-003", + "category": "synonym", + "query": "educator", + "metrics": { + "recallAt10": 0.8, + "mrr": 1, + "ndcgAt10": 0.8701249883466593 + }, + "top10": [ + "192-S366", + "192-S2748", + "192-H682", + "192-H642", + "192-H127", + "192-S285", + "192-H675", + "192-H1620", + "192-S384", + "192-S377" + ], + "relevantCount": 39 + }, + { + "id": "syn-004", + "category": "synonym", + "query": "teachers", + "metrics": { + "recallAt10": 1, + "mrr": 1, + "ndcgAt10": 1 + }, + "top10": [ + "192-H19", + "192-S1953", + "192-S1791", + "192-S1778", + "192-S1721", + "192-H628", + "192-H594", + "192-H4443", + "192-H2759", + "192-H2688" + ], + "relevantCount": 39 + }, + { + "id": "syn-005", + "category": "synonym", + "query": "cannabis", + "metrics": { + "recallAt10": 1, + "mrr": 1, + "ndcgAt10": 1 + }, + "top10": [ + "192-S2664", + "192-S2662", + "192-S2661", + "192-S2660", + "192-H4507", + "192-H4440", + "192-S77", + "192-S69", + "192-S63", + "192-H2056" + ], + "relevantCount": 57 + }, + { + "id": "syn-006", + "category": "synonym", + "query": "doctors", + "metrics": { + "recallAt10": 0, + "mrr": 0, + "ndcgAt10": 0 + }, + "top10": [ + "192-S2600", + "192-S2079", + "192-S1458", + "192-S1436", + "192-S1420", + "192-S1399", + "192-S1134", + "192-S1009", + "192-H4510", + "192-H437" + ], + "relevantCount": 15 + }, + { + "id": "syn-007", + "category": "synonym", + "query": "elderly", + "metrics": { + "recallAt10": 1, + "mrr": 1, + "ndcgAt10": 1 + }, + "top10": [ + "192-S878", + "192-S1948", + "192-H760", + "192-H730", + "192-H2911", + "192-H2846", + "192-H2820", + "192-H2773", + "192-S900", + "192-S399" + ], + "relevantCount": 27 + }, + { + "id": "syn-008", + "category": "synonym", + "query": "senior citizens", + "metrics": { + "recallAt10": 0.7, + "mrr": 1, + "ndcgAt10": 0.800693766409882 + }, + "top10": [ + "192-H723", + "192-S1961", + "192-H734", + "192-H732", + "192-H3734", + "192-H2903", + "192-H2947", + "192-S766", + "192-S252", + "192-H500" + ], + "relevantCount": 41 + }, + { + "id": "syn-009", + "category": "synonym", + "query": "liquor", + "metrics": { + "recallAt10": 1, + "mrr": 1, + "ndcgAt10": 1 + }, + "top10": [ + "192-S2215", + "192-H353", + "192-S2566", + "192-S2477", + "192-S246", + "192-S228", + "192-S227", + "192-S199", + "192-H473", + "192-H472" + ], + "relevantCount": 82 + }, + { + "id": "syn-010", + "category": "synonym", + "query": "childcare", + "metrics": { + "recallAt10": 0.6, + "mrr": 1, + "ndcgAt10": 0.727329844310522 + }, + "top10": [ + "192-S339", + "192-H649", + "192-H2884", + "192-H200", + "192-H1590", + "192-S1912", + "192-S852", + "192-S822", + "192-S358", + "192-S349" + ], + "relevantCount": 15 + }, + { + "id": "mis-001", + "category": "misspelling", + "query": "mental helth", + "metrics": { + "recallAt10": 1, + "mrr": 1, + "ndcgAt10": 0.3170853252047272 + }, + "top10": [ + "192-S820", + "192-S636", + "192-S1318", + "192-S1310", + "192-S1300", + "192-S1297", + "192-S1284", + "192-S1283", + "192-S1267", + "192-S1257" + ], + "relevantCount": 66 + }, + { + "id": "mis-002", + "category": "misspelling", + "query": "clmate change", + "metrics": { + "recallAt10": 1, + "mrr": 1, + "ndcgAt10": 0.4491790547278348 + }, + "top10": [ + "192-S571", + "192-S2737", + "192-S1796", + "192-H877", + "192-H2908", + "192-H2833", + "192-H258", + "192-H2159", + "192-S1853", + "192-H2890" + ], + "relevantCount": 27 + }, + { + "id": "mis-003", + "category": "misspelling", + "query": "marijuanna", + "metrics": { + "recallAt10": 1, + "mrr": 1, + "ndcgAt10": 0.3170853252047272 + }, + "top10": [ + "192-S76", + "192-S74", + "192-S73", + "192-S64", + "192-S2663", + "192-S2529", + "192-S1828", + "192-S1583", + "192-H4026", + "192-H3079" + ], + "relevantCount": 57 + }, + { + "id": "mis-004", + "category": "misspelling", + "query": "afordable housing", + "metrics": { + "recallAt10": 1, + "mrr": 1, + "ndcgAt10": 0.3170853252047272 + }, + "top10": [ + "192-S868", + "192-S867", + "192-H1377", + "192-H1373", + "192-S903", + "192-S895", + "192-S888", + "192-S882", + "192-S2025", + "192-S1985" + ], + "relevantCount": 40 + }, + { + "id": "mis-005", + "category": "misspelling", + "query": "homelesness", + "metrics": { + "recallAt10": 1, + "mrr": 1, + "ndcgAt10": 0.43812463509980126 + }, + "top10": [ + "192-S874", + "192-S82", + "192-S142", + "192-S110", + "192-H3959", + "192-H3838", + "192-H3778", + "192-H264", + "192-H229", + "192-H1436" + ], + "relevantCount": 26 + }, + { + "id": "mis-006", + "category": "misspelling", + "query": "opiod", + "metrics": { + "recallAt10": 1, + "mrr": 1, + "ndcgAt10": 0.6104531109861133 + }, + "top10": [ + "192-S347", + "192-S1304", + "192-S1302", + "192-H2496", + "192-H2405", + "192-H2110", + "192-H2096", + "192-H2086", + "192-H2071", + "192-H2068" + ], + "relevantCount": 21 + }, + { + "id": "mis-007", + "category": "misspelling", + "query": "domestic violance", + "metrics": { + "recallAt10": 1, + "mrr": 1, + "ndcgAt10": 0.3170853252047272 + }, + "top10": [ + "192-S951", + "192-S702", + "192-S2678", + "192-S2417", + "192-S190", + "192-S176", + "192-S1123", + "192-S1076", + "192-S1023", + "192-S1015" + ], + "relevantCount": 26 + }, + { + "id": "mis-008", + "category": "misspelling", + "query": "evicton", + "metrics": { + "recallAt10": 0.5, + "mrr": 1, + "ndcgAt10": 0.5933275909929555 + }, + "top10": [ + "192-S921", + "192-H4505", + "192-H1808", + "192-H1911", + "192-S904", + "192-S891", + "192-S886", + "192-S883", + "192-S874", + "192-S865" + ], + "relevantCount": 24 + }, + { + "id": "mis-009", + "category": "misspelling", + "query": "vacines", + "metrics": { + "recallAt10": 0.2, + "mrr": 1, + "ndcgAt10": 0.7237527203934739 + }, + "top10": [ + "192-H2411", + "192-H2394", + "192-S2626", + "192-S2622", + "192-S251", + "192-S2472", + "192-S2467", + "192-S2079", + "192-S2", + "192-S1755" + ], + "relevantCount": 12 + }, + { + "id": "mis-010", + "category": "misspelling", + "query": "minimun wage", + "metrics": { + "recallAt10": 1, + "mrr": 1, + "ndcgAt10": 0.902688816176951 + }, + "top10": [ + "192-S1176", + "192-H1994", + "192-S1159", + "192-H2043", + "192-S1213", + "192-S1179", + "192-H1971", + "192-H1964", + "192-H1959", + "192-S805" + ], + "relevantCount": 4 + } + ] +} From 34aa469760a000acc92f3780834fd49246e8e995 Mon Sep 17 00:00:00 2001 From: violet Date: Wed, 26 Aug 2026 15:24:15 -0400 Subject: [PATCH 07/16] search-eval: generalize the harness to hearings and testimony MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The eval harness measured bills only, so extending relevance work to the other collections would have shipped unmeasured (#82). Registry (scripts/search-eval/collections.ts): one entry per alias carrying the app's search params, its relevance sort, the fields golden rules resolve against, and the categories that make sense for it. Corpora and golden sets become per-alias (corpus//docs.jsonl.gz, goldens/.json), selected with --alias; everything defaults to bills, so existing invocations are unchanged. loadGoldens throws when a set's defaults.sort_by is not the collection's relevance sort — hearings motivates it: every sort option there was date-ordered, so nDCG would have measured recency. This adds a relevance sort to the hearings UI (and gives "past oldest" an eventId tiebreak instead of the duplicated startsAt:asc,startsAt:asc key), shared as constants between app and harness. Verified behaviour-neutral on bills: zero delta on every category. Corpora from prod, no credentials (yarn search-eval corpus --env --alias): firestore.rules already grants unauthenticated read on events and the publishedTestimony collection group, so the web client SDK pages the live collections and the production converter runs locally — still the property that matters, since a converter change needs source documents. The source collection derives from the config's documentTrigger so it cannot drift from the indexer's, and config.filter stays the authority on membership. Client-SDK timestamps are rebuilt as firebase-admin ones (the converters check InstanceOf against the admin class, and root vs functions/ node_modules hold separate copies). Bills keeps the emulator path: its rule is path-scoped and denies collection-group reads. Committed corpora: 962 hearings and 1,056 published testimony from prod, zero conversion failures; testimony authorUid hashed and fullName replaced by authorDisplayName — neither is in any query_by. Re-exporting bills still reproduces its corpus byte for byte. Golden sets: 48 hearings queries (nDCG@10 0.907) and 39 testimony queries (0.856) with committed baselines; every rule resolved against the corpus before being written, so no query silently skips for want of judgments. Both synonym categories sit at or near zero by design — neither collection sets synonym_sets yet, so those queries are the headroom #82 has to close. Testimony bill-id is 0.848 for the same reason bills was before numberVariants. The testimony topic category was rewritten before commit: broad queries ("housing") scored a flat 1.000 that could not detect a regression; narrow ones ("solitary confinement") put recall@10's denominator at the set size, where a missed document costs score. Two golden-authoring traps documented: a short `contains` matches inside words ("gun" matches "begun"), and rule values compare with punctuation and spaces stripped, so "health care" and "healthcare" are one rule. tests/search-eval/README.md records what the new goldens settled about weights and variants. Co-Authored-By: Claude Opus 5 --- .gitignore | 10 +- components/search/hearings/HearingSearch.tsx | 47 +- components/search/searchParams.ts | 20 +- components/search/shared/index.ts | 1 + .../search/testimony/TestimonySearch.tsx | 4 +- functions/src/hearings/search.ts | 21 +- functions/src/hearings/types.ts | 23 + package.json | 2 +- scripts/firebase-admin/exportSearchCorpus.ts | 92 +- scripts/search-eval/collections.ts | 86 ++ scripts/search-eval/corpus.ts | 63 +- scripts/search-eval/corpusFiles.ts | 98 ++ scripts/search-eval/goldens.ts | 45 +- scripts/search-eval/index.ts | 206 +++- scripts/search-eval/remoteCorpus.ts | 147 +++ scripts/search-eval/report.ts | 8 +- tests/search-eval/README.md | 192 +++ .../search-eval/baselines/hearings-base.json | 1034 +++++++++++++++++ .../baselines/main-typesense-0.24.json | 1 + .../search-eval/baselines/testimony-base.json | 890 ++++++++++++++ .../baselines/typesense-30-weights.json | 1 + tests/search-eval/baselines/typesense-30.json | 1 + .../search-eval/corpus/{ => bills}/meta.json | 2 +- .../corpus/{ => bills}/schema.json | 0 .../search-eval/corpus/hearings/docs.jsonl.gz | Bin 0 -> 128525 bytes tests/search-eval/corpus/hearings/meta.json | 11 + tests/search-eval/corpus/hearings/schema.json | 90 ++ .../corpus/publishedTestimony/docs.jsonl.gz | Bin 0 -> 1016122 bytes .../corpus/publishedTestimony/meta.json | 16 + .../corpus/publishedTestimony/schema.json | 65 ++ tests/search-eval/goldens/hearings.json | 514 ++++++++ .../goldens/publishedTestimony.json | 525 +++++++++ 32 files changed, 4030 insertions(+), 185 deletions(-) create mode 100644 functions/src/hearings/types.ts create mode 100644 scripts/search-eval/collections.ts create mode 100644 scripts/search-eval/corpusFiles.ts create mode 100644 scripts/search-eval/remoteCorpus.ts create mode 100644 tests/search-eval/README.md create mode 100644 tests/search-eval/baselines/hearings-base.json create mode 100644 tests/search-eval/baselines/testimony-base.json rename tests/search-eval/corpus/{ => bills}/meta.json (87%) rename tests/search-eval/corpus/{ => bills}/schema.json (100%) create mode 100644 tests/search-eval/corpus/hearings/docs.jsonl.gz create mode 100644 tests/search-eval/corpus/hearings/meta.json create mode 100644 tests/search-eval/corpus/hearings/schema.json create mode 100644 tests/search-eval/corpus/publishedTestimony/docs.jsonl.gz create mode 100644 tests/search-eval/corpus/publishedTestimony/meta.json create mode 100644 tests/search-eval/corpus/publishedTestimony/schema.json create mode 100644 tests/search-eval/goldens/hearings.json create mode 100644 tests/search-eval/goldens/publishedTestimony.json diff --git a/.gitignore b/.gitignore index f3834a250..e4348c094 100644 --- a/.gitignore +++ b/.gitignore @@ -102,6 +102,10 @@ CLAUDE.md #gcloud .gcloudignore -# search-eval: regenerate with `yarn search-eval:corpus`; labeling sheet is authoring scratch -tests/search-eval/corpus/bills.jsonl.gz -tests/search-eval/labeling-sheet.md +# search-eval: the bills corpus regenerates from the committed emulator fixture +# (`yarn search-eval:corpus`), so it is not committed. The prod-derived corpora +# for hearings/publishedTestimony cannot be regenerated without prod creds, so +# those ARE committed — see tests/search-eval/README.md. Labeling sheets are +# authoring scratch. +tests/search-eval/corpus/bills/docs.jsonl.gz +tests/search-eval/labeling-sheet-*.md diff --git a/components/search/hearings/HearingSearch.tsx b/components/search/hearings/HearingSearch.tsx index df35d1672..2168613f4 100644 --- a/components/search/hearings/HearingSearch.tsx +++ b/components/search/hearings/HearingSearch.tsx @@ -1,6 +1,6 @@ import { Hit } from "instantsearch.js" import { useInstantSearch } from "react-instantsearch" -import { SearchPage } from "../shared" +import { SearchPage, SortOptionInput } from "../shared" import { HearingHit } from "./HearingHit" import { CURRENT_COURT_NUMBER, @@ -8,34 +8,20 @@ import { formatCourtSubtitle } from "../courtSessions" import { useMemo, useRef } from "react" -import { hearingsSearchParams } from "../searchParams" - -/* carbon copy of type in functions/src/hearings/search.ts */ -type HearingSearchRecord = { - id: string - eventId: number - title: string - description?: string - startsAt: number - month: string - year: number - committeeCode?: string - committeeName?: string - locationName?: string - locationCity?: string - chairNames: string[] - agendaTopics: string[] - billNumbers: string[] - billSlugs: string[] - court: number - hasVideo: boolean -} +import type { HearingSearchRecord } from "functions/src/hearings/types" +import { hearingsRelevanceSort, hearingsSearchParams } from "../searchParams" export type HearingHitData = Hit -const useHearingSort = () => { +/** Relevance searches every hearing, past and upcoming. Clearing the window + * explicitly is load-bearing: SortBy calls useConfigure(selected.configure ?? {}), + * so the previously selected option's startsAt bound has to be overwritten. + */ +const noTimeWindow: SortOptionInput["configure"] = { numericRefinements: {} } + +const useHearingSort = (): SortOptionInput[] => { const now = useRef(new Date().getTime()) - return useMemo( + return useMemo( () => [ { labelKey: "sort_by.past_newest", @@ -60,8 +46,11 @@ const useHearingSort = () => { } }, { + // "upcoming" already owns startsAt:asc, and react-instantsearch needs a + // unique index name per sort option — eventId is the tiebreak that + // makes this one distinct without changing the ordering users see. labelKey: "sort_by.past_oldest", - value: "hearings/sort/startsAt:asc,startsAt:asc", + value: "hearings/sort/startsAt:asc,eventId:asc", configure: { numericRefinements: { startsAt: { @@ -69,6 +58,12 @@ const useHearingSort = () => { } } } + }, + { + // The only sort under which text ranking is observable. + labelKey: "sort_by.relevance", + value: `hearings/sort/${hearingsRelevanceSort}`, + configure: noTimeWindow } ], [] diff --git a/components/search/searchParams.ts b/components/search/searchParams.ts index 3a6ffa08a..2e074f579 100644 --- a/components/search/searchParams.ts +++ b/components/search/searchParams.ts @@ -39,9 +39,11 @@ export const testimonySearchParams = { exclude_fields: "" } satisfies SearchParameters -/** Hearings always sort by startsAt (no _text_match sort option), so these - * weights govern which documents match and typo/tie behavior, not ordering. +/** The app's "Relevance" sort option (see useTestimonySort in + * testimony/TestimonySearch.tsx), and the sort the eval harness must use. */ +export const testimonyRelevanceSort = "_text_match:desc,publishedAt:desc" + export const hearingsSearchParams = { ...weighted({ billNumbers: 10, @@ -51,6 +53,16 @@ export const hearingsSearchParams = { description: 2, locationName: 2, locationCity: 2 - }), - sort_by: "startsAt:asc" + }) } satisfies SearchParameters + +/** The app's "Relevance" sort option (see useHearingSort in + * hearings/HearingSearch.tsx). Every other hearings sort is date-ordered, so + * this is the only one under which text ranking is observable — and the only + * one the eval harness can score. + * + * No sort_by is pinned in hearingsSearchParams above: the adapter derives it + * from the "hearings/sort/" index name of the selected option, which + * takes precedence over additionalSearchParameters. + */ +export const hearingsRelevanceSort = "_text_match:desc,startsAt:desc" diff --git a/components/search/shared/index.ts b/components/search/shared/index.ts index 9d7fe6fa5..7972ed9a0 100644 --- a/components/search/shared/index.ts +++ b/components/search/shared/index.ts @@ -1 +1,2 @@ export { SearchPage } from "./SearchPage" +export type { SortOptionInput } from "./SearchPage" diff --git a/components/search/testimony/TestimonySearch.tsx b/components/search/testimony/TestimonySearch.tsx index 5efa09eea..9c8e4e751 100644 --- a/components/search/testimony/TestimonySearch.tsx +++ b/components/search/testimony/TestimonySearch.tsx @@ -25,7 +25,7 @@ import { SearchContainer } from "../SearchContainer" import { SearchErrorBoundary } from "../SearchErrorBoundary" import { SortBy } from "../SortBy" import { getServerConfig, VirtualFilters } from "../common" -import { testimonySearchParams } from "../searchParams" +import { testimonyRelevanceSort, testimonySearchParams } from "../searchParams" import { TestimonyHit } from "./TestimonyHit" import { useTestimonyRefinements } from "./useTestimonyRefinements" import { FollowContext, OrgFollowStatus } from "components/shared/FollowContext" @@ -51,7 +51,7 @@ export const useTestimonySort = () => { }, { label: t("sort_by.relevance"), - value: "publishedTestimony/sort/_text_match:desc,publishedAt:desc" + value: `publishedTestimony/sort/${testimonyRelevanceSort}` } ], [t] diff --git a/functions/src/hearings/search.ts b/functions/src/hearings/search.ts index 2bcf8abc1..3d5fb4026 100644 --- a/functions/src/hearings/search.ts +++ b/functions/src/hearings/search.ts @@ -4,26 +4,7 @@ import { createSearchIndexer } from "../search" import { Hearing } from "../events/types" import { timeZone } from "../malegislature" import { generalCourts, currentGeneralCourt } from "../shared/constants" - -type HearingSearchRecord = { - id: string - eventId: number - title: string - description?: string - startsAt: number - month: string - year: number - committeeCode?: string - committeeName?: string - locationName?: string - locationCity?: string - chairNames: string[] - agendaTopics: string[] - billNumbers: string[] - billSlugs: string[] - court: number - hasVideo: boolean -} +import { HearingSearchRecord } from "./types" export const { syncToSearchIndex: syncHearingToSearchIndex, diff --git a/functions/src/hearings/types.ts b/functions/src/hearings/types.ts new file mode 100644 index 000000000..408cc6339 --- /dev/null +++ b/functions/src/hearings/types.ts @@ -0,0 +1,23 @@ +/** The hearing document as it is indexed in Typesense. Lives here rather than + * in ./search.ts so the search UI can import it without pulling firebase-admin + * into the client bundle — the same split bills and testimony use. + */ +export type HearingSearchRecord = { + id: string + eventId: number + title: string + description?: string + startsAt: number + month: string + year: number + committeeCode?: string + committeeName?: string + locationName?: string + locationCity?: string + chairNames: string[] + agendaTopics: string[] + billNumbers: string[] + billSlugs: string[] + court: number + hasVideo: boolean +} diff --git a/package.json b/package.json index 1445e1eef..dc66ff436 100644 --- a/package.json +++ b/package.json @@ -22,7 +22,7 @@ "emulators:start": "firebase --project demo-dtp emulators:start --only auth,functions,pubsub,firestore,storage --import tests/integration/exportedTestData", "typesense-admin": "ts-node --swc -P tsconfig.script.json scripts/typesense-admin.ts", "search-eval": "ts-node --swc -P tsconfig.script.json scripts/search-eval", - "search-eval:corpus": "firebase --project demo-dtp emulators:exec --only firestore --import tests/integration/exportedTestData \"yarn firebase-admin run-script exportSearchCorpus --env local\"", + "search-eval:corpus": "firebase --project demo-dtp emulators:exec --only firestore --import tests/integration/exportedTestData \"yarn firebase-admin run-script exportSearchCorpus --env local bills\"", "firebase-admin": "ts-node --swc -P tsconfig.script.json scripts/firebase-admin", "generate-stories": "ts-node -P tsconfig.script.json scripts/generate-stories", "compose": "docker compose -f infra/docker-compose.yml", diff --git a/scripts/firebase-admin/exportSearchCorpus.ts b/scripts/firebase-admin/exportSearchCorpus.ts index 829bb9e95..4ee8833ff 100644 --- a/scripts/firebase-admin/exportSearchCorpus.ts +++ b/scripts/firebase-admin/exportSearchCorpus.ts @@ -1,26 +1,44 @@ -import { createHash } from "crypto" -import { mkdirSync, writeFileSync } from "fs" import { last } from "lodash" -import { join } from "path" -import { gzipSync } from "zlib" +// Imported for the registerConfig side effect. import "../../functions/src/bills/search" import { getRegisteredConfigs } from "../../functions/src/search/config" +import { corpusDir } from "../search-eval/corpus" +import { ExportedDoc, writeCorpus } from "../search-eval/corpusFiles" import { Script } from "./types" -const outDir = join(__dirname, "../../tests/search-eval/corpus") const batchSize = 500 -/** Extracts the bills search corpus from Firestore (run under - * `firebase emulators:exec --import tests/integration/exportedTestData` via - * `yarn search-eval:corpus`) using the production search converter, so the - * eval harness indexes exactly what the app's search pipeline would. +/** Extracts a search corpus from the emulator, seeded from the committed test + * fixture, using the production search converter — so the eval harness indexes + * exactly what the app's search pipeline would. + * + * This is the bills path (`yarn search-eval:corpus`). It uses the admin SDK, + * which bypasses security rules; an unauthenticated collectionGroup("bills") + * read is denied because the bills rule is path-scoped to generalCourts/**. + * + * Hearings and testimony come from a live project instead — the fixture holds + * ~21 hearings and lorem-ipsum testimony — and need no credentials at all: + * + * yarn search-eval corpus --env prod --alias hearings + * + * See tests/search-eval/README.md. */ -export const script: Script = async () => { - const config = getRegisteredConfigs().find(c => c.alias === "bills") - if (!config) throw Error("bills search config not registered") +export const script: Script = async ({ args }) => { + const alias: string = args.argv?.[0] + if (!alias) + throw Error( + "Pass the collection alias, e.g. `run-script exportSearchCorpus --env local bills`" + ) - const docs: { id: string; court: number }[] = [] - const lines = new Map() + const config = getRegisteredConfigs().find(c => c.alias === alias) + if (!config) + throw Error( + `No search config registered for "${alias}". Known: ${getRegisteredConfigs() + .map(c => c.alias) + .join(", ")}` + ) + + const docs: ExportedDoc[] = [] let failures = 0 let token: string | undefined = "" @@ -36,9 +54,7 @@ export const script: Script = async () => { try { const data = d.data() if (config.filter && !config.filter(data)) continue - const doc = config.convert(data) as { id: string; court: number } - docs.push(doc) - lines.set(doc.id, JSON.stringify(doc)) + docs.push(config.convert(data) as ExportedDoc) } catch (error: any) { failures++ console.error(`Failed to convert ${d.ref.path}: ${error.message}`) @@ -46,40 +62,16 @@ export const script: Script = async () => { } } - const jsonl = - Array.from(lines.keys()) - .sort() - .map(id => lines.get(id)) - .join("\n") + "\n" - - const courts: Record = {} - for (const doc of docs) { - const court = String(doc.court) - courts[court] = (courts[court] ?? 0) + 1 - } - - mkdirSync(outDir, { recursive: true }) - writeFileSync(join(outDir, "bills.jsonl.gz"), gzipSync(jsonl)) - writeFileSync( - join(outDir, "schema.json"), - JSON.stringify(config.schema, null, 2) + "\n" - ) - writeFileSync( - join(outDir, "meta.json"), - JSON.stringify( - { - collection: "bills", - source: "tests/integration/exportedTestData", - count: lines.size, - courts, - jsonlMd5: createHash("md5").update(jsonl).digest("hex") - }, - null, - 2 - ) + "\n" - ) + const count = writeCorpus({ + alias, + source: "tests/integration/exportedTestData", + docs, + schema: config.schema + }) console.log( - `Wrote ${lines.size} docs to ${outDir} (${failures} conversion failures)` + `Wrote ${count} docs to ${corpusDir( + alias + )} (${failures} conversion failures)` ) } diff --git a/scripts/search-eval/collections.ts b/scripts/search-eval/collections.ts new file mode 100644 index 000000000..0aea5da90 --- /dev/null +++ b/scripts/search-eval/collections.ts @@ -0,0 +1,86 @@ +/** Per-collection eval configuration. The search parameters come straight from + * the app (components/search/searchParams.ts) so ranking changes there flow + * into the eval without edits here. + */ +import type { TypesenseInstantsearchAdapterOptions } from "typesense-instantsearch-adapter" +import { + billsRelevanceSort, + billsSearchParams, + hearingsRelevanceSort, + hearingsSearchParams, + testimonyRelevanceSort, + testimonySearchParams +} from "../../components/search/searchParams" + +type SearchParameters = NonNullable< + TypesenseInstantsearchAdapterOptions["additionalSearchParameters"] +> + +export type EvalCollection = { + /** CollectionConfig.alias — also the corpus directory and golden set name. */ + alias: string + /** Local collection the corpus is seeded into, kept distinct from the + * dev-workflow alias so `yarn dev:up` data is never touched. */ + evalCollection: string + searchParams: SearchParameters + /** The app's relevance sort option. A golden set's defaults.sort_by must + * match it, or the eval is measuring an ordering no user can select. */ + relevanceSort: string + /** Pinned include_fields: the id plus every field golden rules resolve + * against, so judgments can be checked against a live index. */ + includeFields: string + categories: readonly string[] +} + +export const evalCollections: Record = { + bills: { + alias: "bills", + evalCollection: "bills_eval", + searchParams: billsSearchParams, + relevanceSort: billsRelevanceSort, + includeFields: "id,court,number,title,primarySponsor,currentCommittee", + categories: [ + "exact-bill-id", + "topic", + "synonym", + "misspelling", + "member-committee" + ] + }, + hearings: { + alias: "hearings", + evalCollection: "hearings_eval", + searchParams: hearingsSearchParams, + relevanceSort: hearingsRelevanceSort, + includeFields: + "id,court,title,committeeName,chairNames,billNumbers,agendaTopics,locationName,locationCity", + categories: [ + "committee", + "chair", + "bill-on-agenda", + "agenda-topic", + "location", + "synonym", + "misspelling" + ] + }, + publishedTestimony: { + alias: "publishedTestimony", + evalCollection: "publishedTestimony_eval", + searchParams: testimonySearchParams, + relevanceSort: testimonyRelevanceSort, + includeFields: "id,court,billId,authorDisplayName,authorRole,position", + categories: ["bill-id", "author", "topic", "synonym", "misspelling", "role"] + } +} + +export const aliases = Object.keys(evalCollections) + +export function resolveEvalCollection(alias: string): EvalCollection { + const collection = evalCollections[alias] + if (!collection) + throw Error( + `Unknown eval collection "${alias}". Known: ${aliases.join(", ")}` + ) + return collection +} diff --git a/scripts/search-eval/corpus.ts b/scripts/search-eval/corpus.ts index 6e3a03ad8..2b06a65ed 100644 --- a/scripts/search-eval/corpus.ts +++ b/scripts/search-eval/corpus.ts @@ -4,33 +4,40 @@ import { join } from "path" import { gunzipSync } from "zlib" import { createClient } from "../../functions/src/search/client" -export const corpusDir = join(__dirname, "../../tests/search-eval/corpus") +export const corpusRoot = join(__dirname, "../../tests/search-eval/corpus") -export type CorpusDoc = { - id: string - court: number - number: string - title: string - body?: string - primarySponsor?: string - cosponsors: string[] - currentCommittee?: string -} +export const corpusDir = (alias: string) => join(corpusRoot, alias) + +/** A corpus document: whatever the collection's converter emits. Only `id` and + * `court` are read by the harness itself; golden rules resolve the rest by name. + */ +export type CorpusDoc = { id: string; court: number } & Record export type CorpusMeta = { - collection: string + alias: string source: string count: number courts: Record jsonlMd5: string + /** Present when the export capped the document count. */ + limit?: number + /** The Firestore ordering the export paged in, e.g. "publishedAt:desc". */ + orderBy?: string + /** Fields overwritten at export time; never fields the eval searches. */ + redacted?: string[] } -export function readMeta(): CorpusMeta { - return JSON.parse(readFileSync(join(corpusDir, "meta.json"), "utf8")) +const regenerate = (alias: string) => + alias === "bills" + ? "yarn search-eval:corpus" + : `yarn firebase-admin run-script exportSearchCorpus --env prod ${alias} (see tests/search-eval/README.md)` + +export function readMeta(alias: string): CorpusMeta { + return JSON.parse(readFileSync(join(corpusDir(alias), "meta.json"), "utf8")) } /** The court the eval filters on, mirroring the app's court refinement: - * the court with the most bills in the corpus. + * the court with the most documents in the corpus. */ export function majorityCourt(meta: CorpusMeta): number { const courts = Object.entries(meta.courts).sort((a, b) => b[1] - a[1]) @@ -38,20 +45,23 @@ export function majorityCourt(meta: CorpusMeta): number { return Number(courts[0][0]) } -export function readCorpus(): { docs: CorpusDoc[]; jsonl: string } { - const path = join(corpusDir, "bills.jsonl.gz") +export function readCorpus(alias: string): { + docs: CorpusDoc[] + jsonl: string +} { + const path = join(corpusDir(alias), "docs.jsonl.gz") if (!existsSync(path)) { - throw Error( - `${path} not found. Generate it with: yarn search-eval:corpus (requires the firebase CLI; takes a minute or two)` - ) + throw Error(`${path} not found. Generate it with: ${regenerate(alias)}`) } const jsonl = gunzipSync(readFileSync(path)).toString("utf8") - const meta = readMeta() + const meta = readMeta(alias) const md5 = createHash("md5").update(jsonl).digest("hex") if (md5 !== meta.jsonlMd5) { throw Error( - `Corpus hash mismatch: bills.jsonl.gz has md5 ${md5} but meta.json expects ${meta.jsonlMd5}. Regenerate with: yarn search-eval:corpus` + `Corpus hash mismatch: ${alias}/docs.jsonl.gz has md5 ${md5} but meta.json expects ${ + meta.jsonlMd5 + }. Regenerate with: ${regenerate(alias)}` ) } @@ -67,16 +77,17 @@ export function readCorpus(): { docs: CorpusDoc[]; jsonl: string } { } /** Drops and recreates `collection` from the committed schema, then imports - * the corpus. Uses a dedicated collection (default bills_eval) so the - * dev-workflow "bills" alias is never touched. + * the corpus. Uses a dedicated collection (default _eval) so the + * dev-workflow aliases are never touched. */ export async function seedCollection( client: ReturnType, + alias: string, collection: string ): Promise { - const { docs, jsonl } = readCorpus() + const { docs, jsonl } = readCorpus(alias) const schema = JSON.parse( - readFileSync(join(corpusDir, "schema.json"), "utf8") + readFileSync(join(corpusDir(alias), "schema.json"), "utf8") ) const existing = await client.collections().retrieve() diff --git a/scripts/search-eval/corpusFiles.ts b/scripts/search-eval/corpusFiles.ts new file mode 100644 index 000000000..1de4b8e10 --- /dev/null +++ b/scripts/search-eval/corpusFiles.ts @@ -0,0 +1,98 @@ +/** Writing the corpus artifacts. Shared by the two ways a corpus is produced: + * the emulator export (scripts/firebase-admin/exportSearchCorpus.ts, admin SDK, + * rules bypassed) and the credential-free remote export (./remoteCorpus.ts, + * client SDK, subject to security rules). + */ +import { createHash } from "crypto" +import { mkdirSync, writeFileSync } from "fs" +import { join } from "path" +import { gzipSync } from "zlib" +import type { Schema } from "../../functions/src/search/config" +import { corpusDir } from "./corpus" + +export type ExportedDoc = { id: string; court: number } & Record< + string, + unknown +> + +/** Fields rewritten before a document is written to the corpus. None of them + * are in the collection's query_by (components/search/searchParams.ts), so + * redacting them changes nothing the eval measures — it keeps identifiers the + * app never exposes out of a committed artifact. + */ +export const redactions: Record< + string, + { fields: string[]; apply: (doc: ExportedDoc) => ExportedDoc } +> = { + publishedTestimony: { + fields: ["authorUid", "fullName"], + apply: doc => ({ + ...doc, + authorUid: createHash("sha1") + .update(String(doc.authorUid)) + .digest("hex") + .slice(0, 16), + fullName: String(doc.authorDisplayName ?? "") + }) + } +} + +export function writeCorpus({ + alias, + source, + docs, + schema, + limit, + orderBy +}: { + alias: string + /** Where the documents came from: an env name, or the fixture path. */ + source: string + docs: ExportedDoc[] + schema: Schema + limit?: number + orderBy?: string +}): number { + const redact = redactions[alias] + + const byId = new Map() + for (const doc of docs) byId.set(doc.id, redact ? redact.apply(doc) : doc) + + // Sorted by id so the corpus — and its md5 — is stable across exports that + // paged in a different order. + const ids = Array.from(byId.keys()).sort() + const jsonl = ids.map(id => JSON.stringify(byId.get(id))).join("\n") + "\n" + + const courts: Record = {} + for (const id of ids) { + const court = String(byId.get(id)!.court) + courts[court] = (courts[court] ?? 0) + 1 + } + + const outDir = corpusDir(alias) + mkdirSync(outDir, { recursive: true }) + writeFileSync(join(outDir, "docs.jsonl.gz"), gzipSync(jsonl)) + writeFileSync( + join(outDir, "schema.json"), + JSON.stringify(schema, null, 2) + "\n" + ) + writeFileSync( + join(outDir, "meta.json"), + JSON.stringify( + { + alias, + source, + count: ids.length, + courts, + jsonlMd5: createHash("md5").update(jsonl).digest("hex"), + ...(limit === undefined ? {} : { limit }), + ...(orderBy === undefined ? {} : { orderBy }), + ...(redact === undefined ? {} : { redacted: redact.fields }) + }, + null, + 2 + ) + "\n" + ) + + return ids.length +} diff --git a/scripts/search-eval/goldens.ts b/scripts/search-eval/goldens.ts index 7370f6e45..466ab4c52 100644 --- a/scripts/search-eval/goldens.ts +++ b/scripts/search-eval/goldens.ts @@ -3,21 +3,18 @@ import { join } from "path" import { Array as A, Boolean as B, - Literal as L, Number as N, Optional, Record as R, Static, - String as S, - Union + String as S } from "runtypes" +import { resolveEvalCollection } from "./collections" import { CorpusDoc } from "./corpus" import { Judgments } from "./metrics" -export const goldensPath = join( - __dirname, - "../../tests/search-eval/goldens/bills.json" -) +export const goldensPath = (alias: string) => + join(__dirname, `../../tests/search-eval/goldens/${alias}.json`) const Rule = R({ field: Optional(S), @@ -32,17 +29,11 @@ const RelevantEntry = R({ grade: N }) -export const Category = Union( - L("exact-bill-id"), - L("topic"), - L("synonym"), - L("misspelling"), - L("member-committee") -) - const GoldenQuery = R({ id: S, - category: Category, + /** Validated against the collection's allowlist in loadGoldens — the + * meaningful categories differ per collection. */ + category: S, query: S, relevant: Optional(A(RelevantEntry)), sameAs: Optional(S), @@ -59,12 +50,30 @@ export type GoldenQuery = Static export type GoldenSet = Static export type Rule = Static -export function loadGoldens(): GoldenSet { - const goldens = GoldenSet.check(JSON.parse(readFileSync(goldensPath, "utf8"))) +export function loadGoldens(alias: string): GoldenSet { + const collection = resolveEvalCollection(alias) + const goldens = GoldenSet.check( + JSON.parse(readFileSync(goldensPath(alias), "utf8")) + ) + + // A golden set scored under a sort the app cannot select measures an ordering + // no user ever sees. Hearings is the cautionary case: every sort option there + // was date-ordered, so nDCG measured recency. + if (goldens.defaults.sort_by !== collection.relevanceSort) + throw Error( + `${alias} goldens sort "${goldens.defaults.sort_by}" does not match the app's relevance sort "${collection.relevanceSort}" (components/search/searchParams.ts)` + ) + const ids = new Set(goldens.queries.map(q => q.id)) if (ids.size !== goldens.queries.length) throw Error("Duplicate query ids in golden set") for (const q of goldens.queries) { + if (!collection.categories.includes(q.category)) + throw Error( + `Query ${q.id} has unknown category "${ + q.category + }" for ${alias}. Known: ${collection.categories.join(", ")}` + ) if (!q.relevant && !q.sameAs) throw Error(`Query ${q.id} has neither relevant labels nor sameAs`) if (q.sameAs && !ids.has(q.sameAs)) diff --git a/scripts/search-eval/index.ts b/scripts/search-eval/index.ts index eeb8b2b93..41ebbe54f 100644 --- a/scripts/search-eval/index.ts +++ b/scripts/search-eval/index.ts @@ -4,10 +4,11 @@ import { join } from "path" import type { SearchParams } from "typesense" import yargs, { Arguments } from "yargs" import { hideBin } from "yargs/helpers" -import { billsSearchParams } from "../../components/search/searchParams" import { TypesenseConnectionArgs, resolveClient } from "../typesense-env" +import { EvalCollection, aliases, resolveEvalCollection } from "./collections" import { CorpusDoc, + corpusDir, majorityCourt, readCorpus, readMeta, @@ -32,18 +33,26 @@ import { type Args = Arguments< TypesenseConnectionArgs & { + alias?: string collection?: string out?: string courtFilter?: boolean only?: string threshold?: number + limit?: number + orderBy?: string } > -const resolveCollection = (args: Args) => - args.collection ?? (args.env === "local" ? "bills_eval" : "bills") - -const includeFields = "id,court,number,title,primarySponsor,currentCommittee" +const resolveTarget = (args: Args) => { + const evalCollection = resolveEvalCollection(args.alias ?? "bills") + const collection = + args.collection ?? + (args.env === "local" + ? evalCollection.evalCollection + : evalCollection.alias) + return { evalCollection, collection } +} /** The typesense client's own search params, with the fields every eval * search must pin made required. New ranking knobs added to @@ -55,7 +64,11 @@ type EvalSearchParams = SearchParams & { per_page: number } -function createSearcher(args: Args, collection: string) { +function createSearcher( + args: Args, + evalCollection: EvalCollection, + collection: string +) { const client = resolveClient(args) return { client, @@ -63,7 +76,7 @@ function createSearcher(args: Args, collection: string) { const result = await client .collections(collection) .documents() - .search({ include_fields: includeFields, ...params }) + .search({ include_fields: evalCollection.includeFields, ...params }) return (result.hits ?? []).map(h => h.document) } } @@ -82,18 +95,27 @@ function courtFor( return enabled ? majority : undefined } -// The ranking params under test: everything the app sends except -// exclude_fields, which conflicts with the eval's pinned include_fields. -const { exclude_fields: _, ...billsRankingParams } = billsSearchParams +/** The ranking params under test: everything the app sends except + * exclude_fields, which conflicts with the eval's pinned include_fields. The + * cast re-homes the adapter's parameter type, which is generic over its own + * DocumentSchema, onto the CorpusDoc the eval pins. + */ +const rankingParams = ({ searchParams }: EvalCollection) => { + const { exclude_fields: _, ...rest } = searchParams + return rest as Omit, "q" | "per_page"> & { + query_by: string + } +} const searchTop10 = ( search: ReturnType["search"], + evalCollection: EvalCollection, query: GoldenQuery, goldens: GoldenSet, court: number | undefined ) => search({ - ...billsRankingParams, + ...rankingParams(evalCollection), q: query.query, sort_by: goldens.defaults.sort_by, filter_by: court === undefined ? undefined : `court:=${court}`, @@ -132,11 +154,12 @@ async function judgmentsFor( } async function runEval(args: Args) { - const goldens = loadGoldens() - const collection = resolveCollection(args) - const { client, search } = createSearcher(args, collection) - const localDocs = args.env === "local" ? readCorpus().docs : undefined - const meta = readMeta() + const { evalCollection, collection } = resolveTarget(args) + const goldens = loadGoldens(evalCollection.alias) + const { client, search } = createSearcher(args, evalCollection, collection) + const localDocs = + args.env === "local" ? readCorpus(evalCollection.alias).docs : undefined + const meta = readMeta(evalCollection.alias) const majority = majorityCourt(meta) const results: QueryResult[] = [] @@ -156,7 +179,13 @@ async function runEval(args: Args) { continue } - const top10 = await searchTop10(search, query, goldens, court) + const top10 = await searchTop10( + search, + evalCollection, + query, + goldens, + court + ) const topIds = top10.map(d => d.id) results.push({ id: query.id, @@ -178,6 +207,7 @@ async function runEval(args: Args) { { env: args.env ?? "custom", url: args.url ?? "", + alias: evalCollection.alias, collection, serverVersion, corpusMd5: meta.jsonlMd5, @@ -196,55 +226,159 @@ async function runEval(args: Args) { if (args.out) writeResults(evalResults, args.out) } +/** Renders one field of a hit for the labeling sheet: arrays joined, pipes + * swapped out so they cannot break the markdown table. + */ +const cell = (value: unknown) => + (Array.isArray(value) ? value.join("; ") : (value ?? "").toString()).replace( + /\|/g, + "/" + ) + async function writeLabelingSheet(args: Args) { - const goldens = loadGoldens() - const collection = resolveCollection(args) - const { search } = createSearcher(args, collection) + const { evalCollection, collection } = resolveTarget(args) + const goldens = loadGoldens(evalCollection.alias) + const { search } = createSearcher(args, evalCollection, collection) const queries = goldens.queries.filter( q => !args.only || q.category === args.only ) + // The pinned include_fields minus the id, which gets its own column. + const columns = evalCollection.includeFields + .split(",") + .filter(field => field !== "id") + const sections: string[] = [ - "# Search eval labeling sheet", + `# Search eval labeling sheet — ${evalCollection.alias}`, "", `Top 10 results per golden query (collection "${collection}", sort "${goldens.defaults.sort_by}").`, "Grade each result: 3 = exactly what the searcher wanted, 1 = relevant, 0/blank = not relevant.", - "Merge grades into tests/search-eval/goldens/bills.json as explicit docId entries.", + `Merge grades into tests/search-eval/goldens/${evalCollection.alias}.json as explicit docId entries.`, "" ] - const majority = majorityCourt(readMeta()) + const majority = majorityCourt(readMeta(evalCollection.alias)) for (const query of queries) { const court = courtFor(query, goldens, args, majority) - const top10 = await searchTop10(search, query, goldens, court) + const top10 = await searchTop10( + search, + evalCollection, + query, + goldens, + court + ) sections.push( `## ${query.id} (${query.category}): "${query.query}"`, "", - "| grade | rank | docId | number | title | primarySponsor |", - "| --- | --- | --- | --- | --- | --- |", + `| grade | rank | docId | ${columns.join(" | ")} |`, + `| --- | --- | --- | ${columns.map(() => "---").join(" | ")} |`, ...top10.map( (d, i) => - `| | ${i + 1} | ${d.id} | ${d.number} | ${(d.title ?? "").replace( - /\|/g, - "/" - )} | ${d.primarySponsor ?? ""} |` + `| | ${i + 1} | ${d.id} | ${columns + .map(field => cell(d[field])) + .join(" | ")} |` ), "" ) } - const path = join(__dirname, "../../tests/search-eval/labeling-sheet.md") + const path = join( + __dirname, + `../../tests/search-eval/labeling-sheet-${evalCollection.alias}.md` + ) writeFileSync(path, sections.join("\n")) console.log(`Wrote labeling sheet for ${queries.length} queries to ${path}`) } +/** Builds a corpus from a live project. Imports are deferred because pulling in + * the search configs loads firebase-admin, which every other subcommand does + * without. + */ +async function buildRemoteCorpus(args: Args) { + const env = args.env + if (env !== "dev" && env !== "prod") + throw Error( + "corpus needs --env dev or --env prod. The bills corpus comes from the committed emulator fixture: yarn search-eval:corpus" + ) + + const { evalCollection } = resolveTarget(args) + // require, not import(): under ts-node --swc the dynamic import survives as a + // native ESM import and fails to resolve the extensionless path. + const { fetchRemoteDocs, projects } = + require("./remoteCorpus") as typeof import("./remoteCorpus") + const { writeCorpus } = + require("./corpusFiles") as typeof import("./corpusFiles") + const { getRegisteredConfigs } = + require("../../functions/src/search/config") as typeof import("../../functions/src/search/config") + require("../../functions/src/hearings/search") + require("../../functions/src/testimony/search") + + const config = getRegisteredConfigs().find( + c => c.alias === evalCollection.alias + ) + if (!config) + throw Error(`No search config registered for "${evalCollection.alias}"`) + + const [orderByField, direction = "asc"] = ( + args.orderBy ?? config.idField + ).split(":") + if (direction !== "asc" && direction !== "desc") + throw Error(`--order-by direction must be asc or desc, got "${direction}"`) + + console.log( + `Reading ${config.alias} from ${projects[env]} (no credentials — see firestore.rules)` + ) + const { docs, failures } = await fetchRemoteDocs({ + env, + config, + limit: args.limit, + orderByField, + direction, + onProgress: (fetched, kept) => + console.log(` fetched ${fetched}, kept ${kept}`) + }) + + const count = writeCorpus({ + alias: config.alias, + source: env, + docs, + schema: config.schema, + limit: args.limit, + orderBy: args.orderBy + }) + console.log( + `Wrote ${count} docs to ${corpusDir( + config.alias + )} (${failures} conversion failures)` + ) +} + yargs(hideBin(process.argv)) .scriptName("search-eval") + .command( + "corpus", + "build a corpus from a live project (dev/prod, no credentials needed)", + yargs => + yargs.options({ + limit: { number: true, describe: "cap the number of documents" }, + "order-by": { + string: true, + describe: + "field[:asc|desc] to page in, e.g. publishedAt:desc (default: the config's id field)" + } + }), + (args: Args) => buildRemoteCorpus(args) + ) .command( "seed", "create and import the eval collection from the corpus snapshot", {}, async (args: Args) => { - await seedCollection(resolveClient(args), resolveCollection(args)) + const { evalCollection, collection } = resolveTarget(args) + await seedCollection( + resolveClient(args), + evalCollection.alias, + collection + ) } ) .command( @@ -290,10 +424,16 @@ yargs(hideBin(process.argv)) url: { string: true, alias: "u" }, key: { string: true, alias: "k" }, env: { choices: ["local", "dev", "prod"], alias: "e" }, + alias: { + string: true, + choices: aliases, + default: "bills", + describe: "which search collection to evaluate" + }, collection: { string: true, describe: - "target collection (default: bills_eval locally, bills on dev/prod)" + "target collection (default: _eval locally, on dev/prod)" } }) .demandCommand(1) diff --git a/scripts/search-eval/remoteCorpus.ts b/scripts/search-eval/remoteCorpus.ts new file mode 100644 index 000000000..a9115cc70 --- /dev/null +++ b/scripts/search-eval/remoteCorpus.ts @@ -0,0 +1,147 @@ +/** Builds a corpus from a live MAPLE project without any credentials. + * + * firestore.rules grants unauthenticated read on every collection a corpus is + * built from — `events` and `generalCourts/**` are "public, read-only", and + * publishedTestimony has an explicit `match /{path=**}/publishedTestimony/{id}` + * rule so it can be read as a collection group. So the web client SDK reads it + * with nothing but a project id, which is what makes hearings and testimony + * corpora reachable to contributors who have no service account. + * + * Bills is the exception: its rule is path-scoped to `generalCourts/**` and + * does not grant collection-group scope, so a collectionGroup("bills") read is + * denied here. Bills is exported from the committed emulator fixture instead + * (scripts/firebase-admin/exportSearchCorpus.ts), where the admin SDK bypasses + * rules. + */ +import { initializeApp } from "firebase/app" +import { + DocumentData, + QueryDocumentSnapshot, + Timestamp as ClientTimestamp, + collection, + collectionGroup, + getDocs, + getFirestore, + limit as limitTo, + orderBy, + query, + startAfter +} from "firebase/firestore" +// The very same Timestamp the converters' runtypes check against. Importing it +// from "firebase-admin/firestore" here instead resolves to the ROOT copy of the +// package while functions/src/firebase resolves to functions/node_modules — two +// distinct classes, and every InstanceOf check fails with the memorable +// "Expected Timestamp, but was Timestamp". +import { Timestamp as AdminTimestamp } from "../../functions/src/firebase" +import type { CollectionConfig } from "../../functions/src/search/config" +import { ExportedDoc } from "./corpusFiles" + +export const projects = { + dev: "digital-testimony-dev", + prod: "digital-testimony-prod" +} as const + +export type RemoteEnv = keyof typeof projects + +const batchSize = 500 + +/** The converters validate timestamps with `InstanceOf(Timestamp)` against the + * firebase-admin class (functions/src/testimony/types.ts:41, + * functions/src/events/types.ts:33). The client SDK's Timestamp is a different + * class, so every document fails validation unless it is rebuilt as the admin + * one. Seconds and nanos are carried across rather than millis so nothing is + * rounded away. + */ +const toAdminTypes = (value: unknown): unknown => { + if (value instanceof ClientTimestamp) + return new AdminTimestamp(value.seconds, value.nanoseconds) + if (Array.isArray(value)) return value.map(toAdminTypes) + if (value !== null && typeof value === "object") + return Object.fromEntries( + Object.entries(value as Record).map(([k, v]) => [ + k, + toAdminTypes(v) + ]) + ) + return value +} + +/** The collection to read, derived from the config's document trigger so it + * cannot drift from the indexer's own source. "events/{eventId}" reads the + * events collection; "users/{uid}/publishedTestimony/{id}" reads + * publishedTestimony as a collection group. + * + * Any `where` on config.sourceCollection is deliberately not reproduced — + * config.filter is the authority on which documents belong in the index, and + * it is applied to every document below. + */ +export function sourceFromTrigger(documentTrigger: string) { + const segments = documentTrigger.split("/").filter(Boolean) + if (segments.length < 2 || segments.length % 2 !== 0) + throw Error(`Cannot read a collection out of trigger "${documentTrigger}"`) + return { + collectionId: segments[segments.length - 2], + isCollectionGroup: segments.length > 2 + } +} + +export async function fetchRemoteDocs({ + env, + config, + limit, + orderByField, + direction, + onProgress +}: { + env: RemoteEnv + config: CollectionConfig + limit?: number + orderByField: string + direction: "asc" | "desc" + onProgress?: (fetched: number, kept: number) => void +}): Promise<{ docs: ExportedDoc[]; failures: number }> { + const projectId = projects[env] + const { collectionId, isCollectionGroup } = sourceFromTrigger( + config.documentTrigger + ) + + const app = initializeApp({ projectId }, `search-eval-${env}`) + const db = getFirestore(app) + const source = isCollectionGroup + ? collectionGroup(db, collectionId) + : collection(db, collectionId) + + const docs: ExportedDoc[] = [] + let failures = 0 + let fetched = 0 + let cursor: QueryDocumentSnapshot | undefined + + while (limit === undefined || docs.length < limit) { + const page = query( + source, + orderBy(orderByField, direction), + ...(cursor ? [startAfter(cursor)] : []), + limitTo(batchSize) + ) + const snap = await getDocs(page) + if (snap.empty) break + cursor = snap.docs[snap.docs.length - 1] + fetched += snap.size + + for (const d of snap.docs) { + const data = toAdminTypes(d.data()) as DocumentData + try { + if (config.filter && !config.filter(data)) continue + docs.push(config.convert(data) as ExportedDoc) + if (limit !== undefined && docs.length >= limit) break + } catch (error: any) { + failures++ + console.error(`Failed to convert ${d.ref.path}: ${error.message}`) + } + } + onProgress?.(fetched, docs.length) + if (snap.size < batchSize) break + } + + return { docs, failures } +} diff --git a/scripts/search-eval/report.ts b/scripts/search-eval/report.ts index 3b8ce8174..774adf47b 100644 --- a/scripts/search-eval/report.ts +++ b/scripts/search-eval/report.ts @@ -14,6 +14,7 @@ export type EvalResults = { meta: { env: string url: string + alias: string collection: string serverVersion: string corpusMd5: string @@ -57,7 +58,8 @@ const row = (label: string, m: QueryMetrics & { queryCount: number }) => ({ export function printScorecard(results: EvalResults) { console.log( - `\nSearch relevance scorecard — server ${results.meta.serverVersion}, ` + + `\nSearch relevance scorecard — ${results.meta.alias}, ` + + `server ${results.meta.serverVersion}, ` + `collection ${results.meta.collection}, sort "${results.meta.sortBy}"` + (results.meta.court !== undefined ? `, court ${results.meta.court}` : "") ) @@ -91,6 +93,10 @@ export function compare( `\nComparing ${candidatePath} (server ${candidate.meta.serverVersion})` + ` against ${baselinePath} (server ${baseline.meta.serverVersion})` ) + if (baseline.meta.alias !== candidate.meta.alias) + console.warn( + `WARNING: comparing different collections (${baseline.meta.alias} vs ${candidate.meta.alias})` + ) if (baseline.meta.corpusMd5 !== candidate.meta.corpusMd5) console.warn("WARNING: corpus hashes differ — not an apples-to-apples run") diff --git a/tests/search-eval/README.md b/tests/search-eval/README.md new file mode 100644 index 000000000..86ba85881 --- /dev/null +++ b/tests/search-eval/README.md @@ -0,0 +1,192 @@ +# Search relevance eval + +Measures how well Typesense answers real queries, per collection, so search +changes ship with a number attached instead of a hunch. + +Scored with capped recall@10, MRR and nDCG@10 (exponential gain) over a golden +query set, against a frozen corpus snapshot seeded into a dedicated local +collection. Harness lives in `scripts/search-eval`. + +## The loop + +The repo needs node 22; the usual machine default is 24 and plain `yarn` fails +the engine check. + +```bash +export PATH="$HOME/.nvm/versions/node/v22.23.2/bin:$PATH" +yarn dev:up # local Typesense on :8108 +yarn typesense-admin upsert-synonyms --env local # the "legislative" synonym set + +yarn search-eval seed -e local --alias +yarn search-eval run -e local --alias --out /tmp/candidate.json +yarn search-eval compare tests/search-eval/baselines/.json /tmp/candidate.json +``` + +`--alias` is one of `bills` (the default), `hearings`, `publishedTestimony`. +`compare` exits non-zero when overall nDCG@10 drops by more than `--threshold` +(default 0.05) and lists per-query regressions. + +To author or revise a golden set, `yarn search-eval label -e local --alias ` +writes `labeling-sheet-.md` — every query's top 10 as a gradeable table. +Grade 3 = exactly what the searcher wanted, 1 = relevant, 0/blank = not, then +merge the graded rows back as explicit `docId` entries. + +Run `yarn check-types` as well as `yarn test`: jest transpiles differently and +hides errors the root tsconfig catches. + +## Corpora + +Each lives in `corpus//` as `docs.jsonl.gz` + `schema.json` + +`meta.json`. `meta.json` pins the gzip's md5, and the harness refuses to run +against a corpus that does not match it. Documents are produced by the +**production converter** (`functions/src/*/search.ts`), so the eval indexes +exactly what the app's search pipeline would. + +**bills** regenerates from the committed emulator fixture, so it is gitignored: + +```bash +yarn search-eval:corpus # 7,337 bills, ~15s +``` + +**hearings** and **publishedTestimony** cannot. The fixture holds ~21 hearings, +and its testimony content is lorem ipsum (`tests/seed/seedTestimony.test.ts` +generates it with `loremIpsum()` for 4 test users) — there is no real language +to match against. They come from a live project instead, and need **no +credentials**: + +```bash +yarn search-eval corpus --env prod --alias hearings +yarn search-eval corpus --env prod --alias publishedTestimony --order-by publishedAt:desc +``` + +`firestore.rules` grants unauthenticated read on both sources — `events` is +"public, read-only" and publishedTestimony has an explicit +`match /{path=**}/publishedTestimony/{id}` rule so it can be read as a +collection group — so the web client SDK reads them with nothing but a project +id. `--env dev` works the same way against `digital-testimony-dev`. + +Bills is the odd one out: its rule is path-scoped to `generalCourts/**` and does +not grant collection-group scope, so an unauthenticated `collectionGroup("bills")` +read is denied. That is why bills keeps the emulator path, where the admin SDK +bypasses rules. + +Both corpora are **committed**, because they are snapshots of a moving source: +re-exporting tomorrow gives a different md5. Committing pins the eval to one +snapshot, and refreshing it becomes a deliberate act. They are small — 126 KB +and 992 KB gzipped. + +Re-export when a converter changes what it emits. The corpus md5 moves with it, +and `compare` will warn that the run is not apples-to-apples. To keep such a +change measurable, re-run the _previous_ search config against the new corpus +first and use that as the control. + +Two things the testimony corpus is not: + +- **Complete history.** It is every published testimony prod holds (1,056 at + time of writing), not a sample — but that is small next to bills' 7,337, and + the court refinement narrows each query to one court's share. Absolute scores + read higher than prod's full index would give; run-to-run deltas stay valid. +- **Unredacted.** `authorUid` becomes a stable hash and `fullName` is replaced + by `authorDisplayName`. Neither is in any `query_by` + (`components/search/searchParams.ts`), so nothing measured changes; + `authorDisplayName` and `content` are kept verbatim because they are already + published publicly and are what the eval scores. `meta.json` records which + fields were rewritten. + +## Golden sets + +`goldens/.json`. Each query carries either `relevant` labels or a +`sameAs` pointer to a query it shares labels with (how misspellings reuse their +correctly-spelled twin). A label is an explicit `docId` or a `rule` resolved +against the corpus: + +```json +{ + "id": "tt-001", + "category": "topic", + "query": "ranked choice voting", + "relevant": [ + { "rule": { "field": "billId", "equals": "S531" }, "grade": 3 }, + { "rule": { "field": "content", "contains": "ranked choice" }, "grade": 1 } + ] +} +``` + +Grades: **3** when the query names the thing exactly — a bill number, a +committee, an author, a location, a specific policy — and **1** when the +document is merely on the topic. A query whose labels are all one grade only +measures whether the right documents are found; mixing grades makes their +_order_ matter too, which is what the example above does: testimony on the +ranked-choice bill should outrank testimony that name-drops the phrase. + +Rule values and document values are compared with everything but letters and +digits stripped, so `contains: "health care"` also matches "healthcare", and +`equals: "Cindy F. Friedman"` needs the indexed form, not the form a searcher +types. Two traps when writing rules: + +- **Short `contains` values match inside words.** `contains: "gun"` matches + "begun" — 54 false positives in the testimony corpus. Prefer a stem long + enough to be unambiguous (`"incarcerat"`, `"disabilit"`). +- **A rule that resolves to nothing silently skips the query.** Check a + candidate rule against the corpus before committing it. + +`defaults.sort_by` must equal the collection's relevance sort exported from +`components/search/searchParams.ts`; `loadGoldens` throws otherwise. A golden +set scored under a sort no user can select measures an ordering nobody sees — +hearings was exactly that case until a relevance option was added, with every +sort date-ordered so nDCG measured recency. + +`defaults.courtFilter` mirrors the app's court refinement, pinned to the +corpus's majority court — 192 for the bills fixture, 194 for both prod corpora. +It is the _only_ app refinement the eval mirrors: hearings also defaults +`hasVideo: ["true"]` in its initial UI state, which the eval ignores because it +shrinks the candidate pool without being a relevance knob. + +### Prefer queries that can fail + +Broad topics saturate. An early draft of the testimony `topic` category asked +for "housing", "climate", "education" and scored a flat **1.000** on all ten +queries: with 100+ relevant documents each, the top ten fills with relevant +documents whatever the ranking does, so the category could not have detected a +regression. Narrow queries with 3-25 relevant documents discriminate, because +then recall@10's denominator is the set size and a missed document costs real +score. Prefer "solitary confinement" and "same day voter registration" over +"prisons" and "voting". + +## Baselines + +`baselines/*.json` are committed scorecards, one per landed search change, each +recording the collection, server version, corpus md5 and git sha it was produced +from. Current: + +| collection | queries | nDCG@10 | weakest categories | +| ------------------ | ------- | ------- | ------------------------------ | +| bills | 70 | 0.752 | topic 0.497, misspelling 0.499 | +| hearings | 48 | 0.957 | agenda-topic 0.842 | +| publishedTestimony | 39 | 0.940 | topic 0.861, misspelling 0.943 | + +Hearings and testimony each landed two measured changes: the legislative synonym +set (synonym 0.000 → 0.810 and 0.673 → 0.968) and, for testimony only, +bill-number variants (bill-id 0.848 → 1.000). + +### What these goldens have already settled + +- **Weights are not a lever on either new collection.** Testimony's are inert: + inverting them entirely (billId 10→1, content 3→10) changes 2 of 39 queries' + top-10 and moves the score not at all, because its queries are field-disjoint + in practice — a bill number only appears in `billId`, an author name only in + `authorDisplayName`, topic words only in `content`. Hearings' are already + optimal: every small perturbation scores exactly 0.957, and the only vectors + that change anything drop `title` to or below `agendaTopics`, trading + committee accuracy (0.978 → 0.903) for agenda-topic (0.842 → 0.924) at a net + loss. +- **Hearings must not index bill-number variants.** Typesense pools tokens + across a field's array elements, so on a multi-valued `billNumbers` the query + "H 2391" matches a hearing whose agenda happens to list both an H-bill and an + S2391 — `hearing-5226`, with 46 unrelated bills, becomes a false positive. + Bills and testimony are safe: one variant per document, so tokens cannot + combine across neighbours. +- **Typo tolerance masks synonym defects.** `liquor` appears to reach the + "Alcohol" hearings, but only because the expansion "alcoholic" is two edits + from "alcohol"; at `num_typos=0` it finds nothing. Verify synonym work with + typos off, or a broken set will look healthy. diff --git a/tests/search-eval/baselines/hearings-base.json b/tests/search-eval/baselines/hearings-base.json new file mode 100644 index 000000000..68552bce1 --- /dev/null +++ b/tests/search-eval/baselines/hearings-base.json @@ -0,0 +1,1034 @@ +{ + "meta": { + "env": "local", + "url": "", + "alias": "hearings", + "collection": "hearings_eval", + "serverVersion": "30.2", + "corpusMd5": "fa6e9fe42e3da564da0bd72eef1e55aa", + "gitSha": "2e037d0c8b1a61d3fe09b8c37a9de94d9c4a076f", + "timestamp": "2026-08-19T18:30:10.469Z", + "sortBy": "_text_match:desc,startsAt:desc", + "court": 194, + "skippedQueries": [] + }, + "overall": { + "recallAt10": 0.90625, + "mrr": 0.9270833333333334, + "ndcgAt10": 0.9065328757618745, + "queryCount": 48 + }, + "categories": { + "agenda-topic": { + "recallAt10": 0.825, + "mrr": 1, + "ndcgAt10": 0.8417087253585072, + "queryCount": 8 + }, + "bill-on-agenda": { + "recallAt10": 1, + "mrr": 1, + "ndcgAt10": 1, + "queryCount": 10 + }, + "chair": { + "recallAt10": 1, + "mrr": 1, + "ndcgAt10": 1, + "queryCount": 6 + }, + "committee": { + "recallAt10": 0.99, + "mrr": 0.95, + "ndcgAt10": 0.977990823370192, + "queryCount": 10 + }, + "location": { + "recallAt10": 1, + "mrr": 1, + "ndcgAt10": 1, + "queryCount": 5 + }, + "misspelling": { + "recallAt10": 1, + "mrr": 1, + "ndcgAt10": 1, + "queryCount": 6 + }, + "synonym": { + "recallAt10": 0, + "mrr": 0, + "ndcgAt10": 0, + "queryCount": 3 + } + }, + "queries": [ + { + "id": "hc-001", + "category": "committee", + "query": "Ways and Means", + "metrics": { + "recallAt10": 1, + "mrr": 1, + "ndcgAt10": 1 + }, + "top10": [ + "hearing-5099", + "hearing-5594", + "hearing-5585", + "hearing-5577", + "hearing-5582", + "hearing-5584", + "hearing-5575", + "hearing-5583", + "hearing-5546", + "hearing-5100" + ], + "relevantCount": 19 + }, + { + "id": "hc-002", + "category": "committee", + "query": "Judiciary", + "metrics": { + "recallAt10": 1, + "mrr": 1, + "ndcgAt10": 1 + }, + "top10": [ + "hearing-5639", + "hearing-5494", + "hearing-5478", + "hearing-5452", + "hearing-5434", + "hearing-5388", + "hearing-5358", + "hearing-5229", + "hearing-5227", + "hearing-5216" + ], + "relevantCount": 13 + }, + { + "id": "hc-003", + "category": "committee", + "query": "Financial Services", + "metrics": { + "recallAt10": 1, + "mrr": 1, + "ndcgAt10": 1 + }, + "top10": [ + "hearing-5403", + "hearing-5721", + "hearing-5576", + "hearing-5524", + "hearing-5473", + "hearing-5457", + "hearing-5448", + "hearing-5439", + "hearing-5417", + "hearing-5374" + ], + "relevantCount": 21 + }, + { + "id": "hc-004", + "category": "committee", + "query": "Public Health", + "metrics": { + "recallAt10": 1, + "mrr": 1, + "ndcgAt10": 1 + }, + "top10": [ + "hearing-5532", + "hearing-5390", + "hearing-5239", + "hearing-5236", + "hearing-5222", + "hearing-5628", + "hearing-5360", + "hearing-5221", + "hearing-5211", + "hearing-5110" + ], + "relevantCount": 13 + }, + { + "id": "hc-005", + "category": "committee", + "query": "Transportation", + "metrics": { + "recallAt10": 1, + "mrr": 1, + "ndcgAt10": 1 + }, + "top10": [ + "hearing-5431", + "hearing-5407", + "hearing-5738", + "hearing-5694", + "hearing-5634", + "hearing-5573", + "hearing-5505", + "hearing-5454", + "hearing-5400", + "hearing-5345" + ], + "relevantCount": 14 + }, + { + "id": "hc-006", + "category": "committee", + "query": "Housing", + "metrics": { + "recallAt10": 0.9, + "mrr": 0.5, + "ndcgAt10": 0.7799082337019198 + }, + "top10": [ + "hearing-5366", + "hearing-5197", + "hearing-5750", + "hearing-5718", + "hearing-5526", + "hearing-5474", + "hearing-5485", + "hearing-5419", + "hearing-5367", + "hearing-5240" + ], + "relevantCount": 11 + }, + { + "id": "hc-007", + "category": "committee", + "query": "Election Laws", + "metrics": { + "recallAt10": 1, + "mrr": 1, + "ndcgAt10": 1 + }, + "top10": [ + "hearing-5224", + "hearing-5113", + "hearing-5735", + "hearing-5627", + "hearing-5545", + "hearing-5508", + "hearing-5451", + "hearing-5426", + "hearing-5322", + "hearing-5151" + ], + "relevantCount": 10 + }, + { + "id": "hc-008", + "category": "committee", + "query": "Revenue", + "metrics": { + "recallAt10": 1, + "mrr": 1, + "ndcgAt10": 1 + }, + "top10": [ + "hearing-5178", + "hearing-5748", + "hearing-5722", + "hearing-5687", + "hearing-5549", + "hearing-5535", + "hearing-5479", + "hearing-5458", + "hearing-5447", + "hearing-5427" + ], + "relevantCount": 19 + }, + { + "id": "hc-009", + "category": "committee", + "query": "Consumer Protection", + "metrics": { + "recallAt10": 1, + "mrr": 1, + "ndcgAt10": 1 + }, + "top10": [ + "hearing-5147", + "hearing-5395", + "hearing-5720", + "hearing-5692", + "hearing-5656", + "hearing-5630", + "hearing-5541", + "hearing-5433", + "hearing-5416", + "hearing-5357" + ], + "relevantCount": 13 + }, + { + "id": "hc-010", + "category": "committee", + "query": "Municipalities and Regional Government", + "metrics": { + "recallAt10": 1, + "mrr": 1, + "ndcgAt10": 1 + }, + "top10": [ + "hearing-5684", + "hearing-5572", + "hearing-5212", + "hearing-5152", + "hearing-5741", + "hearing-5719", + "hearing-5637", + "hearing-5516", + "hearing-5503", + "hearing-5495" + ], + "relevantCount": 18 + }, + { + "id": "hch-001", + "category": "chair", + "query": "Rebecca Rausch", + "metrics": { + "recallAt10": 1, + "mrr": 1, + "ndcgAt10": 1 + }, + "top10": [ + "hearing-5744", + "hearing-5741", + "hearing-5727", + "hearing-5719", + "hearing-5684", + "hearing-5637", + "hearing-5581", + "hearing-5579", + "hearing-5572", + "hearing-5238" + ], + "relevantCount": 15 + }, + { + "id": "hch-002", + "category": "chair", + "query": "Cindy Friedman", + "metrics": { + "recallAt10": 1, + "mrr": 1, + "ndcgAt10": 1 + }, + "top10": [ + "hearing-5632", + "hearing-5603", + "hearing-5631", + "hearing-5602", + "hearing-5601", + "hearing-5598", + "hearing-5589", + "hearing-5597", + "hearing-5595", + "hearing-5590" + ], + "relevantCount": 15 + }, + { + "id": "hch-003", + "category": "chair", + "query": "Alice Peisch", + "metrics": { + "recallAt10": 1, + "mrr": 1, + "ndcgAt10": 1 + }, + "top10": [ + "hearing-5632", + "hearing-5603", + "hearing-5631", + "hearing-5602", + "hearing-5601", + "hearing-5598", + "hearing-5589", + "hearing-5597", + "hearing-5595", + "hearing-5590" + ], + "relevantCount": 10 + }, + { + "id": "hch-004", + "category": "chair", + "query": "Tackey Chan", + "metrics": { + "recallAt10": 1, + "mrr": 1, + "ndcgAt10": 1 + }, + "top10": [ + "hearing-5720", + "hearing-5692", + "hearing-5656", + "hearing-5630", + "hearing-5541", + "hearing-5237", + "hearing-5194", + "hearing-5171", + "hearing-5147" + ], + "relevantCount": 9 + }, + { + "id": "hch-005", + "category": "chair", + "query": "Brendan Crighton", + "metrics": { + "recallAt10": 1, + "mrr": 1, + "ndcgAt10": 1 + }, + "top10": [ + "hearing-5738", + "hearing-5734", + "hearing-5694", + "hearing-5634", + "hearing-5573", + "hearing-5226", + "hearing-5195", + "hearing-5174", + "hearing-5166" + ], + "relevantCount": 9 + }, + { + "id": "hch-006", + "category": "chair", + "query": "Daniel Ryan", + "metrics": { + "recallAt10": 1, + "mrr": 1, + "ndcgAt10": 1 + }, + "top10": [ + "hearing-5732", + "hearing-5701", + "hearing-5658", + "hearing-5586", + "hearing-5534", + "hearing-5206", + "hearing-5203", + "hearing-5192", + "hearing-5177", + "hearing-5163" + ], + "relevantCount": 10 + }, + { + "id": "hb-001", + "category": "bill-on-agenda", + "query": "H2391", + "metrics": { + "recallAt10": 1, + "mrr": 1, + "ndcgAt10": 1 + }, + "top10": [ + "hearing-5111" + ], + "relevantCount": 1 + }, + { + "id": "hb-002", + "category": "bill-on-agenda", + "query": "H 2391", + "metrics": { + "recallAt10": 1, + "mrr": 1, + "ndcgAt10": 1 + }, + "top10": [ + "hearing-5111" + ], + "relevantCount": 1 + }, + { + "id": "hb-003", + "category": "bill-on-agenda", + "query": "H.2391", + "metrics": { + "recallAt10": 1, + "mrr": 1, + "ndcgAt10": 1 + }, + "top10": [ + "hearing-5111" + ], + "relevantCount": 1 + }, + { + "id": "hb-004", + "category": "bill-on-agenda", + "query": "S1489", + "metrics": { + "recallAt10": 1, + "mrr": 1, + "ndcgAt10": 1 + }, + "top10": [ + "hearing-5111" + ], + "relevantCount": 1 + }, + { + "id": "hb-005", + "category": "bill-on-agenda", + "query": "S 1489", + "metrics": { + "recallAt10": 1, + "mrr": 1, + "ndcgAt10": 1 + }, + "top10": [ + "hearing-5111" + ], + "relevantCount": 1 + }, + { + "id": "hb-006", + "category": "bill-on-agenda", + "query": "H63", + "metrics": { + "recallAt10": 1, + "mrr": 1, + "ndcgAt10": 1 + }, + "top10": [ + "hearing-5113", + "hearing-5396", + "hearing-5362", + "hearing-5220", + "hearing-5189", + "hearing-5168", + "hearing-5141" + ], + "relevantCount": 1 + }, + { + "id": "hb-007", + "category": "bill-on-agenda", + "query": "H 63", + "metrics": { + "recallAt10": 1, + "mrr": 1, + "ndcgAt10": 1 + }, + "top10": [ + "hearing-5113" + ], + "relevantCount": 1 + }, + { + "id": "hb-008", + "category": "bill-on-agenda", + "query": "S6", + "metrics": { + "recallAt10": 1, + "mrr": 1, + "ndcgAt10": 1 + }, + "top10": [ + "hearing-5113", + "hearing-5475", + "hearing-5448", + "hearing-5442", + "hearing-5439", + "hearing-5190" + ], + "relevantCount": 1 + }, + { + "id": "hb-009", + "category": "bill-on-agenda", + "query": "H56", + "metrics": { + "recallAt10": 1, + "mrr": 1, + "ndcgAt10": 1 + }, + "top10": [ + "hearing-5458", + "hearing-5326", + "hearing-5376", + "hearing-5459", + "hearing-5396", + "hearing-5362", + "hearing-5189", + "hearing-5168" + ], + "relevantCount": 3 + }, + { + "id": "hb-010", + "category": "bill-on-agenda", + "query": "H.2424", + "metrics": { + "recallAt10": 1, + "mrr": 1, + "ndcgAt10": 1 + }, + "top10": [ + "hearing-5111" + ], + "relevantCount": 1 + }, + { + "id": "ht-001", + "category": "agenda-topic", + "query": "home rule petitions", + "metrics": { + "recallAt10": 1, + "mrr": 1, + "ndcgAt10": 1 + }, + "top10": [ + "hearing-5516", + "hearing-5503", + "hearing-5462", + "hearing-5438", + "hearing-5397", + "hearing-5368", + "hearing-5330", + "hearing-5572", + "hearing-5541", + "hearing-5474" + ], + "relevantCount": 19 + }, + { + "id": "ht-002", + "category": "agenda-topic", + "query": "budget hearing", + "metrics": { + "recallAt10": 1, + "mrr": 1, + "ndcgAt10": 1 + }, + "top10": [ + "hearing-5594", + "hearing-5546", + "hearing-5100", + "hearing-5099", + "hearing-5098", + "hearing-5097", + "hearing-5096", + "hearing-5095", + "hearing-5090", + "hearing-5088" + ], + "relevantCount": 10 + }, + { + "id": "ht-003", + "category": "agenda-topic", + "query": "miscellaneous matters", + "metrics": { + "recallAt10": 0.3, + "mrr": 1, + "ndcgAt10": 0.46900009332067477 + }, + "top10": [ + "hearing-5461", + "hearing-5210", + "hearing-5390" + ], + "relevantCount": 21 + }, + { + "id": "ht-004", + "category": "agenda-topic", + "query": "disabilities", + "metrics": { + "recallAt10": 0.3, + "mrr": 1, + "ndcgAt10": 0.3499667779514209 + }, + "top10": [ + "hearing-5169", + "hearing-5728", + "hearing-5477", + "hearing-5432", + "hearing-5377", + "hearing-5353", + "hearing-5334", + "hearing-5214", + "hearing-5747", + "hearing-5708" + ], + "relevantCount": 29 + }, + { + "id": "ht-005", + "category": "agenda-topic", + "query": "public safety", + "metrics": { + "recallAt10": 1, + "mrr": 1, + "ndcgAt10": 1 + }, + "top10": [ + "hearing-5704", + "hearing-5638", + "hearing-5604", + "hearing-5440", + "hearing-5409", + "hearing-5347", + "hearing-5205", + "hearing-5167", + "hearing-5471", + "hearing-5378" + ], + "relevantCount": 12 + }, + { + "id": "ht-006", + "category": "agenda-topic", + "query": "late files", + "metrics": { + "recallAt10": 1, + "mrr": 1, + "ndcgAt10": 1 + }, + "top10": [ + "hearing-5744", + "hearing-5743", + "hearing-5727", + "hearing-5719", + "hearing-5637", + "hearing-5639", + "hearing-5627", + "hearing-5581", + "hearing-5508", + "hearing-5524" + ], + "relevantCount": 40 + }, + { + "id": "ht-007", + "category": "agenda-topic", + "query": "health care cost growth benchmark", + "metrics": { + "recallAt10": 1, + "mrr": 1, + "ndcgAt10": 1 + }, + "top10": [ + "hearing-5091" + ], + "relevantCount": 1 + }, + { + "id": "ht-008", + "category": "agenda-topic", + "query": "climate", + "metrics": { + "recallAt10": 1, + "mrr": 1, + "ndcgAt10": 0.9147029315959613 + }, + "top10": [ + "hearing-5156", + "hearing-5112", + "hearing-5690", + "hearing-5418", + "hearing-5344", + "hearing-5300", + "hearing-5220", + "hearing-5190" + ], + "relevantCount": 6 + }, + { + "id": "hl-001", + "category": "location", + "query": "Gardner Auditorium", + "metrics": { + "recallAt10": 1, + "mrr": 1, + "ndcgAt10": 1 + }, + "top10": [ + "hearing-5688", + "hearing-5671", + "hearing-5594", + "hearing-5546", + "hearing-5515", + "hearing-5471", + "hearing-5474", + "hearing-5459", + "hearing-5458", + "hearing-5465" + ], + "relevantCount": 33 + }, + { + "id": "hl-002", + "category": "location", + "query": "Virtual Hearing", + "metrics": { + "recallAt10": 1, + "mrr": 1, + "ndcgAt10": 1 + }, + "top10": [ + "hearing-5215", + "hearing-5733", + "hearing-5714", + "hearing-5713", + "hearing-5716", + "hearing-5712", + "hearing-5709", + "hearing-5703", + "hearing-5699", + "hearing-5698" + ], + "relevantCount": 60 + }, + { + "id": "hl-003", + "category": "location", + "query": "Written Testimony Only", + "metrics": { + "recallAt10": 1, + "mrr": 1, + "ndcgAt10": 1 + }, + "top10": [ + "hearing-5506", + "hearing-5455", + "hearing-5704", + "hearing-5750", + "hearing-5743", + "hearing-5748", + "hearing-5738", + "hearing-5737", + "hearing-5726", + "hearing-5722" + ], + "relevantCount": 33 + }, + { + "id": "hl-004", + "category": "location", + "query": "UMass Amherst", + "metrics": { + "recallAt10": 1, + "mrr": 1, + "ndcgAt10": 1 + }, + "top10": [ + "hearing-5575", + "hearing-5095" + ], + "relevantCount": 2 + }, + { + "id": "hl-005", + "category": "location", + "query": "Northampton", + "metrics": { + "recallAt10": 1, + "mrr": 1, + "ndcgAt10": 1 + }, + "top10": [ + "hearing-5672", + "hearing-5747" + ], + "relevantCount": 2 + }, + { + "id": "hs-001", + "category": "synonym", + "query": "cannabis", + "metrics": { + "recallAt10": 0, + "mrr": 0, + "ndcgAt10": 0 + }, + "top10": [ + "hearing-5530", + "hearing-5235", + "hearing-5165" + ], + "relevantCount": 1 + }, + { + "id": "hs-002", + "category": "synonym", + "query": "guns", + "metrics": { + "recallAt10": 0, + "mrr": 0, + "ndcgAt10": 0 + }, + "top10": [], + "relevantCount": 3 + }, + { + "id": "hs-003", + "category": "synonym", + "query": "liquor", + "metrics": { + "recallAt10": 0, + "mrr": 0, + "ndcgAt10": 0 + }, + "top10": [], + "relevantCount": 8 + }, + { + "id": "hm-001", + "category": "misspelling", + "query": "judicary", + "metrics": { + "recallAt10": 1, + "mrr": 1, + "ndcgAt10": 1 + }, + "top10": [ + "hearing-5639", + "hearing-5494", + "hearing-5478", + "hearing-5452", + "hearing-5434", + "hearing-5388", + "hearing-5358", + "hearing-5229", + "hearing-5227", + "hearing-5216" + ], + "relevantCount": 13 + }, + { + "id": "hm-002", + "category": "misspelling", + "query": "transportaton", + "metrics": { + "recallAt10": 1, + "mrr": 1, + "ndcgAt10": 1 + }, + "top10": [ + "hearing-5431", + "hearing-5407", + "hearing-5738", + "hearing-5694", + "hearing-5634", + "hearing-5573", + "hearing-5505", + "hearing-5454", + "hearing-5400", + "hearing-5345" + ], + "relevantCount": 14 + }, + { + "id": "hm-003", + "category": "misspelling", + "query": "gardner auditorum", + "metrics": { + "recallAt10": 1, + "mrr": 1, + "ndcgAt10": 1 + }, + "top10": [ + "hearing-5688", + "hearing-5671", + "hearing-5594", + "hearing-5546", + "hearing-5515", + "hearing-5471", + "hearing-5474", + "hearing-5459", + "hearing-5458", + "hearing-5465" + ], + "relevantCount": 33 + }, + { + "id": "hm-004", + "category": "misspelling", + "query": "municipalites", + "metrics": { + "recallAt10": 1, + "mrr": 1, + "ndcgAt10": 1 + }, + "top10": [ + "hearing-5741", + "hearing-5719", + "hearing-5684", + "hearing-5637", + "hearing-5572", + "hearing-5516", + "hearing-5503", + "hearing-5495", + "hearing-5462", + "hearing-5326" + ], + "relevantCount": 18 + }, + { + "id": "hm-005", + "category": "misspelling", + "query": "consumer protecton", + "metrics": { + "recallAt10": 1, + "mrr": 1, + "ndcgAt10": 1 + }, + "top10": [ + "hearing-5147", + "hearing-5395", + "hearing-5720", + "hearing-5692", + "hearing-5656", + "hearing-5630", + "hearing-5541", + "hearing-5433", + "hearing-5416", + "hearing-5357" + ], + "relevantCount": 13 + }, + { + "id": "hm-006", + "category": "misspelling", + "query": "cindy freidman", + "metrics": { + "recallAt10": 1, + "mrr": 1, + "ndcgAt10": 1 + }, + "top10": [ + "hearing-5632", + "hearing-5603", + "hearing-5631", + "hearing-5602", + "hearing-5601", + "hearing-5598", + "hearing-5589", + "hearing-5597", + "hearing-5595", + "hearing-5590" + ], + "relevantCount": 15 + } + ] +} diff --git a/tests/search-eval/baselines/main-typesense-0.24.json b/tests/search-eval/baselines/main-typesense-0.24.json index 84522f4e5..c8d1682a2 100644 --- a/tests/search-eval/baselines/main-typesense-0.24.json +++ b/tests/search-eval/baselines/main-typesense-0.24.json @@ -2,6 +2,7 @@ "meta": { "env": "local", "url": "", + "alias": "bills", "collection": "bills_eval", "serverVersion": "0.24.0", "corpusMd5": "a0499d7bb8597f88dbd737893bcd8a4d", diff --git a/tests/search-eval/baselines/testimony-base.json b/tests/search-eval/baselines/testimony-base.json new file mode 100644 index 000000000..c6ca05fc4 --- /dev/null +++ b/tests/search-eval/baselines/testimony-base.json @@ -0,0 +1,890 @@ +{ + "meta": { + "env": "local", + "url": "", + "alias": "publishedTestimony", + "collection": "publishedTestimony_eval", + "serverVersion": "30.2", + "corpusMd5": "bd1aa76b61b9803ea9ca90827539d688", + "gitSha": "2e037d0c8b1a61d3fe09b8c37a9de94d9c4a076f", + "timestamp": "2026-08-19T18:30:11.594Z", + "sortBy": "_text_match:desc,publishedAt:desc", + "court": 194, + "skippedQueries": [] + }, + "overall": { + "recallAt10": 0.8658119658119657, + "mrr": 0.9102564102564102, + "ndcgAt10": 0.8556474089088215, + "queryCount": 39 + }, + "categories": { + "author": { + "recallAt10": 0.9833333333333334, + "mrr": 1, + "ndcgAt10": 0.9816590194751601, + "queryCount": 6 + }, + "bill-id": { + "recallAt10": 0.8125, + "mrr": 1, + "ndcgAt10": 0.8479850279985381, + "queryCount": 8 + }, + "misspelling": { + "recallAt10": 1, + "mrr": 1, + "ndcgAt10": 0.9429187326594431, + "queryCount": 6 + }, + "synonym": { + "recallAt10": 0.6523809523809524, + "mrr": 0.7142857142857143, + "ndcgAt10": 0.6730753520197963, + "queryCount": 7 + }, + "topic": { + "recallAt10": 0.9, + "mrr": 0.875, + "ndcgAt10": 0.8606145622091282, + "queryCount": 12 + } + }, + "queries": [ + { + "id": "tb-001", + "category": "bill-id", + "query": "S531", + "metrics": { + "recallAt10": 1, + "mrr": 1, + "ndcgAt10": 1 + }, + "top10": [ + "9OuaIMy4lyzKGM7odk_D1", + "CdHtztqVLe6x9PWBICz2F", + "jPFcvSFfzB6Z1kN8rZk2J", + "YPu6EPQGzTJZkPXfafmD3", + "dsFGMNRAMzfNW4bFEwafw", + "KYRHh20qkFcJmVbEg1sTg", + "92Is4Ysah1wA6bSY62X_z", + "PQefJ508_vvqTnoGzp2d0", + "VFY12LS1u2OKx1tI7qLk8", + "Ol_Hb4XciXTzUH1BRRNWY" + ], + "relevantCount": 108 + }, + { + "id": "tb-002", + "category": "bill-id", + "query": "S 531", + "metrics": { + "recallAt10": 0.4, + "mrr": 1, + "ndcgAt10": 0.5637884576902256 + }, + "top10": [ + "1fSJjeB4F2hKx7xktRO00", + "O8Q64gYX42olvz7w9NczZ", + "0wpvjt7NwI_wHGE47nKbC", + "j95dKA76AwuBFdXhKz1Vu" + ], + "relevantCount": 108 + }, + { + "id": "tb-003", + "category": "bill-id", + "query": "S.531", + "metrics": { + "recallAt10": 1, + "mrr": 1, + "ndcgAt10": 1 + }, + "top10": [ + "9OuaIMy4lyzKGM7odk_D1", + "CdHtztqVLe6x9PWBICz2F", + "jPFcvSFfzB6Z1kN8rZk2J", + "YPu6EPQGzTJZkPXfafmD3", + "dsFGMNRAMzfNW4bFEwafw", + "KYRHh20qkFcJmVbEg1sTg", + "92Is4Ysah1wA6bSY62X_z", + "PQefJ508_vvqTnoGzp2d0", + "VFY12LS1u2OKx1tI7qLk8", + "Ol_Hb4XciXTzUH1BRRNWY" + ], + "relevantCount": 108 + }, + { + "id": "tb-004", + "category": "bill-id", + "query": "H4351", + "metrics": { + "recallAt10": 1, + "mrr": 1, + "ndcgAt10": 1 + }, + "top10": [ + "8Xjcbln58m_qmfQP05tct", + "6zphapXlY5Lp1N13oJMRD", + "GXINovmMEERyTJUEbOKEE", + "hsbL7POvqXTw2e5DUuTki", + "4lMlyTqg1oh8lE4VDSHjs", + "6fPT4NSDkgXvTBahF56xt", + "3KFRIeToLSmcTd0GnQ9zG", + "5V9bzQe2iZNmTALY2Quso", + "d2E2LxE3r03TgpgjMG5NX", + "9-awIt_tkxdiaPXPhQBB7" + ], + "relevantCount": 28 + }, + { + "id": "tb-005", + "category": "bill-id", + "query": "H 4351", + "metrics": { + "recallAt10": 0.1, + "mrr": 1, + "ndcgAt10": 0.22009176629808017 + }, + "top10": [ + "sSa8ZLDXwVOR5PRBLzOF0" + ], + "relevantCount": 28 + }, + { + "id": "tb-006", + "category": "bill-id", + "query": "S505", + "metrics": { + "recallAt10": 1, + "mrr": 1, + "ndcgAt10": 1 + }, + "top10": [ + "q7FABYQzOvfmjegGbYa0-", + "Kjme82E2J3xh_iavVpoyc", + "AHXLF18qIoNN9O75snH7F", + "6K0bAeoxUTX6kGiaaCHLn", + "RPZx9woG9hVb3OMFtSQXd", + "g_CMBoU8VJyXAB_0n_Hx5", + "65VMrIqujcAENO9dZP5Gg", + "n214rkLkVmTQngHYGShYa", + "c-FkwCtiKzdl1Z_QGZ2zS", + "nlIiKUB5qTgGcVEQc2xPz" + ], + "relevantCount": 7 + }, + { + "id": "tb-007", + "category": "bill-id", + "query": "H2057", + "metrics": { + "recallAt10": 1, + "mrr": 1, + "ndcgAt10": 1 + }, + "top10": [ + "p-Fj1pOglGAmu18SEZVis", + "qA3IwUwvx5MxvFbqGc7sd", + "uXdD5bXYgaRAla6i9UAxz", + "1iLkOnpKnIyMPZ0EJ6q-8", + "zQ0790mAoAXDi3wH5EysT", + "byQC1IHIabnkVGSLxeQ46" + ], + "relevantCount": 6 + }, + { + "id": "tb-008", + "category": "bill-id", + "query": "H.1405", + "metrics": { + "recallAt10": 1, + "mrr": 1, + "ndcgAt10": 1 + }, + "top10": [ + "Dc6RugqP0HRxcujz5pLDF", + "Fhw90ohV0b4d6-_oJjixg", + "c7CaVvPRtM6WP-4puuIL9", + "nthww4idwGAivhUavH1KO", + "4UdhIwSdZQKYBsulWHTie", + "uiCjZ0jMjwTOnF8hRKFNH", + "L_gM_T02MsULa-W3BXldU", + "biQVm39ND9kHg9rGlmphQ", + "QfqfGXsYn0K4Iu_38SGF_" + ], + "relevantCount": 6 + }, + { + "id": "ta-001", + "category": "author", + "query": "Progressive Massachusetts", + "metrics": { + "recallAt10": 1, + "mrr": 1, + "ndcgAt10": 1 + }, + "top10": [ + "evG1J59pHtD892srT_HSD", + "b0L9RQh_NZ2EnnljzCNRj", + "pi5rvUyjKlvmMNewnOf_D", + "eam7r9I54vLt29Sk6A-6D", + "seIDlGYzq_vEasViQdiN2", + "8cahVYFjE4R73eGH_2dEF", + "K5fegU_C0p1Qnyq4xexmz", + "RPlMJNham07rUs9FnZhtw", + "dPaqTI3uE2tKfqSjvnjBY", + "ECfI2TLNAozLWAJ9mi_nL" + ], + "relevantCount": 122 + }, + { + "id": "ta-002", + "category": "author", + "query": "League of Women Voters", + "metrics": { + "recallAt10": 1, + "mrr": 1, + "ndcgAt10": 1 + }, + "top10": [ + "QCwx_oImL54_8fifC7dss", + "AGusMrxuxEbkyPxIwGxld", + "BgMzB0KujpKISNB4_Nprf", + "FBWyrabLoxZuH3VMvFMuv", + "QATSQq06ilckdBDgUqGwE", + "phMMN9IYufTSmNzU97pzD", + "lkWCmC3HAy96sThW3Vueb", + "LEu7VKw_xaNQHqIFXgFwG", + "iL9cYJkGWX4Yq1i2biYf6", + "TPgjZsn9vXKQ2aJF0UUEi" + ], + "relevantCount": 121 + }, + { + "id": "ta-003", + "category": "author", + "query": "T Stephen Jones", + "metrics": { + "recallAt10": 1, + "mrr": 1, + "ndcgAt10": 1 + }, + "top10": [ + "x54aPTzKw4mzfCHDGzvjr", + "tKlwe6ivPE1zcoNFvPooU", + "7yrt6_JiCsG7N34SdUssW", + "uUmrMcsmvHJAJLGdK2_Y4", + "il85zcsUI33WROqVNRURb", + "q6OliiiesY1xzxmAVjuKY", + "9-ITBjvC_UUWw-8HhQa9k", + "-01jqkUE2o1lPjijGhV3V", + "0ANKQpAgWF-1sSLPY7aq_", + "7erqVBGptvNi_KUs-EOp2" + ], + "relevantCount": 51 + }, + { + "id": "ta-004", + "category": "author", + "query": "Elaine Almquist", + "metrics": { + "recallAt10": 0.9, + "mrr": 1, + "ndcgAt10": 0.8899541168509599 + }, + "top10": [ + "qkCngGUEqPpW56990vrXS", + "zCw3UiFfn7NpEADJF4pFE", + "7yrt6_JiCsG7N34SdUssW", + "DXt9s5U1LgPRcoT3iaAtb", + "Dc6RugqP0HRxcujz5pLDF", + "Ns08eB38sg4fXiUVyPIS-", + "izBjYVA4sX_hv2LqJNQ7G", + "-sYilJcb7FYgM-xPApD-E", + "JwZRV5xz-g7VAI7AbHSFS", + "ML-T7WWVi7L4Moz961IyO" + ], + "relevantCount": 23 + }, + { + "id": "ta-005", + "category": "author", + "query": "Partners in Democracy", + "metrics": { + "recallAt10": 1, + "mrr": 1, + "ndcgAt10": 1 + }, + "top10": [ + "1lOiHvfe3gdqKkfVyUX5P", + "rxS5QAxVif3dC-cLVF7Bb", + "n0cd5-Ga0RBro4CUrGwtZ", + "LiqNtrg-sc03SCuN6Z0py", + "Pw4c_r2EUikJuKCxrUqah", + "NYPkatkLuretCPsXulkdI", + "HEQ9nYz14M8UWESrjHJmo", + "HhPnj15sNI5XTk_G2DIp4", + "hkrlPHtg0Iz-k5bii2aLr", + "IayRrND2zy-f2XSd9cjJS" + ], + "relevantCount": 20 + }, + { + "id": "ta-006", + "category": "author", + "query": "Commission on the Status of Women", + "metrics": { + "recallAt10": 1, + "mrr": 1, + "ndcgAt10": 1 + }, + "top10": [ + "TvuAMRkXLh2xY7zFkUKzt", + "Y5DsjTHY-u7Mbf4L7B6JS", + "fR53JFa8xQfPTsWmaTzy5", + "Fhw90ohV0b4d6-_oJjixg", + "NFxoUtF2UXQrkCao7y1mg", + "Nc59-_Ck2zDzW7N7LoA8L", + "A-9hxql_cZ8vl_duOB8v8", + "uZfPyMpEKytkwPxH7vCoe", + "_mY95B40agX1xkgaw2Vk0" + ], + "relevantCount": 6 + }, + { + "id": "tt-001", + "category": "topic", + "query": "ranked choice voting", + "metrics": { + "recallAt10": 1, + "mrr": 1, + "ndcgAt10": 0.6575123959566591 + }, + "top10": [ + "B5xcpPPD3VBtvGdzE8hyM", + "pQ-NeP4xOzbuhH8fGq9ea", + "0pICmOpKXlbDf0APyn1kI", + "9OuaIMy4lyzKGM7odk_D1", + "CdHtztqVLe6x9PWBICz2F", + "jPFcvSFfzB6Z1kN8rZk2J", + "YPu6EPQGzTJZkPXfafmD3", + "ViYoho0abCQifXHNDbjin", + "KYRHh20qkFcJmVbEg1sTg", + "92Is4Ysah1wA6bSY62X_z" + ], + "relevantCount": 121 + }, + { + "id": "tt-002", + "category": "topic", + "query": "rent control", + "metrics": { + "recallAt10": 1, + "mrr": 1, + "ndcgAt10": 1 + }, + "top10": [ + "eam7r9I54vLt29Sk6A-6D", + "HEq90V_3KxxP4YSsyIhpT", + "rl6IFaDSZ88PYX1IJjA0N", + "vVY5uJaW2d_j882fhlQ04", + "Z44XOXbB1FmyRaWYwDdCW", + "-l-iQxshYz8DF4nrW0dy4", + "FeBsBGdvWUVRQIKV6pfsF", + "Y5DsjTHY-u7Mbf4L7B6JS" + ], + "relevantCount": 6 + }, + { + "id": "tt-003", + "category": "topic", + "query": "same day voter registration", + "metrics": { + "recallAt10": 0.8, + "mrr": 0.5, + "ndcgAt10": 0.6698623505528797 + }, + "top10": [ + "n214rkLkVmTQngHYGShYa", + "AHXLF18qIoNN9O75snH7F", + "6K0bAeoxUTX6kGiaaCHLn", + "RPZx9woG9hVb3OMFtSQXd", + "65VMrIqujcAENO9dZP5Gg", + "kWt58RStbQMUB7VAqXNCV", + "g_CMBoU8VJyXAB_0n_Hx5", + "c-FkwCtiKzdl1Z_QGZ2zS", + "nlIiKUB5qTgGcVEQc2xPz", + "c4TkesyGcrZWBcn07LsTu" + ], + "relevantCount": 14 + }, + { + "id": "tt-004", + "category": "topic", + "query": "vote by mail", + "metrics": { + "recallAt10": 0, + "mrr": 0, + "ndcgAt10": 0 + }, + "top10": [ + "U7M6KOrOk3HxXp3HMtxga", + "wUCZhFjmgD-gQf1rwlZBO", + "uZfPyMpEKytkwPxH7vCoe", + "_mY95B40agX1xkgaw2Vk0", + "s7YU0Lr8siUL6DZsczrVe", + "rZOoRP_eVkKCsB1EQ64tR", + "ZFMH6QiRVy_ay0TfHLu_u", + "x54aPTzKw4mzfCHDGzvjr", + "il85zcsUI33WROqVNRURb", + "0f-XBB35ZN3aY4qYD3aIq" + ], + "relevantCount": 3 + }, + { + "id": "tt-005", + "category": "topic", + "query": "solitary confinement", + "metrics": { + "recallAt10": 1, + "mrr": 1, + "ndcgAt10": 1 + }, + "top10": [ + "eyoxyKQ66yNQLahDj7gbR", + "SnR_-S6h2SmLvJkuXf4ie", + "p_F4FPB_l6RyZmbNU2Laz", + "RF6gia3v4OMWFyp59RwVI" + ], + "relevantCount": 4 + }, + { + "id": "tt-006", + "category": "topic", + "query": "eviction", + "metrics": { + "recallAt10": 1, + "mrr": 1, + "ndcgAt10": 1 + }, + "top10": [ + "HEq90V_3KxxP4YSsyIhpT", + "rl6IFaDSZ88PYX1IJjA0N", + "vVY5uJaW2d_j882fhlQ04", + "Z44XOXbB1FmyRaWYwDdCW", + "C8n-9BfBnF0oODvYkH7BW", + "as6Is9LPZ2J-zPMzAJUUu", + "jycTZ6dvmsbDtAXhY_52F", + "gc8r_z72KmHh3ODDmFiVM", + "QSRoYGesdL0MwTdDEH-IB", + "lsZSRKcHwgsW_scJjO480" + ], + "relevantCount": 11 + }, + { + "id": "tt-007", + "category": "topic", + "query": "zoning", + "metrics": { + "recallAt10": 1, + "mrr": 1, + "ndcgAt10": 1 + }, + "top10": [ + "eam7r9I54vLt29Sk6A-6D", + "HEq90V_3KxxP4YSsyIhpT", + "rl6IFaDSZ88PYX1IJjA0N", + "vVY5uJaW2d_j882fhlQ04", + "Z44XOXbB1FmyRaWYwDdCW", + "U8V-O5oCaJvThKemGgKIH", + "p9s_gokSsUZ_z5uyCaRTD", + "LN8U2qzdz-L-5K56kVKi3", + "-l-iQxshYz8DF4nrW0dy4", + "Bs8eththvqbwf63jWoIyz" + ], + "relevantCount": 12 + }, + { + "id": "tt-008", + "category": "topic", + "query": "fossil fuels", + "metrics": { + "recallAt10": 1, + "mrr": 1, + "ndcgAt10": 1 + }, + "top10": [ + "x54aPTzKw4mzfCHDGzvjr", + "il85zcsUI33WROqVNRURb", + "q6OliiiesY1xzxmAVjuKY", + "0oN1j4dwm8UBbilDIliJ2", + "PqQDouJ4kaUN9R0VhSYS0", + "RFSu0M5xezxVa1bBt9qve", + "l1I8kGowVtz2WPrYovaPV", + "GDrFCpA4hAdsIw_Rm5X3X", + "-glcyOYtYYPv-IQCOLTu4", + "dUExko-64U-IHhp8lyPri" + ], + "relevantCount": 14 + }, + { + "id": "tt-009", + "category": "topic", + "query": "gender affirming care", + "metrics": { + "recallAt10": 1, + "mrr": 1, + "ndcgAt10": 1 + }, + "top10": [ + "Fhw90ohV0b4d6-_oJjixg", + "QddFVr819ct-AL2R1mpSt", + "mC9cec9DPZmJh-h0k59pL", + "YoMcbg3flFzl2ZuNDBsG4", + "qj9B-cAH0m6Zc1tenFcSN", + "7C300VIQg4-XGPdTM9dTq" + ], + "relevantCount": 6 + }, + { + "id": "tt-010", + "category": "topic", + "query": "language access", + "metrics": { + "recallAt10": 1, + "mrr": 1, + "ndcgAt10": 1 + }, + "top10": [ + "JwZRV5xz-g7VAI7AbHSFS", + "wJk41fu1FiVBJ1xC8GFBE", + "VwGDFqblM0NpNdygg5jj3", + "EildpYQGTwzXhlnDEqqJd", + "syWoGzG3fuHNKS6tcW2e4", + "A2keKEFOnMVvmssvDcBs9", + "YZR3tRTH_AxEbmjFrQ1vc", + "gtnHu_C21R-d1YXD04drW", + "Bs8eththvqbwf63jWoIyz", + "WnfgfrLKQDAiUHcNswyT5" + ], + "relevantCount": 6 + }, + { + "id": "tt-011", + "category": "topic", + "query": "parole", + "metrics": { + "recallAt10": 1, + "mrr": 1, + "ndcgAt10": 1 + }, + "top10": [ + "G2hQLzmZ5GVbZw0IVaWmT", + "B0ZfwvCJxhgQPhi1qUWBE", + "HWYONHILNhIg1YogNtBis", + "tH5mbM__T0n2uCu5qLdPZ", + "xWyIDifmJf0c2Qqz08Wu5", + "SCSHutdvYlIgGvCAMLGop", + "evQA35IoJkYpR0X4mNbcq", + "1e-dFpB_PC6uL_lXhALKT", + "JWXz3tBMSthD1hbfJlC7a", + "VyQaykWaAosNzTi5ZMXVF" + ], + "relevantCount": 21 + }, + { + "id": "tt-012", + "category": "topic", + "query": "homelessness", + "metrics": { + "recallAt10": 1, + "mrr": 1, + "ndcgAt10": 1 + }, + "top10": [ + "eam7r9I54vLt29Sk6A-6D", + "HEq90V_3KxxP4YSsyIhpT", + "rl6IFaDSZ88PYX1IJjA0N", + "vVY5uJaW2d_j882fhlQ04", + "Z44XOXbB1FmyRaWYwDdCW", + "C8n-9BfBnF0oODvYkH7BW", + "-01jqkUE2o1lPjijGhV3V", + "jyGFy24gK9DJU4A5nb_34", + "tzuzCzguXwJXggnIRpjH8", + "dJZJPWdoBPU9DonfEUVta" + ], + "relevantCount": 25 + }, + { + "id": "ts-001", + "category": "synonym", + "query": "renters", + "metrics": { + "recallAt10": 1, + "mrr": 1, + "ndcgAt10": 1 + }, + "top10": [ + "eam7r9I54vLt29Sk6A-6D", + "lsZSRKcHwgsW_scJjO480", + "Kjme82E2J3xh_iavVpoyc", + "Bu6Tz_JnL6Qjfyd-pY_-W", + "AHXLF18qIoNN9O75snH7F", + "jO8-5-ckBJKvogjIleQYa", + "-l-iQxshYz8DF4nrW0dy4", + "gc8r_z72KmHh3ODDmFiVM", + "QSRoYGesdL0MwTdDEH-IB", + "1lOiHvfe3gdqKkfVyUX5P" + ], + "relevantCount": 35 + }, + { + "id": "ts-002", + "category": "synonym", + "query": "tenants", + "metrics": { + "recallAt10": 1, + "mrr": 1, + "ndcgAt10": 1 + }, + "top10": [ + "evG1J59pHtD892srT_HSD", + "eam7r9I54vLt29Sk6A-6D", + "HEq90V_3KxxP4YSsyIhpT", + "rl6IFaDSZ88PYX1IJjA0N", + "vVY5uJaW2d_j882fhlQ04", + "Z44XOXbB1FmyRaWYwDdCW", + "X4C9g3rP9A5tKiBtkiNTF", + "C8n-9BfBnF0oODvYkH7BW", + "as6Is9LPZ2J-zPMzAJUUu", + "jycTZ6dvmsbDtAXhY_52F" + ], + "relevantCount": 35 + }, + { + "id": "ts-003", + "category": "synonym", + "query": "teachers", + "metrics": { + "recallAt10": 1, + "mrr": 1, + "ndcgAt10": 1 + }, + "top10": [ + "751FZTubP1RtXBZqhCbA9", + "C8n-9BfBnF0oODvYkH7BW", + "t_edzv3GrkA1_XCF0Ri1-", + "jycTZ6dvmsbDtAXhY_52F", + "j8eAKtpVbb9Vd05l6TIiX", + "2aDdN2OCct1-sOQsBogkd", + "JIIYdlaFK2FxxjDA7wg4c", + "PqLuEfw8zCdTdaEAumWvT", + "Mu2UQm0U3Dr54IOFp8Ldj", + "wyrhNVcf3Z4G4JLJWrjUh" + ], + "relevantCount": 26 + }, + { + "id": "ts-004", + "category": "synonym", + "query": "doctor", + "metrics": { + "recallAt10": 0.9, + "mrr": 1, + "ndcgAt10": 0.9363792118010483 + }, + "top10": [ + "iL9cYJkGWX4Yq1i2biYf6", + "TPgjZsn9vXKQ2aJF0UUEi", + "klgcdRRi8wbTeCV7VZRYE", + "YZR3tRTH_AxEbmjFrQ1vc", + "gtnHu_C21R-d1YXD04drW", + "ks5e6tOhqWkvobyCnqqki", + "jO8-5-ckBJKvogjIleQYa", + "fR53JFa8xQfPTsWmaTzy5", + "CwGMam-vtxDaat2fEROIM" + ], + "relevantCount": 42 + }, + { + "id": "ts-005", + "category": "synonym", + "query": "servicemember", + "metrics": { + "recallAt10": 0, + "mrr": 0, + "ndcgAt10": 0 + }, + "top10": [], + "relevantCount": 16 + }, + { + "id": "ts-006", + "category": "synonym", + "query": "opiate", + "metrics": { + "recallAt10": 0, + "mrr": 0, + "ndcgAt10": 0 + }, + "top10": [], + "relevantCount": 6 + }, + { + "id": "ts-007", + "category": "synonym", + "query": "clean energy", + "metrics": { + "recallAt10": 0.6666666666666666, + "mrr": 1, + "ndcgAt10": 0.7751482523375255 + }, + "top10": [ + "il85zcsUI33WROqVNRURb", + "q6OliiiesY1xzxmAVjuKY", + "0oN1j4dwm8UBbilDIliJ2", + "PqQDouJ4kaUN9R0VhSYS0", + "EildpYQGTwzXhlnDEqqJd", + "syWoGzG3fuHNKS6tcW2e4", + "A2keKEFOnMVvmssvDcBs9", + "of8VK0lewRoYWyDgfNykB", + "dTVPgcuqJZgIhFobes1v-", + "LrWaFn2nhuFwxIPk-GuKj" + ], + "relevantCount": 6 + }, + { + "id": "tm-001", + "category": "misspelling", + "query": "progresive massachusets", + "metrics": { + "recallAt10": 1, + "mrr": 1, + "ndcgAt10": 1 + }, + "top10": [ + "evG1J59pHtD892srT_HSD", + "b0L9RQh_NZ2EnnljzCNRj", + "pi5rvUyjKlvmMNewnOf_D", + "eam7r9I54vLt29Sk6A-6D", + "seIDlGYzq_vEasViQdiN2", + "8cahVYFjE4R73eGH_2dEF", + "K5fegU_C0p1Qnyq4xexmz", + "RPlMJNham07rUs9FnZhtw", + "dPaqTI3uE2tKfqSjvnjBY", + "ECfI2TLNAozLWAJ9mi_nL" + ], + "relevantCount": 122 + }, + { + "id": "tm-002", + "category": "misspelling", + "query": "leage of women voters", + "metrics": { + "recallAt10": 1, + "mrr": 1, + "ndcgAt10": 1 + }, + "top10": [ + "QCwx_oImL54_8fifC7dss", + "AGusMrxuxEbkyPxIwGxld", + "BgMzB0KujpKISNB4_Nprf", + "FBWyrabLoxZuH3VMvFMuv", + "QATSQq06ilckdBDgUqGwE", + "phMMN9IYufTSmNzU97pzD", + "lkWCmC3HAy96sThW3Vueb", + "LEu7VKw_xaNQHqIFXgFwG", + "iL9cYJkGWX4Yq1i2biYf6", + "TPgjZsn9vXKQ2aJF0UUEi" + ], + "relevantCount": 121 + }, + { + "id": "tm-003", + "category": "misspelling", + "query": "rankd choice voting", + "metrics": { + "recallAt10": 1, + "mrr": 1, + "ndcgAt10": 0.6575123959566591 + }, + "top10": [ + "B5xcpPPD3VBtvGdzE8hyM", + "pQ-NeP4xOzbuhH8fGq9ea", + "0pICmOpKXlbDf0APyn1kI", + "9OuaIMy4lyzKGM7odk_D1", + "CdHtztqVLe6x9PWBICz2F", + "jPFcvSFfzB6Z1kN8rZk2J", + "YPu6EPQGzTJZkPXfafmD3", + "ViYoho0abCQifXHNDbjin", + "KYRHh20qkFcJmVbEg1sTg", + "92Is4Ysah1wA6bSY62X_z" + ], + "relevantCount": 121 + }, + { + "id": "tm-004", + "category": "misspelling", + "query": "evicton", + "metrics": { + "recallAt10": 1, + "mrr": 1, + "ndcgAt10": 1 + }, + "top10": [ + "HEq90V_3KxxP4YSsyIhpT", + "rl6IFaDSZ88PYX1IJjA0N", + "vVY5uJaW2d_j882fhlQ04", + "Z44XOXbB1FmyRaWYwDdCW", + "C8n-9BfBnF0oODvYkH7BW", + "as6Is9LPZ2J-zPMzAJUUu", + "jycTZ6dvmsbDtAXhY_52F", + "gc8r_z72KmHh3ODDmFiVM", + "QSRoYGesdL0MwTdDEH-IB", + "lsZSRKcHwgsW_scJjO480" + ], + "relevantCount": 11 + }, + { + "id": "tm-005", + "category": "misspelling", + "query": "zonning", + "metrics": { + "recallAt10": 1, + "mrr": 1, + "ndcgAt10": 1 + }, + "top10": [ + "eam7r9I54vLt29Sk6A-6D", + "HEq90V_3KxxP4YSsyIhpT", + "rl6IFaDSZ88PYX1IJjA0N", + "vVY5uJaW2d_j882fhlQ04", + "Z44XOXbB1FmyRaWYwDdCW", + "U8V-O5oCaJvThKemGgKIH", + "p9s_gokSsUZ_z5uyCaRTD", + "LN8U2qzdz-L-5K56kVKi3", + "-l-iQxshYz8DF4nrW0dy4", + "Bs8eththvqbwf63jWoIyz" + ], + "relevantCount": 12 + }, + { + "id": "tm-006", + "category": "misspelling", + "query": "solitary confinment", + "metrics": { + "recallAt10": 1, + "mrr": 1, + "ndcgAt10": 1 + }, + "top10": [ + "eyoxyKQ66yNQLahDj7gbR", + "SnR_-S6h2SmLvJkuXf4ie", + "p_F4FPB_l6RyZmbNU2Laz", + "RF6gia3v4OMWFyp59RwVI" + ], + "relevantCount": 4 + } + ] +} diff --git a/tests/search-eval/baselines/typesense-30-weights.json b/tests/search-eval/baselines/typesense-30-weights.json index 79ded4275..8ba86c245 100644 --- a/tests/search-eval/baselines/typesense-30-weights.json +++ b/tests/search-eval/baselines/typesense-30-weights.json @@ -2,6 +2,7 @@ "meta": { "env": "local", "url": "", + "alias": "bills", "collection": "bills_eval", "serverVersion": "30.2", "corpusMd5": "a0499d7bb8597f88dbd737893bcd8a4d", diff --git a/tests/search-eval/baselines/typesense-30.json b/tests/search-eval/baselines/typesense-30.json index 65bbcfcb4..b401e1ab7 100644 --- a/tests/search-eval/baselines/typesense-30.json +++ b/tests/search-eval/baselines/typesense-30.json @@ -2,6 +2,7 @@ "meta": { "env": "local", "url": "", + "alias": "bills", "collection": "bills_eval", "serverVersion": "30.2", "corpusMd5": "a0499d7bb8597f88dbd737893bcd8a4d", diff --git a/tests/search-eval/corpus/meta.json b/tests/search-eval/corpus/bills/meta.json similarity index 87% rename from tests/search-eval/corpus/meta.json rename to tests/search-eval/corpus/bills/meta.json index 0f50fe9b6..291c2d879 100644 --- a/tests/search-eval/corpus/meta.json +++ b/tests/search-eval/corpus/bills/meta.json @@ -1,5 +1,5 @@ { - "collection": "bills", + "alias": "bills", "source": "tests/integration/exportedTestData", "count": 7337, "courts": { diff --git a/tests/search-eval/corpus/schema.json b/tests/search-eval/corpus/bills/schema.json similarity index 100% rename from tests/search-eval/corpus/schema.json rename to tests/search-eval/corpus/bills/schema.json diff --git a/tests/search-eval/corpus/hearings/docs.jsonl.gz b/tests/search-eval/corpus/hearings/docs.jsonl.gz new file mode 100644 index 0000000000000000000000000000000000000000..5cd7d0dbe411e869d657a61401258546c6be1e13 GIT binary patch literal 128525 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 a56QQQj8|7}IK0x^ssA4Z3$8HJH46Y)l4L{x literal 0 HcmV?d00001 diff --git a/tests/search-eval/corpus/hearings/meta.json b/tests/search-eval/corpus/hearings/meta.json new file mode 100644 index 000000000..18258c528 --- /dev/null +++ b/tests/search-eval/corpus/hearings/meta.json @@ -0,0 +1,11 @@ +{ + "alias": "hearings", + "source": "prod", + "count": 962, + "courts": { + "192": 107, + "193": 389, + "194": 466 + }, + "jsonlMd5": "fa6e9fe42e3da564da0bd72eef1e55aa" +} diff --git a/tests/search-eval/corpus/hearings/schema.json b/tests/search-eval/corpus/hearings/schema.json new file mode 100644 index 000000000..593e1a2a2 --- /dev/null +++ b/tests/search-eval/corpus/hearings/schema.json @@ -0,0 +1,90 @@ +{ + "fields": [ + { + "name": "eventId", + "type": "int32", + "facet": false + }, + { + "name": "title", + "type": "string", + "facet": false + }, + { + "name": "description", + "type": "string", + "facet": false, + "optional": true + }, + { + "name": "startsAt", + "type": "int64", + "facet": false + }, + { + "name": "month", + "type": "string", + "facet": true + }, + { + "name": "year", + "type": "int32", + "facet": true + }, + { + "name": "committeeCode", + "type": "string", + "facet": true, + "optional": true + }, + { + "name": "committeeName", + "type": "string", + "facet": true, + "optional": true + }, + { + "name": "locationName", + "type": "string", + "facet": false, + "optional": true + }, + { + "name": "locationCity", + "type": "string", + "facet": false, + "optional": true + }, + { + "name": "chairNames", + "type": "string[]", + "facet": true + }, + { + "name": "agendaTopics", + "type": "string[]", + "facet": false + }, + { + "name": "billNumbers", + "type": "string[]", + "facet": false + }, + { + "name": "billSlugs", + "type": "string[]", + "facet": false + }, + { + "name": "court", + "type": "int32", + "facet": true + }, + { + "name": "hasVideo", + "type": "bool", + "facet": true + } + ], + "default_sorting_field": "startsAt" +} diff --git a/tests/search-eval/corpus/publishedTestimony/docs.jsonl.gz b/tests/search-eval/corpus/publishedTestimony/docs.jsonl.gz new file mode 100644 index 0000000000000000000000000000000000000000..bda2311c264a96605a706b9109c3b992cc63abef GIT binary patch literal 1016122 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%0A;>Cop00VXC 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 z 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

RZa3We<&3pytBY zl47`!LjQBbOaCcUhK^2;_79H_4~`~B`@fl2W%jIj_GNna!*}0beS7)!_eZOF(*e3% zj}HzWVw1i@_O(Jq_$ve*MDu0G)g)x!LcDzO*K=T<{ck+~U+)XCxRm9j>i0+gOv82Gij>JJd< zo~5v zAn1yJ;RbPGWu4}!EcG-Cr5-69SNCOB?*Z<&%84HqmoK?@sa&B&pP{;ffDb8vLfjBO z!T}sGV+rWw$$)HS2?*#yQ*N1K;h1rqu*FT*AgEAB1Tf!1HJj+cju1)R)Lc?m&;Agq*^am(u3mewHr3PDWQ!RshoIJA36IzLKQGQGH$I-<*l$4Lu_!nF4J0rNE&E} zlwKbY8Dh&Vfw)0(TZy+CsnZk=EL%XqO+WCaynesgV~b4|LCWo77F@uih_GW;LaDk) z6KjWHo#?-ao`^K!OvgvaP+L#jkyFIGwN5gdV+3HYa&|G1rE!MIN@hq$22?=e;Ad6S z|2u**;-rOj!9gdd=@9>vpcod+EW`=6Uu5vcBQ%O@WS+Ns2&Coh)~kv;0)gh4)mLGN zP$?)NL>-_dia;bD%c4e2n#2kT^+M}CBS;j;pOhr?nF=h(%!-{kEEt@O#-l;>G}3T! zc|-O@NoByp!{1|1H3XatWP4xjO|!JFAeic{ar&Xqz$S4>NLARTP9=kmlpV{6+s7rV zC|6Ox`4xyWuvECgCb3B)k%4}HR+aGmkz8DB9_ z_dPT2(L+6{e*?LU&#LJ5%>v;-Jv#6Tioy8UqY?zRjswk$;YD3ra_PQ8T`IY*mX4o( zM@5)tHC2;7qL#r?W5RGrU}mJ0aT+USd^%v?!{YzhNArE$9^Bp+u>{`S5rGyIgV`TR zt%-d1P-oJ-sS_kfg>BKls6nH*z!}7Bs-s#}zn2sA)}dmqOcP%W_^M~v#az{QrU%oyDfo!?Gu(dUu~$$RiBk(cZTSBTL!QCRDuptplb zVyeV((8^nvIi;pLzF1;57tlb4;*IQ5%A}&65h?kuHr`T6&~oGr#Fp3=je&Wu5cmAc z?0Hw>Mr5tMgu7Vqva#B=V8sj<>k=pzcSI-ecf2bPQmcy0TQ2vSpjznKdRMH9bFhGN z&OQ*HDo&Sea85QtzKw+{N{IIgPQIFG5&bV~R5JcB0Fgj$zpEH7&@k(u$5LB#zL5eS zD!h%A`1)UEu(qNW|I$}Uh0dqH)aFaj*cp4@R!y51@}X)z*Mpqbh)9&$*67St=_&xs zQ_>8$Z16{$&olF0Vt4j-LtI$WR_hrm0>k7DWtbmaFv+YUpHH81d+7-KhBq=yE)-WC z!7d}gt(`Mr={5{pYT_@GGF!-o$w&F?T0og$#%u4FS*|^d`VZUkfP}huEU#BO^O+Hf zTDuy32SWkga4LL=OV5?0BilEqLI$M+36-FIgee6*Y~s z&jIR=)JR_ZvrV+rI%^;MM!K%E{>~9@nY3K+FPm6QGd7co^we>gwJ6`&t%wn9fYDR> z5u8`KnR4xAfy7!h?OItk>-sL+P?yQJJ!a0}Nn42?k+=PU_@JnFB4rJE$X$DxHXj<2 zAbbw(?X@2qmgr6Lqq2_=A59)dMp&ka<9i&`Z6sN`;9m)=uDUJR03aR&2rBJb8%0q`szgaC zGE<%1YAbUf97KqL2xL46Ay?Xt^|Eu*X4RWn%yw+{vzz_=2>p_o^PO|tJp!PV%F3*+ zzH_b2x|IYF;o;$rA*sX~Z0v3GbyA;qqeywhrB;{?USEapXNUGRT% z2)SWyqF?v*+R&9@W8*Uf#AklTdKm=Rrw(h{iJrpl@&xrC2^G%WBln{4gl%m;hkF(M z~%)`C_H^Q*o#TGU-77=(i)cP6kJl<3a!MXuP8$6Mph5l3SPmwEXtP zH%H^Iub;bDKcu#;b2RGA(R`lIRb@ve0P7gffGgZ{K7zy9fGzNeF`AI?v& zpS(G~y8Pz5r~mkF`A=op=;YDS;6DF`Uqm5(;$j*$lVq{$nd-X5ob#F|w%V%H8&@5( znhV$BBq#~YJiAfxx9u96q|?3SFM46{z?qa*lU2Q@c@RBq8%l$>sO{E$GwQU zr9Ii~uz!3wjTiCZWMM{!hra;qJUAX6^$*8`@qV!L;ql?H|7Bq3<>t7bFTd;04&zDp zPx-TV$@`ne3mzQy$3JTt`87@J;9~u%GyKaEOwa1fdcQPhSA9;^aW();vUnRk?L|+E z#KtR%T}0!7mHXXK_SvTK8RV3XJWrh#+Af?dI7@e;;bHXHnmN*0!lHOhN#N07)QKMF zWkstwDfst?gV6||?`ifkD$YLZk#KC*iJld`j-1uG)qkx<4@Z;x8vX3$#f$6c^yTH{ z#r5^sS@iNnbbfa7{Q5jPJ$Zc=J-v8w^5XR3#n;jG+12&M<;xe}M=zg7m#0^6qKg-i zRzzPujZR)fC#ToZ+12&Q$7W@h5NG=z^YZcJgT=xT0?GB%14RUe#Z zW|fc>UR)$Gty!VO=;29O?t3_*$CDc8z%NPc@{7l45MkU3_2XM!Bjz+-U+(roSb`(9Ni z6-DBpp8@JJ!Yp2!BxY27zF2(x@Dmt-if)Dhm~@N;$b}qY-9bF}AYV-@O;?Gp0(kKqOt`{Mxn(=!7yE{fjgaR+x$4 z{wJb{L=Q|N2lPcg8H5RGvJ<+o`da8AGoi-rejPMX)TV3C<3x`V~%IFAE+azIFu9HeeK$lh0gP^h# zjRw8RAC%b@E^12hg5}LxJ$}kwbi&~fZ`?Agh%!nYnq=yg$6{nG^}t|`O>m&bfaV;_ zD#@6%9$K!GizL|{-DJsvB4tV_r6ilhEc)0MU9+INGOO8>Ay+LZT76r(4))xRdSliO zFDRRDkU4EH5FbDMG|yMFBvWyKA|c5rQm)1(ST2(VQz^vnTQiRzKm5dGr@7Z&CE`0O z_aP(urZ$AWwdszkX-7L}@)^OL;h(k7i) zww;e3{ttP)V%v@BwO`jsMKli|__gVOpN-AvqHXuHxsAuO;qhpAJQ_{n@h{JMjQhi* z$#^^&k9Qmt!%yx#hX0&1)Bb~bx;5qN%j>7Dkp4UH9SJ48DxN z#FmkMdelGCpT>5c*J~AR2*qJ3td&Z`u6H9}W#Cbx%6Dk+OhN|&wx-p*cVf|y$#@c= z2PAW<^=X2;XxGsn_PK{B{9&Ib$UT^dP-S>9x=&@8mL+fsn5tA(1u9obrY+)CrfhpP zeE0JD4DZOxD1_Wy(PvBpaY$Cmsxu$P`8eD=Q)=1D-JRr3d(js;SkN+RmnL1PyYm;g zSnQk)8|w3pwcy8SC&End8L9>Q(6RO?Ck<%66PVM$X3Uvu5X;3~S_4tZjwnsmJ+>$S z$e~4z{!q6MbgP8Q7K*Mz(Mi&CZa8fi0wt{zNmjdw1lT1V?*fRXcNlDrqn4?r zH`;V_y~if0AP2k-rr4wCq?8?S#c~rkSM8tPqO6K?72PI`h<=8@DVGYWh!0!xEM=+l z&dhsN)^au?8i&wex~F3T!7uFv8@okmnMca`;kt;(C>3B(R7$%|6=aY_wkYzzwybfp zm2qa`kv9Y5HIx~KVE)i3yZY2?R5itd1s|oJgSu5wh(N0}Byd~P+mWD#8_%Lv;_l1S zntxoXteJ1Mxv#~Fa=|Na?qk(Jxf5@G3=CZ|}L!w7;VO{fc*#i_^*>|B&l z#LT90lgww?F`R)71n`ytv@Wx^?}7l9IEWH5B(8NJoDm><#iOCH1j)F6GzI!UR2{FJ zppFQ;^O{(S@FKo9r;SP5g3+NPhXft``l8feDLK#?4PJ5KjM=xw%ot@t=?&6H4@&XI zjUy3{3dc}5Se%%o_`$njL-a2Aj(c2^~O3ci-$k%Hc z@aoRwVgnh657?P-PgI91%eKak7n{nc2)Qoa?`l%E(&6_IxmFRNL&Xr@oMj>&W#GF2 z6~Y;&bMLFgbL#Xn)E3pay;1R^{{al*o&g@qhv&}rV0;?dvNd;A$97+dF5pV&D^<(W*KN0A=F3m~ z@x#Ak#>qIj$@O^W-X7jtvS`@lc+*c_aq_!xY|epc6%XX3^x{zN8^9gB%1QJ*y5hVX z!ZnAyk@-(+g{%!CG}-YN0bhj)3s`%KJWJ-ysToN6sEE*mv)31=4?8^h^OYM1)MJ!@ zBvZeP0XXmKA}QlUjE%nA*Iyi)@9ndXAASlg0ajr=X2i0>c`vDj0;j9?4i@j88gwtR zNTijEU(@#MZu5Y?0;LW-3@;eY5Pjc54S2$dM6K=%_+>hPzOp7znuNmY>p%r^R3-Z3phR^C+b zE2pNsJ!*jCSDwm1$}qicF^vr|r?5+gj-0rHfN-1iTR zeVGH8HP4M3qmFD?IzP;^+NK~CX6z6l??kM_%v$#j>sJ&7$&?)zLd5JuQfnH9G&>CY zf3J9pY>cwmmYa!9X-0=6t2=lvIu~KiO&(}_kW~rPKJ?ydbJDtqhHrE(rPQVBN3Xae zBt)L41Q*3jk#OGnolv~aJSCQ+)mcDJNHP=O*#fmkK27u*G!jmn-fK-3*pYFvm4vfa zlpeuLOH-NGrEMi#Kxc>{7+B^Vpi_0#rR+6igPl(3N~%6TBcmckQIXw%e;|!cI9`cy zskp?=-J0XOOK^CY3Td7rt{`7|kQq5;f)>}Lu_@W*a!+bOI+~~dJsByVgW@UE3J<5l*KBV{iD&XD>e@cG&w(h_z8N(*8Qh14f>M=OPb8V|7mzrM(oxV+m(~*Xf_8* ztym)F;QyB4+hC=Zr9e?ybA9E0Kb=y-DYS2Exz{8UqpMy-_i@;hLbNJiu9e&*mGZ&76HG7K zGk1)5_{dSON4|5yvqpT*Svi&O^L!IG9!*-=A`{>Wz5O!5o+?ydkl9I;d%a}3C$f9U zyMk%GuH7M|${p2;ba_%pq>?1-388i0>-l~Xt;A8Jf^++VssTwX&w;*tiGu@YiIABSTCUXj(Qi-AUinI~P@D*WJMBb=lg{{X z6xys_6hz^r@=#bzTj1+-4ok>TsibLq$682*==mTRUl(=`?e>+eOv-!@rpE#5jxYOC ztNKy~NE^zTF08N-)tx|em#ELPZG|0sV-?Gd;7)ZM3o984z6-sZg3pM&?I8Okuf(x^ zytrgtXl@#n%Bao)`8!xnA+@CK5#t%DnL8NB+uvPD5IgNr7GWt{mclpJFgjYo*bs7B z$dGV{G6ww4TV{QmCG=*mI8E}DG`XqePm21c#d7Vv{T)m7<8b!$$w^=ZT#BpkhU9x9 zf8deMrWe$Dv26H(QwjDIpyoTA_;rsbXH`;IrnA|)uu_bJzgcW|hYN42WjOi#f$*Lc zfI0uz~kA`F_Sx-D%X{(o+V2O?dBmR{wmIN1IJ9ETj6fI-S zzx~~dyrOXm$uLB;Pfq0h5O|Ap=P)kb=tDk{heR7{=SqWN2#=5R$Xqs zu@2HlN)50}L?y(yKOjMal__q!e3fpMcdMoCE@IQovu@Myy1U4WF1_`1{p9l)|SXvs|x^GbEPUN z35dbmI+LtQL78a0^r^MOXHitQ)K<1od=YPFyi}-uo;<&alRSD_Fd=h`|KVPC z!^qNE0{KtfE+{%wk2jGomX{&vJb$)TG#=}duVHsdTR4Q*X(N__EQkA2n}~d10^vxh z*awRZ&mbA&Zsc)Ym#)VWXyouffl&0WjwQZGvQNC#h{EVJy5lCDo<{#1+c_V2m8%IM5D|ntv=7WJ5E&B0fa&&Yw{Bli;{?XB7 za6C939k+=+95heHqe&Cu5(cjKgvHBoda|fTvp3zYDf7w6*S9}3)r_Zu;omNL zX}C8QqlX<~$dD?|Q5 zz%85brKotsE+PR!^VX(PdtaJ@q#Ka^Smb%!adKNVv>K`n$*WQ^rhwD7*-AE4%2w5g3;wJ13fy_#q!-DeqF2K?S96nh_$bn! z_L@UbpH@wVfbpiC0QI}VcqD^9++p86(#G1`j{B*WM;cEc8A0e57~pu4SoJ;=QD>Cs zdQHN+qzJdCedGw7t9eIEdkK+#-G>+zp|(HPWXUJf{Nt%ck-Kb|Crkz&9FL}K<;p|o5Gu!c0 ze+?aS{vJn7yR`$-A=RC*)uhCa3lfNmedIpn*(q$Yrcx6pYmAvXzxH_ z>jxrz|L%kaVvMmQRrH!I|GB)(ib#4hTKjf12GBbcmeaShvWsb4OYGEbjt9pC;1Y zDcHeDK4yrHqGzB?jpP3sYtMF%r0lMoQnMAf2}yUm{$|@nDs-xoy=EYUt!{65I-vGp z(qJI_lAIO|EXV707W~1DYsyu*SHcoYyTtk+$B)3B5wMh)GHm7tGfQ_#UO4Lll0lg> zsR}jZn4yRDYp2b5iXwW&Tf0=?~JUad>rF83YJUojC_znGB-|X zvWZLTyPKu1 zh0|$K2%4lF)PX4oWlZ$@!MO3*zUu1LNn^q;r;q?6d~35V=6WicCysKJ1ocz@hG& z8_g;IemLlj#_q7xi{8*l(S47ROIV_kIU9Ki0;{kkKyyF`h+Ck(G*TbFAshjvfNUYk zwDeD=QReKKyV#wS1i>p3c2OinKa0jsJ=+30I^(Lsc$Yb$( z=5vwnw<>6fCR0sxlM3}$$x`lU$Cid+6Lpe5Vtm1SH7lX=lLK+OW6dj57}C{dB8i5m zbIQiSr!>d`02kpdA!s6^u~#Z>#E3jzni_3-kRlUFOK9U&J>*qk<19%+e4#@-%qhJ< zS&UwE;zQHm*c4nb$hdfKbl&O+gi*WLk*hhpDFcWHesX5{knC3R!E}1STf#$K03a}E z#R3)SGXJC^^DCm|Nfy^c`=K?EVplpRB72IQuNUdlw8I|0JadP=^F_d!XVXkmh?W;+ z1zb%?Ei>Tk)6km)VnO-*q%fH$mGM1rl2Y>JX6cBj@{TE1E_p$9%m57}_yKOjG+C<--ZFrM*i4<2w16o?LTqFf0E-l6wKiU(i#8Y~UTY_B70rRl)5eqRJtHD1 zdF_W?1_fH!B0vHl;1a{rv<4G2fH8KoJ8rDoR$NxXllg@TacgX}XDS>=0$LwzGiLgGwQ5jIF=dT_6(tMPsVw^8PVR*wC-5Bx{xT7ffAQdV^_vuvax&O0A=+|@&=t)pTGFVD3|=H+Cwd4Z=-VI?q-V3D=6a4+SLRETONz9t02!s} zgbTn%!jvi&#=InxMRi7?92@gm2ThQ7IELFep-Lx}3QsA0L(M*0+2RKIv=fI$ehzDf zui0_?+OF1=Y9V;vg+fj{R0pqU<$X+$VsQuLN&QM3RnFxIIPCZJB_Tg1k|OVNVwq9( zmzIE7OwlRpto81?Le-*M(Kkh!q!+n36jZ@Mb#{NrK7vT^IQ~$VJOOK?AsI4c{B4B%u5nFE92r`~GHvM!Z-3XCw!dR$ zS>Q*bO5>PRv{w*zwN!K}AYx=6Vv3nYP9lW3qZt*zl=rw*?26=u9uW<*iXC4HI8n&X z;+-SzGmiKY--ri?gVDoiJRNrXgX6(xd?cdiq}t?Z5kh*ZdVjt7+>2hozB778%3?i{9J1?Z+>4&Pym%B1`n^GaJUMuA_UzIQ2ZPbD-)}07 zX7=3*c%nE@4)%RLigtJ5zuZ8B(z%oI=;%IK%h7mzbo7f1G`6q%r>kl5EdJ)~{gWT+ z>+8eg!^WOFncU}}{5OC&XzFEL?C50-hX?1q$>i8?V z@^FSPvenp;SO~iYa56mO#}7XNc&uS+kPtR(LPl|LjQk^FZ^vj54>azzidpk>I-C)e zpK4B}nmb`Bqf8S7b=d0%;M7+vf8)s+l6KJ~0?Yq1H?%VERb+_RL`+((2KwU&}xXF?qg|5R{ zD|g5brxKx@wc<+vaiYD5C@m7yZk{m4*jG$@C=)F6wcW?H5D=-ff;Ulah2aA-k-C&t z-*L|q4A<~+PxFjfFgpMiYX1JA%Q_Cb9nI(edu}A|VSz{sRO*7MGB;V41H{6#Gme2Y zF%{cFo)<40GkdpbDxZL)B+U+Qg+_<>_AA0!orUG_INd_@1LGR0JLFG9X0TEHQSMJ* z?bhUFv3G=?lFF#<$pf>Q0-1jQZ2o!JJ`uBMWithWx`hBZ?X{LYFfmX)`h3TDJBa2S zL5BDy=$lSdu5(@-7J-wtm8tGa)5qp(G04B6+O`j z6M8CZ@^K+5tado(F6K4haT-kq!Q!j|LHq#*+!jk#fRz zt&C_x$jKLZ@CY80E}#UZSbt(#OJ;~4VuwrXKu-Q>qKthdsiR854vRp}H(#ZSEP6&L zgyr0t8w^f|jSd2Usxj+IU7(MNi{`5YdzolZYcNj#k`hvDM|LUIfEQ$S8R@Y+tLz-D z;o4lrxr!P-D!KE$2VhO^z?vFPN`&Jxz0J?MNws9aZ6H$1LGz#=BDur+1$Rj*cL7^1 ziGxGf%{IT6w=zo5XK^&qYkmCiZ!GI+;=B`G5OX(A%1-o0n^pDvcH2>h=1%m+Af-@g z+ujhK@VlhANeIeC7iu@mKmOZn&-35680_hd-WNq#zlym^6Hw#}>EV>(Cn%$O?Q{SL zo+I!Z<6X3TNJ^wyTDgUE7@~K=ZGjguw>p)*o!UKC=GMHqf2D2G&rKu;9QLl;7l1}T z)XDr-$>jI?JN~DWB@Yk#v)pgUvxj(&6 z)9_~@Yd$YJufUoYRK|w9-PAk$F^~p6>HN>Ln9$7S&jr=s&vi^0&|=FFn)_4SN%>z6 z1M`LWm(imj>HJEtd$0IhdgbYckGV+kQUp-(5Z}WT_k_0hQl{0gKORH}M0KT65?-3D zvY#gli%ss8DRP0CJge_)mZTB|At#f#t4cMHXw^ic1a7*eEzXA_1ZjMndnXqZl1i0F zx7Mzs!BLme*xfuO-Kx6M5yH_4mw$Tdcj-nD1YQ`9SlrZF52FiGBb%E&ijQ~Q8@^H`f5iZHWMQrCO(Kuz)?;w~<5VH*OgYsP# zeN6IHBPCi>3EU}{Ei{%0eQ>G9*3fWn0veF4j8rtItT{DHE@uHKNgxZuL5BlI=c0}d ziSwR}B}V2JEeRQ$KNN3%STeR%t)M|SQmnpkmm4fc&EA&^f4*M1;6*z zdAL7G)r~87&}V=-wkhG0iDz-6i(hIdGI5^Ta*nGB1%u0Z-h(s1zj9hXl*le@nb*ZU zbpM-^v^g6NMulDS5y02YrI!~q9a6hCgRxc+ky8P54jOH}riisvPcs@N^u(r^%f98U z;?VRZ6T|ep<+aXtj;?`_^3oJBD!e8b@k$o0@?6LUz{1fb7dsttpPyidi^h6U_WP5` zw6?|CRy7}j;TRAlnV`OrZ9n0)mo*a_eaOQO>*AKl1NzRWn$8&|inO5v$L4TVk<98U zlqqsY2$RLI_47&|fx&@Hb`XI52?|U?fmH(wb^l||rR)LxJ#m0DB%7O0)KPwaKq@6G zZp2rZ&+9r%%B4FZ-P!EMvb*L+fSzOkU=|9b!q7~t%0mLxLAeGtvgfn*qA*|&(VFKF za9$zB3w^dHJW2TN&JtCO*GNv_hmu0ohr=Ljy64iFZ)&dhmK7ecwVt!D!ZhidllUTAkuzkfkG_2}{Xc_*R z5tMgnhbOd6&*kI1v{LAD#7a4s(=m(Yb%}853@^RMrxx^A2_t$;eCI_#N?5Sxh0LY) z=B%mKps~(KBdJ8mh0#GWO{n%bIOL@~V(%vK!DUll^QO-1q=B$&B2?R`?_=HK zvma0o{+YsLDD6YP@{V!BRx|TuV)0hdV{vqon>1wKg0v9M3&cXVS-$DG^Ok9#NoRSi z#3*Zu`BIRFP?zLqMk?^*hd(2>sA2j@jFO$rA|U35kE5qFlu|*$&Ey@^+KX>$W{Bq) z^ypZk0n6^9FskuHrP@-KALAJ>1b89=X$ft~IN92257Ogr73*;{8IAjcQGYZZjM|=c z;U|9y*5m7=%cOsDI+~1@qwU$nw?BL{w3kh)>+tAr*tq?&g?D7jcHT-nPaNp(CKYyg zuf7$45#z5tvKdfC4csa9J%R-?`h4Ypm#DF-t zVWW&Fh8cYI1qCN3!3Zx%3iputFl2F3a`{&^{21~=3o9{d*`LwjW6SxH96D!2Yp*pw+kU{31*s|0&AT)=HZGkMe zynx*|nyAX!r#c@ZtQvx3>oD^v9zMrW!e6)rzJJ%XTBl$dcyQT13s-|JW|rKCJMwniSF{0M5!rECxH~PkJg1>CO#TVi=f%2h|aaPptUv> z|0p;%sRUh^(3q?1%C~LrqMx*T1C<65sasG!T*U2@qFpjyt*_I%DV+@*O1a4JCZrqHQ;)8_r&!VQIDhVTV* z&6$Z6D0_8Wll>*<&b)bNbnQHtSn45=NXlk~%v1sZ)yGDammkYSOPZ)f4ZlDZ{ONFz zGyKItPI=EP<0S);HDkwvG_W+01`uy%A{kytQ5wg6g61(O-j>z9t!d4^uLv!`0*}7L zwC}m;G2rF2E*L`Zufb>Z=+DT;dixG>f$g#>-7W=#Z-J zz2kNn?8W&)o;3_)awvPKs$IB%2`+>KN7qo!T&o?1rebEqE<5^_z~AOeKu!BC3*g6m6hnn25%hcX<)b2vqAOB^r0r zbcHTgA3yx$Nw^$-cjPbvT)bIBF;Ix5ss?Rh+7d+P6D=oZ5$Cd49Gn%)D%iBBbQaKN z_?YADwt>Gf*- zkE4HVrWi)|Vp~5!C;5CTK{+IR;vY?pN&ISjIBn2LE=2$NB8zi^P9#P2jYy=>t2yU- z%f)JK@VZYMs4L`r%_nIjs5w=2oJcV)!IdD~LW-7oe#@CVYJ+6LF|*Mc+8;03Yjo^x)Oyus43_pNQ@mCzR@d%#P8!$x&4j z=akx~S-z+jr2XUXs+OiF@8$jSc^OCnM9giOJ1DB7Y z!Q|+O4|;PFUd-=I2_mZRn&DtN=5M4m)-TF6Fe?UsrBQJ!X_V37NG`TyA$w|aQt&&L zD`Ly`34x#Uprig2F3=m+R+}Y7wJbZ)VB8r^Cy^OKHxFxcEK~ zodohLTi}F>j{7EBQ?{@CivEe8(8NiKvN<|rr(FA=Dkp{ZOA|}BzHnL%szYA-^t_l& z2WGH(785)TO>rb-Dq9$rde6GEZI^dJv);|UQIHo97H0FFjq8Kiyt}cp1F2pel=LvE zExL(>Z1w=&6bCC)mSEbD*7dSlrGMA^zDkdOoc{Ri=&0XIlk9f4xpOV#C1tPxyn5D& zp3(+TL|4FeW!vcT%&|UBC4Fu*_&+0T9Ourfq9t<8nI_meRV8|4Z!E|y^4u;2v{ce9a?DqT9 zqvP(V7rnZ?c=9M3ji-mBG5znolZu*o#{?kG>Tg4j80^0j?C9s zmb50G6kYd}&M;-q>ZIclsYz5skYcbLa;Z;x$9oqCg=0Q4=5y4O;-9;GwFI>&uH*fH z&@IFeR@@&!3o z(!`O&Nv6+CYN;E29ArK-UK-L2yhYoFrY%uiK}~#@ zlzFjj9%IRLmhw!Eu3Y9-xz1%tCfddduu=NbD$l^<6_1QXlB%Y&^8MkeW(w%?SKBp% zUOWYpc5gYE`5OvghY!rYeR`g!3=sFt7D!;mg$Twc4?2YbR5r z0-84q)#uyUx7?fbsxBuET&+a`wy9aINp0vy7~CPQ4-6uL;e+YL!LdSKgd3&G&p{`P znJga}X0*-DtGC%>GrwgGg|}IA)%E;Wqs=Wl*dy|>xUQocAZP9w=Un?r<;+IR(_MYH-HJF5ZALoJn}ZXwAC_?%eUFLXvo>C6Ewal+5K3# z)b43Xh?rJcaz=dc*k+d}uezsa4}AkYe1#qa(3~G?qpQN-#<_`-@Si(2UHe?Wi55vw zR$Z3F)PYFtZyg_ScU|3OpNlTOK_?Jz8ue(dKV&kWyE4>ifLIS0QYt`FDcP7s$w@tu zYvQE@z+$gS_$h8pgVT#nG#DN77Y4_}$-|#<*2J%l z4+kGV{M+cTfBf*C!zaErnb5ZedfoO}6yF&RhaW%u+u?Zn@V7df@^kjbbep5W!%v)5 zADlkxMB~HJs5=~W4yU7s|D&8Ken{(!|kldfcCkr;~oWG!cIC zmQ%l^ZEGIU~wEjZj>O7Cxc&46FG+%U!xRpnP*Mnmg*q~g2+#; z&8#DDUDm~Vx%~upYaZetpMtfWcw^=AQS?7Wkat9oqc2oJ9*n0VKRg+F(v}TPQ$l?D zF53W)bp7HKA3b?->V@0qYUtEy93r)@^fZyneFljgF}9`NhvPpTkl@z#7K9^RJ`?*JVndm zNu8h=gctBpK^wvl^FMeXocfc;r&!KDe)x}vLYyh=Dq*hx&aII4EuWDXR`Ou*(8E-L zI!uTgkXdI_0=l}&h$&F}mZRLwk zLtiNYqbj;L%kLR%WSi#3TF}i&!64B>)WzT@<{q25K{AwK>ByWE5_4IvnNP|iX+epf z`L^L=XYY*kJlXn5iqC0M5bXfE%ej^>-9JHA+Yr?QBayPOW)rwIih!!TJ7(qBt;&RI zkfvXC!qiYvE!3?(Tm#&d_{;3ID-G|2^e`4mXPHlE({{urfrpGLxQRU4?sDK~Ir&4# zg)&nVf^RG5q~d}+JA?B;FDKUjpD_aI^gy%??{Onf+0e!fbmE^Rfxbn*JipVbQ| zLMlo`WTYv%^O=)j1(AWkS+Yvt0+(C$GNcSIPf-)5v0DC#D|B z1LtWVIvt`A@x$?Ca8J;nE}$~YHEIyb(|X;V5x}eK=9rAa4wlQRf`8O(+YSzNjc&yQ z&`pXd>+ZG|4F|-gQ5RM|Gho71Eca+QlR?Ql)={B#n61J&XC5%FVv7u>0foU5DGROo z_~FmGC_*CV|C{O`Km2)rR6t)SDU(m$T-go#Svo1wPGl*xYpxGc+$s^cmOM}^32S&k z?L}`;qOx!$^*YQYZ&7X&l`zDAfm)LY;vZ2mkUfOYRJBShFZ$P};UVme2+p5~-M!x# zAk}eSP*m0BKSVD{z`g`b?VeWZ$I?a+Em)j6ncu=Hbwz`$aBXc8U$M01=(0|f(b`Ib zi!hF%6GX^8)uq?VXeSk+FaH769`N(Ti(L_J!a!HuaimTHlB#ItIvHoEjwS9#6vI%E z-uilElL}@AZ*1rx0aUsAj+CNx&LZ;R?yTe#-NfAL>u8Gn8(FB_Z@gl6lRmh^9^4@h zeu6vrTgpTqkNSth{^58!`K@H4zkcz@ydG`;RDE+k@2|{iG#-C_*U&?m4oAPO(U6|1 zz0Z*7p@cp|r}+vYe5@zy*ZGY*c70wI<(#YVXG+cgB5$EKk@Qo?>P`bmADo~~e3#ED zAZB%|#%bAn`8ikw{WpTa`C@0F;iP|X)te3`ZflcFgoL01TX0$iLV*ejy$Od{Mxz4H ztlv5)W&0wUE0fjllq^8YCEcD*iz2cz7*59EaZdyFme7zWwzI0cz!CDE`#kvg;m=R# zTTkg*PqAq6c@zc|wUZ{DGu(m~jye;)TRq$mfszxH4l)CWJyk$n<+5!8Sx_|I3C@om znqxvoh&x*H<#$?8bt#dgB7-~1_|>sHA(Ttn?uDSk2oWhQ=sAoA5N*_aNSs-(a?oKz z&wv?DYMeRiJd65?6ikp^FU#OU;K0AjXPlasopViT=)|VAq zmhK3}VfVmB10PB!T_J+GO)j==%=fS_Qs)oY> zxnh&vl8ynN>Gh7zXA+M{oXt>GCoaLVu)dC_=q8$Z(X1|F%jyUSv;2Opgy+(*kkX|;cN$|_o z(Gu7j8S&+)Hu>(YI?;5Xm*#>V2!oegd^;zBO7KcAP=DK z(KCuhXSUkV#2EJbj76b#%b|hS4((X(^@0+7h((pz;xXw+}i9?NWgARIu*_) zh>JMry@P!+YWpFEkab`L&8QbEY{k`1p7+j@&7sQoFby>+r%S5T#y_#?`1dF4BiG0M z1A=aU&#Pfe!-~(T7`Tji3RYK0ezV$knYX^PFy!I9RbbU((UEldon=M0jU}%{8zbTX zNn3}vGq&}n7=XG4E3aM6$e&ozW1{f2E)pv2|L6tANbe?ohe9-kLyClr+GCn~Kg=YC z|CUQMo{17zUEn$JbR0vHIkIA0Wcs(XpxDPo)DigMT0g8Nd(^R{35X{q; z-(5T*%`d{%=_2BcZ1~SudMK`S%INfOc;$Elm2l1o&lIN<=!GGsZh-ujavY+x1r}zJ z=ioWb1}3shX&-V~BCXXHYbjNaYjCxqj4{KiAeaqkeeqQh^rt{L(++& zv6SQPV5tqVCxnm3A z`TgetLrlKsmdBuG+0+y7S2ii5|Iwj9@h3z&60sVxRvGq({e%AWV9-C96*Z}ecKOq? zYr5R{u4{Z(_K~hw8+Pe5NPo_YuF1NDeI+%*vg&dousb}!?T7yM&~3AE?J+8<5!%Mkx6iMDTl zJSo4Mjn9s=lm6AwAD=&eb>6h}9^Gfh_BY@SbLz01Pt_2Crq(O)zJ+4)B#yjL3@e2YB>Ybq$mb|yIluJmt zi%+cO?q?yzX9wU;FX{qX8F?*F)VJn zCz4q}wpw{X&J^O8B@~UCFynHFJSn$ny+X+!N$e*lrzZzb3TqfjbWY(-QkjAd@**Zp z_zxuSxaHp^^NLte`6Bubn#UBGsmd2ns0*P_sM-L1K!U&STuX{sT@`#%YN8V^g4Y(a zrFPEhp)8toXXbUik^(m}ah&Mld4wwyRC|^e%RG-u6^1iKm^f}yZ8BR?U=NGr(6Gpl zKD-LyAsN&IYlTKY>mG9F?S{iIX`B=s`g{kVqzpRHBbmxGN&%*84Xx z9sO|Bk$Ne?)yS~C$Kx1@TS5U;^Cb%O`GS~WK!ov`gj3gH1IQO6ND|AmSWx~ZFgY@d zymq)NbqA7q{VBi;kcy$emrRjo%%BV4wt#Pc=%WHV0p2bp1j_C)4xuC z{64#>o<4i?fqo{!`xgbtTC?ZY5P zBZ}`LQX$Fzoe~(AeWg5xoi5=OC<`7zWK^71zCMfY!xG|#d;O^FWW+IW1-ZJZt-x;8T0RYz?zSs9twtW`^=k^AEa zdZ&HuDo@q2*xPBpStT|)OXDJmWmm!zT$xpLnP-*xzyHtNw|_c1l=cq~L+2pf;KGKC*sP+j^OgOv!*_i_1iHi$)afS4BzC|jr^^ESx{V&2f>t_C8eZ#Lduna; zfJearkAa5@lbQRoGD{3%v@%(=BG#*u7tPaI{ywyaXjVwIi#hqfUn|mMm*+)|LqVQd zK>uMdz(bMs`4+s$Ql#6p$f37Jqw^IA13I;ScQWL1Ln=CS#UCR8C+ry^RZ&wI)yhRX z|8nFM*jIDUkIO2b-!^gip$#h)V+_N?Inr))oHwmV)IviGiPf?$8B=R_Ul`R43bUwG z&p9xLpHTuG!C%Yu1vf^Vh|uJ;ea*HUO=C-73&E5$Hn%cncLiS2t~kdK2wh^@cT(7> zEYhd|mSWo>3h49#)YMWDLX`~BQWYF2Fy&wqY8j0^MoQ~Jpt44EfkE1%ec`D*2M19v`Mi0JcwD{^-2it6pji==vjOj?1 zbXD0sS0ZT0O<^VPsTjRRE=-JnB@dKTiK#q_{#>p@zYat-G{lKsHXs=fsB<1hr#b8# zsG9A{n5;Ms&@uvX`+iP;kX^$F)QM41EVG122`F*i(*%iw{eezB^SbIpFYG2dH>))= zr~IGa10RM&8Jk~XqsHxH8&lQS(xSob54R3F>ZB|kw0{;mNm{Qa@cU7}?-T?ijL{*$ zNsOCZZC+SR35a@>BXQa)bOk{#d$&-1fz-gk6bdlHpXh?%hl!PMGDSWYVy6UooI#&+ zm0xL+g{9)-=laf2~Nmg&DE#l6aBVIs^kXC z)mM?ro3W__!-+1)e5SW(xK9=gkGR?=YxUkV;-=LAL>&o>*uw)7-TQf-}fFGbg zf`>=r2kzkz6Iciv?OhBFNARK?@uNbn^fa{#P-FZ?@CPSk#3+{qtlBq_$i#H!HG+_L zGEaPpX%8lvJDZ(=NX^%p)N;iEC`TrD+l>9;2?3`L%LGwa=eIWd?D-K{*Y|lbOQ3nD zkLsV{o`>A+i)Li2ApoT#S?k6)J8EnzbTXvmdSEE&JlEqqD)T+rA$l%kh&ZvI1rBvf z_MaC(?2SnnJ{TSp%T2PVoST{r^Hv(;{A$z~`rmI?wLj_~9u7vtlljf6_WwA#TCUgY zZ}Vz({r#K#<-4!rxRI*5&nx&Z(!8dOP$$|e`(Xqw7JpW+8VsqpCCws<9r5iW7?b!2 zEpsU1$3?9gx)&cm{QD|kU2|%I{icsN@xhhhyPO>$oJ3|=0QQEQ5~(6XoG8ckJN_+i zJ9QQtL2`*TESK>laS=4tK<6m9a+R|%47L#!SmH&N!V<}L*%XA!Ph3bIy)j{s`r-ox zD*%enKJ}+OJC{zHoYzuR105f&l+uH5b=Xnz1bYNvqWuamo#^t_`8_Hy(U-}WYq5uM@Q4P4ou^dU!Vi?j~6fUyVd2{+3W4~vv1F4FaLOU)h*1 z!AR`!Wz!KN7Ou9jzuLnKZWf)aY(e$Yh``kG3X~FBD7i{v=E1p&F={}jIm~5%t+V!) zkMDUw7wAQo2v~}3D6>FH8)hZWoP>5X!Jckz09F(#rbsoAbL*l`nK9rQPBb+|*Az*& zf5rc~+)90)H;*FbOI^cl?cM?+1j+(161bTHb5VA{Nf+aYM2k^b=5=pLtix1>K1u1 z=QVr9dm{>${rnc4@1&y>ZT(ey|67f{3max5Kg$SH5$*5N3DmDh*$q!;OpP$8vP!|SQhmv`YfwzzWM?xk-+ti1^ zP6b&yMjOxwt|kAYpXm^e%xWe%q>WO^s-ot_hGAK5>cn<_E4%}k3bCe2W#+dwc2lhe zDMVIeJQJPsuw9##V*{XhDY2Wj9k)VAAuB1x$r=lxR^ml8{a>$hR21D*588(@FH<F%8F+Zq;k3n_=?%=kmjWvNlIQX1u@VOsQ_TUc6Lq*&^%L% z6WGa$%5Dr>m?x${3ut@0^N6@Qn=dV1{0+&+dYT7b($l)2bnFWF16bm*Ct&3Sa@OQ= zS_%_40>;dU&dt)LEgaoo&Iq@=T-C%qjR0@W6rSi>R;IX(?42mU;^61q-IHqj2u}vhfprv)qtk)(@6S1GBbkke~`(6A(eia@h zj1{GU@nFkY5rV+u-(r3@2ARRB6rDQQL!-#1N{7 z8HaYS9BJ6f7X#HJA8j z^x9|vO~|H!+NrNz(h6;K$$T)dN5}nv9gfGNd~|%+KR%x9vAy=61mV9A z%{A;_n6wPy{`l_o+31HK-%P(g{eC`MRPV3febYFLACB&ms@N0ue^%}Bq>L_Dm=k*6 zESKX_j|}wi(<~`rG5pA%oL|_4?5m3yLp6F_ZnVQ+P)P(s@!;{|M-IPeE@$884&bSG_OabzcS=z*`gq%XsLdk@=}_;f1*~k(0k$~$=y4WYB(J# zu{$!bsI*`V@<`x;AZkG(+n_rr|E_}-7&Xcj&mGY$a`&Nlf=(E;(^CzsUZK8mOXhu4 zp6*09IR+%lF#^PAQ-MqK)1w}X=Tl6hpK0=p9qkAPV?#<0cGj`AWTd{ZTnWw>bgLaj zEbal+&I{e@s3XLo*$HeD!W!1yG&^)QvPCFl1LGuRUIM+=Zs_^xMh^q0fp5(2IPu2i zu%uk|q7x*s4ZUPmu@{yd7a4hg8^j#Gt>BvEMYRp>a~5#64`&2DP^ovQHa4raU3|+4 z3SJXm% z>;3!H=f@a2PpF8wjZRZST4lZHVj-m%3dMs0(nf2U+yN*rgA8ga@m-}LK^8jEpWxa7 zeB{kK&$<;aq_Y~FR~o(>rkK(Z2B*F}i{6>-#-z7cxMt)vqI}Z#c21R^EbrcC`TSPb z|BAvTIR~LcedCpZMwpH^$Wk-23@liZo}azgVKoPysMVY1qVs;_OaM7VE+MT6v@xug7hL8G{BP0LhfPVWdU-L2tCLB}kWj-??D)7H6d z8LzhE*2&?ZAIEkw7#__IXXD8i$E}m;(Rg??Jw7}<-mkefnU2T9FN#~wCpU-BZ=M#9 z)6s2R3@)BLsb|}!b?VV%cu(NkJoG&Vb2s{LDoJ(HdHkm7asou@bI_tZ@XSA(PDQ76Dp zI*kq?qLr-L{iDj3vHc9{yL=Fm5;Qp>%nJ%3qd+EvEvS-BF%x^)xkfJeXD}s6#vt+dHmItiKGwybgA-Xp2qf_qo z2h?{DUFT(XL)<&b7M!}SeBvZF!{44hxjud9vR_nifFWH#o}l5Vl@V^Xm-=2;9T*XzD{G9P}_UEm?D|o;8ln7J90%fLmCXgBp9~ZT!=rP zq-hI2SfVLMinj2s@Pq$|hkhht80=U^0&cE_3^4QACe&6CxtGmsEAuS=6L z>`w)lJ?o7a9Pj1GjEb8Vs=}>Q2FnS8Q>56)MkIw_Wull4gbsgZqN`jSEkw~^hUzt``Rd|FF{@c z!@EgJ+jWvYEi#F36swih$S@LEr_Ho$j`ZG$jw;ARH@nv8HbRAw@)PZ(>ur`q6Iair z(s5=}udjleaUF|jwX&pr+q>%R5;mdHw5CU5PP_{Dg4o*KB~N3#hg^6Eu4pvlzGv{7 z>dmnjHrtlAftc7Gxvdq1llzMx7mC}t1-=vt=-;{9W=l-->W63s=E zs9dtpxNAAGzSK`u(b8-cOLv0bD!q`x?GCc=%myg=oa-Z~OOr??Kr!o_zJIR<8dzwX z8zgmt4kAHt$4yh>%>ug#Wz*|c?&IV=LDG|hYC=y`H$Y3=LmeZw5~ z`dF99BeZe`)ly2+s+<_va@kT}(*3L2J%J(Z&rEsIo(aVPs=&MeuvW#DHlLC^bI-H3 z9#D0xP}+xe@q*mLDC3ZrAX*k}f1H`qWNyg@lYCrr%147w;i}-iNxrs8#O*>}GUuy& zSQMU?KKrVo7AsJqQmi&@4Fw;UmTFzBf+r3T$}+A=s&oZ@XM18Lnlr7{RB7!KH}6O< z|Gi9LK4PVmgZ<4`EG6G_Mm(u97}_=WDl zUZkbfI_&d}Hg$yL!zBk=r*@FtTppThpjhQ=|0j%EcvTR3#B0Oc+iuIueHQv5B1Ey< zE4}EN)F`7Wzp=EIss{`SnZ~8IpO;yV$05|Cx8gKG{+qH;-|Ax ztfL}wP?9467Kph6M3VOaUw-GhuenqV9{+isqn&06AmD}-yD-P($Oruf0rfXh23*0S zRf~3gEW5vIO6vg;c`02+^u!ULhj)@%yl?--sVyNvP9LhC<>%!veBtOG?F;Ba3VbvW z!9Zpm9HWXduz_|RGZjd6DS896HD_0NT#&q5me8o?VZy%O75!uoy^`nO=c@jQ!nR?r z`A1z^AJ>I7b;Gzqq~m%Gt;0FK4n@S23n~YkzhR^mNi>cQXrdpiC;jel+V3r^RZ7V@ z8$C^KXv$4h6iMnRWiajVVj8J2%8b#o4Yd`tq|A{^>KQviycEFXcgXwrUVcqkt zO{#g9hm~XyyAU$KwYxB}DZ8_6mk!e~sG-Aj7qTT#5|l;Q<9gf1mo`2MBnW8`@`NkUeK)$qZb4MqDVw{lTfKn&BWNBuX)lwlhaJ8 zrm@>K(ome_z>=1%LnS45i1lg>JewFsr=|cRA3t)uO_*X79APHF97Exh2GC!vpT_Q1 zNoCi#{w&W?Hjsf-c6srmzwnNyWA2{eR(6xDi`hXpm_!$0cI4hHeyFdh#FlV7gJbJQOmkA|c1@wDH@ zO$n*#@TjH6^D|3Cd$|dk@%e)d5U)Sen;Smusx?j zTE42u7qrIKFCzu87K+u*d-UXw;ApzX`^~h)MoPWb#}EJE7Hg_6plv9p2&RTb&TOC+ z?;OGAd9ltFfD2D|mI^3c5Zk(|;tB)$sDx8`yrHOtk%maqIJ@tbk7xTnN8=E2ag*jV zld^~a7C+cFTG7zvD$4OF`~{MV?hEcLFKM{jj1UrRF$>d_&|q|30M{9PIVf3M&dS{2-=S?jl?Omwcps1x~%nFFryic_|?SG=-4IZ z0wDpuE2cs!Og!-mp@;!@2i<#&?7IGt*JGgy62ybOZ#>IOyIw|DRdSOi)sN2V zUIeKW%VD*!D^zgjp63itl9ZVQ0yDQ53$h5TOhM8fMOCl3d|CCP=K#@oQPGkTDJ;hmF%n9ufy9gB z|7LOmkZ^$)5zF=ZS=(U_gwwXDcDy0wx@+aQ(|Ax1B3-FDiw~v+X|fVHFw}LfI8QHS z;zrgPNUo%+xhk6=7p+n_8DM9Dv8vx;XJ;sb_!+M7C*pAG=%qaf1zl4oC8BHer!||j) zobJHUgHM96YHxJ2KZrW}<~aNQ$HC#{^xHRQSH-*YXRBrqHNBUQ`pOg);KWH5JzU?kB1}(WS}E4TWH5tCgWxJA>s$bzg4f zOrT@YbF(Q)qJgVUS#(`PXEB-_434lk?|oz)cV%?mn~n#v>anemcLfzZj0>FF>fRX# z4u*wKb$o{zK}-N%i|3LcZPIf~CuuB8LkCNh;s-?IJRqQ~73=6!r(nX<6grlTYo@94 zQXH+YV3>6o@(`J-OS-?oTo zd=iRH+%vWBSwns}?tk~E(I4Nxe|7l%Rk^)buCE*9mgC9vFOfw3{5nGLG$)Gsf^w8d zX&ob_H4dy;w}ncgo|~H+08M_TD5@xlsmOv^Y5opduv?ZOO}{k6y<2=r0rk}-=iUEH z3ZN20AgLTY1PM>F-pbRIWki=S{Hqi{73aB7p_#aUKP zCRMr&WwB40%%QlqM`=<*$F_%bWiwz^R%~Ymx%@&-%{!IUPx|Q&N5iQ%iFfwqd&C$u zmv5uOnNe!wDedV{@?m^<2ov1n<7ucCdQ%(P6o}d_Uq{KAQKf|zISad}OOs0eq<1`- zhKi}HP_u+j0CiSc-Y~sbrG|-n{WkWEH7a&fy_zJClsrLf=N!)VBw;{c9534luZq@C zqhcCw&);6rfufB58_}CmNSWpZKds4#XRfZI1`a_bWU^Wu*(&4`Z3C;h+Na0-a}h{ucHIjDxq?Ri55C2JZcem{L854g*nz zE5^OtD@x0Da9%?BN6rdCfqtdNezZ?gj!X-w4(dPz9$v?H7IkqExU=vK#bR$2U#aKS_-^0c*Md6(7=up5HFT9MY!_ zUS}K$K7;MEfyS!Dey1#fN>LdF{&|3TtHHFG71K(Li!G}3p0ex~`q$DcIy4$pMkqJZO*I7TqqibG5Up7fbuj*pHqy!fQK@YB9zB&=3 zGx{eEw?Wk=fcs^BZu6HK3e2nlu8-$*!0(ZCRsrx_yq`tZhLu=#l+i(!CXo|h>EQL! zo(YK)+Lj6)7)$C(E)|z9nkY(?$aFjoCh;y_;PStdN`uGwsBAvgpZa zSf}B|NQ`lL5=acq-lW!{rO+SR=am?`(&LZ<5BpUky&=^U7rII$%Ki-fLT|OeU)bfSnW@B97mumkeaHDKp2VRT(kUhS0fEI5a2#p}5L2f$0+wB|Cayd)y*rW`Gq zEE?mh?j1G1=-a(u{U_IEwu);aQHi#f=S3%4*p<;p6^J?Ep39FpbQAz2YhY#ehOrWw z38ijz{n8ZM6ngcSRF5ii>Wmk5R+#eE@ZH}Sl+UX?Yx)Gphm$8iZB>&iX;lvvk zY7yzRy`l6xsoA_#r2@v5p68h)TNDKHBAMStr#aQMO36aDzj{LI4@n-Knpr_P5c$&E z%sbu^H-w&#o~y+&zUon@z^P@_pB%fqiIQx1nNL$mUe8RSnggQo%12xeJhH2Gnr|(_ z@Bk?|^#p7*aD@>XJ{SHX&%m?qbLrJD>fsKA6vdUw_lAKXm8Sh3F3{6Vi%4@ z0GVJrfx7^0)LiSr-#WQ61Wu)ArFe~Jf0iyQvseTc?^xIu1W^{pNVJu4*K71Q zTfsw^!T)FSk_mmwhaFSiYJwie^^Sys90>}rN?i&)w`R$f^9r1XQa);dWa34TK)feL z22=#g1jvYUj0T!AELZ_hf>1+(4D_8*K{^$#>_lavR&g-Y$V#4ll;!Vmh7o%z?mRC0MmQ%73>?Y5PH4%3qbp>v?FOSl_RrYb zH6zI8lnOx_EoX1bs_pHgFS%^lK?B`XMf18S80yAqlq*Zeyy$Iq62?u27QR7L*2SI0 zqyo!!*zY%HI7Sublmt>d%of(BJk0c_Ym;!9*TZiUR>to|)8jwvIu+yel%mSS=O7J{ z^YCQv^U^q|OK${GZZDcl|DZ(xY8Jx+!7XwXVDT*#`vGp+Lef6`&N9||l^$QXN7pNJ zPc8_Rm1HGRVkQn-@S0_OEeIE~0&i4j<|U{hvuB_-85qm#?Jawd0TUc!S% zr8xsfk8){NPGy14xPg=J#}7Y6PIhLN$5J~hZRKpwv)IsLLO*tQ*=w|>L!Z&+P(}wk zjMqrjv=z1;FG(DY^7xZnb80qzA+_&GYbJqEFP)cn$69j_g60i&p`Pqs2fTO5*~^M^ zutld)8mJNig}V)if(-$9Y=yxBr(+x(RZ2$7$`q=iL6Ns|##Q`7wPM!773KgoEuop+ zGasmvo;ti?!6wxmC;^Mmoy&x~mmR9YQ)|Xg)~GQg8a-^5j}YR=DW+2hYUyI9*v`xmkiOjSek?+ zuUNiZffxV^4c$-oYgIgXKRh5MaeaZwwk((M!iG+ z{0)g}Gp4R&2#K=;kr_`rEN09msi>Gv-9~BdrJgfGc0(w3=L7@lwBlMpTmM89vwgpt zU7>7#dNV6kbNoK5*&te?v69f4D`(*3#}7ZDXnkjim?LatK2CWhp(bg5S3d>GZ{cXO zKv7g@yA#f%4#XO?{m>q$BmprkHWZfzv9Op5B$-nZ4<@-gK%{n2IduZ0>{%D5;XAKZ z9xj;j)MJ-@XnL%e%+BMS#K<{pL#-RUZt6iiMrt@X3>4xY(a}tS)9wgHa-Y0(Qtv#c zL6Tz#SIh2ALG_5Tsy&E{@~Kkb;7@TDkr_idi{X^>(*G}eZ?@b8Mq@4@BL)XQWS@lg{%!8aq(UXjQ|Kjcu z0JT&q`&6CDo9-+T2t;`J@-N@wn*gMZuye7swQ`9rr!#U|(p>=}p zYjl<^5qY7`Qiv{S_!tY5uofmROYbDlBqiqCqtBKk+k@p;HlSiE0mSS^v{x4-qPgEj zhin$stf__0GVR8INb`zlWTd;rkW*m#D|HS$6A*Q=6+#;FYW%OW#*``r%c~A8Dj4dz zOO&tVq_~&z-m@Y1>owE)vnbP5c}xl^YiW3sg9=%Qh&ofpOEOVri!KHAyAp2EL5U$F z*K|o{WqZ&v&i)NRoM43~WJ5;CIqit@V7k4r+!-1@857cTALHbz3&B9nUi8SIu81{) zhFEe%65hcnvEHIw^*j6$9ePedjJaYY*4FY&5&Q@Hi`qi-Ye@(r>H`qs(CxpZwZGo7 z^RYXmY_xz&PFzYt&i)vsB<&&-hlXIDci3*&52pt?x63tLKyaXrb))>3l-zJ)0~E$e ztsv$gSp3vv%NkkO%oIhU{;pKw6OR-!8q#;@htbeFr2f9!rFI?78p;Il5GA~X=uJ_A zrhYu3IF*1EL^af7F)qy{_y@!`&4?M6R{*n zM@MD32{!t3vWez-Y;aTmrTer$Il0DAa~=+e75)Hu+zR&qj}qr=9F2BU<@^KV{PP`>SJ615sLkLBnv#m64#nh{0x zU{ojPB08P33TdIuMK7iVMLE0ai?Q=QmsxU+%KL}+e^Ea|Y#Yh}_)JKCQ$&My#rqMv zbp6+x>QQfSIOyNI>`lkR5MBR*!0|SE!LZ#+v#LO^7D6F#_jTKa#?vt_G#$AMeUDw1Tm;}~`U3G%Op!kZUmmY} zo?YcBqDi`Mx!h%M&>!z_Gy69{D_8u)P%A?fuOQE2h?V*J2L(X1^j!o*7&RY}mEu%; zfzBQM+wsyug2~UayE}g2yisr_gxW>nzAPr^Iz6Jdb&-^D;_Hjzr2q^85o&;Ra_pL6 zzl*)1OY$@nU>IsE(Z3>uPx6>60)?F?B-gX%q6a~cZ01@r?gnJBQj=XFOG?iY;v$x$ zx9Bx>l~ZO&Pqr!Yk_<1%{>|`uf&TBFAL$4zYi&`4vz=E=3 z0*%gG@Mh{GxD5@|klvEqQr;)J$0V zS_OX_gNPK*J9y&c3h?d{zQz{&zLeoOT9&7gMlm;NLxEX7@~>N zZ|b!F&8$6VVZrjmA9tCU_kP zEncQ4Zka}>ZXMs@)qYn`h#ft61xxH4oN=Pn(oj$l&#<&q#MRf|Vdwz4d!>Z*(Azf$=#+`w=g7A*bjJ*Gu> zS7n{KmJGoUH#Y%jE?_5KmC%568RyJa*MzhTp3@h^o0amGDIedP&yC$W^nSxE^T@gN z+BH$;UPN-I&h{d}cz<+41Q1zaJ7iAXSOUaQAD$;)vkZc1gDwg^CmG0yL zo0zaVXcI#`s2_su-|EhFXm`0}VW4nBb-?w2iG4Vuky2 zb0XLX*O(Gi+_8zoGB)Gk%-KqvVNws^c=slw+1^^}@yy1f>46;{9E^sO+0Ih`v;xZb zaBz4u9t{o-+5!fRzXVJC)>XHEeZT(k`LjpoPoAyLmxCYk<+JKRQa0-q)8TFYoL@=8 zpx#k0IBKgGP-TMu^DM@TF8{hh1s_SbBFFy@bqT(N?~YgbbrNU#(4*e4KN%3;JsR|n z4#P{Iq3e|_EJ21|7^kuP*k#YS!kH!vl8#5Lal*7EE}OKp*-RqRTs!#|O}I$i&8t9m}^#w8gR9osqhHt{}21v&R1d=ZZUR~1@cUk(8EOZ7h@;bWl>plOKm-{L z*4+MNx)Yf=Ps!)Ga=w4GQuZ_}_R(+lMc2;fh`ItR?v;2JfQ&NIqQZ9JjLzJBJ=eH` zPRuA*fpTIGt-_(BXVa~(k|rzNL3eiK6M}SlWr|qj6a9?mWQl5;(iS73BwTW_Gax~` zzY)H7n#ng8Fl8}qY_YLbO;a}XUROGIbnI(Atud5}4OL^QNM`h%L5-7cnp#?DT~I6p+(9ScjD!sq!nc#o4*SUoqlfsu{LGY3e0cvCiY@929SmefJBNkm8Z{or zanaWs+WktC$vY;6P<&EiDZ^_F7*`@F!Hk-9DwWIx_@$yc0#|FWk;#F8|VmjF0K)R8M9zhO6i6MFnVSLpFpRLN!U z=l~4C!C?T(_~lZIxbSpxfD0c?_u)zO5+S~lU%Cc*62CglkdnJv(Va)npPpUbCD=k+ zb>mL>ICt+yyRe1dq-Xy3OV12%m7X~|_>}Yvp~DA*-ruG0OmvIt%zux-46Peh5epaR z-TToaBi`wLprp6X)_USz(qQ{Yx4p4TrD7{bO=zW`UC@e3SzcWcXJmNtNks$*S}}KD_^r9lSL*ZLCjaTNLuUf)?RYE9-FiTr!`Lub_hl zuw7E8RixuoG!cAy16sodKooN~$$tW@YTV`ZiWSCi01;)$WZQ~dd9G>q&j|$KoVn;_ zVA3;{9y`ArR}Doqcbv#L@~7)esMIT)dRC*pDUT+qNPCoJ*$jE361|-u@frDZNUxcj z3#*#wi7M3=Farcp32`zhs%U?7ww2ULm48_k($X4fPdTZW+rlpas*b4bFzrC5j806N zEb<~tOa~yryfAUziO!)zljBfrC^=o3nEwBD^w<_9C=t&KyF|A1ePvesx?kEGBju%M zIbx+fN@}e|>BtVE+qiR9;b@>T6@(*X^I{K2V$P#ZPY@+KSBUn{)4`!Il&dNA#)WQSP~lZx z1v4m*?96BQbakkhoiPw~3I*2DRI&vvJIvUUUO2*ll2d*uX#(IY4eI+Gz9?I7-<}Sb z7ArJznJv)6aLgMVPe0R*Z_LIPURa<}H2P&FqhAr}ax^*|O%JAnqr*0i|LY-L-lpe6 zJGwDHJdOWgpZsuov^*R(^1Z{O+mJ55vMPYH%lwEwz(dj}VMlI79=C-827|%jz02O= z(YUiG+NETFm+uwaAOPC3)SKRK|EvBG=JPb4IG_N=Tt*~lc@#!VC>NVh$;uuQPDp1)7@awM9e;#6_y2%VTw~^z7?0R zvt(9F9fed|*{+I?#w%M~uWY)O#TIjWi!hwfWLjvRBDq)C&d~m^<)x|7U!8gNWp^vF zHPxyNIv@zf+zp1^_f27!EHW)^(@eePlWf8I^TEk15i~PUUAotcP910#ws5A|lcD!` zC9V19t0rIs{s-0JxYH&L^Y*Z&#<9aZiOU0ZScclhsmJW#r?ERTo!!amW5cD}(TSG? zO=I`;Gc%(Gpi`#W)CIQF_Ke3PgeJY*TJ^3;GKu{ZcGKJawho4`o@qiw-4w&_fZ_eG zyfBV?6!#)2ZpzCFp-sKseKG~HffGpgL^bg#QZ?){5p`jdU$l@4K`TMp42F2v4- zd&(gY@$boakUA~Bh=;UQ(REr;&Iyi$r<+400t(krnxLi&_e2?8uof-Jjqpz#`^ndO zCK^tsaT{MJSa_8ahq z8c5VCJa_8#%=>nq323LH$;9(LfS{`)IAWUS1aKe_g=h13@dB;oNiUB}#2MytV<7$S zz~Z{BO5AjKO1%tf4PI?bI%om<`;$=-b~8`kaZJLFfV46sL(>Q|$b9`q-Z!DKuj z`Kf0AGW^R|q?Eo}fAenedip%AUf6Dt=G&7Wr;WgLa4@*dW$JGrG8J^;Bc5p#l{Q31 zBiw!`;Iv6Vdg7|o=kgyERX(Zb+vr=HWj5YwSSi;Aui&;2^G)`+&TMqhj3qyt6JEY6 zKkxYh5t7Ruo{Ud)H^t$d;Ai${JT!U<@5)v->PzJ$=!HW{$vm_qlZ+!&YNwWR_;5{` zmI=#2B=i%~YVlHk)DZzdaqjqs8bGkNh1{EbvHejk*9SioghfuNl080H=ZUsiy-{g@ zRJ7H)gW~CNi*4Q<_B*F99^H)|)P*%Q{(9~Q;54}I6KD~#sOROJ8CrQ=5nQqZ;D>P2 z8v_$Qx@hbK&*NoWcEo-gz%hE<5$!vGe<5R`RDjAdHM)=c#<2+GoUs51_ zgA&J*O0MX|Hv)CiQ)<5*IRSFkOZ5$6((05)ArOxhg(W|4Qqo%}Y9=7_@N23f?QAA~ zomvIVd{jM(0Bk^$zsE$o`w*Kkp-L^EiVTGlu`YVL*d(O$2x}@jbuq|Rg7vUq<=J)R zHGG4;)|;OA`}D0EZM4==9iIDPx5_o#5qwL5=yEt2kKDG_^b5M}I{RegSMYS&7I)H z{f;f7)1nt$$1aUaex}$ zu4Yg9Cc(*>Tq6^enLNy^yhc@?u#&|)o<<4H&7$nIX9<3&2x^HLWxDqr(&yPNJU`_bgnt9`bB`AJQv_TS4MR+ zb>1&-1KvF|rHx6&@z$J^$)>e785pa=a8%X7!(Hp9u~o%7Y!8muNn|Zc&3%7ky*s13 z(aWHxz>=>{?ALvpVvU8uc;n>uL$xFfte&tO*Q2ZI6fM;&j4k}A9op}6MsVVLU>YOP z#Ly1Mf{>UxFT&~4wldN}*0(!{ia&Zv)hVQ}hQw2>p~lA6i!R{@ujR@$0puL&d7Wno zdd~djNxrtIOFZcs*Ah{R=(N{W)r;=%IdeC9^yo5rN#Mf=kkr3KtW)LDg$44? zF_>QB4dWJH$@Ydw1wB}{WTyed`4#=!3qnC(Fvb1fqg7RH%KP{3U0+}KR;#kN%&+cY z(915&AMdSJWw+p;>hkRA(q!uDHrh4wWYb$!>-0@_XLvXIw*EOws-K~N2{3dgI(_j7 zm`%H298mOv{pV>Dda7Ht+_hB2?gvL!X|^5*sS{B^P#@m^KXpbb_aEN>S@76K&-9JS zZ0e8xvco6$V9;rvc@M0a<0a`pgi+9p|CSfad%R}u#hXNE&r>0!E6-qrI* zho;Nt(7otQhHWhz=(t>!y^1=I81KwpmtB+EqAKsf6d<)_H?J$I-*=I;MUQLXA2@^i z^(3PP5i}OQ2!vfQ)l=FcAU#7&4(n=`6wv1iC%GWYQIocQ@KW?O^5|H& z4X0k5Q?GK$xa#e0xadysJD0~V9-T$QUjOc!%s=;ROF`r-a!Q4O^$Sz}u{PpXgZp}H zGRQ!DljpI8)!fHAT_qzq$KFQfuRjUCycp-Si`}ETGmqLB;4KstdJ}ZvP7`*lSNvG; z9U_KVT@D?O#(C>xURd-{Qv;8Z-Z`TfO1jykrjDaoj*xg|8u-?|~ zN4r6Jtqk5J&sfS*8y9j+$bEH*o$}vI0i@jR*#W!ni>tf_|1FQesF9!mp&f@UTfc&^ z=DK=50CS~sedZmp$j=DIey!8LorFRX%Je*fad^NW`>#E6qe zx%_HoS=xt@|4S_-EKYIzpyqFWyFZGvF(C{>l4sQBT`&L+o60KBq4M-(=c}RxD~U5v zBKNq+-|qc{kpHrAB@?(Di2*d7JSD4>h$^zMUYX|y`5u#%q@Xn4c3cO`BbSwFsLd`{ zJXLon*m#wlXi-=jqu_{RvgIaV*zmxxdUJ=!)!o=Gz`2jW+bfkpgNjw+RhtR18NS%7 zJRu5jAo9ZYqm^r!3dZo9D?8f5G>w@Lv4iLG`x1HouBAWtf-)wS?Y&*FHUznD@{(vzjqghhj%B4cOoH5cB3#Ew zw72+k8kW^gZlEqnGVJN`izjC)?BEj8QXFP^@7s02qfcH|=-JW^z^QDnxh-^}r>D`I zY%m-NpyokR%vXRnCFz^&Axywg0DO8J^#}cf;hU`LmHhqQTYUfjUan1&_U8HeOID9+ zVFl(^Y>9TCst`WfGH5K+gBo;nLS)E(wUom8%KtSg>tnj!>gL!=oE zM#@lAU9xZU*+-VGe5b)v36UucC`3b}fWLW6<)yOn0kh&|-A=oIs}CSU0>ttA1$%*) zYU$>!!u*!eRu{4d3&X_M$_{$&~KDacqC!Lgt)HgOA`vC2S<2)CjEBaZCh?fIMVJQ=t{R zyz!57*dK-NiO>&o^GVWQ<#{|Y*Wyzmatp+IF5wTtJYFW@a*p-m*(Ke5pqN3(|7eC_ zu2N@AKn8@rWlHHaPN)B*cR;#!bd2TE^=ixAKFmw89B7O(OQ!|~f`JX`%A~1#u3#vB zAH7~d@PumUskvUWa%0#XV|<$UfXoX!-wLORGbL_Qx@@>Yhj2$@hDW-*WvGLPXxxu8 z4V1g$M-%q8`+H&6bbJKUXqHzM%Juo$)nTQZ%2W#siiHG2``1NmmKvR`IKuB&=n=i> z8KGOb^;UwAn*a`hHO9(t9dIR_p8=`Pu`v+;YEt@Vb)&#W zBSiN?#T3*?A)?lm5ME>fJD5VaR$>?j{kam|m7Nce#ugr)oi;p^&T)6*Jo?0(qG#AP ze<@dw<9&Y&UxEC+0k%sP`|gz8WI@Jl@%>o7hc~tB;NMx!Q3RR;cJT}|GSuspoIY6_ zu&uqE5V3M?pc?*Ut<*sIzuJa^!$Ra4*lVeHIfw&f$)T;kif*fP&qq(&nHQ^ zG2qPeBSOMO21crR9dlt*L^7Z*9fO;jP!BV!KK5SEn{_GG)#Cdl7{5MAVVz+OT}(r` zj(Zov!U{AmR5+=}0?H_OfI?A*M0GzPNib8{7KZzxd&wId{z-UT%K=sBOrT&>)BV`uR6{Houtpu1gEdo~y`8?5z%6V z86FJHAnp%__HZ^nvO9&x&+v)ukNcy^bUGYP_7)ruM&pB4!BOtxmc%9bA$!stmfdIH z9ew}9_~qh{gYO!N%V^U7dUB{t{cDMSaFt-ISk*x9%y+vP%>ck!NF*V!VtYJn=r4wPtNt4Xi0Q;m}=1!_{Bxyz&Ht){;+SF0tn1f#uKmJN=-Ig|k z%td0<*8`egdiGx1=pA@aTaP7lM+)P_S%;GNX4bfOIg`d`C|Y}K8S+cj?>{Pj|EsCU zjSnVAhvUJ);bB|)zVVk|LI^&8Hn_B}E}mbn-sM|cJoxcsyvQ4!rSWJoxaBN3E^M_j z(IYfGOL~|u=qx?mMjnEZG)TM`XuflcK>a6lr+A3|20CabsVSQcG-pL{=?dt1=JmFR z1J8akjtk!?06t=`!9D9#xI>u`N||0hO@a&3Q2KAk!JKZ;`%YzZnGtKkb) zvP=zC5+rf>K1=YYOD-SqDG2pR)%-BJy+am`-jISI!9xq_jQuT_?gGaIy!-hZ)ul> zT}t*{Sdd294un;M$;GPZ@V?zufleE@`XwTQqAu$8W}en18!DruM{*|a7?yLFu`kq= zh36c5zZes00fsDX2g}e}u$U>M|cjo3c~yEKPVm^7{}J zI}wuRgejGXOiaNmXOY1{A*Q}?yC9Fp_|7xkjNBN9*KX8i1tIQ=7Y$+RhHW|gX?cf{ z_0bXauQ^##EmMl&bjZRWwY4+o%cSxQjq4(@F~4?o@Lpn<=`^G>WzkhD*@A?46$eX) zW%IH<&a}MbikcwJEp2QSxu)PPH2%iDNg0#jYHXOEsEaUTeqF*~0+X*2+4?Lmhz?yT zfVze}yJ$+&M`#HLuDT4Rz==t(S`Gk{ElC(utrG+9U%If`(~wd^+wH_bnFLY68qh!6 zeQyR}tt7K%3D;h#ZJ{z}(mcaI$UM^Hg7vv{6YPXS?j6Ctg%iC9CI&lstB`9bI?cMq zJSkP@Kk;Wzb4Jh(fsau#%9&Mw5s_1tD;m5OD7pQNIN|iufx#X@o7j$qYayJ6XGqSJc8>fC)nCu;bvlX@E#n}m+c?D=jTD|82?gMJAknDxn zuuF4`XL_KtX5xHP?Z5t=i<4J(JG7F?x7-!YO!R45yD$)uq0NJdB=(>h6#CsqK;0Y-@*wHJw2AgRDx5^+P~Y=T+?iXapM z5qgPY;yv$$x^~)!Q>#~HD(t2ewZ0_kflL>VY{3BAB z%+DG3Zu0}*Uw`c&^9z^Kn~Yb_zCG?J9!Rd)0rEK26V;CY^rw^m3GMf7m=~B;=!m>21Z?zX77eOKcxJ55>(55_~FI zgO_%e*siL(kd4(I>!0u;6q0bk~C$R1XE`w z`YBnjO_6t^la!f~Cp;&EAKOn<5T4L*;+YDstuimKVKjtwIZL6hdCV3Xsg<>Xfu;ehDH~P?k<{Ta}#VlT3ZXl z4*s@k?x>U@#ZPq!g{2$UvZ=_hVWB@LqN$|N2kGGql~j{u)avd<&r!LXjuCug636cA z6xQ%H1Q5qcR#w1um_^jel(9(@!Vzsu@s6k(202+Lx`r;&HRxZWlx%HP`Y1Mdu4_xu zl5tMdTGnHd7Ck{vvPjlqN9K(sHU(x4R#5ND6fy1)&E;;Os6!2kl7nwP-y z_-F{T9#p2WukscdYxcT3I6%KiZVe6r`I8|sMQB_mvQ=i>4VGJ{>q-I?6JRz72e=*4 zEuq{L)={+ctgVjlPXJES$a&Bf3s%inj_&F5(w>}<6)Dvn4GEu30>(HaHbo*lZP)Xq zIkVlc0s{*91Zj0cLE=4E#6F6~{m@W8ael(#r8Om6)l2J@rw|kQYX?(Lngwf9yn}ob zCB|@f$`{l&=tKv-LwaQPYH;6UduDnwyb|`PVA0a>j?=dB%bn=X0jppcyPFRSV*JAbxA2RL))FYH$MlpViHNe7vVRh z_CS4dG<7_RpAlB19d3uX+fHFp6axa018 zJ0}Oi(t84yM0w(EuTm|1Qv9PC0$ItMO6-0*`yNEXUd}dbJ#P3uqX?l`m?I*VVNG2-#( zo)6JvfYzsX9BxE`k_kZn_&8B6IF4w{f~L|TYNsg+xmZ<*h*g_IqzkcqX{Jd7iRh)U zB=fK3tHO<_+bMQ{qf}=w4$tF$M!1Uf@bf%_ks}E+2qC0i+d{CE412+j>)nilgD18W z$nq%VCKl`Emzg!PYNQ%J4>bAeAEN<_o8DVL>Wj$?*vLSk$-GOGo3 z#I_ag=-?y4$GxuqbV(t>nnV&fzCm7{EApF$x2YoLNB1f*1PCceF1sThXx$*N`0)Ne zJG-OHOhr0w42K+ZKt3&${Tefnq}cY&Yu64alN9j`Pyn`~rH}z&$AVx4 zS7h%$uZxQsC7v3eg+Yb(5#pSYGJtR<*^;mgB2C49bl3vwl7VEh;c_jNcIfkxak1$4 zsV}Q;*kKxo@6%c8<`M^~4$p;e|NaYg@SufK7rWeZVznZm!Wa$u{YEM36U6j}WExIM8ziag8H zzp1Kia96#cUi(Nb;HY%yH031&d5}}_YZ25CJ~^bl|6P^emo1M|!mI5RICoB}&#wwQ zIJ+5hPI&BufD(ZL|2QQn#!fkOk8-*^rUa= zA}M1vsNs58N)B2niAgh$I;DAL(g;P7JT9B=$sVo6hlm5{vv7dAMv;UuE}e^%6>7S< zv)Q9Ez3Y{dk}pZCd84NP<15ngL#n4CmfRRFW!=iJ3jwT>0LhT)<;+SOUYi>H0DgM4 zVGd4%1GDmam8VWqy5ORnmnt9hb!{SLl-`4>L?j%2TIZ!IS&UolRQmw{b?*ytl7Fxo z(OJ?0p0nwWc5u2;8puE@A)EwindiL&C)83UlscD79sx3ER7{^QboQc4uc=oyWmUwh zoKir4uT)Kv{x~^;8#+CBtA-%z)~#_r6z z+pZRK?HU|c#bS_L5SD4v64edPxz_5t($ywANv2C8)fSi)qfL}XL^ib9rmmPiwKBq6 zbzM}WWYx9A3Al_C9NhK$rXzh;7cr-%D_WMp>(att10L+RSQvt-T%%+^MOZ$HzLA)M z%EZ?YgP=8dG4!z_m5$zZmKy&!qX&3ck((2)QtIDL%#YulTnUvr5vG4L%8`us=JHdiRXvA}%c!5c(C1 zhKdeKv#iZQ!TzJ((a`~yj2cgN?Ve1?e83jDAex$0B`E=MX$f?*OequLzs~i3O1ht1 z?uTMSwd+xsEsF=M=PEp}`GBTUB{rXw(VI*>bRMm=t2?PzoB#$|COax^`WM%pJh^;M zyYGsghL?@6aZ`!G8A7(?r`aA7rDgfG**1EN<2|y_=;}pxhW)|hF3~Z>LAGGoBsvVM zYn-5{mfJPrLpx74N#$x^xG{q|l9s6BBFWxy$Cz9@sc*tVZQ2*!m+mxcCbLpq^7tuVAZ9oV1pey=>46aTWcGcZ2 zV&t)i8ozZI=#Z26tDP+ifWs8b$ z=vrhGY&81#q`@rz;vds#+4`xE&d=x$a*Bma{=2>CtTFYJ!V_j{PAkp16^QaM&0J?n z6oWsL%xc9Z%P-566@P#@T40v|v|8u&$>npgqcyddPLj!lbSbNCR1n=QFV^gHE;<)U zsem6Ga?3nGDPH58_FhbjR(lz)=1B3i52r78f$<^#Z zk>~H|EV}LflQMMYyGpJSkST9!DoNNIvz7@acJnT@bq${uyg*O@d$uuRB+$OC2{=8d z_(4_FH@3l$@VrqTLs=JvFmFhubl*OyB+yl!$JDV=(JgtMXJ^N~NQb8NVa#GD`wAr= zG-X{)htcy5B8S5m=f3#nWsK!?go6h4=>VyQyt zb#TrF9eIL#WU<5jt6xTUkeMQiTBueJB9$}P?wujfpc0{vls z7Y*85R(!+iDwre1~jmwI(rgY~MM+*=C^7FdN*LhK(93A|dYgrR1Vrg4e3!Nyo zq~jNvKi0(S_rNHfz_hVYX%I_;%GkRLgR7iQ(c-PWwk!}t0SHG^^2KR-9yi{jbo@aJuJG5p~&p3dJszHIgnhqt-Iy)Z?UiI2poqWr(m z3yxr}1?rnwTdWgE201*iZEW&)jnBj^%FZVT-v3EXAj%veClTK}(b;-!V4RQ<|D*b> zek2qv3sJ3nS=$mz=HT9dMI!b-vTr+G_9nw462p@k>rI`AHf z?p!{2a&ni!%v}2wH1ax+ZIOAL1UIf+lM37OvS9F1sUi;IppnT|ZYa%QL*omNm=sU|&bmZ40r2%wsAU34fs)g7^$vLCovDQ{} zFtZ~wKOBx{M`pH||MgqZ;bbr!9F7OWqkg+4*!W8*lyJ+Yuz&Y?_uXJ|_VUN-`v=ue zkB0RRKcwceCGH zB0~FVa2`0#@7|XNRQw=LOJ*x{k5%ZT$0b&FS>yWC9xCTA6wf`FP9_J3{mE#E$-3u| zA5G}^|0~3EuMfXp&Z{TSzj=B2L;QVuon23ko09f}{^8dXq1r1!l4n%raT+0mL$49S zJ+!Cur*%<5iGlz3bDZW$VLn%pio7`Kv#*_x^r;tKz90D#zObukA9vwH1L$|_WA~yL zPr1+Kxut`m6N+ESGzZT<++o@Ao<&m{f>`3f6bMC9!-->=U=eDe zcG;;qcwbtc^f-^eADKfS1t}dxC5_i2Ra&94k@z3M$p3NJcfDY0H34+D^IWE+K}a(8 z%wh#FJs;YG-4XU4OJu17Q-_IiWiI&FU~cqa+thr*r{^!DC;W-mxcw88&iQ2RwB{8H z$q5_D#C0mT^DGZ+5j8*j$Kg@$=m;1A2#uhtg5A?=@?;90*d%k7d6Y=Eu;nUG#d=p_w;Q{xtOb>C-LjB4*-`FKDk zf&c>Wzc7Uf#rrk>URWYk=m+VQ0Up(|Tk?9#%hYs zfvc!gCriFlORTuEd5zQPICb|P*rEhiR5Sxyn(#I!XA3}iwJT9^eCC1S8tAl&B@Okq zXh*&+`iOp8^eYOu9gN2P!|C{Ne7J*E2>ta>LOpdvhb&)s7JhqHRU}6Fm~hhcLZ!? zcI z`z^$=aV;|9thha7T?ZgX+%VZfE8RuwsKVaijg~Gz;nKBbWOxTbsFGWGVZfp1np!j> z!NrPIu}$gCxKZcyD=DLQcFPZOroM5EkfwY0rg&WVC6y+|4HN8*8EcjdZ`rgd$>JO{ zASslZ*9my6kuq%aEHwE=rHj~s0>x6JYjz6mpix(+dL_WM|FY#0n5G_%-J z&s~v16Bt{X{2l8T04IleZnASu(SKG$G zIpHG%?ZQt#p@>l`C)%FdaM})Pk)nVm*GcI`mwZ-ks3u@`VVLoj^V1 zq$+-#=0KxjoS4N>wtSC#@(>aYF#mzx$TW43gQH0s*V-B1o)Zy67*jB~N+IH%uu1O4 z(TXLZ1;}6OlB_X<5kvr}W}iU_OymO0&8XgJe`_OWTYDo_ZSzmxvgWY9unv^r!17Q5DP8rU~o&sgPqw+zPpAKokU)wUe8o756=~M5{WZ)&%MVxxkU+ zF3A(D^ky;E*{j}<)+P--qJmpmL&bqi?KU`)N#vC*ObY7GnYzl?)ZoR5E&Bzwir$;7 zF{s|UF`%(J3l~&(JQTcf$50L2D7}UO?+dIz;i6CvE1_5lpjO$w66fioRLa;Y0tP$6TDwG z-xO4LEK>FMDVyRxf3v|TKyHBFsXrKO?f*=zf8evMu4 zZ^P6xbn}evtg32L-oJP6`ue)JHUu72|IWNv-u;N%XZZ8~?OvZ>->&iSXfPd3C&QhS zyYZJV?>IdkzkPRe{`1w7ztT$WnFAg5ROHKxR6j&lEdmcSBjo9RNo7JaD`PoRWEu7pH&h> zE*-PY8}taK4Pv0yvk9TT$;`YHX6AA10-hDyw$km{*j5m*RzxwWR&+p_#9tH7;y5<3)EY-_oHwb!(OAFSuB)$ z^wYn;`q$Bqqqk?H2S<;}vwsGa^Iu;)v2TZ$=?^c?;?d!c*Vku19pOJrTZ*%-&Rd(FYb)x;Ggua_iRk zo9q}eBeNXRl24CY8{K?#Fr1h}yD%G(Wn0_OQNu)!6B#liT1bpH&k64AD?62w&PwB?cU9^)&KjVZhza z(wM;HS{Obx+s~~E(?0_im6&4tB_(0$XvbO--s55vwAK~Z`ghn{e@Mo4em`%EC{%#- zhrMIaEy$@pCsBlXUCd}-XDf`kDdsB3)aY!_8!pr0sgO!MSy)mW*qHe{YWqE4o@zm_ zi5^S~z$kv9`9#8#G7Rowip&ocuecINW#EMh4a6V`DNg{zoi9WguzH_%wy4s=Jj)O7 z|LaZls5dwq^r`4RY!%(th)$)%eo2;D^iCcyGV(dQ&~fzkV_s*==oo!rAe!{bdtgWb@w(?KI7s&`m%Ho@ z`awG-1ef?XKr5G26q&tWks+|^v{!&!D$tCFqO zH<0R_P5CA`nz+IAXhJ}#?~Q_tjR0(+s^DPi@zB#${P z06jHMu99*c6(YL;8!y+jbvNLn1~v=EhU~>sjhb*Gu@^GFmS*V5Hbq_n^e*N?yk3;+ z(fW}N*P)62O1lz$S|Vu917&pw77xNPeXkd{28C+n}2sGm;Adq8L)T zA8wR+x4|C*ik%UAJ10}Y@`oSU_CVE*>$zr-S*=c>jX^|*$Onfwx%f4xdi`)(vmQcXJCV(n2KpCTEL1y@ z)G4u0Nn5yV+@WIOILm&9D&i+X+hvlH@L^lK;Ds#H6SqvGQ@4)q@M^!SCj{QdvJfXe zt*-Im)H*ohM8vnRsCpshL(;>7yPv+c**2(x?zx#z#K~>s-I*zgwT5VFE^t<#BH8Ff zXNPXp7ktKI%W__b>@I6F%PU#Re-5!0ZeUAdWF+AkFET40hQw|r(6x4RvmirwD9BK# zu9aCwXP*bpNiNi%c2VMc3y4R$4g;8fTLOe?S94QnGYc9=W{n9U&5EFTvhN-E2@$BB zabG2O?VCnlMY~`kmKF4nXxfMkPlpDGeY}W?xOV6|_ki&1qDN+yd7UNYihHtO)@At^ z!etLI_^UNq4yKdC$#`;bH0kR_|x%E*TZk#ZnA^N@w?&RVAQm$ z9e+hfgwLP@eUT%AL#K#xBG#d9i`vMN>ld?-E`5in)aRroH(}_r${uW~c z{46~$f$PqxN{!@MQ?bE;$2mK}3g75tq1r}FU)q}*{pz5xsUouAPNz0rit;IaF80)Y ziNv@k%p?@r%b?~Ajtw1Akbh^%oKAQQ;fgv6DwcudiU=wC4ff5$YAx+eWM(xKvjpSG zg8C-CXAwr{oRlzDLfxJCF+i<|6SOoc%PugN0YTAT38BSNsPI#MFlKg{WSNj8tQ4$@ ztyt`Kyl&LoEEahhi~J5rIS~&ru3f>x%l19_=E2MFx^#TdI|y2|zNI2AzK}fvXrNw; z(jh;$JBM7?Czx0KuE4^&Gq|g$=fQL;Amo;LYP}(85=pp~uu#;g_5Q4_q!qmn-6~BC z{fH`j3TYTY8#gPEW>EB_#7KHB(JtoSQVKS7d+BQPE%LiY7fuA`q=bh8KK5)i-U99- zXa)I``NR9a;CxHimk%J8uAkNz(8eT3-HNt(z-}p6qC30-4+IFkZ33b8aJg*?y9D-xoSJE`5R)`pvfCa@p&Q)}!dt== z-w=9;^Y47ec|-aHK+z-in2zXL>@es8*Dm5qz-hgEC#c%7gp+S-zvcgX8S_HHMmnv*YLbGPE7D)E3BiIkP$7fyyMZ>AQk zDQVM9$>A5(Y4{897j@EPp&Xe?B$eLC!5i=qYAsC2$bZ3d4D`?oM|3E|^fOP~Dy^Yg zcB&k*9mZ%Uqeo3T4EzM-ck8;&Uuprv%uP}=R7X?%oPP+}x5A2^V_G7?)7(ci1v_3< z-M^U}+V=@b)8mp#OD6~bFoi)P+uTMqO7C%4&>| zsb^~&_p1FAE!5M^d`gM6Fr@u){Dh9y6R!``|$qHj(X?? z1)k&Rqs4%m>UE;=U_x)M7fr^KPINGsM9+F>yM! zE4vSo&StUwxf4C@fj))RVSnykqI}2 zZrTu{LYM8iN72tFuTm7$??fbTmc{ z91lgRN-Pdi3PGu9aDLKsIX+(7EM^cE#n@15p}5WcJHwcmVwXw4M48(&InwAv7ixcP=B@d0) zOFR0LL`+lYV_BeBS2ixA%`v{K+1n7`uDOp(c_h=T*cqM+m@;$b2I*(!)b)q`LEq;` z8XzIzP=Sg~UbQP*^Ss#PR9Tl)ig@87b=gp6@Cw%|mQFpd*Dh6c$SOK9sY*y?JyqBc z5V((MBS;;OB@jb5pqS-{|16`3T*s6e0cvS^ioOMZi~P8 zN+V*EMWST}0*qVR1uzksRI*B$eC*)sh4{OZjHr!O6Ut=4`o481p!b0yOu0$a3=qPu zI*rsc;p3}GU>j*l_&Sm3e|!1w!LI|bf~guP!th!krT3qI7Q;j1QK>sq$v+tH za={ij_w9X3W??c=r&crc%KfWB3&HgKJXo_v1L7y+ad*~iVcQJu*-3=}rar8UF%$!23t)I&1I2FVTzs-*PpcOvSik(HL*{FP+y z(4K3ZYa7aXNF_LESdcDh&8L3r8w8vY>JFZvm3fQxBKjMdberjbG;1P!euvcBZr!A2go;dY~= zR8(5z+;ILkCURMa_Y0=r;J~jxk2(pWDkWU#OhHu)ZmTm6ias__SftS3iU}Lll}hSu zpVl90a0Rkhyh_PNontJa_S=eQcTf!RFP9Ed^PYb8AAlO_Jwia)lpiPqD;tJhHl&wxsLaU7jX^($^4>2A(8EME$oTyb??l->36%9o5%F}i zRQ&0Z>?f=ZwJs}wdo9jTqWD%Vgg+}|*IZD(=SBG$_$FtbDmL-Y_>#-#jUUA&8j3}9 zvLkHZkwaz{JHgC^s6$0kzT-+djVu42NpJN=X;zhgwL;;+aC|Tx_K!w8@bSi9zG9*9 zn{UhP_4MgaX?pYh?B?O?#Z7h5M3s++zoE*1LzVxAD*p{t{u`?NH&pp=sPf-X<-eiI ze?yi3hARIJRsL6?%15K=WOUFL0r+~T^7Hc_Smn+%y+gsqw3Txg4u9nF% zFXY(Iu$Rd0YUs)+MtbiJZJ4E;QLZ^#Qa?XmYE9G=LQTa=v#=uDn5JD#1W5CT?v&7_ zsQE0jgim0Gontc=ynUyMjdoz(5AXk9y$T^Y=SA&KJO9u~0jZ%T-BwI7>Kuh60cu#2 zPQ`r1;(`s8T9j^9R%DVlHQy;tEH_kK5Gw(Lr`M*t^V(LXYci8=xjs~DxL~}=LN3P; z=|^}YAk~maQ!1tk; zAh{Pk1b_mO9*IMxSUD_(vo_+y_XN3K9=yszPG)qi*(`=4Sovv`$cu!E#h7OR!X%qC z$uNs`el=}kI3i%|e?xaxf!%Gavh=6R7Re!KJkgn8rG!ds4~|<{PTqBF9O9_sl|yBR zBCLlCcpO)P%j-OCC|jWjUWMC%!Vcna(gmX#?115dwiPo+bT~Ca=e;Q@8Zov`71|lF zE~J_wHn&noVok~1r0s!nfVjOoJ=N+2ZX?U1B{B1L&jMf6)}MDdx0j(Z;>6BwanSZ+ ztNJ%M-#=MoW=(8@EI+M_0>#dYd}dWX?u3FtDEwTQby-pBB*YrobrGO3c$vpNi!S*g z{%3eT{m)MvV4Y9?oh=SH9^-wdXUqlySNAsVWA_YK@$U^rgL{K}gQL;CQU7Q2s%HoD|3~=)rx=OlDEFo96xSHKRO(Ck4C><`(S){a4^Ny#^bg?X84z{*gp7f`s2go=w$Tv z$3H9{j=$?)KFPmnv=5GsZewwN?e>Ak*N)rWgXk>2W|d<8pU1^Kv4Em~rcya)qyIk; zDBn}(#`Q0IgW+@<-HXVk#TQR4E~h)cI;Ftdlc8dC()?`6fW&3P6*UhbI*up5>>V8r z>B56ip#0}9EYgb`kBjB629`;JHofc}9rfi(LD9Ji0fQuv)=FKIALDDo((V##>3qvgU1>D*7K|vP$7!5rM>B^lyWIkB-HwA<|f&WmM6+R$%j?;_cG` z`E20PudSu7i#!c0uv3C)yE7Y;Cw;-Sz!imPfS?ucEaA#*FZ#FPzw=^DNw>Ofz(eEf zpCYwd|3S1|CZ%YfCMCdeei}Q&;FOmHn;sJPY@TQNn!Hl2lWq5`VB8~$%;0lMH;fT# z0^{Ycvxr?~Qm(eD^+mpbUu0^XjSamf_BI1l0OH@Y#!)NN0P!+UulVRe^mE&Ds;(vj zv1?jIpujOy4W5UZ_2Iu~`3(k!djIr|GWwZCa~&kyR34+v;huW+vORP9j(3cm?x5!< zHzK(6;J5a;(H=93+I^&K`WWskT)jh&SPkQPL>z_1i5rYq$KRS$b;ne|AV12lEg8AA zjZ(N~&{{l&jb>>+hteJA-z-VbJWowkp^#Z}`PS1wcPA&DYRYAu#AK78JNb;@YP2xi zX2^q2yBh8_6KrlWst#~Dwk`+~EmE*N_i2%_7mk{~vvfW; zlsJtb?etP0B9iv`8=@s@(!!c}OPz|E>~8Th9?7zme3;52{F-pnP$Q_Bj*(}}E-+Am zRdm8r#gQ$!>&@p5Y`xHLTT?58%KYSZ-WYQ}lpycP2s>(w1I_m=Wa}gMACf3a8GWAyj#s;|?=9M{)-!+t>mdF=<5# zEL$GhKY}(q2^}YZS5d598)^>$?`sRxa*X<&kU2!gZRv^J$($u}8PSsp<`eOQ zZHbnG6~}k}Ib~!;Rlc;`j>*-1n1_&ie}MnZr+xI&lNMYRcTrEh83& z-I8qY1pvfC(GJH^sVp`fCA+TzqNq8014=bW0F__O@PV#`kTX=tt;@__mn4#l|G0+| z6yvtbdm7T-^X;(hy+#Q8CPT!i*UQpmHK%eyo)`D%BKOuN`Zar1hy8wkFn~_>=-2C2 zUA)~s9pC(+`^SlSwR+Y4_Pf_rQ_yuh_?2_#*EY^}z;{AV4b$guEhfLS`P!Q7b5rMr zy*Y!U{>lvcW5~PD&7hk}^Or;A_IQf^Vzih*lMaVKCXI(jdjUlaN(_~y^TGs3tIOVa z;B#Ja(ULC(eGOKsFzVedWokD95_CfM!NGd(2y5Z^bxG?{zG zmnSiH`zm*q8kg1 znruPzprqu;ZYL*Z?-c3juWW__8KB0_EH#BQ#&U(Dg0n)7rerk)iXzR|Cpp~rmpGFU zi-HP!Ws9x|Ye(E>+p(#w$b*A(<-D%a1O;C~I1xW@FrD_X7AOb{@fks%fPVhz$$9r# zUM%wT9WGlCb%*yxT^)kO@uZ~=N)%k<&7yB8waAO;0m9)Eo2K=Ap19yGV8Pdnxj}$~ zBpSUapefRXJ^!!@2_Q?Rq)Lbr5uxS_qGuiU`~CL7s3plp)WJT&1!l9WRWgI|5l8)v zal(@?FhdgVuyS$_p?o#|ymBOP{+lCh|BesWdRBtjkyR8Bcl_80hRP7pi>eisRl7{R zC&At=MDc(rM!E{zFR_(ZxD^q|2w{0ei?0x7zRX>ji1*niHGdZo$)*a8(#eE_^OOkP zrlm~W03}Ae8tVKYTnye#9GEK)hx=s4c5uXOx+M*2dhy!<(e1VY`yu^V^X!E z`R{yjS=RI${Ms0Wk7R||+(buJ)S4uvaDY=eiN@qc1tqF1W}PV#F&kijrtkf(lal;t z$ixj>x#knX?j?IU+B$?cn{Em8PgBIEiHJF%8Dx^V6k@2Z#V0KvUg%jCY#isPleE(= z$SwF&17>f`+!ixa$#bsiwaJpo6p6_+X;c*_+PFB~#Cj-u(HX|!Wl^s;lw+Jee;f%P zGRn22-CVt5h0I%N;OIwCJAeUHI0LbKAu$uSx%oRWc@o6K75PaJ1TZ|0Oi*eep+_mf zJ6~q>T=9eS3izN6BrO+tS#fU7J#7xOU|EbUVFFHxCh=Zr# z2JaF^)d&1k+c5dsrj!XL0>N`O#t6nb5k*J*9f@-;8}(2PtT+SZV3Lo=r70XrtjU+y z4aR^>9S{0@HoT6j4IRo6u(_!|yuaDBJ zE@nwpu-AQeC*+&gRlaB+=Vh>c4ElZAo@BX8P17+Fd2Ti2QF_rg39V-3Seq+LDkQE^ z4cU>#Zw#mfA5hYfB$WXQG-dmqHA8A(uh|?SE(H)Kg7E!2tCF>LLJ0%iiy>BXoj^cl zDYtDE(1Rj;UcBot2vyij>ur%3g|~WlN8BCiSu#%W3F8t11#sTQhei5K=G9d=9%Q~= z@Mf;zZF|kl7pZ6B;Ki=05pE@I7cPG!Rd@vMK^3zP>xy#G_8 zX1IjPMkNifHM*)iSt-pX&bsCOG}8$E-#{y8_Bz1BxKnR+I*W2-=AIxQT~O+7u`8Ky|~*G z%d8dE3ghVP^a5OPHp`0!)5E^B3mbRb_{g-6GxqdCPJG#f93A4eF=n`yk!6vWXd#8~ZU(&@_|CP-x?_?u|8ynU>)Y>PGvBtrS*opyo)kV?}r=I6VQWbAbI zWb9fgTLRFvZ5k*ah6nF++}cyQwI}8}y7S@vU!FgG^5Ok|-u105 z;cU^TM2Jf;2D6-dt@McUxcny;<>QFfeU-y3G$omHr97HBHJy->zzx=YoL%y+Op-FF zkhRsHUCJAa$!$2!oN_z4Y3b_bbf+?mg@WS_f zIen<;{A{R%NPccqPtBoy{iyJ+^2io@phgHeMw7vAD-=IYn10`=5-sd}fpL}hh;hLp z-$rHrJ2-2yuxG)D5fTHA<%R^bJIk@(rnKTc-hp z8@+>Um6c}h0*j3!$-^+>+C3YV5mFwfi5QIQ^=d11p+ICCz!b|=`q(zj9vf1duBOH% zH&RfcJ~JqZexkr#8|z2Kby+(}sGWYelhQ-fkpZ&Q*iJ!QW;0FQ!9ZgCYP|NHBC#)6-S*KVx($}L^|k@bE)9ry$Yum_1q3mbVuKdQemCU@A*Bi@FvvV z{eoXhYEFA0FM9FlG1GM1L9+8`?@{A!MF(aSAN8#@hxTY_hZFn7hMNb|{^)3MaBwg^ zINTc*j7P(Rreey@IlVs=c>TlAqw2xa%W8ExSj`rX)00Ef=*|ufhrdV}<kSns?_%0$R4 z52yzVM*88ffA3LmIGK{wi(LOA2n?Uvn2B5&l3!G)UYG*35dQWM-#(a*f^RpxicneB zuB9iPajDo#lr%bM5=h*6MBkMjtiR)f$$(Jg2mPbFk^fcK#i6V=wi{66sRt6&o^#p; z7(PSN_Q(Xe9xa6;ujcC`B>b~*S{u^bvw(0#24IPNs#{pzy8oyzW4P{ z?p&OmpPZvRgT8mg#sdD1XTdw0(5R0NoYhIw+{FJXorl+URzl@dj#?0~ux{kmxuHo6 z^AGR;GAAXKZHFlC9SuL=4YO`Gz_?n8RTB!qFtTf7_$*(u?3l7e1uBK$qOd5YBc$*} zYM!#BqT_M6q*;EGl+vJMMhtv%vWO!%Iz<^nB~=?1@?{2CP*rbD|Mu*64M>qIiB6xN zXzE?!W~}4#sm$M%zar0YimRxYLdqvGD;nzdDW*<8vN+7I_%<}!3? zl9)dsp#g(3kkLaVgBr(vNkp@{h;2rJkJ)ULWks(?ey${QtX#l%c+80L%JV$d(DO4M z$7EXsc(^ILaIZ1&a&aEf}r@@+Ocb%0UEE5IyyO&)x z?gb@oRdtT2USgM9F0}0Qcl1pZmO8djLk#R)N;>^|p6pJ;5^idyaCA{Z`TLgPtc4)J z!YOTv{zJ0hw1IA05`%r0?L{=mCF!Buj@xjp>L$I{WnbFz^5+M`JXs95u-)4hZM4SH zYtdk5Hdyh!H(Ahf30{K}mTZhToGlS4*poL@r)n?GpI~nXu$N zhF9ONQ0Fv=x4*lh{hO_|$q4_IDb}26ibRkQJ{rU7wEM12VHG>8MG;B=m$s5yqVq7B zzoWYYyjZJOh($BjZO2k5cAhA+QCyIOj^w7z*A4k`*$)H# z__1+Q4=RL&aA%R>Q9%E=pj99b-UGmBPmWG+26K=&T|tuNJR}UBnVX{63g#In6t2;% z!>>$Hu0nMpf<(wX`tbfQ*9MyQQC!r^5}|`FjFgVr;p1-f_$E7scyLGdSvvB4ZAIQl z7%L@Z7~#m1h_tE?ZFrj$(KCGA$1TzuVCs(Fo20ImV;L|zv&CeOygoo1R8LhPhM6mT zGO9CD8EQC#1!3Hd5E3A+5~NmzfRGwWLk$B;sA47A5)UgovNHUoeKf}h5vLGYBy15O zhr4271N^rbf{37QV{~Hnba~DnT#L+MRdxHEp zpVw=l1FAC>d$5t9|9us4a6cnpEm#J?;)GGAv`BgD2@qQjF!QNmQ(>v2K38#G`Uq1a z2;j#%Z-!=YBbVAqpQx&axpHNTxF*=m6I%(bN2V!_0g0IKs}4_XDP?h3VWjhHQW((i zQ?IfD!klrwou@qR*s(SEZ*->qR(n&22mOP?$-(64;P9ZW+Z+Dn7xkv* z@wE7Edr*9rrju3u@?w5G`9rfH)jvG^dfHZ>!My(>ZL2Dj;Eh`9R)fj-@E$#Ywzs^# zO$h94h-@ODpsuNSjD8hatA?ZUkeLu)S={O~mABhkR$pa|c!%N{T1rc4LF_h;1owQw zYk|&lTg;gh%p_0N6PmBGJk6I}Xd(dLUY)G(FI$BUQ6%i_`B5q#Ziw$kw}s16R4>9D z)ZNRP{?U#rN`=GOmVzxcrA9Fixf5J}G>>A}5T|03r=nyktg*JSwYnIPnvMh-dCqd9 zoG6g(K~>c2eYebLFUrWAzEb$SvP3LfNSnsBY&kb6@09*>PL`9vUp2@ z=Cv7rPaz*w>xe&{ka(t(fW*|N_t5&T3GAFzQI)Q@NUc@TS*~yWf8@R0jvGgoF8V5o zIqhi)U{NINU%i2iQc1GPmMpbOw%a`#G?L69nXY6eotZ3(zVgk!J{Qx#!2o@3=Hfia zeiT2+!S}7TA|gqae%ki@ZD3=zTSX=_BO_LEaMDs!*3<9VlENlt6tg6j28jJ~+LO;HQ9x}`j4d|>zXxQsSBskNR)!34=J zZha5c&v6{)R$`^xo$UG}z=4$;t=0KYqm-5f;sKfw^Ez$Zo<*ZCWj)Ue7ulb)ecN;# zkRK{KQv#WQU1zv&cw|748oF|8^kyk6B-lg*c>14Ifto;IYbjQI~KEm;}Bn1qHb+yCxvAV?hzHc{!JJf@b($1R!a0 ziEy|x85WroHg6ls%CWNDxnKFsc5YEYrlCYYta3e!HBAn@3Pj9=4vnL|_2hx2N80<2oWEuhm11v&M=U2@VfgBt-)=+?vM-_lDAqB{wdUO+w<)2Vj=z(6idGMG?$AjbH z@lcRjEyQ9oRjbdd+oW05w@zm1o7J>!lFO^tm(QQroUY2`b65Tuh`$`FoMuJS1f1pl{@aq- z2G0nx>nd!W8wZjeLFua(T+kf4A_IVet458Zn0zuk^?9lSF0E~h)M!^0^6dQRY;<&Zc(Nl48UH0(Qv2ui{^hg$ z{M*ObkFVF?Jxgz^MUnk@@%5iR7Bh`wW7@h;t2X-9}3H6H%R*r^}^6i^vFAY(gO?WPO+_u4F#R2Gp`Dn@TKQNHDrm_Hb28)9Fel zANCr|AGsZ(9T@=g&+zZ0=2rAZCc$T+Xv3?dt+CZDHlA~4>st^3?eA6Z zX0eI;bON5j|A{`HG^s4L@Vi-M2-hSn*yJi`*|%EuljORJl%^uJC_~c5myrR+sQ2tiCT{Tez#~V)^TA+rda{2vJpp>Mv-HD~wB2&~Jd^mUjNc-0Ht>J*gQ$xzg3MO>*yxH(%ce zi2|j2{{QFjS;Eu({L{Zg`l71$RBplLOPkj^WpA;NIGRm|(coSQf+QU6+H(PP}Zv;2bkBOU) ztm5Q)gAOe=U7ekAb6Xn}hr!^`cPx^51zRuqz3*hL9 zMHBd*{-CH6h`}TajA(s}P%1e1XbmRkM?8`@vic1Dhb7HxFn?8vx3N>|DrONlf3=Pc zgj~fC`Uck1-2TzM1i^qIP&6lN=h{e?GYHNC5K$?f2DjQL(#A@K`GeeXb}4(=H4bNzO;witSGh{XqwTr zqp7D!yK3gPAbs_d3%+lGG@kTN`N&c)@!u2IF}|5neLu==FgBM)Fj8}!U+yLMj?X@O zaM(Yy%is5VK6kyKj~GwVWYjJt@;&)XCtoePaVTv`^p6#LUU+r4E5 zGK;hVb-L4;a9M27ri5 z&U43Nz;H15jIJX;y1Gi70v$L+qrvf@|F(Pu+dyH-tdS=z-jE>i$pLDtamATZXMv-dB{TR8g$54i zp8S!S|5_7kl#q)`6g5?O8(uhEuoO}m`tSLRY9@!t4ID`LM_q~1t`JCRa`|!;O?5q4 zQzO~Qc(U zP1{fHMjS>%Ry-opk3gU1FfV`9P-B|Lb>^6-o4gXX75%rN`m(^J+6-U0{eyRxWuamd=!0Ac@7#KmEVG-O=sySitQjm6XGCAWi&SW%f`fV~Rtx6tn!y z>1+wB3W(BlnP-8Jv@9IOB+|xuZeqRc9C4yD5k(LWh{vW&6-#wH-*gyQN=mrpe@|De zN#azsZ(du9g?1vTlB=R{Etf*czQQ|GiICmJr~Zo+oU9e;G5^97yl=!+LIaEOkm`Ob z5^o3rt40ds8gNB`Ohl3z5nchNAzuhr)R%0dV<5iIz0}VoNm4hK+u+;(^V70^!`kg2 zi@e1(#%MSgboBH;06Xds-?YTK_wXAU2)~_?&0utPay&RcIlV)E_t$R%tpEJ_o8xys z9?VX^xwtyL7(csydfhdS93J1*1$a_WHs)zRxhNJttn#M)v?f4I+>}82X}nF*7=x(= zjZoZVRdd^KJ53xZeRj0MrCt)X9lA;r&-!@i-mb$q9SV>@LuSI`N_$d|RKO2*|7{`8 z$l4Tl^Xm1>H%~6#;Np6gjt_hxM5>-&_|e_%2eh78e|7>ftVlt?as;~1Y~7U-9Hn?- z=rCK#hPp-2WPD@P;;PHTRTxQQ`)(HZYuDw)s1RzCTZ^=xY;obI6wwy|m#6_6R5r#g zIl=#mN+cE8GKZ6t(}Hk7oW!@-i%4?Bp*GxBUVcRmW8hM_a6wVcjGT&W9A)_Qv12YWBw@n_ z*3nj!m5kHXtk!j+QZVu+%Xt#mJ8#DxoI26Fk&T=N zlb~6Etr(zq>%2vDaEiKsTAke5q%z9!TGcEyrvN?4xHOTZ3>OT>o^!@w#iB-_O2D!c zsl_~4l5s@ozEv5Yrt6lrMNiz?0Cv2@Wb+CuFo-*%UAV&|7-h%qFde4j^TFw=sBczASnIvk7+w^b}Ue~I#)y*bC;)aJ{BQL!FhEgui7#|MXh{_67h&CO~{$>Pq` zraQKeRv8*v|7ha;mpns$TDN9Dy#Do*hsm2e(vYBQ;BM2Pxb)gBUFv~S*D0dkoAh1s z#LQs07%%dAQm4~4x%aF;Ivbrl0Cnj2?0!Ge&sa6-AX>k8IQ@rgyt?T&O!9EM|Yqwx56je0rn3nQH1NQbSX z(vvnfrUcdP4a-PV#K*FNC1aaRpC->xq1hSZxhwJs1TRrp`PO;p8;p;|@5f)R^RDcr zOwimwnLZavmb@H)2eq5J+Ayb6l+H!Tq2VsJ+$Di?LChtTk!vMX_I)1Csy- zDrJwl*M6AnP)fRd5?y|*nag*R?~qT!dsSyQNC`P>UE;Uc>&{_)MAumb@0)iX*%RKs zDlRtd{$l>;EEyHaQzZ4j8=UQ;{V1fzVr!it75f~1Qn(Hp1G9da1Qa%FJyu!#pnxm;fEzXlNr@d-tY$r2j6s8 z0E^T3{%D{Ge%2oGn+Kr@Ku{{RVrp@y_YcvxASi7m-8`z8Mq^#z3a!EW+X29@%*N|& zE|k}K>%95a-Rnd-!QgNF3d%YKPgHf@GF03_m?Mhxm+F;JGw}hF02EzW zo;pN7Lt^OG4T*TN-cWGVe3-mkm!jE|C5ns}1)pxbwXlLftFj&5BePh&Th-_g*f&69 zKwZ)aeATENYpWkdQ>7c@<2lez-Y~=vh-k+tJhl&AhQ?k*wdU|-R?NNACU+-<2TU!U z5W_)RIo1Bd{cYQ=x8O&=z)C*K z>|$yrztNBeL8z_;tYk=1=70jOQvA{q>14r1)wansb(Sn%Vgk+zu}u&>W!eV&sAn!M z+@`CF5riVJW2DJ#S`%@El~h$l$BuWOU#0-Gc45C=Ck-~$pthy4{vu4NXH=@Wfd1*T zK0=Mx2BZfPq*cNDj2_9EE3r^GZrmoW?};Br?EXgIxBut=e%oFKk*{ff>keq5>g8vO zv`p?vx}a(!QerMmJh+mhU$J40kiFAt%MDy!{gnG&YZJS0x2|aJ+g&_)pN%^=H2-*r zgz7RKIsA?{<}$lTzprZ1Ndoh><@%`#(+Sjxzt=NV9z@RF+>53gA&Z6jl-}=)kU6GJ zF6?g170q!ArK0*vXL#Id$#rj!95)NnGI=SI7}Yd+icqex***;z=R`i5TvyB|>=Vlz zC^}86?eiDhn8Zx&cf;es3kjL3@a*qulGfwOM_SzV?}o!;e;yENnr^>TGqVGjITh@r z?+&Hj#4Gd!+Q?%DFwe&TLgSylE`jv9ck%e^hTyILaXuI%*H1O+fy+6COOl+O*KAmkHI9YmBOUI(!zQp`Pv9OpMyfJI0Sbhxob5(pY)yN$mBYGW{ zD$cF1JyL=0Hd9oZ+}Ffe&h;{Zkq(l`DJoDW1@R(9N!bX0q`HOfk=)~Jyp<<1UEbJq zdFov9ocrTT9=ezx?r59u^Po580xLWQK6szkyl@aaYD`%3t1>us1LU&g(&(m~I6Nli!DuiXcvnin$r?hK zu(P}sMFaj=FPY@^WVL8o*+<0T3p<X19CfB{xBZmijI1R}WKzz$RC|^v3%gaPo5K5zLSg8e8a!O2 z-%1feAq2>hHg)dA?!Eh-xU&86c{dljcCFthDEyYZnb)qFS4H+v(rMIKBn@tm6>j8B zAZggMy3{tOrViKkzVtcHL$LKStuHJjXk19Fqfx!cUTMG>JG_G54Q+E~&b_g;OyuyQ zH#v5tn;KZnzfv$9)Nj4lxuu{bXBTK(>urE+6jV_(4JtIm$n)LG=u7{ZAo5_`+7D?{ zfHpiW+&h6GY##E!cK5BIA1~;F^;{g!$E%H#5-}Xy^^}{2fg2->m0c9c_|6rz(=B)I zi&ffbk^H8AmJ57<58{I9-_uo5NL-d+`VcEljyGEw1fnc|Vj6uN<%=X; z0Mg)f*ivf?#_DC#Wk8ga59cUpnQ?6zURW<)zVZ9!%+%K#-kg*Wb$-W7U83ObvaY4z ztrk9jm6fyPi6srMC28Q^Dl;3Uw{A)yn!Y|QiA7h&XWuwKeH;_|0eR^&DKruIsRmtUrcMWO)NzD`DLe#S}-ETIZV4 zmes*DT@|f=fQAvvthxAV@JN9{AwvTT@1^k4n0{Nv;ZuBt%nNxyn#3sQJ{kiv;OXO1jyEPe^wWmg=J5a+zqyO(LLf*)z7eznd& zvB!d0`?T1o5l=`VUqq*$E0z1xW&VAYDh;tifB!%jElNEMyp|a7&{pGgqp##m=+q8o-j*tK^R>&F<+jgZc~K(_GgeSxJoUE5gq`zf@JfE zm3g$1v72gki_+jmV*%d;F4)w^9q94{KXjHb5D$}G|jAh5#D%9_s zcz083Rd8S4&_PNJdCn^p zKm){IYsy@FtcVJ~W1^~5Tj)u+kW8a1iRzsPGvm&!xn7AJCkd{Q0b{IF2)n<4n0@D& zgAF4?l-ROe_fL)wg>le7KN{Wr^fGV47UNSo&rehT8JxqASL~E0!afVx&8W-*9U@)Z z3>)oAY2nuk#Kl)~5XFq3HDGcv0YXypG5~M7bI9;f3f#~#N&tbS(YM)KTet}MBj;_k zi`YbXbGu>N7NZLB_S4#{K_;~-#Z5W&<}f#I*(vkmWxIOm+7-90ePf?y8G#s`PEb@= zw9`XyU=ca+SVwwm0?{CS=V zdh8;3136)CuR)kyXP9~>8VtQ#OTBpd{NVEHC9}$ghtx0>yc^pHyHc&!nt&Z1+aXg3 z?iY=TT`6s%@kZTpU;#f&Y57yA0NTBvLE%#uz^ANNPScNixNs- zYJ%;KN&bPJD88@8ji*RxO9CmhFd(KyK2aCLE+Q7|l(KSkVK(%e2lOi&6z&GvL|hs) z;J<)Z@#*0BWOQ~k9GwjJyAu8iUd3OIZh!cpxE*{koPRg1|MKF8M^9Iqt`5)Om z+PPX6k$F`m_oQ<|DYE;-qR}>7uobh?O>!$Z@Jy{?#waQD{K3^+B?#O!^tpMRnhFCU%eK)=$RdkV%KCT`gLVi(>kwKjUP@crrL0C z*%d#f_Vx_Ufl9!ks<@Dx7oY@Wsh;j8E?>5ai}9w-P3)YiQnx)5L+dHw$-hCf8IJDW zW5#_g4;B2CjGm>R!Vl;r@jeLPYWhxrz@|w=?jfYfIkP+ZW?rj=YWUhV7kjNOW>93n zyZipM?#X%)A2L!ynr~w1y{(DWwbj#t71M(N0LD2BL-avM zXI71-%*e%PGPhFN_AA@6b$<2wc|i8hwS6mt*&V?BF44VU3L=-;HxmdgDbjoqViMdK z_z`2@D|i~SjKz&@hjrezX->EEby^1^uru17>QCVdweE58x>W|4##s;IU^$X?B9kgq z=k;7cS=cfQi&!*iFt@E*Uo;9N(kz*~3G<;a6KQR|HZ!r`)C~F;SUI1apC6{_;CwR9 z+~HvQcWD(Ko*tc_9}S1cdy}T)v(e!6le7xIJf6DQ*MGSjEQfzAH$NP`bMF>EcByZ} z(OsT7zmkdbo0StF@mJNY@ZMC;@Az&c@#A#!u_)p;w$%|V@!c8ke?eE~k9TCg?hl9b zRU96l1?F3ZbSQPHN=wnt#r)sjZe`J77rd(edCj#UeqYOKo=P z##n}=u=UK5EpJ?dRe5_w%`E%=p~m$}M3b_}02j3Xh}Vvyoi?A#S*oIo<_!n8IH4m; zmAOy7+T^k-XHvpgnhyN$hNlBBz!xM)Gw0RIOzwd%pZg#f7^D>inA6_zg;$MYHNCiwNC5fb0K6onxNmUqtkM)) zUY1(KUD-1m;VF#l4SZO8h5c4)vN?$wcgo^B{3$R6!9x zGCl+o_sZ7#=#b6TQUwR>_ z+g31O1h7< z+5#fsc&+5gJ;5;hKBb`sJxUFgzHnGwumK~0z?B&1X?MNz!o};$kFCzj{o^9bQ3|wD zfsOB;rF?-oUroJ3t22TtTX}}S!IN)aT^O*1OTE5T6cIIvS|py!SF1*wJawtHC8bo4rLC5qzk|3FCt?REYeN?q;%YRcoc#Qo*OO zUkuFIcVsXwwfK$%*dBr8@FEo;=Y{GZ6JT-q?BdnM{a!L8d6Z2)C-8F1&s`Qt>%WPt zqa+STiIT8FUn)0zJPyVbd~UtjT5WB6E?~X$$Q)Jl0Fk-M zeM;;K-+RpY$y9(7nD z2V=qnZCa~|s!XnllP*HuBxgaMI;~x5Tyg#2y^9xD5Gv|-ye&iJM(;(Stu70d8arV;VNn;#MPGgOFX2&!`fN-`;x{nLQY*#O|b;r)G zTWqrrO%u2C4ABHe2f#c6SLE_Z8mmzj@-||L9gGt5zvN=!>Kw~o2)}&=QiXy++$ht- zuDr?}DOMk4(B{aqp0(vcff4{{t94&u!OVlLL#5(Eem5e=JyZ;J0AxU$zjf#a@85(% z+ihd`qFPq$;`MUUR#dzkgcHOo zISmn^3T;ysETSah9N~8Oah`z=Mw2UL>;e^CS7CGpc^)!O;c2hRSquqFlIJ(>^HEg zg@b7A)42<;s!`;yKv$_Ay~>0Rk+k$=qwMM22_oMRCOyJqfxr`Sk|Li8{HK!7+T@XD z!;L^&t4ua3vNh#%^eL&E)PU=7mv5r^-q3UxOfiA9l;%7cYwoy7zMSizqZu_`6`-uA z-caM6anDtGk?C0g6Dz1T3>QbefA1vMvDLs&-)mBZKa9IaPATm1WvwqX$wnBqWNYS}j(L_W6 zWqTno(l9_oPhvZQs0)VR=H8{4hCR=3u`O%Aw6SUZ$PR-{Rk4ri9WCM?qhYUm?x*yoPF-mm)}Ft;TIeqR`bE?MS7iNwRdn zT%Ik;m*-3QLb+IX(6wHqsh?bfBtV&i@FoJOp`;z85$U|ok2O*};3dFZwiltHGdq(- zlu*)OruJzbm%RX{!PWe^q|kH82W)M63eF{~Y@Ro*qAjSbYlA3k=FBSD_^7$efrdJCm+R!F8YmiXe_JS%A+*VmhlDZtht$}rn=^iSS!tfY6O_iajD43vkg}6vI5=B=SrQ~Q9O@&^3 zW8DE#f)t0|%i>J9QHuIH0QDuUyL-v19Oo<^EmC^!NqI$z;9E00^$rPJ=YJ2tv?=*i zpK}Xa$vf_xa3i__uio55aFIYj*x@E9vDp(C_M$DjAj{wGta*NNbaHZjHn@YI@*A8r z+gWz~$HRR1#pC6Z7f0`oe=IJ$eXi5P|B8LC(?j3qdgc9*c1iE#OImj+G#j=>NYSFI zYF9XyTtlG!R2mY-rK=BKqhOz$I}=56_LkJC{KNf&uW7toHfmf%T5 z9Ti6Psrbq?EDBw|{O0O0joXIjp^AhY+(p?(A$ExkB*jQ2kK`H%d{=eR&`Oiu67|%s zU5P?L@;HBtQOYM(57O`+ym{-A*VRmX5?NX3{ONJJksVW|ZM^@?FPsM~)IIAboL%e4 zuxY;>fXG0t541AqbrV>u_5a+FSrmGM7g6XSQdPWd36P}eu`Ey~M}BSJ5QL)QEt@v2 zb^Sn~a-59arXo`*Rk=E*fg%rg-cKH*1nwEMZwUFiq%;N|MYa1ks@*@rF1e-`pB&%0 zS925JFOGm8jZMraLL|kGDGrZkC!dLtSeX?h2l4JAfr*|VCWphm^iI55%+}}nN^Ref zVDP8$_1qN;k@{U$paf0bA~l@zKJB1zqRX4e)*H6R$+)i4O#3F2ii!j>rA3(I@N`?4 zL-9$V;WySzi`39Iy-?jYz+^8jAKA3S^q2C3*Z2~`axcgu1ddS8k_>X;YGQbKX4ma> zn&$1?KZd^*g#c~@A=N|&()R9fw!3U3DO#1-^_P;;aU4EMS>z99{%EbIAtvpS$Mag# z1VmoRcqnEMi1Z}VK2k=X)>?+ge+XUQAkvWv*p>6fw-5w+G=D zlL(d&LRRhxcGdu}gpO!TN~CqQnALn>6VtUrTPsp%xd=T7U-CJOQL)2glY(GeGSB;T z2jCXKSa{Mn9H}6MjBDPIj8OV=7T@9Cup^_$uo?*N{?5A*ue$@wHs^KQp7ZL@aMXAu z4dLY8<&)>nUIpn3YJl$_OHtUgA~vzxHrp|e3NttGVix}Nuhdq%4Uit&s?Jv+T`kcp z?ddbBp@<2}s45$u{CxD;j#^R^m6wGMj42fgK4o$u@p$4be|g6+sKA4YlCJh(v4zB+ zj`StOMKQIXb7~+#^n%KSMEW10?ZaH1uiV7}q@Jlxf*Mb2m14C>Mc#@rIjrVbCXaPH zDpB|?CUkb0&4G*-oGet50GHGvHh%0YD}ONHaU}y}pu|JIt&ASQ|J45TJbH0KvosZ* zIx&%#e?2%b{-jVVZ9TApuSoAp=kQdGb+Z=Q>lb`?BU!#rz z85JkTavz1%M=D-(H*n)$gN`3lRJ1mzqi;yry;10eZcsr6#%_3;*6KDxfm_y|MKQ9K z?Js)iBB-4#N1k)cT_YALftV_uH~_U;X6q zj)+*Zs&DgKPhN08Pk!cQZVJcirf+co5r)_=8E1*fe!tAZ z&O|BEcc?mqpKC>;dC9|=4_aha8kUG!m3S^eWLxUTiNWQ!n-ud&RY*W;?HXC8Y11x* zUDHjAu^kpwiP|rpd`2kvYU$+_oAmZ}6P7wqc;4<)L#9qW5g`a_cXp1Mq>Q-kDvE zr5#2jTeQMzV8SV>OYN^}LR^SSHGq^Qv33Hn#6l+MqpE4EGI^BN9XM+=LC5O4q3TPl z_3cU2?l|}Mc7f|yxC>cUO?s==SRzTcb?eykU)mb z9K3#aa@Ze?f^zm#k1|vDx@PGFiu(!Av*&fmJ0eN)oxQi;jr!25EH%v5!q)rHE8NE6 z(MAW0Xe{#imacjDz)rXI&N>Y-pWJ&uc~<0_G{qG_7FqAw4zr$D3;!hzwMCW9Oxj6q z(~bxJSDRfF*9W>KOnaLT6+u6&yz|2O3Yo)+v^B1MhXa051YVZpaQlfHk0m1 zAAkU|Eocz*3k=s9OnmP26x<_ffa_oPhokfJXXj%7LH^X;x(HuX96O2-3#CBXPit%<-Le48tJn%7OMhfunoO;-&p zN_L6S*1T>1yE?mfX! zPr+yatodoo-g9IwC%7YKJl0eWcADN%h)Co(QIg`@f(+S;;0yWsMy&ACLgb#cj;!Y| zaa{=&tEuu6B3n^mxX3nsT@?az!*ksEoRaOE&Z=0gh|I7fOs(>|)%fpm^^V=!Hn;|= zBUbGQ)0R@NY4K>qk{}Jqk=JQ)BN1aq{6y8WZ{3#0Mf6+R`x1({=$8RDm`5LJ+S-+~ zb}n@L-Gys+7{vACa|22OH5Aa|nb8Zk*7Mx2LTY9n8n>mEyw~=Kb(5l+K#@yIqH^|= z!~n-IK%%@{?A>-qS~STUz_VNyMe6-5r+`E5=!9;&d+(}mo_)-P~aA8kT7COY75AG14D zwbQ&HxYJvyM0PPW4+(vms-CG&{$%cpHzVpO zog$~z?UeDMiiRv>(aR{lAvIGG@-*5BDYa2O6A z*Cq|_^L|k|^LR@r5F9M%b;)xyk<6uC8?PrvV_%7uBOC#WR>hs@Bq0X zJzWY%d&RX^_%Cd|HO0tL5i{(d8agJabV|j_L39erDw0(VO}id{-}Lyl^w2{!iq>38 z5?8#p=mAKfwFZxcQH_bV7l~9^nUWq^oGAiP+@m=+PgiA-VoYXpp2&dvD~bc6F!4vo zcDGSOgT|+=7k)#Y>4nFw;6kB!_{Qa;0{3J=>9o5NB|%+fw)<>bi2{rnqHb92A5t_& z_H*ye%U2ioB}Cyr)%Qg0K&T%gR!~eKZI#Q1I)11W5A_dd?GVwfxl>g6O;yQusqjwe z-iD5MLlC7bSScMP3j~tbVurJ0j=>b-OfW3*PB45hY0n#sOV>^*Iv4A7^ALNvuVNCR z3Pl@jz+f6azEtC~Nt!tgOR>6pR6LYgZY0~jv@vI_)yIMRXvvjC0SN_A`g~K)Qswv&N=})S~1N_GWIOQBjkMx11v=1T>>w``T`?f^JXxA%?d_L({_3S}a z)em@)2aA+H``c+J4+g{G;PhxX8vJJ3$(Kuaa(eUb>DBU2-&VKhkBh_ak2}n#<2%7< zm-8AZQeyjG0DsuF>8B|IK1R5f)9{xLQ`^qQ&sJ7ZU3~Ch{KUx8&(n3&>l}`Ghk7P1 zq$iwQri*c%XK<#z`u!pj(C>;jA4dSNP)kj_77Zl0i=gUcPE`7BWmgMu5T`fT>=j;N zU417a@0^XcNEK;TE!#VO+gSJkd5t=B6B%Qg=(A{?cX+J0!Y!nt?_o$r3OB?QlZ%QOwr)k={hBLo(m5w5|5k&HHE2HFjth@=0Pu&-PR52$_roU~}@E#H19%{VU zYu=WAf7wb4PL7VUBbQCnG&`G4&L*F%3VeEUI2arr4+n!CRp8EFqIBSn9eRHz@c2c2 zyZWKpy!h(%H-Ef(_UF;n>B$x@{rKeHsf->;4V`S)(ZMo#Qe+(CUn~>+3DtB>eKV`3 zr|sR8VD3cN z77w>Z&Ee;t{-z%$@+*lu5+9aaZet^7(OMAw)1QC(x3?__1;fFEYuH4^O@UWx%b`L! z*DA|WX2~N#>%BBYAzu4;)e1=Z4B*Osxbo5YF|Qoj4FPs94%Av|{eA_9$ij@>{poGB z#Bel55;8zy_=U5<2)}SR^uKVmF#X*x^rFcZI?}{2KSUBO_qBF zDzmQ}o-r1b$?)9gtKcylAXXeuJBis)noRRs$A3kUEU&aTUn509rnF#3M(6~t^xzzS z10nM*)KviBuVO0eHRTCy!^L1l(~ddqvaZkvSNG*q){AjDwths7)rd|J^gp4?f>!GA zA63R#-e6m_WLoV3sNTzXCkW$%I37Sab~$1(~7B>ik$Nx1T1*% zUt7mLZ_mv{W`!Y;E02UTq7*HH0FEb|#Ab(u>esTzB4i06=}g-gb4Mjqygjjm@utRc z0K;}j$L_Gl1BdO!Rch8Y(W&ky7u#y_g5!lUz36=e+3892oI#DR*YPO#i!oLb4l>Su z9mdw8>OOBXj0dktN4C(oC#v5ZRk`0gA);cAwtdL7bEbZ2nmNW?6Ck%QJKFJUF4{3t z^G36^m$Yb<26SPhQBkK-_C;u1uAne3-Oo=esJ_n>?zgOLo}3?_9v>Z#2FEA+6`p>L z%I4L{`Y+%8@Tb$)&tB&5rsvb=-!y;h!h#0F(XYp|?N&R*3H=w)Y&*x4x8+sI7K?gs zwiQ4ygCWwg;oxwzSGMUAYw$ow5-t-3&kczaZ_Du}d6gE6G+R^et#dj%C_FcDh;Z67IYK*K*fY;8MPa~6ECN|geeWFm4SMiqU5sjgQBUw?Tb|lsjooa0N zdl9HcC86i+w;D4gR%=yWVT(kC1u0g@<(KUy(P+k41AE)QH@wf>mb7c&g2em_B{Tb3 zus_6yU1$hBPsQRUhAk7PwOayk?MHm|i$($q)wR%JNvjqWSM#6J(`6Ub}YPlzssL`>g*_cBR` z%u6ju0}MCL@4J7Xl5G5U&j$6S#mwDtt3ltVT9;ct7|_W=MhmTbdpq8twL6OqG0wun z&Pe4=r0_2V|Ed&HjPm2C@Ek=@!yVl^|E5JV1PPW0`CoK^+ebq3>)epIlT6GsGX*Ll zE&BHk?32K=EfDscas;TV=B5jMVm;Q+q{icti5rJ3eY>UiPu5F>%hE%3s zm^V^GCQ7Ao%QP4fz-0u6F946zC!$f-gQ(7~7>%)OuFQ@U|6@|;thd>RIYP$U1r23; z-pcQj@vZSyl=rl0RaSOc>2gXzf)0K~FA>UuBq)*CQ}F3R`Rv}&ec6KEDCnjl#a&u( z#=l^r16*q;p6mXuBW5otY#Lf4c+dPZ0#3AjF65%N-$`edD*|-CB_w&|jZsQYj{8+j zgUXd*WOXttjR3#)^G|>K`KP}DcG~1Wx`S!nHV0`@plTTIyQOJNss!SUEUH%A?y1@q zy+swi!?yH26G6L5oaA@Y1d(@+$D+Fwt)3<_5uylvyDHGB9TSE{K?^_iq)G#wdTca5 zb}0sVliavXSU|W7-b6q74tDSCX!&>Cu@n&uDMOFGmWAXFj6}fwWYYH=nF^ zHkNF6`1pd z0_spF5adDXc{}y3QvpRaH`rdq+`&D>90MWUVasoch-FzvKdWi5gFV1Kuh^Z;TZK{<+qQ z^LBIZ?7m0b1S8@1?PNZ*VDcb*DaIZ;O-Po!W4jN#UgnU*Oj#4np4=XfR=e@4l`TJd zv+R0>{2O90tODc{*3QaUuCk>9o%gW|M`w{PVyq9LuhE(@P9jB>GE7Bglsx3C5Uep8 zEm4)>QUhz|>XA_L67Rg{EkjEDs)pg^onha{1TcIF)yHNHQ#sbJr5`H$5lhaIH>iRI zkX+}OQGUNN)8KpO_mfvPqPMOSA@4Y}EFkR~0f4tnKDa=_pXG2qq1O&e96`Lmhv8b8 z-Lg`WN#*K^6p9tyyhzL3xZ}OB7VZrP_v7|M4vinhiRNXRfyB~M`6DMvjD>vpbskl- zPWM24{L;b%95NOY6oFdRoBqAwP?N-`s{Iq+zAG~ugIFsS89^Lfqy1KnZ`7&jzRzXV zN)Z?q*cke{!a02!=Yo58d8Ej&ip9=a*hO&(-QH)VS@_YJ4p05oN1>0s%u$DY*zNAgF0Dte{L=cE~V@ zgYV6JwC}f5iTMNIxq7XVDt41mG|UnKY9BP*RrNx`4t7==fmU$ zSmie&=kQ8+_y6+yMkmR=(O`IVzyG#Gx#Mb_ z<1CA_^b5DaUUQkY0Nefi)89}fc9JPFb=rWOKZW%T_OVBK>JKWNfOySL8UpOI)pUw| zyO*31VUQ^ECOg$V)9Wo_KV*VkJ)WvrwW zXOm27Qf2vBo@?T!+|W~qvCG-_p{VX<>VFAb0s#7$6kk-Ux)g<2Q)ttIp$MSxaZqeH z8uf>GiqYWy!{mH)FdWE0pWII#*ZEBJ5MNZN!6gnS0Uzr0e)4^hyDUdYealJkyhR>BQAzK}*hE@`Pt5t~;-;;~(rG zd6Ac;YpOPlM;%xD$K=X0Bbj}C)F*q%D0%9}eU)M=(lz;({z8E0<4+F;BmBR4wLXyd zc~GS518$%PE<6F(lbre*EGdh42Nv-jaA?l%0~>}A`>5WeW%3x)_R(&xht+T))Y)3r z0TPv}5dXHMnaK9YSv5RAKfnJl8J(XV9FB(knR8TI(*mpGb&lYlCC~Z@KuwdphH7=$ zv@X|O`wKWkzUn8B(&9%h<=y-Qx5FZa?kZ^^N4iiPQU;|$%0|arvWNE{CP$;QgQLT9 z-WDwb{tg2NuB_>(fzaCq>D{b-vBnAjAzvwr7=YR*8h6$n4X zT%-gV9jav?eg1y(TPYQs9uH2>j*rid4$p^MO~}q)enq8%7q2Goj$ZvKee~7hYUsXB zZ(bgrY>_RF?&wIquEwrR-c)tfY|`@6XchsS4&dyOFZAW&`_vfz6{ki$FLwGx5kQ0p zy8z@xN*@89Ck6B~H0dh5?4^{er7jLe9N-@U_pK^rtut_`T97srf?B#67xW|3X;Rx@ zS+A++8t(Ef>1jXz^jELhE_6h&C^tP)fhlyStlgqo6R1g#L~CShm9d*Sl2$xwnztgV z)WdV)&`&vpaw;4r5N6FvfgJEA5&110TnG$7$&e=>9nmPW<@`IU}-i|v!Rv06XLaCzM%`EzL5NJmsu$!aFQ7AM^j+XFpQA#QD zwXW?YJpvSAM2Py83bOB1_xVoXpF-5`8ZHKETJ&`(I0^)IX|r6h)Dw$Vyn$${RXv}Z zmH@@-c|Z}YDt=-usI4ViX|6_8XU_qQ2|e)YQ|W}G{vP{H=qgA@KFggbP+2?PSOv65 zk&6kXl0_@N4c@ufo30vS+ruIm<7c9UB;6E1Vg0_qi6Fjd)vA>fp^R+PhZJ`BvVfWl zW~BeN6(Wb{hev0F!;^G47@VAp+^0j$j|Zcp!@>FK$?4fnXpH_6g~pxuv_Aq~fAQ_n z)ok>aSC{iIo=nFlf6foLKpCT>yFlju3B=FM(NZS$RheAJ66m;hpbZX#5_*g_z}AR_ zCZD?G@9|$H3>kM$tv>QnAZqV?UT_jRt?8;Q2jX=YA}F z{^^eZhN-N9=!mIME9rr-n1I%ioXOeST8hI2u#FL^YUd6E1QWFNiMqRkr@CPSB6`}+ zp%SI{pu@x(?sk)+|F*nf3oewRps69T#M@#_He9GwXUyrVv#sb{yCR?Es3<^3P6VR0 zh*OzZIxHAmWZw>rD}W_Y3L>97c30T7gJ8c7v>`@2On@zJU?uEcDJTbOqW756)|0&t zyp2-FmBkboK-%~Qbv6OqBt<>}^*0Nnp!FH=-BVyXEL}Qr6p_`}!iTXcR5zah5U$hK z)Bdi2ccVs<_H`iM5UR*Q4NQ)F1XkM!ry3pYdAu#|eovA-?jR>cK6Vm_(o;qN-gbhHLD;Yz|5gB^Ab!+&ex0?7rMVB^-T-5e3Qo*4o&D zIl!T{rl}Yk;;M%&OH1+a=(XkPtgM>6c>t6f|BKmfu5MI4|JG2RUlnbr#6-~e*weQc z5vg~r2V+dLN^NnpAL#Zl*^nn#=cc#C1OK#B4O!=HsZ2)?H(t6jEj-9pim|x+Sk7xF zSV&>AJzuK)d(G`RJ$3>r<6)fm^&05~WkD)XN9Y|xqo02ndb;V zQ!U3c?O^*RZ0k5Ua@7}9A<}i}9mA|ss5}!NZMjQBf?IDUX>=^pkQ2ShrApX>f`MvF zsZmc2Mn}{If73}s?DQ3mSwOOrm#!5QPh90uHAEm!q|<8{5h~JSm$rI@e+(XAE5%a1OsUI6=z4&mNoO_I zJR!P?oEBM+IQeil@6)JO`|M4tQYgL1nP51GweBO!gU9{LzUr}xqKt@8Y0zQ{*eAzs zJJe~|w9F$fyNU3@$0fqO$TBXnQqDtzg~jVAPm!77gO53k^xu|BcJ_b@CGyLX;mvk3 z%I!6&s5_xLyD~#zlSvvA2sQSA7a(c}R0z*!W#cK>c^#!L$dsm(^6dut=)*ftAmx>1 zUgzzK8wB@*%EaCE`0{=L_y^tWJ|f}QJpVt;UF>u)JR2Mxo{UaT?sgaZb;VHM+>B2S zzFoSP!?VM8=T8p?`Q+6{>ba<6{HN6xe{J=a4juam#OlVbohQ#w!f!Rd2x2a;iVgR$ zescBmPyhOVrkYFd-%rlvZF%VrYH8Q%Gq4?g?~exqVq73DaTs`z3zETzSWde@bLfkMQur2F#UTK?kG1Tc0NEA}y2pIZTTa(p-$ z9}m;%*~w`(Ob3657RKmoa6CL24UR|KS{U(PqQDxWn+48kS~OAQ{Px9*!}IF9AFA3N z|F}51I6OO=bt32C>0Qm4kCMOma4h}SW#x{Jw9>009qH$8oqHAO&#OAKGs%a=FP<20 zQp5>9pnSoQx=;GzqlKhdyfXsh;ba z*3i^JY2meDc&__LgYyT^`lq9lSl}Tt)s7Vx^b(4->Ub2h>mU;CcZxt$?Rat{5PB^~ zshM4_Qty>Dc0E%zHjGZa$c9+$hMmYbs%fJA^ymUor*}$(|L~mDrAyye8Nm@^w z(=u^=2#tM0+f-RVlhF28Z~qSgSz5Mr zO1f?L8pKUmJU>uuF`-{!!uHSZ3a6`VaU|ok@Y+W&CB5e3q4&2eAH1 zjnaCd(osS!OLG;w-sFzFi%p~@tE0X!uAGiH1ul|iQq^p8DFq)!1*vZfFk{3&V@&Io zo=&KyOT$mz_NDA&VpJity5NMv&_^>I;54eW2C{sy$fZE;S8_P2$$6@UDroTY=uW8~ zjzde=u0$Thy~`WT3l(*OJF>BjOvc$5#~~J{YL41JQ+ob9& z>$Kx#Z|5L9%dT*%##}EW5&0 zyx0;f;reAYJx(G$$uzX*>T0|q8$lkSr=*D}-coTIOIbsS$@q?~xv`0#8&p2O4eSe> zf(y}0-;^Tkkk>j!cs7{{u^a;bp_Aw&pCpNp{DxYuC!_PzqtnCT==fwOp^g6Xixd&Q zd;M%a8vJncbn?aGoAHy`uz554$lAaQSL98TCeQOv#2)>I>aNi}ZIuOZt=HAN@v6o= z%V+a(RnGz5!1h3Jv$B4kbEfsk?Pctvi4;BRA0kBS+iO^Yz?6gyKP6_UmP0$s4QuDs_u-MenzWX%!bn!jCiC>xycB}p!_u`PFanW2 z=p)0D*eQ1%Zz+?Tu7k3DsA^~y?^%`VJYcLwD9A<#k&t1tlZJhrU9+n0N*vEPy zH>7DqPo3FPQ`{p=0&1{c$u(3|Sn7`UQ*7j#VfTFgVf|b2B8{#xuOLx`Dmm{q_i}%2 zwe*u6_rl-%ABO|qmeoIURVa;!Ci2d*_sScb;4=r!vJiubegZ`}-nQxp#jCEW{h)Km z9&5sxoQn2@Gvr(1-lYqvCGkh$I=HHRKveTtw3?UnWe7AQq;ioY?%D+>VQC=?ii4U+ zV%>xnd&T~{j<8VT-%S8KFN54eB+4KzFv7XbiHqJ?m8r)Y?Z9Z1BWUJ8R(#qwdF2-O z{h{G36#ZLOk(9$j-3R*XUSTq;G#AOeM-h;mu3(GVG+fd~qn{PXm@Q(#XvaZ! zwdTKj*)aLEx?!}9TLA4PFD`a+t<&r%J3l{4r$aXy9glZ%t&b7V9i5*Y9UTtNwo#3p zzeG7!H|^P|EncS!cknpfNW&?4jkVXxJ9=9_@}@E$ zOwqJRsXmUqGfcg{!V9d!`uE&k6|Q-a z!FS9a$HO;(Kmlt@_UtEqon8789DmqLU@y}NTM<`U2t}h2vn^fA!JSy3&ae29!N9_K zMynL0z57&&jwE`tXV?_YP@fiVCxiXBhB8kfob_ zcbhly9c}5Eh!$^ShjBVe2CuU&Iz~5UIA*m<6crH)(`MDIyE98Kx9}$8N?@OG-M?&th}I5 znZ%rEQx9_wlTO0iI>=HcMKvP}Ux0R^03t;_D)FYx#^#$|eemLU)&%OWjH z9x{y3y`wS7d{{JK#Ys##B20zLbmr9m5GR63%j21NsMRiA@U=uCZ@dwgF$)N{Rk2za z(L{=HK%3C%stI_=$m_SCT*$d;qMVgrq~ImKy0UU&S-3SF=W4tg`Tm45RE=ZYQ(5H5 zcgXc<@LFVg6q}E4CLIrs5!=Y9Z;4e66a%zN_wLtEKVnbX$&99>Y;-ml3`eJD>G{d& z-^2Gf8yt;JPX_0MZJbKyFHvT+FLk*iKWf`QP4Z3tW;wh4^V9nD%YzqBJCu);UuG-t z5qZ+Ct-$c)H*2dV|2_SAlTU4>4j(-0pBx{@?NHOa>?;4KU9ZnoUFVZkv0AVw7j>$x z`-evZUi4(I)Vh_CH-ZS_Da$MI64=Oo0uOmw)kxB|O(!=}q0nNjlOu|&Z{^CAck){7 zt#Q$+DeQAqA`=Gmt}rpafOJ`dFuP8hx!2NUd#^T|HZOQ-&8xLgvh_32M>~xNih|sH()P?{Q zOkUP#DU%X{-k<1CEz`Ent2Vv_>D|(-)slV3m(p5%5fM=`ML)dM2TDt_EV4u+nHVLu z9+181UbS(~B*nElwk4S^5_VA60L`(55bkbAgbdNp0_yHCz5}845m6-c-msl{-lK@l z0aU*My$sV_s$wLYN~33i#E88UfstyTJFKaF0&AXqAhvzz!$B8-9UzisOva!2>tv4F zgTnGVvoKcFMghcgbmpr?T54NPdF;@Vf%tBbx7g@c*q76~?OX#%dA>wCz$8FtHeV21 zRPj5Jr1lT~ga%zRS_RBqokOm(Ckhb@{RLrISaN*FlQP z+6p?YN0&&cBrogSP|dEcA&`L2@&F_d1q`4dDkO0Dk<{B^Ugm;Q0^5&3I3uso%3QN| zacH9wd+!c;BPjgo z9{3olW3B0!J(2NB^)9ZVAe!NS`F)Xd^0E{4l|xBF3<(Hn5k8+ht<#0W^z%NUGJ8R~ zR(h@-B!Q?iFj3}WxkN&yN9uBjq_2((*DQXy{O}l4wZfl9YTM9yZ&snMbp-S zS+wsNc{-o6n}L?4nukX&)LhSf@+el z0~^<>nOBn=AL?FQ(5}wSbCE3CbkA9NX&E_ABU?ce;1-@R5XO<;QL-s*C-Y>rRA1Jd zM<_X^ic@sd)0edBS8)pc4STr9XM+VowLRYj31fx%E%W38BJzNHVi>ruU^%AAMzYD^h~o=SvSz)pm4V^?5I zgbWy2R9suCWQOLK*nUaV5$Y|)w3|Q|YTxGzn)Rv?qvsuuX_e0t*tVANg%l}@b3iD; zv9VDVN&|NIq<&~ZCi z#p)6tL^Ya{cD{z+is3SY)}(Uunxw6b2N=x@DFUw*VW@VETDj7UK`rZrD~>&da?B9+ zZ}VxPwKb9Zw4P+G&>U>r#C%TXP7?g^YC+n;m(=*}y@ijiF~McLM(L#z&Vi{KXU8m@ zt)M#|kJ9Pc*=TZhcyyW`9)EJl;^cgAcy@X+Iy^huR_{@2&FScH&px!Cw=ZvxMuWv44{!eX?N&GE{H|(+h8{9u~NaqnGixFOE9DgtEG}A#LT8y zRyUo`WDc`KwIam|P|ZqV{g~4B=*eP{!t|nC@aX$d4IN}IwTkR$AtgC^Fgz8bqmP znW%@4um-cyTB{xoQXhSur{!#gHKyB(_%MwLdX%1mXnWEX#G~H3_54UA$V&6w+dpWQ z>ej1((|F7$l(UUv6Lz4eE^BS2Rz&LCBpB;9qOnxY;0$L8LDa^sYSGKh%!k-M<6i-X zD>F%;{!X%XGIodQ}dh)`sW9)8XOq@c4W?S&RP?Cu?`C@BM*fbvoRP zFCJIb$+Va+PhNk2dV1O^dmfI??}{Y9*na4jE8PgHeyei|>7mzdwqi!LAycyX7;~(H5}spByGu$n`XwimeKAf$u@4kry||~#zerscTkTGEHm+!$V-!W zFtwQg&5Y!-i74_okgmszPRiJ@LLTRUxpKH&^-Ek9N?ZXXE|$3;8@zLz^U<5s#}z%? z-0Ut%f#ah3wkl;2L+~%A6>-Q}V&(G%v=tASw@$hid3hiMv3=KXgvzj#nOGR510#36 z$^bJKT`mRO^*o9mbMMOon6A3yYdl?I zM(u>%BAGe>w-JCqducoV`dbj&9pWnep=Gl9`KP~nBP#aB7qPn-JNg3jWLaK2`C%Ht zE#l$ffcKZIox4d&>=JT(-WdeEZ4sOhyhX+VFpul~t7CU*u)|dp+v6ty7+JY`-9OGq$y_z19pbf66;vOHpAO$HU2_!~lr3-ZI&xX4w> z*vGM3F`h7Eo0;O5HCQxDt;5U#2*zs&D0Dhg%51*yx3snMc9TxB^AhyBoV-bSyPPpg ztJp3o1*Ln=c7#&T464J|-^1++{-c^s6DjV($|NU}+s;rPF@YO<0GVNf0>-j*9C2iS@`=jAO|+&G74$!EgSgq(u~ zPeF?1t@}fg{QT4Z7g#N6Bf0sm6R3)b?FRoSquAml_WNo@=h+2B*_N533o^^fANfPQ zC~}AmfEFLNlbY>YAd3v|l2kLiXR!&a6!9!Vd*nCZH3#AGnCXw|db5Nyd(%^xk&Yt( zJYhBM+>M{aI(=~JTBn=%ImL{mRm3jP{L8%5&8UC%n$rc~{j{j6`Yw5buCR+43F!IZTUHCdr9cFQ*c>2pL4Chi-!4)rh_9CidUATO zTEeuXfvEW4!QkuxFLLm$JK#n7{be@oCCRdX{AZ`OXhHzJt;Xi>&>xCF>XUSExWZ$^SysV09wh?68 z70yJZljw4}0m4VIddc=#_VnlhnyLGbvs0x@i@IDOd}3v*KkOneXL72=a(RmPK55>6 zrbP+6*d)WlU!?5%A&n&sOD3bzb=2K=;PE37pLw)v8DodyL6M()&(I)x*mzn&2$6d& z*O9;wjx&+1Zqqm%3#5UmhkcU5kto!;sM83%!U+`9Ty^#KR%YV!zS~njA#qKS9;aX= zNgAm;<^G->&@A!N95J-KWaPKsAW~}k1-D2DvaHGv-Ik8LiUA6aO7^dv+(B<4YV&|J zTeyq>=iVKAeBbM>m+%m-mv!ElfEaIxl3;2LhLK5^IgHep$>-(l5BdQUf#*<3kwSz> zZIVoh+J}9o!`|gHsZ{Fnzj`!jx;k zOI*&y-hr8$fMOQQRZ!=A^NqMXC)3*68|LyX&QvUD^yxSVS4nJNJ#38&J6y>qH0!*b zm~a~Gz077)_uGj*QmR1O=*fEu&bW0b95CRRsJZH{Wp%YQx82N52*Ra>3NPvkr<8fS z2BZg5%G*nsrc6sFCc*vDSF_$T6@UKeujFfOeNIQZkpmC(LIim;G1)^@d+e`%h2-V5 zPJcFY!1AsR@dh@l%4#5A^q2}=(C0?VjxtR*`0SQ zMeXgoMU)ShD;`Fc1#tLeXtE`vKPt;pHyypE)wAYAK5*h{Ll|=r)X&o8%qQ`v&AwkR zx$l^7c4Hru>+XGZec4NVQXDaHyk5Trpg1ht`DQh(-h}9*$@7+T*KUOo_aVR&m)5B| zg~`XlIY68p%S|UaMb&_W%n#k0AoA1^5$74dkw_31d$W)yD4#YQ`TKidqyT(CgTEj8 zQBF|-R5|OR;Af{*k)xuKK&+IB_tKA`;qyxCFc%ior7aFzs#pxxRhpsmqOD*xcn_iE z0MgMte*ZwGvCBGJ2jTU3=Bk6LJkW?~cY?(f=SLb%#7%muuB?v@(5n^8@nBj;(Z6aI zCt<#p3@v5D@>WfyHrB=W*~r$3{jag<@Vcst?B}2U>RbPtZ83_p4B6cTdcG4q3}Cv& zK(-ukGO5l9C4}ZU{p69MGTJ)5b%iN+aE|K*B>@eSNoIsU1&Vfht@f#U)1ti^*33a+7;k7=2#iK_BMxw$rPqw8^}W4(r39hwV~{=U_% zl#LYKT0DVF8lDebVTeYocM;)48x76Atk*@iT9goRfcE<|cO{T0Oo$Nzz=JLs9faC%yaFbj>Gt z9d!nal|o4BioZl*np>4A%OiK|CwJV%M?`BMLTsPwX^@F9tGL%U0F7%WidB*|1LO(- z-0loBL~dCk&rvH>A|UX%DQc)O*jbnop@vAyre}`pKeS5dUOe zmX$IPw7X&rG3#rLCA&MYsylZI-sf&}a_7c-TQ5%DD%e~WlL90edR6 z8>ABcfwT}sFUmD*Qh4VXDGH}jXzC^@pZdeP=(5$sY&dUFiO*PPyG`@LQbjD`rjv-0 zIkM-_6+jMsJE{j61uS40$t zT!8NDBg9dR$|hEqwXM|NfC>Ucw%b=xgG}0CI+|Ymy<$zD8VnNFo0g7x+ygdC1rT|9 zg-n5?0h&wp&`3F8wl$fn(Ar<~(o2MUmA`K4BwvE#Llv_zJzjB&EG9N6_L8<8z)QbV zmJyY*U`L&L*Xj3n+Id=)*_)dKKqv85R9!qB{+`*(?bN&B#tI)>U_|SwOHUID?NO=T zZ$i+bV75#^r6lwEwsk~UIZzwPwn|>>7X*PRHtW1UW|v-KWY{}9JKK4`(jpuUhG(ij zrUWM@oILOo8zwz>13V~b41ym5IrmRY%?pmMPs4O^^MjyCHxc$e*D8Txe^qXcCj*;l zaqyBR*{231Ceh7%W8khZRIJ%aZeVSs_2^V1;_QAElQpLqY}4rPghkDic4E>>QFn%% zvsWoWzKj(jm=b&&B2$l;ON%NO_UDpUV`gOEdIB z7)5A!h9p5l3)AZ^M%$o{EP7qOC-Kdjkn%8%2lY(D38ZN%dJL}G!2TCoahI&bXxr++ zJ~&%pSXy4%59#$8<=#E&-j@5nE*UY8)r9G|4sz4lOI+O=1>)Ly> zay5<+QKBltWUA*mj_z$YzOX(n=l7hI5M6{;iYkg+7G-(snl^5xhst;ax0(Qu`K_3x z{RjCejLuHZPDdw)=g0p(ehSYI4xhdmJ^IUORZYiv{xW~<-hI`9aSl(;@1n0?S4I9f zWfLMSkSFCVoe6N^bMO;C4aE7ivfn~OEbl1%#JJ|CwR0JsIfw`B>>qE-Yu`{CZ$Rm3 zL4$<;j(DUzcFn|RG61$H^WC)5h8CNy&JBpEuJkRA5sH$bqZcTBt z$i#BYAP4xp;URX`;Sv5XzBW7t2XW!bY+-dDeC+FzrJrlz?!;zy{p7_)9(?AM@74VO z?7iuZ8&|e9_$qM=rV;dsus|E`{W3Bdyehp44mi4|e|c#655D zU>-Z6_7ha(GZq@CC_P&OACQO6+*g)4FXX%F4m`?hoTyFv+#`txcda~fo^sB ziRfC^zIDEZqN~UVtv-;lZNww?5OtB{8NVdH9mw2gF#VDvpdZqZD#))heX!($e$9X+ zO{2+Z_~HG3jwUC=geTP2m6LKt@k41yzb-{pBe^zLu57qP10k*ZXzF}NEqRde+*R)B z<0Hl@_|;^{|J*eO@r!q9rIN=Lh3qvB-*k{C07|5t*94u$BI-bUC1Y|gt5th#hap4{n7DFqb}*b9rL?Ypzlm; zaxm;49DUJI7W`{1^yU%gIh5ZY&q-f+Zi>G)$%VDao4VKe3vzjH>i-~&pd=N_V@3 zH7{ASLibCIG98Vn;>-I#GS$lE^1_nWoJu%dYHu0UBHp3&biseYd=ud+d+#;v(WUl7 z%h=t^YKw|tF`bL=8Lm#}{IF7h*-+Gn&1xTB? zDEZtjkW-NsF-TvQ3&D1j^RPf3DAO5l+^*TMsL|3ni408ML&uUNLI1*lBYZ*|B^f+U93%$`!h(bX0zl);CUj~kLp4?#gV_jWqMPvRpBX@-UR`k^bq7F z{}KoaIA?!Jo~htj^qMg3FX6b#n$rpSMyja~&6)$wB8~d)gvnMRs<71uW;22vh zx4%6tRi9Ru1{LQsm$+ihR2p#!4-AC7uF@3)7Cbr^c|8}*))ptbJU?1CbuiG?a%FXa@VHwvf?|}YhHz~oE2#c-dxm8O2=%B zbXQSjOs!5gZdB#!f^b}AX@7Jw9M-+0umoAkk$X1hob`3z+5qjw^Sg)MWB*f&;vKn@ ztYQ{~t+w_B)3jVMrx{30B*g`Rz0fpt&(3mF`Fz9ULMtN0%sR1pM~%yM6H-=^Om~cp zHVr1yZD>-RkT1fiOSDDyLyJRd+EyvMB5nVSMshrCmVMOYk!q}LDxF=N@-(;~Xi<}(u3rnm)-tOcQ2C|O zvVfWMo@vY-?(N#`Va^nVNf~;8mQD8fM-20BaxOOPfv9trq7i>UoS4~Kth+N_e^Co^ z$C(&9WJQ9?_BA$)7d!#xzqZKYFiEJxmet9hPX)`w4%((n{yaWB=^YJ+BA5$)s`#g0 zJ`fZQT_Si5cM<9b-whljn_C>gdpD27hxb1Tw^9&@>z;%1$d2lg{ij0L-%IY5)eJQb zNBaE?#8hhoC!(@gq@iwLb(k1QtxUBL!|s@Wf@*h%$jl#pyG9OGkdLe_T}(?oJH2bW zJ)c0C)TN|Y{b?8Hkx-wY8-VXrL40P;HM&?{3(g=4dfIBro~puL<5VO)Mdu`zeJG|h z(9!8U(ZV=w7G#@ZGA~CUN0l3Qeks@I#xLP`RVl5m%Bu7fm5w2KrZe96uN})T)Y`+r z$Q9+>L3|?j<@n_`yz>hSj9@~f==xifUPAd;cOYNx`r=t?|3+kYBmX;DWrbg|3@Em| z?c_^ka>q0!=cdZ0Q)?uq(KEos4*2>l*JfCEHaQ>PA-l|MMkD|*Pb7E!8UC<%r61n^ z*PX-@*{T~XAE9z@BQ(a6=8KYI^K9mV>yMZ#N04Ijz-Dv@OxL`}UAYJ7E?(hr_-~S! zK9MYYa-IWkF|*0*Ww|nO-B6KuQJbCMp;qgqsj)wq)7SS%GHeRX*pR_i>Fn!S)izn- zTjk|=lu4W|4S3}j>XUnh)6NLRSN`z+C$IJ^OkFM+zs%OXwlIKp9>O9>IeWG#bZm=)i*^hyW;P3@c~ zGBH59mRi{zcabfBG&q=yN1h|g3C^?Vw&O>l;5H3u9J5MYDM9G8nzr_-WcO%2J?Y)q z+GNG7k;h>jL1}cdS|$d#UP7oeC~-4^bZI2Gd@&dekA^)z-DLsIahckyHb=m%@Kcsl zDk~^j6peDn*6NKWU#ZC!T;uKzlF3W%=Ix45u~MY-98od_%%Be4!bfpBbkU;pg;O)D zN{>1c`kRO4B*~vrK<{MKbR~URF<9Cms#HpRlO!Cy)M}voj&r<;u90 zds&9?;!TBCSf_ZNB8;(LC2KYX%yizYnUzKINW{n8@!#DUeu?KGAd~HYBXjOEmt1XH z(f;uMr;TdB#cpH>HeD3IQcA%n*bsjwo1tzks()Ks{<%X4+_c*tu&#XW9l_U{Cx25z zhyZ7OHhY`gE87K+1=&=X+B}5oU%|Rt;Z-#8q7A|KR&E1z^sE-rtw(ImZj#sS6mzn7 z<%f0Zs~NkiSrY~2TU#Zs2l0}^HSfpka~|x%>$ZMt7Z#XkG4c{oKTb_@7nBBhUia@B zz>OPuHt@XWn?l-KzAsx8Lfmt@O(0umaDQ-jklbsNyJc4EUa7e1q)u=bZ_X!#CJNeV z`q6{oHJ_iIoxfCW1eCazEfU$t1Ue(pd9Avg&np9Zc-dfOZIYL!QbT$k2L{=U0Uz5? zmuBrl9^@OcLYN_uOm>SrtHdm@C|}G$9J7?Vd^ck{<7|3PGb#V@;KTcjM_|X5_)E2g zHlLMkP9E3EeV>tiUS97N(VhABr!;oI;6;CU{}W;L{wspZ$N`%s>l@P6ICx3K;d2C$ ze=n`j5nuO5pI4j!IowpQ%j{5OOUXhI+OdxtM->1_D2hg7)LuBDdWx_?i@oA)H865k zMlCKZj4d2A#1VUUybQLqby;;q%}H`krf?*Cak}?xJ{J`j@78F?APPF3Nyv0`Gb0F< z#EPuX@P=0s; zIJg^o@43@mmvwqS)_Mk`b-b=Tx;idkC}7QH;AnL;bc$NLk(5BPQ-E8PD0Ktv(=Gq1 zy|k(n5L9D|h(v^{xnP5q)-|#ywKUeuxmf{Uys$2g5T&=SeDyEj3ZQXgXTl34Buoda z`iK^(M^hD~k^&PnUVVR=;eC z7edDXxf5XngyurRHQCNCjcHb-IoumU%WB(Knzy?9d=RyhctS}I*ep>o+ZCZm!59yq zrgAz908&D0-K36T2&CYD+AZ<*l0CJ+|G4~pG1(VPlYw@2UHzBOKtZ3tMTi@ zasTeOoAJGiZ+_?kst*4LQwy9c2U5>hFBL>UxieY(_u_V^t^gZe?)JsWQN$#WgA(Iy z24QD`0;b?0S;PLLVtIFyyfpdBB+q6~v2b#7I;Z zLV*~@7tAx(T_jn^In{nr#_TRb1D(wHraqlN-2~_0vLFCy_=WEtl!j#36?T0QX{=G! zgYQ1P|JV31nYO9$t~g-?63hyFKE8XluCg5Oakz#0yevMtGJc5JNT1~gNk-s`#&@VxGjR{fC<-%xyJxGRyZB{9uq zAtcs&9@HZa(2Cj0!(oi}uda68A%amTuOGvV5r7<-d$C$vBkkHLnw9H?S!;}<(EZw1Mj|Oz5?ysX5pKAgdD+Xtxt8uiT*L&u zh$r63*vfO)LC8*GZY$vTm5 zwlFdueOahREH&5)WGQ-hpsC3fks$K$M$`?eM%r|WRA%AYY#a-_X@o0qmUJk)>xaDYiW^xfmZPG_zSnb z^9_gbvhce@#o1g|mxN!~8*L@pp56NI;VCaAQ{gV5i}b_$pWF3X=><_P;1}I)LeAUu z*k(n?YW0%w=nI9sGaV)EX8QF^;F;3j9G+w(;I?qduyvIRRI!>!?PO77JyXgmrcG`Z zw2H_ZErY5^G>Y&)+lKNI5?Z+TUUVkPzH2JGvcYs^5-&RWAd19S%qVdo%$5duKU=Zp zJSFW($tuxhVWzcJJ_8SnlCawdEd^Vh==4eXpsC7ykaSm$(U)@ddDdAn68LLFQL$iU zfr3>S@|irQkNTrG?*-PrXq2W<|BJ`UcLpZ&68%Vt(WNG2U(C~(v;`umOb5a3AXG5a z^W)Va#Y;?osNgXEl*At_SuI-;TR6|=Heh=fW{o{5_*NRkGE$I;HUyiWiqMEa`Y8|1>)M!pEqW1xf(K zAMu5{W9530wtcBjp=WWgJ+IgD(r-gEn1rmmP;Dc`^4)xZTI- zC5OW=;zM!@G}p?F;14atXwdms>s-}cQ+6=)=vclLvUYfk&Mk;{KMljOI~c?g6l^87 zmxaG8du=66s}%@QJ4>!Bl0%A4H*#{E7(TrJ`K24?qR5t6t^%d5+XfuS zWUfY|p~IH2Njl4&)kBVqc1oTl`k0qRwxa41{5jhvPM?0B$5h9b8N_^i zT`%t5?L_ME&*ELwdS4b|ExRk3-4P<)DsJrDQ-wN#WwI18J^kWk$<`E@<~Kxi zOln_p&FhMSIZ!JXSo9!yU9x;7eVgQ|&W)0z?;VL&ykDJY01-rKt}Ea~Cy@ee{DlgU zD7%iiPHaIDQq|j&2)^EyVe%h%8fS^J_`H0Gw(+wTVbr$o&?5{@uOZJ68o8%d2>!*G zf;6eE&`CV#uGQXevsh(Z?;&PtHpHUcvz|e_#tnL&gHm}S-)0icbp}|;bzetzRDK5M znOJr@p(gASy4Udo^D#wxGPxg3$Cr=K@85C-j&%!6nG9NYF15l#8zhU6eZIWTjg#`f z#-}G=E^bB7^}n~qSzkkmC(`8c!;7={HNGSdR;QEvLYe2nDBp5*AMy_*HN-aObLGZI zwgJ?c(NUFE$@eD9YayuekV zQ-y)VqlrKdjS_1+XB`6^U6;*v>Xe~7%DJb}B~6pyrNx=ZErp8c+-Zv~&@?U!=l=A} zRBx?s;q1zRJ}Or>moE#Uu7p?55IF3&X~JMs*nAfUl9se%*GMWV9d}k-mHCy6fic+( z_vMQ}v^ai453T4?2KJJ8j|t{+ki24Xv_MN^}Nf_#Gx!c;@9f+{P>g3CN zFV1g~5J%lX*y3x)C%C;fadjX{>PDrw`Bxj*1ch7YZiPZ&uAe&+*PTbFw2iZLK>(HU z@|MDnLpMiVvx%9uH8ym#pZzd(4Nj6p+R#{2gTzB~p%z|r(!aqhv49Oifrb5ne<^fa= z7qX>gLkQ#(Q?&3!;MIkM%ME@Vlb1}nu~iP5AE>V~4}#mpGv<6RNlfmMi&SOqIeNy* zQc?=CUq8J6PbYKROVr~_wp*WqT*ex!8ei2UA|cpH{38po#F>|7wb+3u2u$0+bL85? zRZEA~klqAUUKkrQGtFGGRmtJll7v;&<;kQO9UTp^E|12?p!1)biV_@U+8kVFxanH4ir&2%a8 zybvb^lQe2zQaSdrN8ze6pl01dG=m4c&tY^aoE(Hkz z3lM2R1#kpz>ahs1Q}Bh%dYvnjTHyo>=|<++@){lzK^#gUrJf)O(@|IuR<){LhDGF~ zpW62xg#B5=oI2)aDGKE4W@hJYF1-l=P0FvGht^Bb?`6~Eo2+3J_>D~q z%2F!qu8AO3S^~YcuIhx9q{ti1g>W}~QdmTeBB4Yj+ZsuFuC4PttYGC(FBouFRF)|- zYUkAJ%3SACfof>FJ{I$NRePa5h1&@KXWPyiB5DU9PqC2+s@G-~DXs)?*?#A%dqzq? z0Z0rZlq)CTLZ64Gl{B<#Y+dIA!^Awu%PLEa3ng%YTC<9dK&@*>_a4OC9@d@_3QUu3 zl(Y;@x@Dpz;~~~$3O1%YF=e8_YbC7*q+?2$y8r# z)!S}NRkXZD`A||OFkzL26aj`OJlO4h2mJLCiEI$5V|LwQ2sx=R$sXSjUpbM+As%8L zlvmD`qs0{I?XpsmxyGGlF&UdJAVsbz^5Vog{uWaL-z?LQ2b>gIj1IF}|P%SsJ zmi4w+?}}1XA2k7__=Y(=q3&rDU>WgA#WcQNQ7-ri#x-h$N;5Jz6^q>YPkRg)ZzA+e zD9V<3mI@$^D?XZ4$Md$$wHv}du5L#^xjoGm{i!u=lg-<_ zj}hv3bWQutudd_A>PL6#3vlckyPx@<%0cX@%DG)w>v&K9G#4hCX><04j41~R1J-QXWh-g%^#gUZKP6_fGD{M{1+ZO9=3$BmO($VlX z?9$2coqc)ufWv0|YziiMaipgX#D#uMsjh&$R-0kvY!kE}t+fL1;}LO$zLIJ|lN_6i z+i9Jp5}6{g5px?z8?ioyNZj#3a?AQos@f=Dj{4&x2YbdcPq zYKrq0^@4EC!&hZRbOy^$Y%l7!mKP7?rs8lu=D!u95x%^2{Uj`Z-iX}UAl=t+v}~Jj z*pc7ly05quMk!gE=GOhi!zZYm3;vc;!IgSj@xDEhwA=f@Qlx(dC5PoC?G!d8+@obl zAw5)kBvr+zJXV=Rp`~|ObS$F~hegH^{n9s>!pmao7@VArk5ALl(R6-vI5lSa>yN>s zqm$Ev(d78}V6v@u7=IESgC9GJ_8)wIdupHk^KfEto}Q-D@$qPUVAJjKYinD5eB2Hvlkw=__~7(#xHWE_ zPoi-PZ{kL2Zt^-BrfL!NoSZ2hR2f|hUp156#Aj7Me-69 zUZ2^TaSt)a{agqtUbymhkIitQU>H5C8}@jf=%(M?Kf6UqGI8meHX zeclGgE{P_kr_lF}rILmX#%v0$l65(&MA4S&h#r_Bck{i4Iw@=#CMl4kqjk|3948^JlOTs-^d>*4rW{pP9Ze{*p6+dO^KiEmDiZwhZ-Cl`%fW9FYg8}iqpz;4EVJ(BbN z92@k3BTXa*?4pAKI~*R}z8IVy4?V2re&AwVC>v!Z%*SW>ZV_Gg?W!XShC2%&+_8o1 z3ciLW5w0cVX`=$K;KO~|Z{>B%o}FD>^v};;-S@P09e)N6kar40FyuRPOy$K+<|6z? zCN|N_O7^K0#>~y#L}xt2uPX*y5Zp#~DOsD1q@r^+YvN``>sh#k}+P-Uf z!OS5@dn_!otH{l3RZeq@+-X@Q3+tJWkv|J{B9P?FH0W>|B1-p$YX$wMcw(GDTXhNTQ9l!q-*VzAdUU&y{Js5^Y!-T3a}~3uT>UiP|p0Lt^TbB*u-q{7USrbcbun z(@jW+FagccXCIl>%Rf2Qk{W<#5|`MZiItcvc5=F5_n>~EIX?@BjK7QaJqwWuWXr=TbHx96nCs0R@1~cI6V~}?yfBe_v5J?IDDo; zm+&aMZ;;fL_Jl}4bPh8j#c_|hQs1Im_v|J1-4Yyf0dvDro_!~2=|WIp6giDb*_KQ| zuBE85^R_mk5~J|JA5GwgrHN9uk=Ux~3er3cqf)`H<(ZxHms|RIdH@K8K1>&Aa~w4* za|dpLNK=h4!Y66j3irtZ(=P+)SGEuJ>maFV9rSXlx&?uOSUs04G!o9R$wOJ+J86_c z3$x`5&{~$mW^iSi|72E4#{^pc{iDLNL2K2z@IBCkWg|sQMBa zuxFD6AP7u!W8T@QtAtso9G=)9VQ7W{CC^Us=dtWX`_76^_yFusp^O?%06B=vCOH|n z&On)+FHgTfwn@H88g=NuQLNM6>Y~5HMaFuOYv1Ep8?f?u8h5KNq3x656{NGeGkn2Ht-p=gLdjlLOM!Z-wi#>zk3w z_*5p1#JTI8yd=pklh!4v>@;+j8RZIZ@0?>)~h z(geYsI%0}wJ<)$#6SeZ}?B&z@x*S3;jv8yNr3P_LbpD=8sv1#+o9K0G)& zog9uPV>>&h+acDdoK(R=zLuI^T zW1v626oWE%Fe4&++p;1zl(^WLtk*C4Ef`sdS!2|B`j}r z`r-Y5j)#4mq`^S#tiF+3LVy(lxfiJB<4|te2Dlv0ww! z@W1NhY+(zqigyH3+?km*TF6i*B4U_xL|0&XU=;!dMCDs!D95g{4kwq_idt=y>$XI8 z^i4sT$$<6f-S9&}aREk<;S`y2fpGsS*OfMlfk+I{FdvLdv3B~s7laR;t#W-wzFB&C z6US{JJ-rfNurb!LY;Ygp<;_NsZ9%P(L+YA-wu*y}sTurt(q-#&EIPyvl@-&8Ii#l$ z+$jMuWpZt`B_E4eG*Y`pZ3Pf z(szE~7cwa;iCuCi2J%ovwA=!}+aa7|m=cf>D~ntcWQ}$pcS4j;@H_GiDz7iCrUHs{4rVB79&8wRx_{pt^RBs_&|cHY`tx$3Gc(8P76TaA~7jWeH4h9$RGTzvAX zk`)xxqPTf1>)CX$s{yy&BN$WC>5_CZV)Blf$983O;{T#G?*OCF5zu8-t|WWT!>139wn%IV$RY!ZWToD@SN{$n>uqtoMKC3Jr! z8y7hV8>iN2G+e)fBq~=T=8XOj$HK0xWu$L3i&F9v=;bDFZqgQT>i6iA2TX!fV$#&6 zuFcxas!SFJ_~mWdkvEPk0IAP3As|bMzP3kq&cFbN2mtC6GBHlkh1Xz!*Rv0$w(aY0%t3Rd3@rq4Bu_(~&B6E^E|(47Qj6o+O-GCDpSL9C)P zQ5+bJ{@lSAiJOv5dq>GEa+1qwo-HCq01tf)k~MRu0VU!!Y{S;76@;UMTy#)D4G%=e zKFQm6t+HIhY@ujAthY$J5!bOUax} zj*m}|kN2cx{3nq!*7cY6`(yLN`Mam>`SR62&Q3oyMGh_xagn z6dHzG2n;S9f5R@3DlWs8KciZEh)q8J?7K%dYZ-{m3dfJOQ&j~#LZKy*&bwruaxH3Q zg}Qi1R~2b?m4R4yPj#@Rrd-LC{OxT;@uEKW)KWx zo-5QqyQ{OJxpP^Jge-VkmINHEO_M1{gjU;y@4&IxC)Xxx9DgIHESFyC@gTXcj&n@* zaHT!o$S6gcZR;vScoahrdO|r&>e2`v-!$oXm$q8_v<;zcwOD`-einbcHi6@g3I6*x0J<-%BPd?A{2DMB%^ zELYLxmnIFXrnmJ0TvT&~LzY`1-?)AsJouwf#aP1(N~VV*FOXHvZrtU+3~U2!4uJXt zI)QA2BwBh^WYe}zv^x)~E(N*(m0@evBwwDtxclntmS8Lhq#}Jv$>O$3KoGda&>q!x z_rCOJrPFSZpvTHy`@xfR-uAnYw6oYGX_hJhC5Wa1E-avr-F5nef-r3==8g#-z=2m~ z(JX6KGG1*kx7eWI9j2Fo*N|7}1uzKDeU7<+#JlfO)A0{H&mR0kJJeI9I>mqU!op@e zZ*wv69wjNcO~Pq3^$?$Q+FKFHrhNJ6<+&gjX#SH&#Ht5D3Por;2KPv`=+0hP2z@M9 z16N96*!M>-&p|p`wuNexJ!uOo2P|Vg*LOc2jwXDZ@es{;Yg_ea29T~jOSOCBO5#<| zL;_L;ni6mw14)CUL4Y)Ih{2o@4IA(gn)mZZ9|%61W#ETzuGuAx*cX4AZk+ICAvM%M zypky~f4w%v;1ErxII2g4x+tb_Kc1g|?Zz`dK=E$FSNH8q}OBTVcW<|cWZ zLTA`P+sZ<_hVNiVV!&HQszmXH;ts8KMg6(|;`o1f|8qR~0`SS@6&6ZzEQwnP!qf1F zu!8fkV&)muKT~g{#cipb;-u7;bPV$9;N_iWjVz`LKa}tkoed;om~OxZ#$7$l7BX^M zZzN#}hNw)lX7d$pOb$1lA{Ul;nDMksH$DE0x8Ql6qnQDZ&^;uPTYj5?i6oXma7E1z z?|iz=u)Q7JqG0$C%=bK6?ke#2lG}bCK3dufqbmjU?yT%b zXWFcUzo*=bsU;uPG`9jIh6PuFUvOLzpe3g|>@8yWij^}#H-uu0019z`mjJ+Ibq!~* zY+5?`@cw7ngS6Tog(CaGx(V(X8d*B%r;j;~-Kw=DhOtnc6u5TilB&I66%2$VzvR_& zoYXMOI1$vUtHL8v=|EwK9_>F!o$Ac`COhGImr@G{wep0WzqBrJobB9{J0>{eY+!Ao zY&6>vHE(II$}INW>$U>xkUsDdx=G6n3A!kG68M)~F?w!o?z}%b{98TPNL?U}SO@N% z@5_x(I*}$%3#hUmU>xz-5&Xcjg1|Waa-`N>Tf+1FSsx@npMW^!MVO&VG2_REvH+8y;Mox6hCNFg^8Q1eKeC(0su-I9?jIletQ5yaNMSB{f4rw3z)CvwFhSX zyItycDz?q^=S((^Q`<(NToA2-@wjPO!=ywhR6%CW1d!Kx~fQ*#%3{J)2W zsMB*@qK$E8*hoSan>p;~GOMjmo8Ij_9t~^iMQj=s#g6d%$- zTAI`^mSX#}6JpU48v{a`)tZIs9j5kB&z- zWoiGd=D&+KFJHcR^*VVp7>^Fg4Ro6HKV9=p;h#73>Y?TiZz*}|g(j#9@-mVcikg*T zWte%S`NPO}pCSzFBt-py!#UPmKsW|+#M!bc3$0#y1r10o`0$I!Az}MajUz>Ju=0!C zC?%}~>gAMa9Rr?w^q|k+6(YdD9>LF~z&W#(qhOyC;i~7Xdctm8qOiMiBDb|i%5E#t zdF&GR54euudzD3miAC*iWdu9pNh|zAuSzYC?=87TlT8ec{f$lmsmML{ix1#W6}{%5p5#C;FRmoeMc%B*u6IvvVtaqA;}5%KN+Te>3RIr(E` zf2)!G?R!m5CPzm{Cx=I)onDjplV8zmvijlb$>K@-?WTNIeRq)_u1+qVbex8x;p8Sk znfsvkx5)!^jjw)av%0ytj4SMr9lwE1`ta)2i1I7qnm1+gXn;HWS|%}9Qb!ORj>_zb z)||JbPtCQ=(*>J3le;Avg4?yS0^4^IBRl3!qA!_y?z-dBxe8DdYn)5d=Hm4liMxHP zD0G?lI9A$@ow!+@<$R2$quuVGP6@n`T6gr{g1|1fLs%~g6MzUFUAWy1Nol$4T|^0j zQ=@N{Q^vKeCABq89fIBMF*^?gjoKzD2haA$dVj4$xq^i@!zqh&fK{A}f^v((jALmc zM^HZpFy8;r6D~Y68`;xnym5dV3V)kgNb)ol36P8DK#AlB>&DEycwhnUL>&l!D**UH zAFQ8pFspX5dD_gp3Zhw(qUcGqrmjU>An+h|UHT%WjCn1z3lZEcS_x{J&}|WS7U~p9 z$V5P$kSV=IxOr7_$3)T@Rn)~;7HrC@%IQ=Hn1$&Y!hbGZnpH7t440>7*vQ!5kwD`r zQK}jAXu%Z_0v(Xz-?SHWX0DB9@kKMhF|^sHk(j+Bb$A{#zrVTIB8h+E`efj24G-LQ z6+bAIkZ)@kbkEuy6iFUP`ERp#x8kJZttCHD(j%2Esv)%6wD4 z-T7@KN9d@|<=}S`N@OkwSJX;mfElYAFI!8L3vXwMb*zvqm&muk<9j9LrUI+A5F>*Z zW8gqKaf2;AVAqi+SsyCHsH0nFg(MP~v+(?n+^YDvk)HGnMHq+F3%%@NpYJd!cL`#y zJq1P(`@j?nvoT5nF?BwcPKM*XueBW=ZbhWHsqI)vv>*wx3E>ISxGV`uOSyyow*|uE zqPJ^gv70Nzr%q$JNM6jE5`d$FApu8+LNCwrm(I6QPmr1l!tsO@ZJZ;~*6P&3KVYoD z(X_UWp54L(l`0Wb3UJ^=IKihB6C60%N3|S1RSIw?A<@x3$?L$}{(KbLmF@i!wdZpU z$qCzw>oP8XHOpI9ND9pMBqhj&;B+PXf{>zG-yMYm_lQiFkz|l))Dj3}^| z9-o+ANX{G@47E{yB%G7s=rP0LE-7sFC9{t(bD9TdfKp^LoS?JS#`s?^&(n)TckXWPt;dmcoTOF*IF%{2}?hP?MopOC1;&+ zzN5ajfAC#TFVUzPYs6<>yBf` zvyvyk_FfdFau~W~S$BnX8X081V7<&Vv2ThNLoavP?`n7qLfM*9VunUS{xv0 zs+8)4Qum%H3gXI|M6ewy%A)o-s&aE0{BZHp5AT0QRMU#ASL4nLC$JmSpI#PwW41V0 z9j8b3z>LgvGCVo4zb05cI5;?*98FF}bTcrTe^xV&}-Bn>)3NTq6iFVad!DUAb&IjOTy(VZ-wYf$ANN-S9)IQR7c&Qv+ z`KqlHm%I%igh<*LcqV*!|1YWVDq=8(lW3=R>T6sfv#1x>-O1Kc>BJMS%b$v*ZP4ji zd7p0IFyVOL5GPq_o7Gl}KvhDZ>nHJd@C@IJaBZF-ELvFxNtQ8enreK4#XmEHl9K1fJ9(LL9wXZi+=qh)`#KQ@h&K+NVWkFo)!D z{wGCQ{95y*s-Aa3JmPK~5b_OCA1MHlKyJV1qfVw(CVlu+toKozdrQuBnhW z(IEjq*R@AYHxA|$y^3JZf&;fz#zWHa_p8qhPlrdRC*z}|ZD!8SC%?Kr_rvS)b8~H8 zJe&VG8Gn5>eexvlkPBaohsQS+==N|h|8kpzaQ-6;I^ReFB^93`YFoV+B)F}o&bRLx z8wkmDeV~F=r8RX-Gp!W-y5XT=wXZsq30M~jDLxa)g zL<^tw#kZ3$h~lR8`rF=zQ`=yEPOcM?$=^M-Fkg$xMX7#MHV!3H{ zx3~d_=42G5QFx@Q%rw5d#VeiXr{+5O^27U|U%qDG(#gZLz1Rz*#e;1?)YD(h7%?Sxa>U6B{CNR9g7EGuYyV>>|s>{X}=nl2Xy>_~}EDjEirFK%UFiscCa-F;?O$q|@x=9|G zoRT|2t~@?EIKC`Sk52lN$!ULdaCEqbrE4~w+0)5%JWP*9X?isL6?DtPgOlSiDmL33 zMGBQV84V|&M-pFsV;&UaV%a{pe)st0+y2A$>+idEe0*>dN&IglBI8v6djf$z+>w&G z3x&3(adI-}ZEa?6KSfN2fF_uUj$P^{Z<dIXenx;%H z2AFYwgs!V{nN71M;>u$h)ihS1xCn-&V%augpYw7$-4ISJN1zNj+3Tyfvi~0q4vr2` zFdvVPj`k|uIOhE5P7y7_Ai0aa*;o(WVM{FMa!VAaGd|jk<`Q>mfm^pE5>L8cYx}s= zX#^Ur_;~44P#CkXh{%;(^YmA+(yE~B&II>X-Mh&}k+YK8u|VZ%8MWa`j^7zo?5&Ur z$jdvvSI2AWhTf#W7-Y4FbvG4i7ZD>rBta<+t=IIe?6vc&W=o&wt=$@%Ekol7!X@d$ zp!l1T9c6`Ts;5~jJ-5}1^3^_aj3|vAYTxIua>4d5Ewz54xmF;Nhz$`6 zC5enx#wqV@tp$}M(pia?zb=YWC7D!gAj!=YY7MRpC3t467W3cENKs?C3E4iTye z>rfF@>>TlpeLPVyyjI4+-T}xcJhik{mO{fCp3+f&#A{NQ5e-2v+?Vpg@oP&vTXaE5 zc02VSe3)kq>sTts6iO}R2D1R$f%LvmgRnE|WJ9|$uCCo&gB+`Lbj`nDJ$lh%qEgb- zxOmgGO|sz7N6@+n+uo}?r2wMpL%misoa+y$O8D4FFsBwRbxB*;W=W504H;)?PzszI z>&p5trxbE#xT2b5cUHN}8yzFV+aFWES?lKyL3{` zS<%UYvm}SSOPGHK%4p)tW^FEM;WAHm%N;^qT@e%sQ?o*|tmZc95<5vPKkeZjJ|96Q z7gjwrp@lP%-pFd5vkHh*$`)B(m4#u5dKkF$!KR&t?6uyQ<{8X1g%j1Tqvg?)J=R~8 z?LvFOboN)`Kt~0)Ox3TxaUcb*IJR3MJ4%m7>P5vSsg{<^5gIyuc>l8`l#t{qEB?D& zx$+kN=rDD)_%Rt<@yaFJDZvm=MNzcWpvI!$mfGg?zJ2F-5fKnE{VsL&eJdX;j*CCD zzSCY;rX$~r8f1WhQTBXdD~nQj_wkW0PS7>;h7#3mC8>TL3789mk-(;r1e2kJ_>N+) zkx67DoSd*_wJxP;krq>eq$`o753DFMxD3L|k9rJXCu<7qqFBwyR2u;{H6 z{*OK14KyH^g)7RBL=g1g*OP#R*Yvo#MR-p++{(4D9w?s2%4;_6HRm>HB6M^D`RIBE z?EIbSD$<6iJTz1jZ){0<#@;|D`+i;cl6JRak8H6*{NU6y-Nsi+kiAd%TA&!9Vv*+T zsJU|QgTwOTAeAEctQE_-G8GMqAOKYTDu{(juFgn=?2k4@Y#1p&7EKUMME7H#XP6V$ zY>8R>o-~)!5pFPuyLcuS^dTn8j6KA*o|#;uZ^^Rsy(Zy-2aC=3~wW*@e@0N9=Twrk#UfyM0mC9JW0&|yg6>I8FUS#Ik5gkV_ zW^i|<2xQXj6XBlm4FLpOUEpB7LZftIlF=8D)P@|cmiFt<$Ae?sVlo)Hhf0iG1g-3a zyaeDTOdDI~IO`P_v`}meI_@D>8mT~hx^JVe#G7h7jGQLCh(C``{Z07?G8d2|MD})U zEmQ8loyl#vH$b9f_EQ`d?o;i?! zLuD*996^m9wCeGoRF=&T^W47kWIFdFwwmYzhXph8z#h>mrc$xx0goc~idl{(L{hpU zTxSPX$`GO);G6etAhp5Wx!aJ9YJ?yc21aJwa)y!j5#ki2a1`#)n0I2>;&L3_+Nh#i z2jP(*i)27)OT<{n6`}bWuAm60Q;M-xx&}U-t1!wxz+}m4uRe%4f`nrTvA0V6L~Fng zsj|knhslbi1qU6KB`a_$gZ(qYgbucjKh0$8P7Uh5a+-y7xyR>7Tay^Oi2q6+lu0~C zxQI=jr7q`2LV&VL3Ab{&8`oXRH+M_WHy3R+_rwH|E@Q7Xn_6jW9!6hjgijUgMPnGk z(ae>}auo??1%Ns^K4qv6(cja(B}2#6NgtfkTD5rq=hZQ5;YW^tw*$^rQ0{Dc$=MHW zRupF0OU^2+k_H(fF}uCwZdI0VbFzw_o0SxYnRsrNX4PX?9gfl-NPAEi>LvHng{d0C z7N47uG*^XCEwUQpXb(U4hfuH2IDlT4x30x3Q`-0FGvX#e0n;F+EO zz}|abv;Bx;{qZ91ZsSlP&o4DySIte^pb9gZ98@?iL@wa>YMDQtoE{zxK}LOWgY4#S z-7^2|L3{eo`@`zn&FJO9;?dLchr`oJHr*dsDrqbj`CxrSv%prR6>%!dm9zbAazGJO6vwNDDG zx^gWg`1q!dU?B*wfyi54)piC;8Y(&p$wvFT35_KjbeUCQ)znS_(VhCaAxsUA(YpWYudR(~XV6#|&M4|CQ6r=#xh3oAG#OQ=6OT9sd5AnDQaf@6O zCO*Aqn^f#ZS*Aky3j#C^KZ8bzby3Uf&O)rafvM8~RS6U7n(VBzHH&y$ZIqXIJV(i5 zW(35oT<9C^dk{trd4FQ21oV;N5d!f{roz{f2GJS@Yv{tw)k)xs_a}A7*;~IcX!B;^ zvum6#tmBqfwDigvY}dhM@vN+D$?|Ef(eZX$QoRHsui24!5BtBfqgnER6D@A9Z&MHZ zgXvf<_rfm9CR3GG>BwT@yr_ktUeF09&*o)SWCreFUREY8dyd#Ko3#xNt7?;zitxF; zGO5A;Unk#DGxXK6OkI*g{XIkf9`V1@2j-qaP`di}+BQ~1rITh$EyM%teb!$~*`Z#l zIgYrbMX_@aIt{txWGk7R>|~RZkED}D80Pm%C?B65oE%IhC&R;|qrFbi!FY6f@^2=T zpY~s$eDlrUvy-QX&&nSs$D_xa7hNrn(}Q2vVEoH48G1I?C1`!_+1Xp{3vqVtRauR+ zi2hr?a@SN-wFnosK+VayNM2Gr>Q>e=d#nJ0H;GBN0zsxBP8L-?Qz_mO~^`kY4Qwx8>+;-iRCD;rP(kbEbqec<+yr0_vavaO142%ysqKUf?36~Jj3d8 zwz5UJ=A(PIJnhBCzpb)lRYnaTU6Nc-e(QeF8pWh==KZ8m$0CGc1tPbqxsx7j*eNHQMbp4*Dl zh}L4X{#X*7Xt#KPc##3qh*x zo3@A=cLRe8ZztN@v=nqwf~bOH+>I^BOwPr+!`>JcS4TcgpzQG~)gCsM3i#2011O@bN17~)x z!v`sJyFE`>yRBOn#vnqz?cv*0k40YIiEw%~rHDd4&_l^mWy1B^hrD&u0laiA!!~;E ztftI-snS98X~izo$!Y_DfcB86h)rk}SAWB!;8)@a!|JeTV!BMBLY|^3i4Oma&ghgI ziIW*qSDVONmPR(Q-6q%l9;ci&Fm~+4oxoT_II|NW%NgSIFBFo4;!Z@Pzx`M)P2e%j zF&Z-nL;I}KcJAokZ)7{3jK|}H@xkd1&7%8cG93QOMz&|)z5DTR`E>QqciGXa(dNmE z#ZmRV>lfWjyz)J!i)~j~^O-JDoRr~Jm>7Hr{LehIc?xhg&Ix!rR`soeu3W^I%miLr z6=h3cZTK4za&VUg+fkBLd1WdO9bUIW@yA6XSxN!i=+9hZvVaW5#Q(Ksp{ee$4l!|Z zF*rIH?Mt6XCU#p$ty4FX{@2PBq%e?Y2(4*!=WCl^v7L9D(`Pb0nNKE1!{KZ`PN%~+Nv&HUE>}&+#Hnhve;H~@w{TaPo)(T=*CNvuT1i6_SCeCWu6rd zz7en*@dNU)9!PQPvACC)#f4orD(P}8ko?aCbM(5bxBJuhTJGMap@n})rrs?Z`D;c* z_SwC7j0E4Iz(uKY=7RMzg~(-njO(r!c>Uo>P`FMUpPYR;m8}6_93-84HdPDEqBRA` zk4ciOK9+b`>g7Z&q$Ex7bRx!INlKuMyYl^y>3R1Tl}QCI#v$r54Z20yu6=%1u1uPW z8^-Z*F?aowi25=tuf?*lu108Qniz8qox~q3t;qfGjw0S`8is=|*NU5=;^p2VB6MNn zeROdT(w1uvl9&5*ePo)0i0~$K-h0tzO*nBC(Q}aQuQo@!mpVkU7;wP&S0E=W+pNf= zsW~k+8m(5;tsv^VaP>MzSkL@^3KzCkuSEWy!q3$;A?0-nRp8bdiLvlohyXeg!X{UK zYM}$5)3$`$y>RFR49&H0l`#5igx!<5J*SwV?EMQ_kW2$?W5nfUA6AmMmltzWB#mom zZsxu#+ z@=D!H=+gP{{^xeRCZTRVCk}QVRy1;EN??ZX$IHE!j7MMS0c=x`JJzo&WgDg_evr|T zJV>~tyVaMYTZ-dU6hQIUv%cmzH2HARvTwN zG6`SQACP8`sw$;CToaCOW{s_wg&?@sl=OEJGp(&AStD{XriDc>grZ8M9E^obx@*Vi zOL=xsc;#8)>CM>Wx=VqJH*pbC^ybrya#dpO%*z6mp_mmeeVtcV^NyZ;+T8 zgo80FIuxOugO-RsEC67!bM4KT&8(ooNk7wx`a@QPb%dBNY+Xj($MJqZ(W3BVkkVXS zD^Y-(Y}*KBRh4vJ;>+=^?y8uURiSU%xreUDJ+H&ai0Y!&AC@Lfkt14zNlH#>Y@k{-2rQ5bQ%rI&S;RA0ag}gkiRF+Yg-Mz zJS5-fLt7#aeNk}}TqDikuPHIgTcbx+CR=bfdifozXl*6MtK{8*Ew|seY zD|FnUX5f1rJeElz?QPNc^cXdUmhFn@E|nv7vkGn|`J=~g3fm4(JR}(-!o$MAy4Vd8 zx3UU-CCG2@XkF4X?W`df4m4gNspWHANVRZh_i3`|Z%LPU*F>@E#g}y(IT{@r%9yL0 z98MjB*%#0orJ}XH{L{oip+rbxz0;dWwM)}mPLwv_pybPo5D60 zvX|hLz73|dKL1(Y2BjhgsBD{lR-kVztNDjqF1$|X$?qmUb98!qba*&Eo{UG^G&%7n zzaf%tS^xcEarNfgAHJ#HtuCflcfbGP@7qYaKQdZ>WVHUsX#J7V`Xi(DM@H+9jMg6+ ztv@nae`K`&$Y}kM(fT8!^+!hQkBrtI8LdAuT7P7;KAO=wm<-29C;Kv5?vvjzqt%Yz z{B1RSb8xRZI(+=%!TR)R+NBUZI6V4&8ALA&^n{MaA*Umq5f4kynY%uTr}jFlKeZ?H zzVplfEmqKvwSRspD`=Mp^z-{Q6_FkvjGxX1`e<-`a(eq>aBzBhCrVDuvv&fR)$MdL z1S;0?ICvdSX+Iep90rb0rvbyz-=ouAXL`8E!mKqTfyj$OS))l$kH@8v>1)dJtuiq> zh&p5pF|AzrqWe_IFbgs}w7{?0+{l<_B1=ow_^zp?e$~sst6vWYqW3=6ZCuC8-fQS!yi&< zbT`Q&&zjjXRy&KP&kYDWDC#f~A_8xB25u&ilAA7e1LYtc;-G_orQei&YRiVnb&{^8 zNe%}`Uknoe_D+$6{gO5QW^$o%ab!dBBfZwflG@9`#6wmo>*-Y0i^A-Cpta!R-&)I4 zXl-Vc2TZN1=DG$a_vG&Cp6TzwcS2E&dH(a^@sZ=80i7y)wGoutYqGqV*^#AL?6O*EMsjILa_1u(g!_z24OXM(oNd-treU6jS z?QtTTVTYs!qc3Yi^bi}{XU7H_VoH-v^K$l9bTcv`fAM*V2>UG7+;^5Xs_Z9iv2I_u zMULq$t89@KqGUnA5^!BOeH(m1y0o=BQ^R8spc+jkL#26l`f}9cG}wmiS}aT09m=KY zwv?=X?A%TWnK^>|wb3qhQgLnlPPBk_hERx<;Jj$pNRT88dSLtxQZU!P2?_bwL2|d{ zQn9mTAe5s7*}823Ajy!$ZcM6{n{3&g@Xrs@j8%>P_p*o+MMq;8&8C%NiudA%oFtLmLUsqX*G#s?>T*lLhL1l9G zh9hmeuSg?zky3Y$U_?bwS~&ff={k!0VkAEwKTn2} z$??H>a=I;L(D~%w>ehaD*xCo@&%Qal-(R-(j(>d6ZvM7K|M{Cr)ST5pJdV0Z*l$hN z2fd7BkD}r6C6Yy3kTFb?V{_K>+%KfR6WYp3IYze)1PnOxYQ)Wpf(L%GDrwlIS4XtjmCd!wi<_K{)`e0I%V#vmLfjY=jnG^|O_W5N&QptM zsio@+?;H59>Gip-TG>2XNYS^V)NJF}d_w7l#|En{m=B%gSaF3dt2~C>VhR1LgOJJV zt~q*K7cb9VeU0?gx+>3R;b1s(7m~b+1bTvz!NoGPuXfl!Z_$*yJw0Ag}l(n`-COx-~T^a`kh* z_^lY?;UqEFrXepLjn2%eN68)(9c~TjbtA;$4nhd4>!VLHBj^(AuGl46B#*6Q?&0ZU z3h7*3SD7vnd|Vb}>O%z;tFH4NM<@O*RP=1?0OE~2_xyx=)=@yAGQ!J zonl#oF;E-pmW%$?IbWTRRUJf&*xR=AEB6qot8n&|R1m2V|IqT9ZXd)JQ8N=t_UHj7 z(W?dOM6q8(HeI+nJVp8v`^f?mA1jl8FHcP6i>`Si(&*@TibIu8bTLN(yN}-e5#z zJjmB+8$ZMMcEbuH<;(MIUDmDcU7Yz!={@eDhwtwCU9vh~=iS>uPZ`E7euy3FdKVbi)PG^1h==gnd0>uE>S6KAqqr}^ zOGPhOH}=|z_?)e51vpxAW%8C7A>DQAQz8L{|E5HJzaI!b;G&DCCG~xLsow_^iPMKw z+$vBNq1f+n2KHSuKuwRMaxSCtci|OSnT<%5EWm50Bc?hUo|(XbsX9}lHs6V>fD(Ld zkPRyA^L`gD|=agwTFzcho79?SkWYG&wQT>A~^b9L#2i z>93%CI2ay{#*^{!j>2r`lgO^bdw*}l{`~Ib&Gnlh>8CpUE$K4_>NN3SXJFp2;Dne6nVl<@p^}&Pa}=)M-r_k~KFJ67lEz zLB5O^Ri7n!<%D_}0_8(`6ro^=mez%3y+rz?}WgBFB{icoPnags^yZE4IQS4m=f7BR9i zjZiGeRR)R}h$8O1kw{Co;3;adz%7~@$*^?qolL1c`QiWhzkxPu{9#s8x;MxN z;V@_``_=Z-87GVF#I2%4D{XOdjXFU66}~AyrYM{Hw)2rHgh9L@HIH)9N%En-ILV%Q zaPJf$hGm`{O2RDX<*E{c38ACdSwW7m@XFqi2V;jrm^*z}2>B(M2#`c?!BV8s+yjjs zKekJt*8s#93+Kwp$ke?{RFM)&rNakc1x~sEg!s=_fQYH=uKLb^_`{RdPI=$pxT<5m zA>K=Xn7FDePpl`WK4N>Ko1mHx%*i{Q(RXXZ7&Z`tkr>zwDjC;IRy2BB4sy>q*KP;G z>7d?2v#cGi4aYlHv(R{r z#5F-ZoNF6cI{n&!c%%d&HDzC%I8$WzqC>-}Um4U0`qA?xD~2Fb+s%erjcIzS%G!A& zUg}DK&*(r=unCe6Q6J28WU&1NMN`N@bjGbS0Gfm7xi%=L>a=uE6`sJS{e6o3qnod& zuaVMHJJUH-dmd@6_bo~HDJy-Cs@Xt1?R_%~=LZK2@+srt(GYr3$&a=wMWBMFbP{Fb{Ng4dpMU1(6L7GQH|X_Qh*%4%`PQhn;wA~J_!YY%KE%5CAuycQOdp=rc_TrnXRXVN4-##>} z({DH3di3E3?qhRTz+u*vv%TRi2wDvK=DmswDVk+w z(5rG@S(O{W`ITmMZ3QPx0(ELv>JFB-bUfZjLzH>B*hI3~jI4kctQ$v=4igr!%tuE& zJUx2s)L9mF3V4T#TgwH?=Rv?TBR8I5=++#%+>H*{o(EyD@J}wxcB&dKtnN8TLCg(p z)8r~M(M8ELaAlzmxSO5~l+N{s_x}pA#628-IItrHmrx#s_&edf(i_fBFP2kP@>uWz zDp1OfsOrjQQlnaBv#RW?S!|oSL}js1E5-1kj)eS42ah%B{LnqpiCIe#dy&W}~NQ9i#vmRQaYZlW1;* zJnT9{rfpRIGl-T*A86QO3gsx0%n`UV-~*bbppw9c_dk_ddZoWw&M^^<^a|6oUY8>4 zl)0{UN~YL!=e8ZljC+P`zGsC*PtsJ`T41Exg}Ckesl%7cT2vWoEXJJ&!LjBaz@2?! zn_NJ@`NaoA`=)xsQtreceB`O9VI#hdwh5)^L}b8}mAQD+u4PgiB`Gz4$z9qUw!qO- zaCyZ~xBr&(kD}cMuM#oHm8~{A_o4z{Nr&{dC1%NHf;R z8)phjlB$kyIxtCRob*?enBkS?vj5c;Z)=pRf@SwW@s(MxV*r4HSw#i|QO?ZN4Dk>x zBBNsb-Dqg8M6y(%=v8EhEiM<{u485HZbE5LuU6a60IH!AlPj)vqR66deXt@LrBKW$ zmnIf6zE3Qdm!=R9H8LRa7P{&0tXsIkN_k}$ z62U}Dx7$d3D$^-G?y?vkCU>ow!R{hS(e#p6=;|4d@Ssj&_Sso48IDH>2YVj=36}dy zgWj{Zu47Ry{@?fT2gf%)d;%6KS2q>qDd*g87g6!qR*0bQw;$N~i)#k1LabpGNX8VW zh~?>#imzgw$E6L!6Yf*raHF2$Id@~6C#5NpXSSX#Gc@8?tY9`$qSrJwkLlgU70sm) z+Xb`f$s1z)mrMBEXCzbXd*&M-IqF;TXjE6>(D50KMnnAmi78r~_82Yc$Cq@qFFD5@ z8**15>SnOXJlq)_U1<1!e9X|&HCp@pcxQ4SG82?1Pbpld@v|i2dDb(4@VYF>HZijd9ZDKb)gRi=5zu>1okk2jtn#CjY4_AQQd&K(9+uA+es+$**(_@f?X2YH3 zt^h6m7!Ay`+)(z4Er*qzRc+=Vzd1>_M5`3JeQ_V$kad@W$wAX4KFCU?KE*r4t6?U$ z2QYeh%uQSW(tHCu^D7OMFZ-A}meB@$M`hiz0!@Oay{`7Q_&AE$bUH-#ht}jO9ZOkA zMDl@$30|EVLhSNFrGlmPqXn@B96@=xS!D4dWG-E#UeqD6Z~U;TJ~CPmK`U7VSF)1y zlPsNIJ24fCV?n`pBa7~F;LJ z_M!R9TW`zj8_jHbG#yV4#*>4C zjJ1O5@!yiZTBKQ5S-a9UTXMM8aR*9jr>?*q@oh%J)5w)_N!TluD|QTIlC?$pRaBpg zL}BZy!z~#lIlj8lv=vC}|DrXODTp!Ad0?@im*}y}RG^BtyG)EprOHn| zOuG&!t@9Uue|)b$nk0l$fvIRoM!rT^$g7y5iUS5-49vUf2Dz)ITt>nbld=|h48;l!rR!+GS zzzthBednL>*P#)SR0*cw&oWZBBxYWru_#&x(j-_`To68)D)koEkY8AR4WXmRnKwtq zZ0^VX%>|+clNIt<+v{*9e-*JC#QReZPn{@Jysg@GgU8{IHN=dzj~8_HJ15dn?nu8f(dZ4dAs*l( zsX|v~6|^M!u99kLaR$sBj_Jeup9LEOQe34(*i{o9Bxmeu^n5RsEUI;G3+-Hk?5aZx zbuU^6R-c}JA&XM$CiE2`1#RWspoiMm4kKEmN846aDQU1G$v=4>zs8OY=E@eT#1HR( z#wm=#obRdIXyld4MzvRo3{P)7k~ScG5C!$kc zCl`%f!_YrL?fU;^@6DFm$g(WaU-2%hL9zxw03=8-(#oyBRxp%F-&)^PFLxdtL&2CpcWQdsDkDp-=YxuITJ~G9< z{QlzN#miR-u@Rl*^*`Ox$?ACzdqeQTuomAv7itLc=wx_Q4Dq9`-PU&K+BF z-%zQD+E!}4$bYVFd9$?HD&?5R!lx57e;aqFYcx(LC`uwI^D-`L2$n&75ZEPFNu-E4 z$xwowndq1Z@&&mbpjW*0`^98ZCD%Qc#4FeFe-6&qP0*fY)kIX1RKSL?#_2Zx-I|b+ z1-FiQQPhx;QR!W2aMq={7I}ucXdUiz^`Gx054guL1Ks2f-Y}CE=A8iF}M^6q7?*CXBH(#OQyeO`D4u*N+ z;#+newUOE3uezlh+12lV2+a!@+$?6Iscv1O9i6HIk@2ga^;_7`f5tw5M;<5SB7{=6 z?ap^o^xntIZm?;0dKaC@AVy$2&(1EMKG3FVZP^aVMVCbJ9*xGM!QuXcdo(&}9^AWU>Hg#T<-OC3KmYmL`tp4A^Yx#*KRtiA z7&eY;C1DCmp*oo?0(HQped&sY>nbLl!bEQia|L<3Sd?4n^QRz0X}m3Cpu zS*AWOrI~WW&Y*QI7wn^=yyMGT+N|s(EGt#^?MD6mb5b&^BQP2??5_LDVp0q9tqhS})Heho?Gp24T(5iv}+NT3vRhWJk zyw`8d+NDzuiYj^NL1c;FqIgjvhzfn(;jk%&CsC6x#W`S&8f~@o2tPKrdWkPwt~D(Q zBaW(ACm9{n_~Dkhso2t*u%*&UA8B{~%Zftt852%j2dn`#gHzUfcM0*(+f)3wOl$47 z^@gu=S#b%qb|_7%c-SIim3w#2r7MSW`{XK`5jtW`|L6!wvyNKxunr_zY9 zgeC%Qz+^=C-T78jGV*OxZi6j?SeK31)=-Gb3#r{g$-)6MtF;vmE`cu>l5XJ-J9XZok5KC%w> zk&tS}@4}j1nViBlX&r`QGCZ1$&1613`3>G8gVVvu$>Df#*v@7fuf%2OTNd#C zonkULJ$>+^epFlz(zAEhBRjiTHb5qa{iFWx3o`l9&T@sBJb}5XBTGgQlk)-+dX=Y3 znn?-f>gN$AzbNnhFXv0LpgI*O=Pp+4ABIlZKk6q3JamUgu}#UdVrEPB&oAh0l&*c0 zsd3^nYilaL-g#-)z2sY{jZd$Ve+7!UC-`KkAmPi8!&(s!LR0j@ZCvBvf+*XANm2aoYBE8TmB{b9c&%p}q=J;Hehh0xi# z0_?Wcrc%{XkC^ZixN#j%<+iLmF&`MsoXnFcfxD5-J}uqlq}~b|fZm$C3Qnu*w4{=B zbeyakPe}nR4qbYNO{A+Wz6Du7d~#G)_arPcm;Ak|4YU&&dp9ptd`6b(T;?somCG%p z*r->4@9YGSqUe+O-<1<#MOQ&j@niF*Ab($MliOOZ(q=@Y+xnqM_Rj#glSe|BjlqB! zmHeuV*3wi8ke($4$Y${Ef)EHh2Z{xijIHCXTZ_3$15Le)cSwU4Oj&%I$44}aoV=T_ z04c!nYbbAUE?c_ew;vgDJ8<63T4P&<$KRNwpEcmk5#QBShC+1KD+Ir*;L}7{6JIiexKSHNY{7 zQQO&4_#|(Dyy#MKwu=kgpwreE-N5wj>6U*W8-9$va2k^8MqZJVArILvW)&+VghO<5 z3S3giQT^hTa>#xknlyLX*P?7g#$4(g#UC(M#;bbHywsxsHyoK=FiUKl9t|j8`{6m* zxQXjIqFtM@QnR$qpH|zfA3vSq?{@EYCl*VI+|aDEQc@om{au+on{~29sfHpd1p$;& zn?iGGhXC2aW=Ry`F_>B%^G_+LWQp8dsJl-9gIR_;X!P)=nMqdy^RRE>XyALTyW=4B zTw1TlH^?NJ`D!OPJShggJqL)==hb58p;OrI%oa+lTtyPOQ}b$&)o@u?=~M*eL}Uv4 zDfa8BPNlOdW-vx~TB(p)ZSq;iO~x=}{x(6UnW9KGGuYqp4BP=_-y#%LCTfxu3+>L* zeF6W}EsHv%X_Z{rZDdHK<@j%e#379RV!DxQBcPW&s4Kg!QAR7#1CHh+Go`ub>dZ{( zd|Pgo%F*%BQ(CzVNl3p-ZO1mv2V(WNz=Vb|JZ101KEc-@cY5)=ETwpTV8;{K6(zns zOO;|fkZ-eP(AVD)xJ@@D+j!0xAn@T< zREY_$;WNOEZHb*cgoj)D;qMpU4E;m*E&CY2Qq`$6HdlM1)G-96W z&H?BQE*=H?^cn&Wp{yR7Tq%Qx$^^b-8i*iD1#O|?K5ZfN2@>@035@F>4aP^Kqf!5s z{`yw{#!W}3-M^e)4d2~=_v6X)lc&Ym_-V5$adh}!MuQ%l09JVm6Z$!FSzoUB91`@G zwdFsbPE3Lq*~Fv4pnLY2WazWJF7mWU9`^3{e4XVp*wDZKT^t?X&WR3$=oMEChrh{# zcK7mYna>_Esneorw}+d)Ge?Jqu5eMdXwYB!%eOG0tK`19PG`xhUh+d~(^AxgADLNZ zx5-l&Uu%kl>1`G^c!78W25+E#o1|RSPDyrkxSeXKX#|S0CLLP}RSM@DXl1{Z8nCli zT(PXr`+IhN`J<{7@#x!d)*$-H)#pWy4F4sLDEgHK`VKDOu5t#XuggoSi$u?`WLAj7 zB5xrQ+D2-5ZJh<^~*!NE+CWJr~4>_kZKs;#$VZTBehY@3~77+FI-Gi?B#& z{DU80$$F1b^w-%8I=iFcmt-*Y;MID%5N93cKJz542*zssP3kA!lFcI9HNOZyMwz~a zF}*Y4|Enp}hr`pssK1Xg?OypEDAV@4V*A!k-@Uzf*IksCt7o&cXd*NRx60@I3WVlo zw8DM<^|f%BEM!H<%tyV$;pq^CxxwIYFWc8ZVRDu(Yz|t)1xv~Z9=5OZhrkM%$f)I;W(m@W4k(5D;9R^_5|pSIZJGr2W6FHe0TEue;W=$kG|Oe6LuW zOe}A>wVmdpP@XPV6tE-S~NtZB~z@`d0c|CQlxss+LyMqL(~Z_kpOm!1SK) z{lS(iI72#5@Nmaz-5yLoj3^=add@SmDUAx`6Fer0F4fYBz>w}$J7xD9wcADsoLn3rL9PJK!MP>WK|tJ27oYlQ*DMKc95 zVBfqjm7pjbuOf0~23no?0lQjf#a6t8gjNu!9ReIM+=i3b5K06<1Zl-8oL+>}?=HGd z(;GZ$iKKiZY-LKy1cCS35odAl+-(*p*GeF=G$kDB1itSYOVLDhf8rQ{tI$LXCU@>V zzIbtdx7T`F9@paH6XPmP4g;G+hP1Bxc5UM;)uTTe&v+P(w2ms)1o!>&mqMHy-=a`y zEf?p7zwgpn5Ni3R+7P|byzItTwdbSGw9rwnQ$E;Q@S)x@owWcWmuRZ4)s&&S zk@N*(v24i!@08QG0Qk1&E z@n29pD3+dF5v*WshS377Li<+O&CbMe<><&kJ&-mmH?-V$80H6fzqFo8ogu!U^I&YolpFoK2#d?Y&s3;gjEYcl4 z{9UFML7;yp*yqvs^muSO?vMIA%0clfUlI1X{__uu=Rer`V6O0)9 z9{*;7QMj4TZ@8O|@2^B=g#KO2?IN|g)e0LcQ`{C-fYGq3B2;5yF{SP5o9p09cO2_9 z>PS{5Pix8)>m{&}eS~>1>?f|F3 zY9w4UY6ut~QAr6*4nhLZXA{0BP8r^q8$sRQ8zTrsKJ_!=bmoL*m^9Zm)CQp9*dvEn zTp<>vxqDQ4d^=CIrF5HRRWyOGdb@Biti;#MyiHe5H3$95EQO1jY7y5ecCQCMZX0(Z zkUCj`q%+HA&hwv=_G(p46qa`E7?!)(+B*i;!O(@%jr3uskKv+rxon9&cO+9<57y8@ z%7*HB)1$R1N-o*Bj7lfB{?MqrAdQzftvMKSKqFco9EZn&8VGvN$u%RdsH~~rPeAUBq z+}-#57KQs4TfNp*iU~0xm_!tog*bHshHKPktVp3Kvo>qQnX)LIrmIP2DgMslZw9yC znwnK}Q!Ueih=<6hTf-BR)Ln!&waCs-ukgGd=VGP>s|(hg!^2h+fN-5GF4CKKSrjtO zs;hLZk!DoncPeMB1w4#)E8T@f%!ZXVlpMHkC&VPE9yv@EnV>>`C`g~bfm8R z-zc%Rm+sNPj93-D9@(d(-Swk~mwfxglnaHE=nYoUqgFadnO2-0L}{h9BkboMd@0gQ zw=J*=`tw_tK)OjI8#=lx1v_%ntY9pS6GetZ{OY}lp2_nKrLTm9v3qu+lrXVgh#Zrk)J{ifY zpmg-Vl39^FrpU$|8@loCi#)7VUv?{!R>YC+-ln_-f=qwpx0^(2*8b$-?=X?!x%5~? z7?8E7U8esoNtd~m%9nBLcc-K#wfs6Pk;fQb-sw!TT1z&ZT0la6jmYHo75}jnBS?YF zA=4JTxbM1y;r?J}=ggJ^@@iiM*NmOe=iCXoRwmDtHW>T}syg2D+7o#1a*sm>xuGCF z=Af5xR~J;IfOlLJE^w!lVFXo-F+SnGe6yr+gA)U}wPIB%0C#$2OEPA$37&hA5sA7e zK~*YV8P>4wfRr;l+xjQ6Q}|;or&w!in>&n|E_)hl1Q1^pyBZ2r9YgCpeeBF-l$qUj?-iTtR5yrElcCO>He+l$_R0gjJ6aHO z@OdC;w)jdr-2ge+@iJfm2Qt%sP9%D?H?Sp+;&UZz2d5`7t;op*X=Lx|;?pgg+I1m5 zHL;FY(>jOPnBMq!-e24uPx@Suu-}Cu-{`RY0y_s)CO< z`WrWwXTYRV*23dGs*e|iDRyaPSDx^AwQGtGs=~(JH*_|Y} z2qY2QLNO!W^&($5C%5MJKX;Nl{fuC8l{{wPgFXDi`~L(7++muvX^DP~7e3c+o?2KX z1=UBeWl8Mc@UwEaCLtBS!bF55Oqd<*(7i`%9B~Y1BYS8DW^&p;IkCS+PVDIDaBzAw zK0F;CwX68?D^aAe_o8kIDo*p0XK%{KPk;K;yTyZh?}s}i z6rofyf4hb}%1VzJ?I1^zmMz}36HLZG6%P|ISUg(MIu$L2oNR;tY#5g+S(c{ab^(uq zZI|dW)Bud`_n#+?DqTiweKS|8IKO|6Yd))Cvn|Ga!($PSQHzeqsCJ)(XInG7`O}&r zt$2>RO+y})JHd%c1dOl}El3t1LU72ulm)bv8Yxl%IXuY}$~2pjXUX2@%c9sSt*{HE z`QpR-|J_T@ypTJuzCBn#gvdQYw zR1~RB=W@g^&5UA905ekixj=aXoJHm0ZR0C2)s^A`)@%Hv@uJfudB5KIYb(dloT)RY zo>B%>z~^ies^7#%A)Ih7xv3BTWE!GLpmI(v?~11MhCDr%FPf*-4A4-)A*0&9Z!+lP z6^|jLlk#x8UCnkuh;szukiJW`O({UDTnM1losdsndyLB!w>98kuvp^~A+9KWR~PDLOG2wWF=p|VjPtDEL#hB`+b>>rd< ziRFM^z3S0LWr-r+E0i2IDdozUS@RwuKTTgXzTcQf&DJa;&I02c1K_~KW31zN>gxH3 z(v7qHC0ck>I*1R81y#)@)77(;u3geMita?*O2Q+*!=VL zmq_O(s~Q%{DmzD~1r;2dGuMzrNY9sA<3N6!#Mr$^JNu&`2&hXy)Bub%X9)3?1ZVZ< z5zDR=yoB#l=%h~DTD-{g`+EQ7Lba=Ox->THp|D)UDz#ro!!!Ba>w*NF%Aqenr(ujU}DCWrKdCr63~ zKp&C7zLC1S_O41a&1O2soi3GfM|+7*IG15ShijmKMD&s@m83oj06If(Bmx}T8Ym_X zktALE(sk$58b)kNIs)8NH}rjC-t!G9%J5T8D+-ANKe}Dpa$Ue^51uAg703Vw+jpa0 zkQ1pX%VUzBvEMD8eM~FeoE-ia_H5nmc; zNvM7(dg@171qVI5Kd zMu5!r?NrX_362ipCg!EBmWfH>dyk5S?pty7Dw4u?P+)&W;4URLua}!DHPPlzr4e2W zb9m@S%!mY;7Qfa;sF2*Z;Htz>y&xr}685!tJipY5OM_ zY>Hw?t-wRH9*CV_kZ=Qa-UR`}*k5xJk>@6*I8LlTQWIqyiKePsK&G2-XNfzxZWSxS8B~a*I>|xoJ7;B5c^kcWOiu7RAA()Bm_h zRglh24{v}P=!)S=8B)zGZMml&Ve8u`l=6&3lzGUuq)f>EFRyG(h(B>cGixN_PzaK2 z0847%Eo`NB@Iip3X$_?+nRzn7Dar}SQdC}B){Zxg0OOj?RTmR6^;DY(@&E~7!j9V7 zuj3PHIyoBH{`mN0IzBx;iiE~L`-D0k3heNtKW?2+jaQ-*s&zU0kEeHkS-cpf%U3Ut z%JG{wZ(siMm)X5$XXNCz8iq=~e%ZSuXX+l#CPBk(c6<8jdT~Z+?pHss`DynHd z1(Cm$^n-^()s`oU+`N=eR^%`Qteo~hQ*CQv>lkTk%1LU}oRPNKnhK)3Oj{gEV)URrJ#{NTC#K%~ez~qzU+f zRtXWqC~z0^a4T!Gh3^&2-!^$#Ed{ATGi|rYQM||KKXP-OE||9f;myJk)NvG;_=dFy z^t9d8qG-#LP4AZLb&XRwtt-D7OUYYeQYJ~xlTg~TByOT&kMz5ve-ztWVK1QA&exgW z%C{y#K8A!(R`OjPxZ!aGhDhovyBbJne4z3(9^37dGm3cvl?zh3_Ds$>kmOFXLXR`a zxa6GNR`kdm^zJ6#S-Y0bvkZ{LB0O{ut%UQq7g-4EIgJCg{2(S{q35No_Zv;NOZCHB zc^@}?hx4|QBba!m8?=E;)s$P`xnN7-8Bqk4@#Mo9_U}>sSF%6WcBz$-d z6QKz_j#(_tM0yLm#SKsr!WmFc-6?u^}BH=?oxWm{X&8Vq^=t_BFpaFvT^mti#&$tfBE`@^Z7X+sY&_-qoA(iYXkW)3vmNi{cUG zK$>QPq(>rH`F%w9r2%xRaR_Vj8puVO%+0Jw+7q(IOtNvy+@EJQ=X+)wuT!s9270Ib z07VUFqT%UIE*TN`8DR}&AQ+)xm=$XaUg}#F{1VhDF3m+GziceR`XDi(KH;vvztkqI z+@8yxiS^b!8sJw~V%sbhIJ!vbW3nD}m`n*6xeX9FgW4OU7qmLeY1Ar(zu_jTwKZfr zFjEv^UnjyKzeAL=|BYTE(17R-Gbh5~MHoc~)QgzOvkDhSF}$T}j*Bb;M_St~y#$wf zrEVviJOYYg2AKt$A>sCGr$SiySxmIKn@O&fzU9Z|qH~+^0RVx)>vr^7T4Sn~TcNjB z?HkyAKX3f`(B2+r!{KnypY)H%{gd(R*#3%E>!?2%j!s60r|k+_ zd_4NT{{HOdmmjOuqh+(f+P_s0;Oko~CipdUMRqYrE)n*?2-m9%(Miw_3XJ!eJ2__3Og_fJ1{5JD@#K;dr_mm-QaC z`FCy-fuXea$zN?#dGtb9P*|51rE(fwJ3K8V-mwpbDpR@1lWJ8I^)lOf)~BfYiBsxr=1w=_bJ}HXo$LLsArf1wl)gm zGG%4SRjm4IsS3N06s9w4^5imeZO{v3Q!1NV%#+7?UQ9Xl?(Jtd6WY6(VbPY`0PpQ3 zkCg5Y3y%s)AG46nsn)S*5mmRsZ&bH|*Y&2DDAjLMs|OJxOlO6jdmnRY*VY?R^No0H zuk#DVX)Ybt0!Bo$B+?NVI{b}$dEZrg(RLD70|+L**jRwV=Y>M2RpmPtpY>X&DI#xG z>=1cb7sZmtW9GK(B^Rc0=u6*fO{-)9B8&@xn<1xA6Ss|$LkN!>XXW0;8Ry8O-e5c! zzzlgXI7;qB)8*i{sdD#YZLkmT|M%C2#f`_O!}00qXw+5#ZM^cUU~wy%|{QT3= zu*k08o!p#0pT7I^XEr=9r$r6OdkJ@-UyZZ>&f47M4ru>q<5W#lp5YT1`-bySr{yQY z3v^+FJ8tjU3?$B8^7!9kWWAdeuF$m#-qEhO%R~6Gmy8Yvv2XTuDw1_d5{bm-_qJTq z$ml0(TjJ7x(04fb$P(P$T9qjpD)^l}h7$X~SU@_Juvf+V&V_UasY*Jv-0{IqlbFx7 zyrM-)kYHtIz!p-Ah0uyZoe)@ySWpsBT!CZ*VfI>)R-a}9(Fr7 zaC+}ptFVI;y#NB?bhx9&@3SEJw@NatWueLG=7>n$z>GoUY=Y!R)I#&bA7A=Q1(zeh zIGGDu`5vvl2?B@v2{ZEWb@JX>k^dW=9dYHTs&yK&KM7-SGO+k4icO8Nb5vf69%=Wo z^4(_Yydc%Q7Pk%&jufTLSz6hA5l~Dr(lBa5P@2iEsBQ9dnVezjX$#S5nFLn0>n!ff zx}66>`z^LF{;i^HK32PWW+l}+OKb6ylD>P?y(}XZxWExN>Sw4*{c_kS_Z6QGtrKa& zh%Fak4^Mgj4$9jEv0O;-! zqrVh(EWH6vK#_GVuh8+UWHj(*$C^-teC;wnmd&{I!x_C<7kQLLImnDU9pLZrByzPG zP&AoGQ-<*y2!G&gON@48nc81 zv?>yg+=>dTj=;#K;Oo2*IiNAm`)vhI=EMw7hV!vK86S;jX8bFf@Q3~W@n~>(a@tk} zYP=E!PVJCpf6R0`d@vuqeVh$f=f%_I!+Sp;e)r@vW2TQ3x;`B>h3XcTXsB&{tsq2# z<(;}jnkUbTvR<0ix<;44mCM9zCw>hOYj&(JvdH%OriK&;UDx!k}aJI2YG2 zo;#^+Kkja6ORd_iywD_;DK0JoWJ#g>VEY?GEsP36g0 zHZ$>1ag*o*1;L`w7IT^>)3UgcQKTayKts;xVTvBM9((i%fnJaCSUwJ*8?TN(oK}KD zuToL%LA*r0j~u1?S)V`s^hpo4qSDV!} zN+P4ercLtX&a$r8)i(zRH#axEm04#t)Y6J_ao6vp)ko`i?YdiXTj4GFlFHkyl{S2P z#A(sIV!w9~^Z@ogqj^!bS4u}opc=X%^1w&q{lUvfP}Im3r&XT`GJ8nkmN0?h&6RS;Dr^1lUMQ!O>8;)!0NJ7R75@%aV|S${n|x~+Zn^<)Q7UwwfSI4w=5RbY)uu+OH?Hl^>0MAh1;;Q9~*p^j^qFqYHc zZ1;;Jy~ZwqZAA(29shm@3Kd6(2akHg{^{Xe6$X<{zo!i2kt6isrSlHh1dLYE2QVU%Fz3T=l)k`Ky!$<{F)S;&Y7IDR-X z*tPiSB?e7-2S~AtqNY66oGuTH+;sdE&*vbBs`($rpA&PvM!}iY{wxdfQ1O)jM>0e0 zho-U&VMzg{qGAx8)4u7yHDqV^=9^d6u8C0eo-f?oC)?N?MAfyG-RslQ_73^mtHsBI z-P)%F zC=7r_12pWDn!z^f!#=PR3x~G7^tZ?wzGa!mHEHD}V++dU^=5iy1tOa4bgWvULQfgP zypV`=Z~Tri=_HSOCj%kUT=tF*4;#%2R=8d4uv;xqouL-B$KY6BNT7p)(`}Kksxn74 z+~~fdJMk;GVIL=w)@@di=Mrh&#DG+yFJGP6{avvG+!GPWUgbn`_6>mVv&(xOomk8( z_uV+xqwe00BtUxTwPQi9q@0-sC$8q8y>Be z^@`Go1EzUiTnBu-Pi7mLO@umG6jY>Ux~X-zC}NeORA_dECxhY`YE=$hxe=enfY;sU z*Z8;&$R(lg-bNR5rt0FEs=ORwr0gaF%{reBpmFkd(o;Yz3^10n_^OvT#=+@}YUe4) zoOeRs?oJTQcHQI%`GGPAW*ddaH_jkz?^$60%u2cZ@}g|Ox1Fw0cH1HfCxPgR`K(ff z8KidEZBba5z4i4rgC{)Etjbj{5!6{z-o{+^-CFa&$QQG7#Cr2QSw1=NCucKl^F;=kZVX zo~6g@mh{*7mILN@HkJ7tRqaMMQlv&>_n7hV_~5cP>Yw=bVX!yyi5Da^FnMJH@g#9p z!V_!&wWo}QDJNRn&motQ+$%RL)_*bkpW~=`2(7ni^*aBU0C&~#S1*fLj7uqv?O{wtkleAtZ#hQu!#bKH{23iAbhm( zTgUw_(!O%I?)sAL$<>^KGq1<9oJ1zgpw z&(QgPMBJ4|qfvFt3WfO^P&k6NqSR~DXjcw^@GL#1nUc{$I`*@!^@yWJHYKl^Z`Vyf zHlJ3wp5uN~++M4YSFt8Vhdk79Gz6d#(MJ|gn6YWzrI1+5VUDbqw^L}H{`08c5%_ba zs40`Jmu4b5ZC;1Me?cKS$5t2$Hn4#k?~<(BsH_eyeP$=LAEGp#pNo}MV@!t6>j)RBM0-qfm$i>|(u zF!V62z}59>Sa?3Y1GshMw*2d={+Tt+9V5<|7)!fALcgv!xhF%_yCYZ|vNsD^@X z!!tZc`!qLtC+H`?h+Xr?9~yVOy9YXQmoJUD@G?wuE$_(E44aiat`4T8=koZ_a6@ z-58l)qAincm?!wa2k$Dm$MgziiU!6)b$8T9NVO;SOgsWG;3V zAEG(fK1#aWIe)4>fbQSVQD?YYM(U47LumUBN9{6F{L0r;{eAJ|@-NSS*&LlbcwRnT z&3^ph@~+6(ytA|0ug1~s zLK|P3pYj8?dE_ctJlDpWz_%Nvw6i^5t~@y{Z8;7c4+@yhh`O)Hu1Kqq0qtB6)@n&& zRA<3K))7lJRS85SH~PLx-IGmxEo>0FQvmwz-JpCEP8Ztw&@gR+Jy|V@P|s~t2|Kji z6JKH{Jfrc~wNoNkm&F_Fj1Q(+x?+kYF6d@v)^!k(U!^tV5Yi&=c5B1&kkIFi^==2S zFA?KN%=qBg5ODC;lo_QE*&hK$9}+-nk)oJG5ho}ex)2T-&dqSo^PAWv%Dr7k>j4MT z_)A9wV@q#VuBH@QZJwu@YqF1l(_3m0W^<6=(*1ZyKr%F}KWW9c~7la;MX zp$D=diN16Rl6a#`DOB39N##n~ff1DlblALRZlBu?Pesf`3Y36G%-=v}GpTAb%_Q^_ z>3eKcv~NE=rqmOF%hGQf?HxzDeBI(Ex3ayU(Wq}p zR>jO_K9RL7Rd1bL+PW+%lsuGVvhRsIu_LZ7;v`tSZ`jqQUc)+Alm?6Pc+9=oEH|h* z-IHkn>b}@>i%?l}BN=us-Lu-0(+?q~%&v)!w`ebu=01ng^=B=+mi*1m&nWL)6|8*{ zDj~mY&GPVO*t``Y*x1m+Qx9j2Y!`D=t~BX$r-B%ng$M;eywqt`CTrr?=)rTQoeH(U zUC_i?B;PHL?dg)DEmc6cxg6bD`G!rEkpo?yc5&6qUWcXsCdH$i11SPNY3(0%#yS#@&-TTv?6JsX7-evaq z5X|4h;ptJk-_>{}%85UgnC{Plzx(;m^9L8*Uw&R(b??7Oj~7o?!$t#aFz(+bGV@t! z@TWl+4B?1j0`vrb`Wi%>+VNiUP-ey(#7S)=2$|T#kq!J>~_vH6{{p8fthF z-Aq;YWTI9wj+HD5ERwkX0f`Q<54)GdJ#Cd%iw!^k+^Q8TQaDg;Xl+2P4&vjh&8ljc zgwD#%!t10X(a9@Y#e|2-8la~mZCbh_h?{%+n^OtPyJBjj%1F^gf8#a&;cJ7*5rKAB z5t&i0;92_@K*g#piPqXlgxr$uzu$mrVM`G&7so_leT)9B7QCI>#@gm4699t1K!9T` zc}np+=`+Nk)W@RUm)p<2G{IqTgvElTWIvbl=bN3!NysFxx?X++j3PN%{1c*tceC%ZcD@ zw8i3b0Yb!Xdt?IP7cU$`Gh~R_ZfHzf+DOrMV*Ss}+=KH-bW`H0Zoj@y-vDB7W@wr& z*wXm0u(9S_nGN2DafQWzk6R{Xab@$J{8InysD3}H_GWGHR{*0VbpQ*8W?)cE#A647 z75!7D@|mL&s=-Gq&}fAkJCVl61C8G=)HoiW^!vk;@nEoHg`+wn!@>CEH-;K7e(qlU zGJf~%Ah*k|`Tpnf!JwsQ*B=f4altl?V4@ASfuO_5n4s^`Fo{*5bR*iGsxgK}>}!-x z_0(2S=6!CnD`4dXMRV?U!lyi-E@eZw1zYnvXDoFXBWS*$nOR*`pEU?ENVPctS_g9d z`UsasL1#b+#O14n>q!+&-jEQDrSzKewOb9E)}|~n>qXhbX2c1k4o8Z&_Nr5EUuohq zZ~`>;Fj8BCk*#CuN^}@ZKfn><@9)&M7$n3-rcL9G^P+ST^>^;SIKSKOIe2&V>mYlo z&g{IHREW%xb%s`RcI;WjqlEy^_y*ON&E$TJLhNz-WTDz)PTKCJ^mgw&{qcwIFYo%s z=;uzfJDl2gWuIkHbP1m`4ZYps)!U+qs#UWW~r#F=U)0!(+eLW(y~r)!rhg08zgFk1hdWQxWs$Y8KeWIx~|SX*Z-s& z*Cb;j$rUAi)w4A^GGM@MEJ~--fXzXLi^*aEOu3j$QguK?C|F3TOc$7cmK`tF?O_n> zP3eS-g()WjxZTzyKuP0`E!L)-?M{N-tJJ{5FN4#5Ki0~3J4pC`V05u7xV=C(o*n$n z9sD!7|KePB;JY1^3}wBog&Um01aN7@=}Ka{=k|uyOD1=fzQA;oa<|7*h=|oq@-v+C z1b+wQlbpuFc}8T7b`dr(Q+nV`nFg@WrV1!7|G?=Z?9qpF@sOCBnN-1J$R$NP(7VGY zR5jXqv0|>LeC8|*r0C-qMq>5ak~+C{X@|Aq-8A69ocms1)NYZVR;?3JhjG0CeuL-@ zn4n3%-jv)}^wDER1Obo)A136?mW|aD7jL&^HR#%##OD?1$ANtVr8it!e;bL`$GFiJgr)> zJsUW~V7$EFIv%`n0#vF}pPVls^Mz8i6d>JYhOnU#Kbxb~9Ajz=5n!Vc!g-~C1% z{n!dRU;%V^DL zo6M~V>H6@O#L%zMRw&k_quBt_4a{Ak|BudYXb9=Fi(k@uh5CEGCFy%=3=vI^5`4;Tz zyeO(A7KhEUwBkuJybBOsVpb_amr0r0xo?I&Gj$F87&hm;aQj4Ok89?K_kWYbe$QF= z^v4$$$^ZD&iT6Lj;>_t?t9iceJh+%2mr!iiJQ{NFckVSV^j-mxF~pEeNTInw3M$_K z^I<%Ys`h(9CwYhl=&N4xT~V5qsjE%=iKj+dJP&@^aB_Fti)6|n%72VvhfI7QqM92e z2D`lKiALCu)ozC(SC3424dGV&#wCa{+&j)>_|G?GYAhTs7d9E9aCu&=ddYQ9A4MlQ zIz8mr_mUy&+QXyddGA5*aF!em`pKPPe~7J3{iIn$-iUXOn~Mq%PAX6$ROKR_BS~-+ z0-1WC?qkqaeiPeQ&(v_I+5B9Yh4jxd)U>4Wo>z3c)aT#ax>>(mrrE62p0QJk>?MyI zZ-iu%I=c!^M0^Dps9qc10$YoEgt3jR3iD~smgb$aJWp-%pqHGR%5IZ~*l|?zY1khe zOUA*5GU@r)KJnz2R<|a@6HF#V~8d%+4HH!)CVpVMk!{4T>g62s%z122S8;5|273M@N3uX4@!H z_dXlQCz2^7hk+Ivk4NIf;D2068OQzP&a<;9`9NI2ulVr(Z+y>&b|b($lr+r|lz-$` zM8P>iz?Ycj0Q`#@(F%9gM5JF^QWS{Us`I}bodToBS{zub0O4`lRHp4rSMgl zzQg|AUh=KiYts}a#Ll00Ztfm+3=16Y3|mVaoJZe}TVfiJ7sStb&2%5n5J5n!6B|)j zlW9~QlGWml8F&DN#cT6fx0rW%jcnLcbc>}RyZ|8`gTT>PEE z$dS?V-W1~cT_r>rb?c%_*w)GtUs^?EjTnd`+VN>6MI%q5`TyoQf^C)SFf@9Mlw%a4 zI*I3*S`6;E>6%AC%;c#gW(gC{~2h1quo*IS=|MObxV{%H4-jE7cN- zd+D61#aObHv}&DLR>m3pnx-OFlbnSMW>_GyBE>wpZ*fN=BCB^$IY+8@3W`E859gZT zd_KJYn<$1-v=XO)iCm$g!`$7DzYz(W{dFNA_K`BL>KVX`$psp_$$2re@ioaXsa`sI zn(<*Gm2CH0+O$WcxN|wKkpI#2hG9l z=enS^LsU-QQ*~@lcS7Q$Cc%V!%N^N2esgKrBbM5qAe7N%{+w|C@4<^@w@8sD+V2Uy zpizGqw|+j0V#IfKyIsl9Ra-%cD`%HaeA;x*F}?IV)g|1Bk`M3yS8^8WNtb?O`vDVf z#RqgLCpsRCW_>6iYKh)S zHFB+P^>q0adb?pkcarD5PPD4edVJtm*^i2w9Xs2KbVr=&h=PsA+#xLcBL_r>2k*NO zXn!xcwCh?(SNQt)UZ9d#`A;YpfOloq>-a$q4+i~%N5xGS=XY0v?Cx1MfH0nOp?I1Uf`g9G`Au3So& z1MEioS6xN82sU1LqRKYM8BwLRtqx{(ZZ=sRF6F4(9~{KYt?qSqC0ACxnRW+*V!M#X5x=nY%_w-1y^6+$4X!@cC=m&A2eOvBA&u@zZwFVbmHhj?ORm%bB=7DkhAW83)i*Y;w_VYa z!-LxZka?E8WMtqXa@SSqC68>Hze~=6Fo*tZ>*2`gkaB}eA?J}LD_5ET>U)qBgYn!+J_D3uKemwj4 z!~S@1@~?QzC^ldt06yj4!~Ootu%G7tGVIq&{O2pVYbqoD%dmeg_wAnbCz>8|d?Vu& zqx9y+?Q9q0Mm(m&#xYIKqbgpn3F5frT@;N;7t7?Os4>i&1-)MKqz4_>Ypk6o_kfUs zra_L~`VukwY_h?>9?VkcDfDh{>bS@4-*ATQag|CT$34W{ta~m&G5!r$bW>BCtXLcj z#>a!hgL-MZGD=9Y8>56B7cXx(N?oC%ckSDC#$IZdBmkMk;keQIG9G*3D3IEc)1vr zrzo4eTH5X8|tusb+D9mmt9nl1}K{Fmvv2NUjm#`9vjNDuH?jl+7=MfyiJ*fRU?N2mSMf8`5r z>wnK@S;;$URz-1RQDyW>Ze_sf5EW%xG=`}1EY-AT{>WGis}k=??nkxVi&y~jha%go zY%&;ilIK#e5>2E*kRvvW zm#@x}Gto2TtzbDcDsx>ywx1WQh~ey=%U5G-tuS|_>q;nkU|jukQ2RrtchSxf*% zSD>`XXB|{GMTi;Jztf=s?cXlL`@ImyRaW@0x;&864drjpSsV&0mbpF1v>}>Eq4Mm(PbMhmE~=G(5dc#{3+(#^iaC z{RTU?XX$jA*_*U}=lDgjp#C#kO_yn22>Sl43iT%BvJOlWTSMNCUxl>!j-TJp4=x3> zqqVV%moHvDIDdt0A7Z?t!~UqV%co_L9@4Xj6_Ifle0Gav-4Xc-$-$YO`>UxbSF{QfY;Wx)h)P9dj(?>VMj@xkC= zaOjB%Uh>T#_Ckb|W?uN039EPF;2|Q~y%+%WNUlJn@aTRaibjHG5rti}73y8pl!~Lj zsX35N(YLZ}zNT{t0Z8Fa>p#T1NQH&%9kl|IHSSm_{}mvn`COiCCBS}?hx--G1gdfax^$P9?z$CcJwRs?1!f(hbP1F;h@cgYP=Gs zFO7Ayf0^2E-*pEMo?rabfBv2Qu6i^-ts6SSm#0UkzpvQX>)gwY#pIw!Y3v+6#~574 zw0>DEtn2=Lnr!_@)Q288+|f6mLAOSp!eg^Vxc_Xn^(q^;Ja&$b&nH+v>J5&D#|M|a)1%W^TkJwLtG+F*!ss4pbbTTDmzF+d@%k#KTg_+6 z8+}Ez!hLkfkmx-#AUBAf^K;}zL83!w1Asj_=Cf)(IB5#-TAbH~G8$vO48j-CHnmnF zk4R%odhYxJf}Q9Ol2k>(2IVPn2mUfkA(KAg)XJ#8;`|A+Q2w+(wfgz z=nU05%`!H_9H`Kv+Gd-Iyrde4@^6s!<$5FZfU=?+D+9`Jt=1c=`#39s2uWBo%><{n zm)!H{7^+1HcBZpi#}J{KiZ;8dZ)Ak=2(aswwuhUJS|Y6Sk%1PDE_io-LJ2Hfa^O9e z;fn@NH_iz@c5f^ewBn;Ft$UOzf*Q;86j~O*j?{6(@eAjP#yFh-frw+Uh998O{KJK!3ll=AHkJ`Zh=7)6?S7`|iiXv)RKJr%ipEqtnsXBb|S`W*kW8mtRUcPafyVWt>8t9`&K! za&$U+o$nMG#EMJN({DD{HcwUdE*QB~8xUN`8r3XXWMcPm(|-*U{dFF}EFxu}zXKgT zjLk>c=s}iV{Tv%>H4^6bp)auZyYPsYp^6YMK&v~<%Eo9*NNa*Ah7*O%^ zP*N}T&lM?F1ubq2$$`10p;ye>aZ9Eo7vKQ|S9wYW z4X4~I8<^Z=TZjSexIfF%4bN%s4&D$JaP!iWKm|70q7FxrKJ%R+)RfrFip*9FgQP7M zbT$RH!xE0V&O0h_wq^EK3MZX=499P#>JsD+Fz%pm=bdx2na^9)B?1G^AlO)xL8nl) zlbc=7bAV7wz#JGbZb?7~o_RBMlx7G^;%aV|mZdyI>WU#1SfIb}J8BY;MFWlh-Bf!9 z=_B*(E|iE-JBJn;H@`YbGeP1`?9yDPMcHXh=EjZ~WSyFbg2+01N%qb>)#^L`cWOKr zTu{}>Imrl;tA|{IT)&;cb%^WRJ>#jBx9-X~m9}e2kVSB`?7kcW89Is07bxe`3L9?~ zKnJjeo~&+ser4wKG)p5njTtPuWxUpwl_vkGj80{hKnraSu{l}4ylU!vhRa%%X2xfZ zFxh=bapfM1AHJG_w^kT5WRPHdA+cql)v2X%*Ri(c)UIn61vHh)IlJ9dY79Cb3kk5d zPW#6yrbnNWkH-O;d3x@U-k|gRy!H&mxW3>hK8R{b+}TV+vXJYkN{NSvU-~Cw<4ef`OaCaWEg$n(Vh$5|I_Z)O6v-8jCwx* zKJS3tFx|}Oc6QgLEer*1eEk4U-{ZdTIo!CFj&cL!=}7}|<{OMvOV!kCe>HSo$VHsQ z=>Zit82NAzrjTk%-qsPZR??9I_8ig-ia7a4z7VOwp^lTI?tv|zlH5<}2);k;~YMt)96^&xmd zwN4UX;MT@5Q&*u9?GI}KIE!_ccm(g;-{ro1R!?Eitq#fl++WUO0!%V8k2g6et`YYY z2i8QbB#f7>qL$z89FeioB_;XkhxdOADql;J&0Vf3m*tPXH8l8fM&Ma6taI#HCcmNn zy3S0V+l)0hS0@&}QAu44dSH*1b z?CaQuq$B4#vtOOb5{SsG*YvMFO`}Q1iTwa~UssWSq0_B%J2Y=KN~~R4=;Vw8>9V5i zfHMkmX`@$cri7bLj$D)0C}j7BiYAYLIo=045?QUJVWL=5c7^@8yVcvUQK=7LXut&-cV(20 z&TaWw28F*DtKs-`e9}KTJ?!_7_akVJ#)mC0hTqC+$o}$Za`e+Q{pr=a?;j2By?pun z$DcnF*+)z?LZR#Jmw|)?_w${#WWLD19&K`s%2%Jn05uHBJ1qcEbXAJ}aj5@irkrGU zY0a#cs0YJGQG=n^buF8?(aBh>y++k-s6y}g7TM$O^%!S)q79(iQTn9tPRRPj6KMZ$ zyO1S7Q&FiBp?KnDk`M3y>I;or`0l=>l1|DLP{((WM4&9H5-B*{r?`Tt5bW+Mtl6nP z@k9F5WU@(_*jeOsq#7WNjHphJlgwV<;0-I-uTY7E`dxCWzFQ;OU4EJUDDa*eVA zAEu7BTIg|0o?ggem*@k&hQW~KU1x^eqMk5TY=z)nP18?;ar90!9)?tN5 zGP@fw!%j@O*r=FEl}xfi9MM_1mTNF1r#d($ul6N2r1Qp;mJ)_$7~1n!UXBB@@}sWx zQ)$x&wtDK<=%yyi0OclkM;nuNUr30`4Vh>ZS}2Gpm4Y)^26+!SjqnOvx2AJUBhlHp zcQQAzqrKN~&Dpaz*G?y>u}OE7wIO=}5(M{9cEAS1qp>|5%}>mDG#MTDcfbapf#*CN z9338wj>ji$I$GnEXyb0~p8GfF)#j(-+l!x`Ow%8pK6_Z$hnxI)V{;yyp4r8y?1mUX)$Wpk=MPU! ze$Cdrt`f2?Pz&Z(K<3$WYPj&bT^HbE?fZ7%V}X@B+n1Ez{=8t=ypjX8!^o670Vr1H zZESJ%%#`)gB+p*wPcC+s)NnTF&*$T#QQsVmkEdU}q>jhqqyEX^=;UzF_G*?`Xfzrh zHocm|ly}Q%Zn7#`Peu1|Gv3a#(ct@HvN)PtU*5}G!Oqcb_-Iqsx!Mrk7ZmUG3&S3s z{fIaq6Yc3`cr1uLMD$mT-l{cCLc)8{!@9O*a1uH%XeV3XtO3xk>?99XD+8`?j(k9g z0iOz()48jA!l5+?#M)NbZI87u1G{gsT#3DiHM) z2x}VV=Nbn_hs1~Xe=Y68l+;L4of)Lpq9cd@D#~PGQGr`8w;$gBl@ptc3)vm6X}7M- zdZ9P&yE9n7EjLw)9=v#kdZ~Jxa7P`9Th^srYU5pqO;q#p06Rh0hLOP1t5xGn^Tb!u zzECg|q=wgMFIxF%IG3A_u^lZ+R_=V1x?(4S$y5rlsT^);C${9p;;e7{QY$!R2X2k7 zB;Yn?iuQPBXN%Bu(<=zMusl&u74h6M0l5a{UX(7!&Ao!44onmus|{); z)r4@tjj4mpvTiE1IoQ+EZa=*LPqd(|dItLZ(qZh)dYzfg%*)Qt*gFi5FThz5Kd#mk zNc&&VPyj0_d1*G)bcw$(?j%uKs+$q0UX~RvhtC#oHuYpM{o&rGvAaTV zpUf+X-%8GAC=Zbi=<4(@?P8OO zYt)Otp~U=Ig~YRY3!NzOd|;{?Gp8 z;o=ihI{iz!ph^IhMF>q`?~AQf;-$z1(AN|>^=8&e3SLDpJ~qiF4}Wz> zj1D3JAPAJMQ{l7#RJNr`3i5q1Ar(F+v?onQFeeR15RBoQY*yKj_waoU{Pt?=hnQbi zC8$@$2h#$*sImiUf*|zw{ z|5hdU(?1uBEG>k`6D$v3|I_RI^*>#L!+?>UXJ)Yo3j0u*MRUc>zyYrPphUhEz7K-q z&5?Db$gcZ1rTXWpC<#TlAm7Q4xu3RK?fZ%7sK`&v(wQLoO+8)eOC$l=dI^$LDE)Id zS&;uG8K3q>|Kh(ssSKOvcH8`wt@Oq4^=rHX+|6w3;bvw9DOY@pu#WtvW`&dSk40F+ z>q4!7gD`9Qon$=hjibw9@UiDs3o9;!dL5;mV=1{eT@lEyokzWAw*G6hO#UVa;>7}) z`MNA789D{d(r>CaozoU_CRlwr8(m5aD32mYGu;uSNmfjHkn~9N#l~cR#F}IQ@jjdd z>>sI%UknXHWhwpoyu z98L9Ft$?@PC&^~zXC^30r#vTtM6x0fgc3bhVE&ld*Tiliit0(K0a7ike1TeXyLes8 z|99j6+auaAKOUc&+1#9*9?p*EQ~Tv<*6C<)eApk1Pfy$Q2o-G@j}Dtr!OmH|KOFew z@@#l>YEJ&Nt?%9M&cA)S_<7UR%Q-y0&GYwn=0tps5#Ot(G)>cp?@$ELIlB33^RrNStS;L{aQsFZs48XN7m`3k(QO zr)OHGy=SU)nmmHtnD8^5>G9#Oqel1~NY+`&I<$S2}+FOW*{ z@jMD5@A6bH^}`B9vU8$N6gT?e{omXOU;|>6+=q{IJ7cZ>+4Q?K&+RsO zCcR{EIzFLms}X$7-5$RA`;Uw?ehq0><|Kp z4}JJldIXzwvNqEzL&moEh{TMU6WK|rQc7~G^>f6H@XXbY9G=p~QuOK8DZ-nkw~TqWoyX$6%Os&aXh>TJ=RAT6hxmCQBHSU-(oU4J*2rCFz> zXjbtOw$4gpo}w-?ODo1Lod_FF_rHL_bk4{6XeE44>xg5E#@f_L(i{*aoaP)xaaD3# z0=Ar4nv2uJM$6yQh6yvw>)=S~YeV4<$nMC|-&{FdCqN$s4?3%8o5(J}i!0;9w3;q` z{IyDF(v@Ep=#kkb{M7AO6b6rQSBoMd6_w=tQ?Vr&A9(PD$`un`BXP zZs=DxSUEX_UCRP~X>q|K!ugu4w1$#B#BT`lyixM^W2UDjzBe4DD4|~$8yZbW*C_Jq zb5j<2U%{}{?}{Hgu-HN)5Lh!|DdCr*izcCEM`kO2Wfr_xSy1ZgP6&FRBPdmM^3Nk$ zG!oQTl*vC2N4#trA*x4eyA;O!mE#-FpPjLQ=p50LE5&JS6fx8EP1S2uX*wqt(}Va&o1ZdD*=zjN`pwF8knI!gx3P5RTUpo zRB5rN|G~#bZlL@scAGleY;wG-TvrrphtD_hO1dk18$($M6Fvdn_R7u(7i{p?aSwGV zg{lwl{||x`+Js)HO@bnuUOG7Ng&VeYFBu#i_k8w!%f!(}NTnRZsXqEp7+1}+fDdG~ z%xSy*K|iN+RzD_bu^(XyNoor=++7@oRx0DR<650%f6xus{RCntO4sObRU2wq62aB+ zrei!mO;ifKW_eLrlMX29hBD2k={f^88>80$!llM;17j=2LB~gg>^U9?mVF!u7WVXe zw!C6-lp}a<)_5bFBvn=C^U^-V1Zz3l#SrBla~@=W9M;3bV@?000*jXuCW4^IuWP}W zMXOXMb_gtQOLwj}8BjHo%-+7&`x2D+CfumsCmPD!IdQ!#Po()g+lY~Dq1=7=s+wsX zV3KK-3{DTrnNz1wroIg-V;?ysr`+kQ#C4K=VkZndfcNX^viG~G0rv+dr^mzb(cxiR zPV4u=&29cgYk~q*0bp| zSP5($%B^S?} zHKi(Ub&?f03td7QIAH?|3}7bC5uA;YC?=tyRcfmG4fwGpMewqREz(A7}} zw^Q&EUe-R5uFKxw@aPcEH2u@VuiZx3iy)L*tL#wz?ajkR2g~{m{Un!QR3^licClDjz${m#KfH}j<(gWxgMN+MbqF$;@$JPg(HA}$O zG4e!t%GVA36jz9pw3fl;6&5n08bR6Tg(JTykT`Q^m=O5z5K#v~Q8}MQcR-I_9kq_O zBW9Ygu`<9zA(ol-aTZb#Th)$jMJtYm7)Y2JW`Vk+oRSLZcKN2X8LH@#s_D|sHW@Fd zAv1ufAquLCEmPi{@5ycLZ$MF`UAa#$`R5)l)?e>+e&1GWP}~f06_yt8s<-9(F9wI5 z5=UHZ-n}3drOH=-vMm7{Hm`6bNXs8d&dy}>ANCbNN`3152cS#X+KO}GWDN6PqNSul z2hurJ%ARop&IaxR7AlH|B%_xP-&wc0E={Q5Gy!*>8$pQ#vUQcQOcgxIP9-MN|M!0Id;XXE!|kwz#yvc_CFJ{v0mP>RJ?Hw+#S=L_ zJUIYBV{|MobP`-xgebRg6riJmv{;}e%(ap5&4nNX%q>JSigKpe2KyO3l`=QC`8ojL zvZE{$bu<}o3Cmt920KtRryPjQV)p{z&VoHndScRKVUQ@bB~g+pJQ~+TCgE(t>PhK- z9snR#Pg(YG%?5W@{-~39R#4EZt)3GO>-D4v^0ge=qD&V|huy-%y$A6?>K|290|`(+ zDt1+SfO&;FJ%8+hNy`8vGxV#NaZCTrD>l1=^exXdb~x3-9PA%_u>wE|t+Q1&%QTdc zDCHVu{)r=x`|F@;V@P2|k{PnorMUl!mJd01o0SkTD7N}R!Oew0ZBcQNz#^k6x2QG8zDmT!&=EB-D zq#{o*-x8_A)yt;hiPYPu7#h6mcfU>Kt8cmjT2tAhuA0?Tup3*wBm)XAC-dg-w>Rv% zi3GeFaP~z(DW!E$QHQ1ByfH2Ec}lnEsZH0lg0zBphfi@@0O_Wq2Zole9$tj2=_|L+ zZ1C?W%EjH52Ka5>A#JaZZguw{(j%9=+o#>Vmk0?r_CHo83vm&gJ|Mq{ zE3JCpnarg1yL6UTu@%Tyck~#Y31Mi3zO#95XIlpzISb4Bk^WMwsQGmeBjHXvzyGa9 zGMh?^tD=T(yO^CyM}=KC_tnzga=!}yZ~Vpsf1MFVqFUO_CHlZn+&jB`@H!8?BbPZe zJeYyF3_rF9$ijvQ#)z$q+LEp>)(vjoOSM7kFk{F(1Sb0bviELFZX8*b=&!_-b)6>1 z01!alrH4AnBq^rEn=&b>B%@iG18@ML3`9V2Nf5Gm;6F?~Oq*4|_J{FHj;*z~Um}2{ zNL{*X=FC%-m_Q)H!+rbqz1KzW$bVU-W^ky5QWIoPHrxsY)akH}c~LtTc-P7go$eGu z7Wqts9fZ@ad@NHV%c?}effx&6Q}c%8b6QIiMdr*}>UrJsC<#=Jdv9_xG5M^B)!OlE z8zaozvM5&f2gys8kXF`!2@quop-0m8AAKzzRBHSfUYp4F5X71kt4TAfv@3#^i92OK zeru-P5NmAh}mpTq2%B zDnF<>gd8(PuVNER$znEXtK=&tNv5CNSKAvQXt+&B4i z2y_-@+K9rv^&afta#;Ok{|i-Z*dlRb6Jb0r@Z|l`SqKz^Jc4eoXf zy7Ehr!c-Tb;;ILlnW>f&RS{CrJ~CScH9Q{oM&r})pds=4JQ4Yw&9Yd@XPaEt9t0)$ zYfLg3Lea5x5>aFM;+|_d&z4zxS#jhCov9tq#0yWNj;7+9eCF?=?LX~rq<1tPwa_+z zETzgN)Q9<80I;}eK4pkB7;G2wyzr5Wmg<_bwjf~OmfdTp3bpA2a=?dF{jtiEvOI&l z4RS^;2oL~Z zbwp{*&!nVC9F!7o-Cm=9g)L8u?>clvIqZn? zf0y|$P4PE*K&g81mv*Tsl~%zu(u zp`2J39)WBuwM1?+3Df&$!I)0 z9sg%(y!`yrtGRvrtT_Dc>x<&~qnAIdUjN*7CpZ}02D{kR@L(gdt7bpNL}g6V7bp?9?o1v4UIDQPOzxX=6Sd)7!OE?$0n`KWJ8;{a7sE|luzES*cuk`EWO7*UNA-=W&nO>Nys3I-Tm zlB8T(WUEuJgAl^?v`njXPmY_MPp6Fco<-$7=ARXt{-xv+E>H7R{a$d^s}ZYLUMuiy zh~GpiuAOyAt7*Ly9Y}6Cl8qQmXOdBWVrMuVB{3>^M>)vUVkGn2lsC3cu4F@W6i27! z6>>DHTlb>W%3EGyeDYcM=|if?lanUUb(pEu6)G#mudJb74Dm|j0ND;x;`J!Aoy z4%F?oA0e`yF0k>oKNz=lY5SZPx)t_zOb3ut$^H#ujMu<@SR$?Qnj!3U1UWPG);e=Q zF})Ri8Ubr4OS2WsCZmYv_vFzJBS!N!{CJ)o^Gc9gRKyrkp6V zwb+0=GUww3spi)^6CU>mj6HnXeIdD%+x8+wE1!q=B(WA{l!$`RUb4~EXaHA-Dh5Oa zv{vC>^p0vnx>}_RrB!o5R)geGIPXE)z!G}M?KqqfqPu|CWA_Nj+1D-v;e|fb)$9fb z*(NCqAOcwRYJrO<#Tno+fgCYC-}+0!W|tY{ z{yT7cn0~qEDpG}di}9@JC50J_xD+tpDn$|V$Q;j|i&!v`GEmBv?2M8rCuv=xH1#i| zVQ)Abx~j?4tf?{-20==F#Tv0M8IAj^A_v2Tn2R*8YHMbn`GglY?krtp&7mEsEpU}|US`yE2J163s_2TSxS zYgc?#t+ij;lpDG>2W+gF%_4QCAg@kkX@#W7HTEL!0F-A))v~83aoAQibTAsnvdsRO z{BP}{>~&4fk`4eO*+D=gAAmq4e;fwl`1IuD>|lH}JUQ79f;||IPEURt2IAG|=<4YY zFTbu&t}e?T76&Jj!-ofL48(ABmtN!tFc2T3OyoEk{|9;Q>3Asr=j3Rd z^b;hwRR?mZFfiBpWF(Wb_y$*2V<{IMS&s_JccCP*(c93^!uCX5Ad{=d=g)S3hf2#V zw0b$|jF>9g4u*mfi)`-Vu>nfJ6BOC3PtcEqGikhrUt624IlfbDi03T?4{rLV9d`c--INc< z2d-=RO3$2V2YPibc`;W|)P9BqiT^rpW@+7WHY}Ufgr*nLcMV_1O#D`eVf%dzdr|p* zbQZT_+edFlI0P5C?-jBP?<6twbCHs&<40H8pGsFosdtmq=6UJ}Xd$!I z;a;)8`tv-t%1<&El;2&KQ2`*Rjp;Cj%+bL@h-4AkGxJ9#x=h+Lv+yu2$&37x;`al@ zW`Z7Bt%SBgLPh?zXqy0QpcGrGk=EXkn>s}>2eB#THfOQ$iJ49t>UrVd6RD|n-w_`o zh$NtbE5FhZ@KxLCGEaYMY;Yob|Lz|YYtP)&k}pvA`|8>Gec9Ax*zUR$R8PPe8YEZG z&P80@%fZy*_O&RonRjHy#f6C29S-)ix9wubMUktG2j!zUb0R2j^o}l?t$hy+ z*EY4u4ZKOcX04FcsaX4>gC(Vcs-Yfd`9KWxluO?7N*e}t7EXI?P^FbhTSb#kCJ@jn zp>mSgvP9!t=?kzLM0WE2-G3xcAdevaVmX^<{;}D0Bz4nu3*>L?hga|4{RblBilB0s zhKo|KvvFy12N_63KYc4-lUf0q$r)Lk_zz_2{3dCGua~>Sih+>Z!q?xw`$uIJj~9MX z*EY!wu9Rf5Sjo8W!dlPkQnR!w6No<^L&dVqE%0Fvsp7V6L^6JJZb8@?@*p-ATL^@9$x1Qj2ioijcntDvyWt5J})0SF@&q7hk#!IXeBm;dvcklPhfVGfUR z?D}cxR8wWvO3wBfd}~>Oqo=6y!~L3v3M(mQ+!H}7kZBcCW$0Yl4ecRX7eWcrlqICh zxqrB|=01<^nB$aWP zH`AMKFL|C$m+1n4?-%yg%nbf_lY9wk$+nlgvUy%@vs;s=0<3v$-x~12_{-}wD}skD zDo!X&a@eZcP#>H#x%D|s9jJCV93T3z7)WQCBQJryB0=@V#q~21yEb;hfL-K!lQQ1k zT|2-l{G->#)i2!3r&UJ$=qECo#f?HM6RPbR%3i!#mqzWm8;1~(wtG>o3xcLuU=jT{ zkxRX6$5c>xNM1-Cl3Yjf0|8h2{k2vX3|Z1)q2#q)u=Y>!GW>vxyinT#mIS4G>^r%o zR}e#!mRF)l>@x@leNb&+k)$kbD%vx0pC&DH?^^Gg4?80q<&v*`IZQaz8#0{mZRL@yS- z@$IE ziklD%Ewp)1P3pCAj(V4p{?6 zkJ{jzsscA*XVxmYQ6FJuP3ASaqK<5E9tCAxQ(I2riUz_Hd3=f33ft>G93D$4q{5wD zui0qDh9o*={GtH3fFqK)b7l{=b+B(Ysol@(5C+|P=~cAE**8lF zZLNgmz1C7X$Xup$JC|Dy9{SN%Zg&zbEkhJ%T8161&G^SELza`FI|D`f(NNkhT17g) zxOjYh&5wEy;(`ih)K*AWDT+THAdJ@|(2ZS9ALqF%?{)xG&ApxwNZeuBzjwmCK6DxZ!XJcUg|B*MC9Y6C-2R9uWJ zn*%;8oka+4OX2oQlfy`?SQ%Hey{kUUp@?ttl?A3 z?IN|gRXywAysq-bC?g_lZ5edK@sUdvic~#hDRjLSrAVSqO)hTZ?iMHq=Rv8cCc*G2 zBMOC-sG*h z6d@6e1A|CUnyOqpazi0%U6Qa9Wyxib&f1{ttM9b~6FEu6piY7F+rMM&C~|wHN^!e63A+1HRjIsULAnw4xM_g~RiOUr(0EH*+Pi z4U(6{V+!o+Rzxa^R;t7j0lz7NCrSfz53XiHZ`V>NhC@IB`C1AC^ZokwxEuF;h{E%S z0z`C|9xIZ9_^?f!gfEmZjT|BBB89&l&mlcsl+H%iB(oI%j{BNqFu1EJ6f-x~GA(jV z8*7(3HTtExk8%VHqE#`y!TW~#I3QJ!1fqa%c-d2vQ}f2(CnZ0SDh1!i>Ly+587z`3 zcHo2=1n-|j(MqGRXgTwMg3=A+Hm)wJ&{~-!gk$_I$ zd-j~BSwV#&>?krMkt7WBX~nQ9l45u7R5{gkSuE2@ia09+6W@yxUJ#{4xiS&u0GuCE zgg^hQG*&3B6Nbf#6BoU{ipHdirQ8fzH(U@w9a)?i_06p0wNhnZRwS3nq`?v@r2H&{ z$jw@2*=p-ZJb0@+k0~FiY&QQ3uWoQ(Jfpd2gWuWEa2os4C1_4F&TO!-6yzz_;^1B~ zl*+{f(5<_ql0A7jED=~`%9DzRVGS{a7?j2;_RbyurIRDH+wfBD{i;72?@xAi_H5Z8 zZ}w$y?c51njGdHAe2aD2qr9OKzfsKVPT;-EJx&?+)s?tA)rHd*Bg0RM7km+gOWgCO ztfa&(vg9%0I6Rlv*l0cA#K4%gSXGXlb;AlwL3YvwbmxOMrD5}{6ge|#km?30dw8~O znG&>gue^t@xO5@HnCWt$xkf{IvYJ(*b|cov&>D3p3Z1lW%Ei~bcGNxNrEY}y>lU^v zm+0(^bVGbQ*ylykHH2TWvtCeRZQimoVemfhpIrOqgRsnXz#^BIPigfs0s<<`{$Hqx zQ}4}>%70>o{A4sd7>-Z=lPcs7Py0oB`6x3#9RBqD>E(~-+owOa&ekV~cX~_yJ{&8r z2l}G8RnX9(97H2Q&?jYTXRA;~e`YrO%jo-9R=P(gN|u;8pscAs zBnqnHa{s5Og5E{eIypRqG5z=;IIel}DS>~a>Z-5xIR&+LIQOW1b;ZjuZeVQ9khXff z(lV{+Z=!FRgTgB}IpqR_Ce}2v7x?CSki2ZXLqMf^Sg-BO$%@dc$q>NJPNK6)WMY%% z3+O?aEv?bCJ2xH0BthC$5f6P)13N%7)c_48y(p7%oZ6veO{U21MB{!=~4w$`Ox zK`250vt*e8l1NI=p4o}Ial}9$>M57b8P#w~*jp_y7fmgPC!Qrro29%fqLE@oai{|i zl5hOGcQ?h&%2p|Q9v2giDXP)xI z7qD_o@;OiU@a#cL)xiy=bxhpMAOS{((vrm@cVz{Dn}GLe!;V*0n7&-<(Y#H<{1 z5;APjJP@ZP(&{JbbZW&Yda7EtTjpnc3~|!{@UUbPaqh?cn`@}#vma19gEQqxu*}pz zHGpG>)p5L49B}R^Jn@SYiGu>ZfdsZqaA;?Ru@`ztTwJ}D@X+T` zJ{+%4-8}V0nfwN)VcZVCoH9Da%come>a`Tsq8pV{whz#T?GR~9>{WC9Ai0$kBXoS_ z9ET>aHnifObeMPWdeVHx870XtCoLpwx2~UToq|UDqLKJTPd|`GHU);B9WGL#biz8R z&E|dkc3mp@-lZBLs;XHOW+aWMF5<`7iNT!NQV)3l?jP8N7a|<9Qr#eDx-LWCa~25{ zAtu&J77P$78;8`qW3=368wKdp`*ujV^H#(0FTFvzk98w5>KaXHV&P~RwU2aCp%)z_ zcY~?Z?j@6~YC^rfWipY51}B*n9<>G!pcWDG6SZGI#C+OgUikY_pU%$CPLEGcj}DIi zIO@~G?Y3`c2N%^hKc(M)_uL#^y#AuyJR6 z6VKZlEDx5io}6EcS)nP5Y?~*~&>xbs=?lPLO$IFhk-ciQ&_oYn^syZ?W}|tEXC=b6 zB4FP20*cIO49%U-4u9G!Zh43&h7sjlQ8bEebRrXRRf+8-(zXWSMq!o4_|A*^w|E9J;8e%!~4OGNZ%UY_1knBZcWG?a?q}P4LS{d#kR44)5TYY zfHx9Dqo!H43e)q>8`n@43Gd>YvEz5c$twDaQYzGtK*o_Nq{)-#m#@Vh2nAa=lr~?a zxrJweYS*eMu1GdXQPq8hFbUlkWk7#RM9K?Ht=Md`~J=cI|T$z>J+tbC80HAoX3-F&X zZm1Hc+RbZMft}$uW&F4D#0Ux-Iy6wCiAf$CcSWk*Rk8D(r6R3tU3QJF6WvfF&WOzl zYYq6E7m)=y2fQegS5ID^S1x;Yvk)kJ?eFnnCG(jV_nbet8CYYE3 zxTS*n@>J*z3KgukYXwy*bF33DOXI*l?HJ)*J62M?ZohAt!g%4%bdlWwdEb;Wa1%(P zD5v&KszATcYDgtoRc=<_(%>V%wR!5TkktHQ%0qz^KH32g;?YJ|awPSJHQinSIHL@b zi_DrlY1WmroKhL-3eDH15{Q;F)lyH#n2r+}u4qCjqz!WUTUvR8H~AHn(db)k%ZOls zz=E4h{rQ-imR!%it(6(qz88dO?`DD(lDJ*e$NaZ6rktIb`OY3w&b&1x~ zM8$EH>c-7z`;`3XTUnu!cHP=++rr|-$^i@#dTvanS-Nt9a-E%?Z@yV~PDNt1Xq-}@ z^@_Ai-=@E{RsX_+HYDsGZC43;WGf{+;j3P9dgjnc?!c8Zq<Xa2M^avM?mO~mZVdu!y{cyx6!Zq0AO*$~^MZ zRVq@H4);RSjlxeY%5a=E2ZsX6)T?p}i%-Zboj8?4rQqF|It+?4rGg+!X11TZJwEya zzB)^>PA}*F36w@A^e=VC#hpw{&K9oo+i)ux7PZ0fJ9+>B9a!qy5{Xrzq>b`8iwy#b zlYj>mDekQ;kfP_W8W#2N79Dg4#gv-x5O>que1Q7XWK*C4Ffum3Ko9PognAt#$dBx6 z_JVGRG%}@+>QBb5JJUV^@9EX-IvvO|%%#&KL%{|VapP6B(-mfWxlMcS+Cl6;b@o1Z z>|`i#M^7n6e#9B>t{~Fge51p3C;V)dXe&kE*9N(3QL{tr}SJw82zuIK50Qmgq%b@}?oi~j1UdisU^ z?(pgAYW8KT5_NQN7m8b?L!N({|Ij}A)zilL#Q$>N*i&DgnN8Ib-4-Y5@?9}O!lQ}S z!LVK?&(j&ey7sL%^6G`;O&WJs?ms1SdTJI6LZ6ItVlCoMx9>r3%GA-RT1d^KgOO^+ zA%OC~leEhJwN@b+qyYk=DS_gfDHzI;IqqFue0%@>yT7OPzdGreg`l!xUWbw}?W`cP z6N$;y#kWa1mm`}`j0R#GjUB8fqSJClmayjtDr!o*?|ynw&Kfz0NQ$v2sSE~1acY2g z5KqimQ+!)#S2R)J-r}IoJOGP@QM+5B`LW6#>!VR@nnmzPY1!+vkq9E>RtkT_2wxg@ z>*g*e%A}b5=(sm^fnRw4?(gX4^sxQ&!G$LFHm$d4jIwR9P$z@Y@XoBGY4WOE1#iN&0+I64#2CUfGD+{F5%x5`sn@xZEb4uRMQ zXCIV>f{){+tX5@x=|-_Fnx1rPoW-CJqufH(H78R{3%dekl7EW$Mk?gQEkCXI?el)v zx=qY@DHk$PET%YTdKJS|+pc{*C)o77$ZWMK%6i$^i_FQ`4i6?HGaQ@Q;lcRReR__^ zXUF65>G0%e+_k@p{}Sy%VI$bT$2^_nKaA(2WApaMmoJ}PUjI=1RChF^?~;r@&vTP} zWwY!PS-$%qEQ}2iF+vujYyvlFF6#XiP)w3Os=y=GE5E4QW@iqsx;{e(K|10UA#N7lAGdr{{0kc-$uqC9eGlyQ z`}j>SZ!37pMx>@(r^j_{n3&LmlJZ#%478JH7Ca2>r7Zji7$1H^FJ2~Bk1t++@#6A_ z^M}tKCy&psUR=KT;#x0hO zorNtVf+W^!X-A|^AySI4T7{Z5O2%@mA?7idwMbx#8&nMAVVO7CJk@#VtH2_7^u$g| zl@S{s=!{62=rAXXrw%IBt=aR!i{Y6Z6o#Uv@;C4F(yREAE-luLvtpCidV2ErQ5EjP zS}+pRWf=q6l0rXkwe@!Kc$Mg+RsOi{*{0mv(tPgfWKucBli)cdeH2_gQa9X0DHeu$ zrtqb&P`@TbU#p*&-krslYCJ_oSL>~i&jtMN)~z}N#Sk=S8svd%D)f!#lvaffN6Xus zH49s&2JfEi4U~8d0yvFM1CSHNE2RHkG64DAJauIghR|)FA@hSS0ZH1X<7$u zvTK7^+5T}7EATDtmlD*8H8XNgK04BvUCfi4bQbh#WqT184`rq{9E4mGI1@G?-9T0b zju*hQYGcVgh-+v2KQI78pUnHV$tAS+Ao6|dri4q8kfu~Ssi(!?Vsgt~AUQkn>^GFy z$7wMZ^Io9mTo(eE>`&solRqeVA7YeasBk3w6k8Nh1tCn#!x$0;T35tVT4?FTZ#T>b z;{C&}pXOd_Pg}sVLR2a|-8)hdaq~he^1@iwze!9{h0Zw+*V4%huR@#*kg2PgKwgK` z69bzL>>zoZFKFH5L4(Xt(~|p3zG$!yRz)=XZIFVOm*vIYsoNQTwY8vUX%*IV=tv|l z87;sbjDH| z1EUU$roq~%)IARgx^?+TMEW?o+;$JOteqDnnf07l)*-{avNqAz|4l-qz+b#d zW(W@7w({Bdb{2(tlqFdKDTl2auD*6si4KQx2lFCH7CN+dPj_eX?gl`Ll~6u3)y`M+ zhHBLmauXwpO|DV2Day<_TDnA4t_H}6NLDRu?WM1Zcoz8q@D~=ox^<*NrAW#ov&qTu z&+g6m%~k>+)v4UBfC-cdVBh4)2B&yEt(4!}fbKfN%cbNp z(KjwTFs5|AjpVJO8Z$W4w)UD;K{H|Mm9E@DZl^vihq)vF;5^~Bj*H3p>^7|csS9S= ziN8Cwut16)c$=x#OI>0Z<4o?pzXJ@0y>8ICC zPLGd9r)NjwlY{*%%7fE`qvKZHBvdwB(PVD2Dyo{i=zsC0{dzdR{b6-k92e({;?=Ni zAaQVK^Xi`sMZII|Jsuw(vxR&xav0k|zg56Y+vIzSqJ5P?4%22c z!lzk$bItAZ(wZJ80YSmN5qU;i?od*Hl>uGZ$y8OGK-=U7BDXXQkEnO#~r)}|+agd1IAa&oNH5jmiq))%e&!v>% z0lDDKc&iR??FYXe=UqXREQMz1Ie}VL$!amOcf|nod{ir(y4~8;sr80F0*9iUc`4X0 z=aWjjyatWHJr{HfT*y2bs69#mF_cElMvHY&sd30F#WB10fwz(CxH>w&AK%FL2Z99DyQ3&jU&={C2=+mlhf^Iqm+MLg z6B9a?o-{E1n=XX`{?M8!bdhak`H#}=>N!+=O=)SxxXiJ|v}c$$J@1_y{Mm<#HkZK3 zZ>j><2WH&T5&Q}-e77<HQR9WG40L_Jze zZGnR!9JeKb=^M-SlE*z~bt|6gR{A#;!Gzm>juMos%10TOT-j$)?89- z4f+;L|LQ7QT0IYMo26!v7gbt4K*5Cn&uNuw9nifs%CTm3)c7r$ypohA^0#X_4^r}Z zrC(wD)<6p-cWPp_+IueS1Kl2`5vY-Wa9}VLqmbS0iozoL5sEERO69AP`L-Q?CSHr1eTBZ}! zZ;XIeM63(5;U%h%a^`z}?##2TC(7^Hqq&cB2GGk=?3tcm?KdrFrbp!pW!K$X6Ay$N4r^@~XOr7yg4K~I7&_~E5X(}E=3y_3Tz;{I~f?8pxrjKMJZ!em*q zhUIZKNOr`iyvo~HPhVhXPi^wDw2LBlSR@yEsK zogu*Hl-LqHrL0HVKVUZ>BrjY3uR@XPMMkruVOv>1v>EeR@@Q}|P++WT-BL&(7%Tuj ze!VBuY1nj`N1C@2;r_=Z!ZAxN>U0QC#kohd@)Q-*cELv)p(U2MHt5}ZSMe=fGQ8PV zM%i7HQvXrhkPqZ@)dhuI%f-wGY^%@oy3$`enSR7a}6J_keNu=uWHmM`ru6Ht+oBW`@10+Gj-n83 zv9`fI+9`Mt_IgX{MKCd2f0xM4Yq$=UK-bU-nuXRCGfguST8`>7IvaDcMm4{2;v*}Z zo=KOcWKAMS%1kro_(+zPI?@$~TID~qMSw(9vj7#2#Y!ddrmNNx9i5|>q&N$vc4m5$ z6^o#D&oPhMgfkE_XB}B#4xDgo2FXKr2^G^*bHi+#9NQ#j|*M+}^ zNT8Zn_iSQ7PI6MWSF-_OOXfCv--lJW1Z} z-WyE*y9~;Ir|{5cm~A>r_-_Z8qu79|g!q27gbeWVYFp05s)yS^^h2!?U!hZ}lRBc* z`wv0l4tpqZTk%y)Ft>gwby+z+Nf%aE8Px=w&X@4tbFd{Qh4gSQP$Gf1P$NJI_`!W& zlsBIzbITgwBcJRfb(w;pRnPGR5KYCWDktw~l8ivqw=$%Hx~TKSZbNsdv1Ne;J9%rOLD37Fh#H!!lVAN6j#iF7gP?!Hn-t%A_-d3jh=~Q5zC% zgB9KW`BhPigz0K4I232z?pcFE39Acw8elBHFPdb5{q&nY z@Z43D0Okb(IiV&Xnu(`50h7ewIeaHiwF~5wJahumhe#-iM20w#*}85N#k{ioC%g{? z_|?8Edc55{oh@wSLI~tsxvDzfiA3JF?!2Rdt21xA2>g^aH^jgDF3Og35hn-ihj|@r zP(-y?dWOI!mKI_pWt;o!uP*OfJYz72dMFfkD5|o31mhp=)`dncCRPDOY?lr=NQgjn zV0XW^wVLEWgq7=w1#%PYjtgiwYB^I`lE(4xv8;Gr)1qY|i`IQqiqIwt5O$Z9>1+`b zmT)a6{V@&BJ9q*~eyv%^{gl)PMphTS4*qIJfWxjI<3bmtN?D3EUcXvHcEtq|=YHdT z?#g09o;c+k8q=i~!k0fj^UzTE`61 zzXv^B{Uu2pBBs6XKS~9DzzRNx{#tR{E^*}Ozkl}+IctkpQmIoz593qylbV%gF0^ae zQqrIKAIi{UgHJnnE+YE-l*pmp_84ZVe^I6i>gtq!Xdm2(Ch=WqEmR=yxEI@+BT*bI zirWXXV)_76w~wj&0ECgOFtg;oNW4}Bh%F^8Bx}uitDB(p&o?2*AgLD^7R$()lv;sI zT%JL!ctuIPbG(oCxJyl8V?``QVeut-w7Diy^`x`_5)r|Dp9||EQz3kDzQ4SsftT;OPRba(mY8USA>Jh5(fBS(~t)%$hI`-0j%K&j^Wm#Ji z(#5PSrZ?V!CJ06GsA>6JO!jEVXIoFmI<(_`F$DV2>Z$)ND;YY}lv>BAwY2V;F{9%* zz(~zS;+x{>VW0?KlrzKKchqh#E7=`Id7D?RC!J+s6A`{-d_Rt!)pO-I+@MD7yMOmK zHI(WHFu_QTMDbMoJ(9;ZY2M$Y0=o<@j*b)53-{jB3wvy6_sxqQ9P06=k-xV0nI~z5 zdH+2&k@0YRm`s|P*kGARXZ>FePmYq6GQM$Bt;vO%E2Hh@4D<~E(1L;J-!<(2g552; zuF)|hQE_9omFL%mm+7B45JF8tI%YmA8uvOYk*XIR#+9mZ#uxDLGE<7Ml*~PoHEL0% zaj0e2dgsD@?0N@RmdK%C#_bZdvB>~9 z!Slh02oWA9rz7kMGS{8tMTX_1Fsp)17s_P_I80u4Tx-}uvxqd!4)%~1^w?6%xqPh^rJ z5l638oJ4MGvH3>4RooSLSj0$COA}DRr>Pi{XK+(}2#b_B^oNfPPN?v1Gj#0)A*!a7 z;}uiDKh$6C;NBGVJczBld1Ij1h5F?;rU7B3(*tM~x zr;VE`Rz(Rdi8}Z64wgBEhxEdrjrmZBmn!x4%vM=ylNUC-3HknoYrj0R3lvWT z0kPjCy?T?2#lvyHfqlw?G1X1=8wNFA>fHfVK7lT)Gy)K^c`gOFUbNoYKA)l=eMh^9 z1t8++1WQVbn%2+tq~bgWb(Ue7iJeQ_J8$Ij5&o>KAo)Qd7hvyG z#ktEz6-#;mo=%qr;cTwPwF}AYf`hFWd=O_QkIiD&{?--#LKXdcDcZ1Bs`q~7t!0PFFa>-+xj_32hDF2!EjZ04*a-EPsfr4RAh2jo3Z%WDe0 zto8;X+A*i>DFKzd@sOMuvA0AdRBw4tCes%Zcc;TTa}8{{N4D+ayOf)3!JfQ~7O^$U zqNUstW{NY=-ANx?htuT!yZ_}vaP6+-^jmU`&VPH2rS{H z^pawN6O9ux4k`82RO~V??ewOXtkdZYOu3As0j&e=h&ULUnSrdxXe9T0UO7a-WScyC zc@dpwZJAsz%_dL2v}gc((B*euJbVi94thm3!U?%DmysQkq7ejw2&E9#qkAqQh;APO zzyR#!=)V;MvW3MGly3mf(6;8bXx_j3x6(RSi_e)1M_*N2vYsI6{=!a0=Ogdm{XMx% z7HD->H`*<9UxolGI&gaj(V4qN{sb5aj29Us(8ZMnv>R$84o^1v4;3u z>*qd~qwrgU*woVo{b4UT84kJ2Z$yj=n@%KbOKhnAHkb9$$vAOaQ?BZ09vEyK9@yis zMaG=X{oT9v8$f_hx7yEQn^cG}n#l|GTo6yoLNRX=UM}+pND#qPcaqKd$0VCQgyJtv zE(&l$d^qgMgD7oW*L)`}kZ6tGKadj6#$2Q}0D~4l2X1WHln}?JtUWl;J#RB9#b50R zidLs~Or8G7-uLUbP}gk_1nlij>Z=&)-D))@|B*hp{HgWce0T4T^zAY>UT|_h;x!b@ z3CIYsZ0m<;X_J{U&`?>3bw?xDx0d=*=K84hk`@U@1wx!8ktBS9xfig%A=iyOqiOY^ zo<5oj7;zd_5%3Q#e{9E1O8pN??>XW?z&z|cbG&CpDV$pZd%hvQ5Gu5@XSZ`(o2Y5( zo)+(0UZ7v^Q0-CET5EhFKBYB5ZTPEcY^6*U57{GgRh~X}-m9AOR-!&?E^@oT3;lYDde20C#!+vG!ezWf54*PP4ecWN+-(EkR zRee+Sac_OSx4zz+02zNxB!)tZAaq+*3F$p?`{_$;-i_Aoks&Z);OIA)7OMxUYxH0^ z8Xw?u{n2PR?3-2JSLpi6cIZp}s$cQ;`X-5uuB+q48j@(<%59t}^< zj*d@`&JMbDy4GKQ$2#3#pM7&PIy?C8pgbJf_2rAhv+rz&e>l2JIsBvehrisef0MTv zh$DHo2T9-{s%yQ&Yd&M7u4=0De;gO_!Z-Pz_$D8zaZ*rou zx|7U4nX%Z@{i{D=Vz-aK7*C%Lb5TOc4tp_TE6R-qI%B(c={SEMNneEP&WL#T(b(hN zeO+G?YHf4NX`u3DBzJoDy69{^W1-oq%30`{r`bNckSe*xYuqNU2v)UOmhzdN(9Pj_ zQK}=&HT1V0+Ue9JSEi|^%do9@z7GX?!*AlX65jKf+x#^u<3o;CQh2UP2PITl+h!9n zsh4fjy)H4C%hPJ99a4xIBJ;*7aDHTh70FNM0a`Wjrb^c&=Y@6a_EINs~;s z-TM;akJy>8tWtwC4OV&hc7YqD>2OCpVB*%yVZ_ z&?_OvJr#Wh6^&&w4MRBkzByj&&U!}`QmZI(e|}X4LqjdoPa#yOqMfy=n=1LKDTsE3 z;iU*S<#pPJsB@WmyQ^TERRs~J4+ffmACAAvYKOxJ$Jw+`u?1pZN_98VmI=og1^QNN z50Ld79iBxbKVL8l z%YT+uU;`j&TG<@<1pzA4v6DU9FHN3SFs3rDIlI3N+mpfIdHs?W2-=q&jecEUHr9*` zkJI}N&l5@*-WDtR)N;E>ZBB=Av#`N$a0QubrVY$mw}a&2Hqyc1nnfqF=X8NhKzLRr zPXX@c4e0GM8eHOsyA7;OfSD&W>&EKf7^> zRZ$&g>}DWX>nw^4H#}EsYD*?%9n&py;{O2L+;l0-{=vP`eMFS- zLCyq~AAx4V#4b{AA4whXvM5$w(QL7m|8HC~b!ssVBwZo9Kt+4H)Q`B-1VVx+Gdi__ zNabQ_)@v(y;RJ|aD#D0l1#}td6i}&ZOH;1J(&{_)5)98S4Mpb=j33MkBn!S&AM4(B zBcKmfcz&GdZ1*m`D<7PaVFq1@T3xeFHb&1HMG7{_+N_be>ygcr%4VFU_;=jbBm;f3 z?g`AYTBb$b&T}0ez$A4a%3L)&EXDMu@*Nfm=ulOp*Lvk@z8!9r$x`H)h_lE|x^}F? zP&jr7OVT`_L}5!qG87l8gzZn9550GY=$5E8P!HQt*{q|4Ro&O*n$D4S&lRN>9#}d7 zx~bo-Bxpxr_Jcc_Tzz87g*tHS16I-7R=_O@?%3_#uCqd0`^1oFn@fiI&Sj=@7$Rxt z=Z$ZmR0V4$)2v{>ckl*z=Z;{Yu-F9UF;x}(-Mv&bULw7u!M*YQ9js0!g%Sj9pnd9X z()R-KIB87%4?8~<72dDeiCx+J-obr3T%?siIC)F>by*zYEU7Yj@`_e!(Fxa(8BCKV z4VF_e3t~Fl!Bx$3>+nE$yF1S+AAtN~F*E9uIecY#X7|I-L>kWXgf!)C7E0cdMWY8^GNHb~Wnl zRB^wmU9)&M^glN@D=P}tu_j3es<1A3hun>Yb&pMFgI1*pPOl2QQo&N zkcrFlq~10`--ZqLH#ycD@nv*7fQn4rpz56qy189` z%8E^2ElIenFnO=*LGr9<(yEs{f2l)6wzp_iIe9e!QGYnb`S~4@+Z9m*5-=1k@Y8Fa zre=-PTLpYW%#i@3SBbUp=+9pK7+Yqla?h-fadT(-0B*B^pDm)!kI4(^M+)HS=$C5qEUS$~$C`brDW>N^y|n#GeycApuy6W|PE}tjUi~$HrwN2V!xw#QBjKno8P_b!Dx7rJV2m2IJzIqK-Xo_@OYvo zIdG=lD#_Y;qJLR{7l3`imRzws@*%e`biEd`&X+k^=< z;^5R0%_7hh-_)iSG14L*`1@|FzT z%V$ev^NzYCnO*Jz(_)4+M2y$u4n*~hx`#lJr3>%nwOMX=m#N2u_9C8LWws7drPqlJ z6S)@7DCy&Gur=G6$g zcLMg_kx5M{j)uedmc{IYoJYHWY=hv+YH$oF&%)M-_7da?*jJQX2Y5yQG{BFVWRc;r|K%%WSs9QN}1doM$I#krfLOi4S2^ef|b8$cs8fE3iFkb+?d?HE&Yp2}C2%hMjIS-z!B3shSD5;Gb>Y zUbLz)6iGkM0IWv~H(Jh=iW7uB8kWC*3KQwJOD!p|9t{kQmA_I*)xLE@PTQZMW9{tt zJfyehDFl&RSQWK!r0_+O{rRhBkDZurM@)yT4E;WG>-+vJ=uAcA)aMkW{AbzHt3efK z)+l@apq)zglIM?-H~9!AJuLq{Ou;#SU79p|lRwD{q5$FaF&qt#$8Yj_P|5cPKjQoU z?*jVHILz!iz}e%&gQL^4!_nE;PL9l{i@O{hjt)f2T>emuS_7yq4LV$X}57_k?{tss7n6($zp#GY82TMrX^ z-jwU*ht%q)aTD-~2W2~Tsn3#+!GJl@`Yr^_)OSO`L=J(p!Wan#VQ^uD^lc-KpvTAhFTlhHn~lUO!DG(@D`79II5sym{#m-IMYpTih9dkK~vB`~K)kD))n$>n)ug8MWiLSmYv*EXo?hX%T{JZ! zubkp4^%^NF+r5x95Y?+w-VF*d`)?EQ@?vFq$K<-Xbc*tC@z8nqPh=1*=*|k?b-qc( zBSs{=UIfZoWz~6?bA6%RzpZ}oNldp#BDb_bRYG0a@4>qK^sxBi;n^RO7daWy4{WU5~~V)ES~Fngt@v| z*h)!gI%S-NfSwk2!$D*Kq_{60e@VS(LOO-HEarr8#~XIq(S!I0XCTxYAm$eYX!I$a z%A<^}%hcOL#>h&Chpmeb9LF_|&5^(>a|y(ORkPw#2E`4>YfD!eswXj)B0ML{<>_j| zrRIJMS6LV|$uj6px`x%|)pcN!mrk~3Exk*GW_AQj!EW? zLR{8RIhPkf)c5@w(^*IyGrB;lb&WgiBnK`=ck%&}t7n2w)vd*)1Cg5~0;?PvxZr9l z>qna;8yg8r3VBh^y^*v1%+BEyNizm)|9V&N-~Gb{MJHPR{@p+JX9d*Lx8$485M4_& zW7b%1GZqOgQoDA1P_$CT#8v!hA&ASgMgl4neOOK*>K%w0(})5YwGmt_p)&esC=ey+Zcf{}SJV^b4xY@I_gW=)m zcsM+|!%h8nz|CgQCO@ofy8PnhaPqi%{OqT*zc%ry`su;J@$kQfeH9MX7kr_Zq6MIO zH&=ki#K+hU5gOPNhYADc+kHpCQY?IWYej4P%B}~=m+2~b`TpI%(fyDA@|D>pUoDNk zGm@{aipe&2Ts;RT`xpuXi9^uJ=W`(k@#-<2KjOt}L^cEz*(vR=fGe7G$N|!9Yw2;Y-M4a#?;rmxiGUy2GF4^ z+e3{MdhKf2pma6Yb2Z47R)X76tNA@A)=3*k{!2Pc8>5Q$$-j(`kkd!9B*EqBL&O_7 za8c|)_3YJIuq9X+$yd1+kzcw@m^(!wulE!*uKZ7Qm{l$&*jv%J611~BS2?{JHxpEZ zbV2v4aHxL#)=nGVUg)|!4N&H%z!dwEsI2Pt4HF^9Nz~!6sY+JFEsHs7Cd)pDjgOGg zwDn7A`gBF;vp~e7vm|YayppBTp1k**d+Q-~Agu5eebnR)N{$+`MJ~eI%THBXzfx8@ zUj6LW$O5*sCW7yk>7tO)B1Q_QOzw+@R|f89X|l{x{H9B5 z5CXYF`Ud!UDx(GHsCt8$xuWSIK2L8V0PJUOJXAG)S^)S>)fGYc0R2;lN=>hQj`r@U z@8A80yNc9@Ro7W?8SbGGxQpC6cccJSn6=gMiCMs|)QkKQg?!2~HWl``c{XyVRHk%8 zrRW^6MEKeqBy44C(>J-vwqP|!D4EDi#ib54*e2ex+_RsuEP*O`7&3jUwHMbKB@=3<}0HP4$rW27tyOE zW1zHNrbyKb^`}u;Dg}nfCRtid({+~SqVp;9t0P3nN$RbtgIBn#a(7iJ+p6h7%-f52 zO9F3IjTY=DDGIWL9r1d+G-^*~O%$OfR%jSXm6^l>Q#x%#nh8(fm9Xen9F(uJRO6RG zC6%lnOnG8WDQ^ZAcS+q;VPx>OstzLP^6^?cRModIR%vHNI@|7#^pe(B6?+S^JUV=V z-*+$Q=mWI~dN#Q-tE#qOx(b%+LZdDc zG(5Q*_dL0lhxi}y{`5b7VFT;^;@?rg=_&A6;?BUBwU8M6$2{bGbTE1_dN4XYcyKU0 zJv(^tdTIN5$9>!}5PNdR{WR~(9b?E4Y#x>-pRqPnaE}M6(1&(uZc{ivX~984-=ks$S-ruVKZQ&U<7_Jn z(TdM7`h`xLSI%bj;Ak*P?m-sn{%6U_xPN-^hbgb09G)B>pPh||Cx^#f3(fd1zawh? zr>`Fs&6kHa=9?F1SHo|Y*WX_c+cm|b!`}qe`G^#I*_2fqtfOVcqX?|?(3GXEYgbmh zXet9a)sHMI!U;@5+0@z7`hJyMpsoW6)~7WF?)yh>{W))Em~W1BVDe8A)IVpz9I-v57ceJ=NH;7xR4*gyZ}1j zB78n&wTkUOB3aWM0qEy68zdJL4Bh7%xhYC?9Vt^&O`A%2?VCt3mm8!0>N>MC$>!1Y z(|@GLwr_>HFE;{`EV4}X4;EQ5(Il;{-XrG%xt6H+&~{Yzq=_VD%$m?f>bVm_O9(p> zSSH{Z&Lu`80dRn@R=g&kiOtF+QbNPJjolLNsk`!tKkHm6-iaZ zL=iWf+8kxOS12Bpy!IC_iLv)?>iW;$KfY$Y*n23+Y?JeqwmIr#N-0bx(%vr0XiwR% zmmXWPY3^*`fr2A7Jy)oQTSx(9hI!MSn~EfIlp1+EEkE`M!tZtdF=<-p7pZ@B?-8Lj zZy{j3%hJl4ie}LiIwJkJ zdmV;ME9V4G2)>b+e_o{}7{X!pyfzK#sUD$g{vT)xsKLix$5QgJn)23e#q9*H&ZZ^j zYsefXT1a=IBHt6wBTMJD1GG-?)M?kX0=#A#E;57_C!BbuO0orObw_>1Tugumw-|TL z3fU>7(3C<-z=N5V=}LZ_iBT)?u+cf;sY3{ZLCRsL?EcSMct1Hl7@iD|P7a4h2RkmT z(O-UB;eFYB|MdFVcVB(keEDU*yy-tG4_gO;zZc4OQkiHj~y(*C4 z4Hxx7oQ>Dbd=AkaXNENDVj{k>Ha8v-akX`Q@YOFKTw2fClcUF*eCJNXv1F~9|LBB^ z3P|9_v<;{_1BJr)M~oDcjqea{E|ZN&;YdXVh|q^6cJps?Lgz?5y_5p2lA%5{if?i^ zjLE$$&2PAg+6mPpSsI=*+HCBkN^5(6kX$A+GDg#okX(`*Ik#Eu1KgYZR$NeUVcc+& za|fgTPeny1m3C$YcvB@M#Ilo$m`RO2!PH;Y&nKZ&S!wX<_^L zZO=Co7Fe;#2g&noByGZTnyHXux|9-cibMg~n#1Ym{kwmRk{L`k%3d!m%;M-hPc7bO>q>-pMwgP_PdZlyeM3(9n;a8f z1i+X~_=8b4?@JTE=9Z3|rt&a*;PM01HI05jVHR(4{i4`uZh9m`)GnvMe~|Av5YDz+ zNBBD#3Y(Cb%b9v&`MP^b6D6*-K!2-_{M-@9ObM~X8D#%?da)aiF>KZ@+G9(iUXse< zrbIa0DrSSdr_$QlXPt-SBDb)Af%eX_se;GiFU8bY+yB=^#E+;Kw@Srt@;$ZUPU92JkJ|bh`*-pE$wE0iI{9Jzx9j0g zCofhnj=uW#_Nd>k8jeQ?zh9gF_s$?bSPqP;feF+X6Fdv5U!#*#3O()VK0IXgK6$9f z-%7qWIvYQ@9*+(WNlD-LHHT_`9FqS>c52E=;Sxh;CeKWho8*UdwK8SleHz1RmeXd1aIZ4S{)`d^A-I8|AJ{5B>8Tmu zh1_nWP?{GxY#t_!=pO4aOb#`kc&UmNYIS4L<*XyWYn)GH(K`=L0iYpptJRGuwNZ_R zAZaUlY2oy5Ot8&EWUxOqYC#wd)==u|#RXK+L{-b=iX}l|sO2K?M&eq5AY0e03G-$t z4NgDq?HxBEq1+X8*j)ZBnH7!1!5OyKA~Je*N|WOMOB_fqxxki~jKWAKPDuoFBuw`< z2yE7#{9ec`uny>$Y!yadgMQlb9b z$+T5Ksf^kH)9b`Jsb9PGvU5OTq z-V1*i+odf9M&zW?`5zvyBL~_UaVPi&GCYo&O3Dx3ud-U@0m6Dk$ zI3&Ii__&n3gf2SUzwt_h6kJ3{Q{ah7Gqp=+b(W-4uk5t{;dP)Ouo{>_Xd7B(qE4bE zRBWJ|EG&Za2-kd}KE+cD1%~_7+{9w7LLr=jNy4$*^H{7o<2yfEVLM=mlu&50J4}nG zA-SuIjc^$Qbu#eu_CNTXl>OGkg4M^&f&*dZT)PD8;g6ET8Kw(;O-t{W*?=m3m^5QtcFng`g!8pYX#v8t&S6 z=+b|abFtgV`5{`KMEz}AEu)@SLFdbUItT%3;QwpDcqNUfn4XG@@mK~pWFt{LCC|%3l(#a4^pRBhT}^^ZmIr!>(c^EL zAbf#n$TY#V?{ruP$+sZcrXAL{+8B>0-XH^uRGDJMJHRi~4CT{FlVw(+ba^4?pUlo(D>pM+5iJwOmezN&t%Mq- zUny9in2Q`ed7o2?RL2Lq&|WvHdxJ|7T0Jd@<`#2Y)jrJBn$#U1_8uN22_Wmr3*&Ia zSW1orimSBx%)x!MyR6s&iGd+T!8!eo1fZqy&~h$NrRvgILZVFv!`zk+wmW)s)6zDc zoF_4HSNtqK`=GxT?OROuv;Y@nXP;sa;=mm{z<(DMsY^D3EMK(xKSr{7N3pq;=E<=o zbB$p9_x1$;Ex-w}^x7*4|6XJolMH7`& z#XL%tXN9P!YFUb|*8D7LJm83T3pzeKT}|0Kh^@c(^*8Z;vPE!>r$Y`FP&ZX697hE6%*M#jGeza(!dX%zPra^l91? z(k|RTcU9h(;xyby(@J$T70tZ_oLyv_f(~jmLbiYtqV5i+C8HdS#t)R9kS@y#M07gK$zZ40`+;M^VyE5{Zw*7Vhre8+l91orB z)_JCGRlI6>Dn|Tal#7Za%W6;3~U4lNwW+rI&4m9Zf5AXQOKxH z>kSa@jFp;fOADPuLBvv<)F>1p?d;WfBUURr}?^0wyWltJ}t{oR3 zLyT`FifcKx+?si)nPpr5o74wB8oC*j6_W|!Xj(b&ec&8ND7FmNUC@QX{H->}oA~;;Q@&p%VBOrejMB$Q70a&-k7`Z3WlI*Xyhc z{GqQd3YV7`6LB@51EqUa!KqWH(Tie7*>!&iP^B*?5h(VnXr`zTk1P$9Oi9~agIM=Q z+5P;)0()e+CD6fP;JpG)uOl6o@h28xV#f4FH%mFEWu%lk!TSsudg@?Z-3njkn;1B( z+0q}-(Eb@{rz)fZCdOyFl2l!2``Il!2bC4o{Af0PrZQP&liA?fMZo%9Vv#$sge!Gb zqNl)H%bwN?vwHlB{m@#*R0@W>v{Pd~i{e0(w*ADkT= z9Gr9|Xh>&FS7BI)>v?TQvN%i>5!V1WN^P3a=}|B7+IoT& z;Z0HJ3F)n5@>Fo7;@XMgr!>W;*dRnr-A9W^81(}Z%^WY}-L|TC{7rtdX7cgb@aW`V zcy>HIxI+Ws=;-A1S7|114yS)B$B(~BZ@z54x_DcD^OIS&*3{|n@Gc^jDeGKu$&VcB z=2J;n0PyOj-f5(*U4u;K;JUbJeMU9&svIX|YvY*?g#%7wC ze9-`6mt0~i6^RllFE!NZb02WcP#o_dN<^_0hmDRHSb{y5?UXE4J(TqO9aB)b5mj#T zvNkA13C6+W>w#`BS8e}JuG=7Af=B~(*Orv7{=kGZ=w1ZCFA$QDwV)}^9j<6j4Xfk8=8p^2BS00?1ZQt*?L8x?}VAbIA-NxWROM!hN6PO|KqRZEnFc&`@87Pv|1 zSY+ys8q7)|>K^O6cBn5R{~{0v|BmBo=*%Hgy;(rq!qy+6f9J%aLZ{w!aBG=T@~L~; zKAzYEGd&p}PEO5aK0W#M<)ow0+34hSe0qGkBgP*8CB}H)vFh&#FPqWkyPt}6dhzq( zFrU9%UH$w+`v`t^a+m4yuc{ugaAX}_lO~l_FL}z+sQ#mwc!n-v8SUMhCzj;AO$?JN zlovI9$q_{f+{cm6;`8z&d!GMnl8d6ai3HdUO7?SGRdO(XDrgv$UXb24{{2x=0(w#l z#4&8Zv%7k)thTB_DL7{T{JNh1h1iB8qpUzy7;)dM#i7gN z?R9nssV5`U7Ioi7_U*#Xm3S#3L^F(ONf2@-j`WTkB-l>ZJe3}RYn&+c$f=x@Ac+tv z+e|7>LYD!28XN=Aah-xUL%L{`)V0B*!e}vRy;S&`c+v1;I-Q~!eXzjKgykUGSHU_J@)^#8rz0n#I`%UQY%c%eyg0pS4=(bhcKQs{ zjEqxOD!VS1cqo{^hsa5NMiYY7`CK&>Tn#H^Jt3umchkjX|3y*Gi|odisWxeyTW=9# zHdf6MH&PmlJf)-_xw0t8wcnOCGwO0<?}d z$%vlM#h_i}OjPoPQ-wj$&5nYFkjy`Wc*(BUidS$q3tPve0ftC_F6yE+0t{JAO5=XV z6Ya^--I%S4Mo*WiW%bzmdOHQad**&3#-I3eHv^aJ}O&Q;2T=5lXp+x3m^kPiiu2AE~HSu>K&&4 zj9Jg0`E%c69;KdS%s+RJh)jT5YMJgayVGWKN(7KgtRC*)LODL7D0JYm6GLG36hY(c&y>V@a2qHqTAdN(6Lv*i7Xpn1SFh)Du-d_BGytU^I?;;2 z!90f(Q_Aj8n#pSi3*qWs1|nd{&V@LWQ2$gzZWid&xzv(f|9Sr`esSCvRSSB_+3)Qbh=p{2oB@{Xe|{VZLA`k@T0w0+o6d) zZEpVPd@gfh4`)9suQha_yPqU{Olw+X0U;2|a)9U(RR3sfU9ko)rabXjCFnirA?_s- zgG6?^-o0M;&U(?mM6UxRC$xoV0;>Xl>!dTE&W~qiGO)wZa=e)DopipSu6Q&%8u!QJ z+4ykkWHKHOkH4y}_>bu}d;8sZ`0cdHPF|!>zx)2EzGxh3hW+V%Nt54ns6jxb?k0y$ z0N1^U?&)0!K9Z-3OWbotkPQq?uOaPftbI3R4Vs2z7^by1}oQ-=deJ53q#9sqBAC@^p^NDjJHgj)U>!LECBo