From c627e2ac048709e6485b7b8786724451433bb840 Mon Sep 17 00:00:00 2001 From: tabibitoqzp Date: Fri, 11 Sep 2026 04:01:02 +0000 Subject: [PATCH] feat: add white-themed interactive demo + env setup - Add demo/server.py (FastAPI backend with lazy model loading, Standard/ZK/Merkle proof via Rust extension, PCA viz) - Add demo/static/{index.html,style.css,app.js} (white theme, single-row 6 metrics, no external CDN) - Add requirements.txt and update README with Environment Setup and Interactive Demo usage - Fix ivf_pq/util/kmeans.py: auto-detect GPU availability and fallback to CPU (faiss-gpu prebuilt lacks Blackwell sm_120) Co-authored-by: tabibitoqzp --- README.md | 121 ++++++- demo/__init__.py | 0 demo/server.py | 698 +++++++++++++++++++++++++++++++++++++ demo/static/app.js | 649 ++++++++++++++++++++++++++++++++++ demo/static/index.html | 126 +++++++ demo/static/screenshot.png | Bin 0 -> 236355 bytes demo/static/style.css | 278 +++++++++++++++ ivf_pq/util/kmeans.py | 28 +- requirements.txt | 24 ++ 9 files changed, 1921 insertions(+), 3 deletions(-) create mode 100644 demo/__init__.py create mode 100644 demo/server.py create mode 100644 demo/static/app.js create mode 100644 demo/static/index.html create mode 100644 demo/static/screenshot.png create mode 100644 demo/static/style.css create mode 100644 requirements.txt diff --git a/README.md b/README.md index 865bf38..3b40476 100644 --- a/README.md +++ b/README.md @@ -4,14 +4,133 @@ Implementation details are provided in our [technical note](Technical_Details_of_V3DB.pdf). +## Environment Setup + +All commands below assume the conda environment `V3DB` (Python 3.11) and a Rust nightly toolchain (`rust-toolchain.toml`). + +```bash +conda activate V3DB + +# Python dependencies +pip install -r requirements.txt +# or manually: +# pip install maturin numpy tqdm scipy scikit-learn matplotlib duckdb faiss-cpu +# pip install fastapi "uvicorn[standard]" # only for the interactive demo + +# MS MARCO embedding generation additionally requires: +# pip install torch transformers +``` + +Notes: + +- `faiss-cpu` is the default. If a GPU build matching your GPU architecture is available you may use `faiss-gpu-cu12` instead — `ivf_pq/util/kmeans.py` auto-detects whether GPU kernels actually run and falls back to CPU. +- Some scripts use `python -m ` (e.g. `python -m tests.pipeline`). Running them as `python tests/pipeline.py` will fail with `ModuleNotFoundError` because the project root is not on `sys.path` in that mode. + ## Build -Build and install the Python extension: +Build and install the Python extension (requires Rust nightly): ```bash maturin develop --release ``` +This installs the extension as `zk_IVF_PQ.zk_IVF_PQ`, matching the import path `from zk_IVF_PQ.zk_IVF_PQ import ...` used throughout the codebase. + +## Interactive Demo (White Theme) + +A white-themed, fully local (no external CDN) interactive web demo that compares **Standard IVF-PQ**, **ZK IVF-PQ**, and **Brute-force Ground Truth** side-by-side and can generate set-based + Merkle ZK proofs via the Rust extension. + +### Datasets + +The demo auto-discovers datasets under `data/`: + +| Name | Directory | Content | Size on disk | +|------|-----------|---------|--------------| +| SIFT small | `data/siftsmall/` | 10k × 128 dim | ~5 MB | +| SIFT1M | `data/sift/` | 1M × 128 dim | ~550 MB | +| GIST1M | `data/gist/` | 1M × 960 dim | ~5.4 GB | + +If missing, download and extract them from `ftp://ftp.irisa.fr/local/texmex/corpus/`: + +```bash +cd data +wget ftp://ftp.irisa.fr/local/texmex/corpus/sift.tar.gz && tar xzf sift.tar.gz +wget ftp://ftp.irisa.fr/local/texmex/corpus/gist.tar.gz && tar xzf gist.tar.gz +wget ftp://ftp.irisa.fr/local/texmex/corpus/siftsmall.tar.gz && tar xzf siftsmall.tar.gz +``` + +The GIST1M archive is ~2.7 GB compressed. `data/siftsmall` is sufficient for a quick smoke test; SIFT1M and GIST1M are optional. + +### Start + +```bash +conda activate V3DB +cd /home/huhaoran/V3DB + +# foreground (logs to terminal) +python -m demo.server # default 0.0.0.0:8000 +python -m demo.server 8080 # custom port + +# background (logs to /tmp/demo.log) +nohup python -m demo.server > /tmp/demo.log 2>&1 & +tail -f /tmp/demo.log +``` + +Then open `http://127.0.0.1:8000` in a browser. + +On first use of a dataset the backend builds and caches models under `data/demo_cache/{name}_{std,zk,proof,pca}.npz`: + +- Standard IVF-PQ (`ivf_pq/standard.py`) +- ZK integer version (`rescale_database` + `cluster_bound` rebalance + Merkle commitments in `ivf_pq/merkle_zk.py`) +- 2D PCA projection for visualization + +Build must run from the **project root** (`/home/huhaoran/V3DB`) so that `python -m demo.server` resolves the `demo` package. Subsequent launches load the cache in seconds and render all three datasets as `ready`. + +GIST1M (960 dim, 512 clusters + 8×256 PQ codebooks) takes ~30–40 minutes to build on CPU — the status badge polls `GET /api/status/gist` and the log shows Faiss iteration progress. + +### Stop + +```bash +pkill -f "demo.server" +# or, if started with nohup: +pkill -9 -f "demo.server" +``` + +Check whether it is still running: + +```bash +curl -s http://127.0.0.1:8000/api/datasets | python3 -m json.tool +# or +ps aux | grep demo.server | grep -v grep +``` + +### How to use + +1. Select a dataset on the left (status badges: `ready` / `building` / `idle`). The first build is triggered automatically. +2. Adjust `query id`, `n_probe` (1–64), `top_k` (5–100), and optionally enable **Generate and verify ZK proof** (set-based + Merkle, backed by the Rust extension; proving takes seconds to tens of seconds). +3. Click **Search** — the right pane shows 6 metric cards (forced to a single row), PCA scatter, latency/recall/cluster-size charts, and a three-column comparison table with hit badges. + +API health check: + +```bash +curl -s http://127.0.0.1:8000/api/datasets | python3 -m json.tool +curl -s http://127.0.0.1:8000/api/status/gist +curl -s -X POST http://127.0.0.1:8000/api/search \ + -H "Content-Type: application/json" \ + -d '{"dataset":"siftsmall","query_id":0,"n_probe":8,"top_k":10,"proof":false}' | python3 -m json.tool +``` + +Demo file layout: + +``` +demo/ + server.py # FastAPI backend (lazy loading, model cache, search + proof API) + static/ + index.html # page skeleton + style.css # white theme (no external deps) + app.js # frontend logic, pure Canvas charts (no external deps) +``` + ## Experiment 1: Retrieval Utility Evaluation ### Classic ANN (SIFT1M / GIST1M) diff --git a/demo/__init__.py b/demo/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/demo/server.py b/demo/server.py new file mode 100644 index 0000000..e73c32a --- /dev/null +++ b/demo/server.py @@ -0,0 +1,698 @@ +"""zk-IVF-PQ 交互式演示后端。 + +提供: + - 数据集状态查询 / 模型懒构建(标准 IVF-PQ + ZK 整数版 IVF-PQ + Merkle 证明结构 + PCA 投影) + - 检索接口: 标准 IVF-PQ / ZK IVF-PQ / 暴力精确检索三方对比 + - 可选的 set-based + Merkle 零知识证明生成(调用 Rust 扩展) + +启动: 在项目根目录执行 python -m demo.server (默认 0.0.0.0:8000) +""" + +from __future__ import annotations + +import sys +import threading +import time +import traceback +from dataclasses import dataclass, field +from pathlib import Path + +ROOT = Path(__file__).resolve().parent.parent +if str(ROOT) not in sys.path: + sys.path.insert(0, str(ROOT)) + +import numpy as np +import uvicorn +from fastapi import FastAPI, HTTPException +from fastapi.responses import FileResponse +from fastapi.staticfiles import StaticFiles +from pydantic import BaseModel + +from ivf_pq import MAX_SCALE, rescale_database, rescale_query +from ivf_pq.merkle_zk import _compute_cluster_root +from ivf_pq.standard import ivf_pq_learn as std_learn +from ivf_pq.zk import ivf_pq_learn as zk_train +from vec_data_load.sift import SIFT +from zk_IVF_PQ.zk_IVF_PQ import py_set_based_with_merkle + +DATA_DIR = ROOT / "data" +CACHE_DIR = DATA_DIR / "demo_cache" +STATIC_DIR = Path(__file__).resolve().parent / "static" + +SCALE_N = MAX_SCALE # 65536, ZK 整数化上界 +PCA_SAMPLE = 20000 + +DATASET_CFG: dict[str, dict] = { + "siftsmall": {"n_list": 256, "n_iter": 25, "M": 8, "K": 256, "cluster_bound": 128}, + "sift": {"n_list": 1024, "n_iter": 25, "M": 8, "K": 256, "cluster_bound": 2048}, + "gist": {"n_list": 512, "n_iter": 25, "M": 8, "K": 256, "cluster_bound": 4096}, +} + +DATASET_DESC = { + "siftsmall": "SIFT small (1万条 128 维)", + "sift": "SIFT1M (100 万条 128 维)", + "gist": "GIST1M (100 万条 960 维)", +} + + +def _dataset_dir_ok(name: str) -> bool: + return (DATA_DIR / name / f"{name}_base.fvecs").exists() + + +def _pow2_ceil(x: int) -> int: + c = 1 + while c < x: + c *= 2 + return c + + +def _id_groups_from_labels(labels: np.ndarray, n_list: int) -> dict[int, np.ndarray]: + labels = np.asarray(labels) + order = np.argsort(labels, kind="stable").astype(np.int64) + sorted_labels = labels[order] + bounds = np.searchsorted(sorted_labels, np.arange(n_list + 1)) + return {c: order[bounds[c] : bounds[c + 1]] for c in range(n_list)} + + +@dataclass +class ModelBundle: + name: str + base: np.ndarray # (N, D) float32 原始向量 + query_vecs: np.ndarray # (Q, D) float32 + n_list: int + M: int + K: int + # 标准浮点 IVF-PQ + std_labels: np.ndarray = None # (N,) + std_center: np.ndarray = None # (n_list, D) float32 + std_code_books: np.ndarray = None # (M, K, d) float32 + std_quant_vecs: np.ndarray = None # (N, M) int64 + std_id_groups: dict = field(default_factory=dict) + # ZK 整数版 + zk_labels: np.ndarray = None + zk_center: np.ndarray = None # (n_list, D) int64 + zk_code_books: np.ndarray = None # (M, K, d) int64 + zk_quant_vecs: np.ndarray = None # (N, M) int64 + zk_id_groups: dict = field(default_factory=dict) + changed_count: int = 0 + v_min: float = 0.0 + v_max: float = 0.0 + # Merkle 证明结构(逐簇 padding 到 capacity) + capacity: int = 0 + vpqs_all: np.ndarray = None # (n_list, capacity, M) int64 + valids_all: np.ndarray = None # (n_list, capacity) int64 + items_all: np.ndarray = None # (n_list, capacity) int64 + roots: np.ndarray = None # (n_list,) uint64 + # 可视化 + pca_comps: np.ndarray = None # (2, D) float32 + pca_mean: np.ndarray = None # (D,) float32 + pca_sample_ids: np.ndarray = None # (S,) + pca_sample_proj: np.ndarray = None # (S, 2) float32 + # 簇规模 + std_sizes: list = field(default_factory=list) + zk_sizes: list = field(default_factory=list) + + +MODELS: dict[str, ModelBundle] = {} +BUILD_STATE: dict[str, dict] = { + name: {"state": "idle", "message": "", "error": None} for name in DATASET_CFG +} +BUILD_LOCKS: dict[str, threading.Lock] = { + name: threading.Lock() for name in DATASET_CFG +} +BUILD_THREADS: dict[str, threading.Thread] = {} + + +def _set_state(name: str, state: str, message: str = "", error: str | None = None): + BUILD_STATE[name] = {"state": state, "message": message, "error": error} + print(f"[demo:{name}] {state}: {message}", flush=True) + + +def _save_npz(path: Path, **arrays): + path.parent.mkdir(parents=True, exist_ok=True) + np.savez_compressed(path, **arrays) + + +def _load_dataset(name: str) -> SIFT: + return SIFT(str(DATA_DIR / name)) + + +def _build_std_model(ds: SIFT, cfg: dict, name: str) -> None: + _set_state(name, "building", "训练标准浮点 IVF-PQ (coarse 聚类 + PQ 码本)…") + labels, center, code_books, quant_vecs, _ = std_learn( + ds.base_vecs, + n_list=cfg["n_list"], + n_iter=cfg["n_iter"], + M=cfg["M"], + K=cfg["K"], + random_state=1234, + layout=None, + ) + _save_npz( + CACHE_DIR / f"{name}_std.npz", + labels=labels.astype(np.int32), + center=center.astype(np.float32), + code_books=code_books.astype(np.float32), + quant_vecs=quant_vecs.astype(np.int16), + ) + + +def _build_zk_model(ds: SIFT, cfg: dict, name: str) -> float: + _set_state(name, "building", "整数化数据库并训练 ZK 版 IVF-PQ (含簇上界重平衡)…") + scaled, v_min, v_max = rescale_database(ds.base_vecs, SCALE_N) + labels, center, code_books, quant_vecs, _, changed_count = zk_train( + scaled, + n_list=cfg["n_list"], + n_iter=cfg["n_iter"], + M=cfg["M"], + K=cfg["K"], + random_state=1234, + cluster_bound=cfg["cluster_bound"], + layout=None, + ) + _save_npz( + CACHE_DIR / f"{name}_zk.npz", + labels=labels.astype(np.int32), + center=center.astype(np.int64), + code_books=np.rint(code_books).astype(np.int32), + quant_vecs=quant_vecs.astype(np.int16), + changed_count=np.int64(changed_count), + v_min=np.float64(v_min), + v_max=np.float64(v_max), + scale_n=np.int64(SCALE_N), + ) + del scaled + return changed_count + + +def _build_proof_structures(name: str, cfg: dict) -> None: + zk = np.load(CACHE_DIR / f"{name}_zk.npz") + labels = zk["labels"] + quant_vecs = zk["quant_vecs"].astype(np.int64) + n_list = cfg["n_list"] + M = cfg["M"] + + id_groups = _id_groups_from_labels(labels, n_list) + max_size = max((g.size for g in id_groups.values()), default=1) + capacity = _pow2_ceil(int(max_size)) + + _set_state( + name, + "building", + f"构建 Merkle 承诺结构 (capacity={capacity}, 共 {n_list} 簇)…", + ) + + vpqs_all = np.zeros((n_list, capacity, M), dtype=np.int64) + valids_all = np.zeros((n_list, capacity), dtype=np.int64) + items_all = np.zeros((n_list, capacity), dtype=np.int64) + for ci, ids in id_groups.items(): + take = min(ids.size, capacity) + if take == 0: + continue + items_all[ci, :take] = ids[:take] + valids_all[ci, :take] = 1 + vpqs_all[ci, :take] = quant_vecs[ids[:take]] + + roots = np.zeros(n_list, dtype=np.uint64) + for ci in range(n_list): + roots[ci] = _compute_cluster_root(ci, vpqs_all[ci], valids_all[ci], items_all[ci]) + if ci % max(1, n_list // 10) == 0: + _set_state( + name, + "building", + f"计算簇 Merkle 根 {ci}/{n_list} …", + ) + + _save_npz( + CACHE_DIR / f"{name}_proof.npz", + capacity=np.int64(capacity), + vpqs_all=vpqs_all.astype(np.int16), + valids_all=valids_all.astype(np.uint8), + items_all=items_all.astype(np.int32), + roots=roots, + ) + + +def _build_pca(name: str, base: np.ndarray) -> None: + _set_state(name, "building", "计算 2D PCA 投影 (用于可视化)…") + rng = np.random.default_rng(0) + sample_ids = np.sort(rng.choice(base.shape[0], size=min(PCA_SAMPLE, base.shape[0]), replace=False)) + X = base[sample_ids].astype(np.float64) + mean = X.mean(axis=0) + Xc = X - mean + # 协方差特征分解 (D 一般为 128/960, 很快) + cov = Xc.T @ Xc / max(1, Xc.shape[0] - 1) + eigvals, eigvecs = np.linalg.eigh(cov) + comps = eigvecs[:, -2:].T.astype(np.float32) # (2, D) + proj = ((base[sample_ids] - mean.astype(np.float32)) @ comps.T).astype(np.float32) + _save_npz( + CACHE_DIR / f"{name}_pca.npz", + comps=comps, + mean=mean.astype(np.float32), + sample_ids=sample_ids.astype(np.int32), + sample_proj=proj, + ) + + +def _load_bundle(name: str, ds: SIFT, cfg: dict) -> ModelBundle: + std = np.load(CACHE_DIR / f"{name}_std.npz") + zk = np.load(CACHE_DIR / f"{name}_zk.npz") + proof = np.load(CACHE_DIR / f"{name}_proof.npz") + pca = np.load(CACHE_DIR / f"{name}_pca.npz") + + n_list, M, K = cfg["n_list"], cfg["M"], cfg["K"] + std_labels = std["labels"] + zk_labels = zk["labels"] + + bundle = ModelBundle( + name=name, + base=ds.base_vecs, + query_vecs=ds.query_vecs, + n_list=n_list, + M=M, + K=K, + std_labels=std_labels, + std_center=std["center"], + std_code_books=std["code_books"], + std_quant_vecs=std["quant_vecs"].astype(np.int64), + std_id_groups=_id_groups_from_labels(std_labels, n_list), + zk_labels=zk_labels, + zk_center=zk["center"].astype(np.int64), + zk_code_books=zk["code_books"].astype(np.int64), + zk_quant_vecs=zk["quant_vecs"].astype(np.int64), + zk_id_groups=_id_groups_from_labels(zk_labels, n_list), + changed_count=int(zk["changed_count"]), + v_min=float(zk["v_min"]), + v_max=float(zk["v_max"]), + capacity=int(proof["capacity"]), + vpqs_all=proof["vpqs_all"].astype(np.int64), + valids_all=proof["valids_all"].astype(np.int64), + items_all=proof["items_all"].astype(np.int64), + roots=proof["roots"].astype(np.uint64), + pca_comps=pca["comps"], + pca_mean=pca["mean"], + pca_sample_ids=pca["sample_ids"], + pca_sample_proj=pca["sample_proj"], + std_sizes=[int(g.size) for g in _id_groups_from_labels(std_labels, n_list).values()], + zk_sizes=[int(g.size) for g in _id_groups_from_labels(zk_labels, n_list).values()], + ) + return bundle + + +def _build_worker(name: str): + cfg = DATASET_CFG[name] + try: + if not _dataset_dir_ok(name): + _set_state(name, "missing", "数据集文件不存在", error="missing") + return + ds = _load_dataset(name) + if not (CACHE_DIR / f"{name}_std.npz").exists(): + _build_std_model(ds, cfg, name) + if not (CACHE_DIR / f"{name}_zk.npz").exists(): + _build_zk_model(ds, cfg, name) + if not (CACHE_DIR / f"{name}_proof.npz").exists(): + _build_proof_structures(name, cfg) + if not (CACHE_DIR / f"{name}_pca.npz").exists(): + _build_pca(name, ds.base_vecs) + _set_state(name, "building", "加载模型到内存…") + bundle = _load_bundle(name, ds, cfg) + MODELS[name] = bundle + _set_state(name, "ready", "模型就绪") + except Exception: + traceback.print_exc() + _set_state(name, "error", "构建失败", error=traceback.format_exc()[-2000:]) + + +def _ensure_building(name: str) -> None: + if name not in DATASET_CFG: + raise HTTPException(status_code=404, detail=f"未知数据集: {name}") + if not _dataset_dir_ok(name): + raise HTTPException( + status_code=404, + detail=f"数据集 {name} 未下载: 请将 {name}.tar.gz 解压到 data/{name}/", + ) + st = BUILD_STATE[name] + if st["state"] in ("ready", "building"): + return + with BUILD_LOCKS[name]: + st = BUILD_STATE[name] + if st["state"] in ("ready", "building"): + return + t = threading.Thread(target=_build_worker, args=(name,), daemon=True) + BUILD_THREADS[name] = t + t.start() + + +# ---------------------------------------------------------------------------- +# 检索核心逻辑 +# ---------------------------------------------------------------------------- + + +def _std_search(bundle: ModelBundle, q: np.ndarray, n_probe: int, top_k: int): + t0 = time.perf_counter() + center = bundle.std_center + code_books = bundle.std_code_books + quant_vecs = bundle.std_quant_vecs + M, K, d = code_books.shape + m_indices = np.arange(M)[None, :] + + diff = center - q[None, :] + dist2 = np.einsum("ij,ij->i", diff, diff) + cluster_order = np.argsort(dist2, kind="stable") + + all_ids, all_dis2 = [], [] + for ci in cluster_order[: min(n_probe, bundle.n_list)]: + ids = bundle.std_id_groups.get(int(ci)) + if ids is None or ids.size == 0: + continue + res_query = q - center[ci] + codes = quant_vecs[ids] + recon = code_books[m_indices, codes, :].reshape(codes.shape[0], -1) + d2 = np.einsum("ij,ij->i", recon - res_query, recon - res_query) + all_ids.append(ids) + all_dis2.append(d2) + if not all_ids: + return np.empty(0, np.int64), np.empty(0), time.perf_counter() - t0 + ids = np.concatenate(all_ids) + dis = np.concatenate(all_dis2) + order = np.argsort(dis, kind="stable") + k = min(top_k, order.size) + return ids[order[:k]].astype(np.int64), dis[order[:k]], time.perf_counter() - t0 + + +def _zk_search(bundle: ModelBundle, q_scaled: np.ndarray, n_probe: int, top_k: int): + t0 = time.perf_counter() + center = bundle.zk_center + code_books = bundle.zk_code_books + quant_vecs = bundle.zk_quant_vecs + M, K, d = code_books.shape + m_indices = np.arange(M)[None, :] + + diff = center - q_scaled[None, :] + dist2 = (diff * diff).sum(axis=1, dtype=np.int64) + cluster_order = np.argsort(dist2, kind="stable") + + all_ids, all_dis2 = [], [] + for ci in cluster_order[: min(n_probe, bundle.n_list)]: + ids = bundle.zk_id_groups.get(int(ci)) + if ids is None or ids.size == 0: + continue + delta = q_scaled - center[ci] + codes = quant_vecs[ids] + recon = code_books[m_indices, codes, :].reshape(codes.shape[0], -1) + d2 = ((recon - delta) * (recon - delta)).sum(axis=1) + all_ids.append(ids) + all_dis2.append(d2) + if not all_ids: + return np.empty(0, np.int64), np.empty(0, np.int64), time.perf_counter() - t0 + ids = np.concatenate(all_ids) + dis = np.concatenate(all_dis2) + order = np.argsort(dis, kind="stable") + k = min(top_k, order.size) + return ids[order[:k]].astype(np.int64), dis[order[:k]], time.perf_counter() - t0 + + +def _brute_topk(base: np.ndarray, q: np.ndarray, top_k: int, chunk: int = 200_000): + t0 = time.perf_counter() + n = base.shape[0] + best_dis = np.full(top_k, np.inf, dtype=np.float64) + best_idx = np.full(top_k, -1, dtype=np.int64) + for s in range(0, n, chunk): + e = min(s + chunk, n) + d = base[s:e] - q[None, :] + d2 = np.einsum("ij,ij->i", d, d).astype(np.float64) + if top_k < e - s: + part = np.argpartition(d2, top_k - 1)[:top_k] + else: + part = np.arange(e - s) + cand_dis = np.concatenate([best_dis, d2[part]]) + cand_idx = np.concatenate([best_idx, (part + s).astype(np.int64)]) + order = np.argsort(cand_dis, kind="stable")[:top_k] + best_dis = cand_dis[order] + best_idx = cand_idx[order] + return best_idx, best_dis, time.perf_counter() - t0 + + +def _zk_proof(bundle: ModelBundle, q_scaled: np.ndarray, n_probe: int, top_k: int): + center = bundle.zk_center + diff = center - q_scaled[None, :] + dist2 = (diff * diff).sum(axis=1, dtype=np.int64) + order = np.argsort(dist2, kind="stable") + cluster_idxes = order[: min(n_probe, bundle.n_list)] + cluster_idx_dis = np.stack([order, dist2[order]], axis=1).astype(np.int64) + + vpqss = bundle.vpqs_all[cluster_idxes] + valids = bundle.valids_all[cluster_idxes] + itemss = bundle.items_all[cluster_idxes] + + result = py_set_based_with_merkle( + q_scaled.astype(np.int64), + center, + vpqss, + valids, + itemss, + bundle.zk_code_books, + bundle.roots, + int(top_k), + cluster_idx_dis, + [], # ordered_vpqss_item_dis 由 Rust 端内部重算 + ) + keys = ("build_time", "prove_time", "verify_time", "proof_size", "memory_used", "num_gates") + return dict(zip(keys, result)) + + +def _viz_payload( + bundle: ModelBundle, + q: np.ndarray, + probed_clusters: np.ndarray, + std_ids: np.ndarray, + zk_ids: np.ndarray, + gt_ids: np.ndarray, + max_per_cluster: int = 60, +): + comps = bundle.pca_comps + mean = bundle.pca_mean + + def proj_of(ids: np.ndarray) -> np.ndarray: + ids = np.asarray(ids, dtype=np.int64) + if ids.size == 0: + return np.empty((0, 2), dtype=np.float32) + return ((bundle.base[ids] - mean) @ comps.T).astype(np.float32) + + rng = np.random.default_rng(7) + pts = [] + for ci in probed_clusters: + ids = bundle.std_id_groups.get(int(ci)) + if ids is None or ids.size == 0: + continue + if ids.size > max_per_cluster: + ids = rng.choice(ids, size=max_per_cluster, replace=False) + proj = proj_of(ids) + for (x, y), vid in zip(proj, ids): + pts.append([round(float(x), 3), round(float(y), 3), int(ci), int(vid)]) + + def named(proj: np.ndarray, ids: np.ndarray): + return [ + [round(float(x), 3), round(float(y), 3), int(vid)] + for (x, y), vid in zip(proj, np.asarray(ids, dtype=np.int64)) + ] + + q_proj = ((q[None, :].astype(np.float32) - mean) @ comps.T)[0] + return { + "points": pts, + "query": [round(float(q_proj[0]), 3), round(float(q_proj[1]), 3)], + "std_topk": named(proj_of(std_ids), std_ids), + "zk_topk": named(proj_of(zk_ids), zk_ids), + "gt_topk": named(proj_of(gt_ids), gt_ids), + } + + +# ---------------------------------------------------------------------------- +# FastAPI 应用 +# ---------------------------------------------------------------------------- + +app = FastAPI(title="zk-IVF-PQ demo") + + +class SearchReq(BaseModel): + dataset: str + query_id: int + n_probe: int = 8 + top_k: int = 10 + proof: bool = False + + +@app.get("/api/datasets") +def list_datasets(): + out = [] + for name, cfg in DATASET_CFG.items(): + st = BUILD_STATE[name] + available = _dataset_dir_ok(name) + item = { + "name": name, + "desc": DATASET_DESC[name], + "available": available, + "state": st["state"] if available else "missing", + "message": st["message"], + "error": st["error"], + "n_list": cfg["n_list"], + "M": cfg["M"], + "K": cfg["K"], + "cluster_bound": cfg["cluster_bound"], + } + bundle = MODELS.get(name) + if bundle is not None: + item.update( + { + "N": int(bundle.base.shape[0]), + "D": int(bundle.base.shape[1]), + "Q": int(bundle.query_vecs.shape[0]), + "capacity": bundle.capacity, + "changed_count": bundle.changed_count, + } + ) + out.append(item) + return {"datasets": out} + + +@app.post("/api/prepare/{name}") +def prepare(name: str): + _ensure_building(name) + return {"ok": True} + + +@app.get("/api/status/{name}") +def status(name: str): + if name not in DATASET_CFG: + raise HTTPException(status_code=404, detail=f"未知数据集: {name}") + return BUILD_STATE[name] + + +@app.get("/api/cluster_stats/{name}") +def cluster_stats(name: str): + bundle = MODELS.get(name) + if bundle is None: + raise HTTPException(status_code=409, detail="模型尚未构建完成") + return { + "std_sizes": bundle.std_sizes, + "zk_sizes": bundle.zk_sizes, + "changed_count": bundle.changed_count, + "cluster_bound": DATASET_CFG[name]["cluster_bound"], + "capacity": bundle.capacity, + } + + +@app.post("/api/search") +def search(req: SearchReq): + name = req.dataset + bundle = MODELS.get(name) + if bundle is None: + st = BUILD_STATE[name] + if st.get("error") or st["state"] == "missing": + raise HTTPException(status_code=409, detail="模型不可用: " + st["message"]) + raise HTTPException(status_code=409, detail="模型尚未构建完成, 请先构建") + + Q = bundle.query_vecs.shape[0] + if req.query_id < 0 or req.query_id >= Q: + raise HTTPException(status_code=400, detail=f"query_id 超出范围 [0, {Q})") + n_probe = max(1, min(int(req.n_probe), bundle.n_list)) + top_k = max(1, min(int(req.top_k), 200)) + do_proof = bool(req.proof) + if do_proof and n_probe > 16: + raise HTTPException(status_code=400, detail="证明生成时 n_probe 最大支持 16") + + q = bundle.query_vecs[req.query_id].astype(np.float32) + + std_ids, std_dis, std_time = _std_search(bundle, q, n_probe, top_k) + + q_scaled = rescale_query(q, SCALE_N, bundle.v_min, bundle.v_max).astype(np.int64) + zk_ids, zk_dis, zk_time = _zk_search(bundle, q_scaled, n_probe, top_k) + + gt_ids, gt_dis, gt_time = _brute_topk(bundle.base, q, top_k) + + proof_res = None + if do_proof: + t0 = time.perf_counter() + proof_res = _zk_proof(bundle, q_scaled, n_probe, top_k) + proof_res["assemble_time"] = time.perf_counter() - t0 + proof_res = { + "build_time": float(proof_res["build_time"]), + "prove_time": float(proof_res["prove_time"]), + "verify_time": float(proof_res["verify_time"]), + "proof_size": int(proof_res["proof_size"]), + "memory_used": int(proof_res["memory_used"]), + "num_gates": int(proof_res["num_gates"]), + "verified": True, + } + + def rows(ids, dis, gt_set, zk_set=None, std_set=None): + out = [] + for i, (vid, vd) in enumerate(zip(ids, dis)): + r = { + "rank": i, + "id": int(vid), + "dist": float(vd), + "in_gt": int(vid) in gt_set, + } + if zk_set is not None: + r["in_zk"] = int(vid) in zk_set + if std_set is not None: + r["in_std"] = int(vid) in std_set + out.append(r) + return out + + gt_set = set(int(x) for x in gt_ids) + zk_set = set(int(x) for x in zk_ids) + std_set = set(int(x) for x in std_ids) + + k_eff = max(1, min(top_k, gt_ids.size)) + recall_std = len(std_set & gt_set) / k_eff + recall_zk = len(zk_set & gt_set) / k_eff + overlap = len(std_set & zk_set) / k_eff + + diff = bundle.std_center - q[None, :] + d2 = np.einsum("ij,ij->i", diff, diff) + probed = np.argsort(d2, kind="stable")[:n_probe] + + return { + "dataset": name, + "query_id": int(req.query_id), + "n_probe": int(n_probe), + "top_k": int(top_k), + "params": {"n_list": bundle.n_list, "M": bundle.M, "K": bundle.K, "scale_n": SCALE_N}, + "standard": { + "rows": rows(std_ids, std_dis, gt_set, zk_set=zk_set), + "time_ms": std_time * 1000.0, + "recall": recall_std, + }, + "zk": { + "rows": rows(zk_ids, zk_dis, gt_set, std_set=std_set), + "time_ms": zk_time * 1000.0, + "recall": recall_zk, + }, + "ground_truth": { + "rows": rows(gt_ids, gt_dis, gt_set), + "time_ms": gt_time * 1000.0, + }, + "metrics": { + "recall_std": recall_std, + "recall_zk": recall_zk, + "overlap_std_zk": overlap, + "gt_time_ms": gt_time * 1000.0, + }, + "proof": proof_res, + "viz": _viz_payload(bundle, q, probed, std_ids, zk_ids, gt_ids), + } + + +@app.get("/") +def index(): + return FileResponse(STATIC_DIR / "index.html") + + +app.mount("/", StaticFiles(directory=str(STATIC_DIR)), name="static") + + +if __name__ == "__main__": + port = int(sys.argv[1]) if len(sys.argv) > 1 else 8000 + uvicorn.run(app, host="0.0.0.0", port=port) diff --git a/demo/static/app.js b/demo/static/app.js new file mode 100644 index 0000000..e143e0d --- /dev/null +++ b/demo/static/app.js @@ -0,0 +1,649 @@ +/* zk-IVF-PQ 交互演示前端逻辑(无外部依赖) */ +"use strict"; + +const $ = (sel) => document.querySelector(sel); + +const state = { + datasets: [], + selected: null, + polling: null, + lastResult: null, +}; + +const C = { + std: "#2563eb", + zk: "#7c3aed", + gt: "#059669", + proof: "#d97706", + verify: "#059669", + query: "#dc2626", +}; + +function clusterColor(ci) { + const hue = (ci * 137.508) % 360; + return `hsl(${hue.toFixed(0)}, 62%, 52%)`; +} + +function fmtMs(ms) { + if (ms == null) return "—"; + if (ms >= 1000) return (ms / 1000).toFixed(2) + " s"; + if (ms >= 10) return ms.toFixed(0) + " ms"; + return ms.toFixed(2) + " ms"; +} + +function fmtInt(x) { + return Number(x).toLocaleString("en-US"); +} + +function showToast(msg, isError = false) { + const t = $("#toast"); + t.textContent = msg; + t.className = "toast show" + (isError ? " error" : ""); + clearTimeout(t._timer); + t._timer = setTimeout(() => (t.className = "toast" + (isError ? " error" : "")), 4000); +} + +async function api(path, opts) { + const res = await fetch(path, opts); + if (!res.ok) { + let detail = res.statusText; + try { + const body = await res.json(); + detail = body.detail || detail; + } catch (e) { /* ignore */ } + throw new Error(detail); + } + return res.json(); +} + +/* ================= 数据集 ================= */ + +async function loadDatasets() { + const data = await api("/api/datasets"); + state.datasets = data.datasets; + renderDatasets(); + updateControls(); +} + +function renderDatasets() { + const wrap = $("#dataset-list"); + wrap.innerHTML = ""; + for (const ds of state.datasets) { + const item = document.createElement("div"); + item.className = "ds-item" + (state.selected === ds.name ? " selected" : ""); + + const badgeTxt = { + idle: "待构建", + building: "构建中", + ready: "就绪", + error: "失败", + missing: "数据缺失", + }[ds.state] || ds.state; + + const meta = []; + if (ds.N != null) meta.push(`N=${fmtInt(ds.N)}`, `D=${ds.D}`, `Q=${fmtInt(ds.Q)}`); + if (ds.capacity != null) meta.push(`capacity=${ds.capacity}`); + + item.innerHTML = ` +
+ ${ds.name} + ${badgeTxt} +
+
${ds.desc} · n_list=${ds.n_list}, M=${ds.M}, K=${ds.K}
+ ${meta.length ? `
${meta.join(" · ")}
` : ""} + ${ds.state === "building" ? `
${ds.message || ""}
` : ""} + ${ds.state === "error" ? `
构建失败
` : ""} + ${ds.state === "missing" ? `
请先下载数据集并解压到 data/${ds.name}/
` : ""} + ${(ds.state === "idle") && ds.available ? `` : ""} + `; + item.addEventListener("click", () => selectDataset(ds.name)); + const btn = item.querySelector(".ds-build-btn"); + if (btn) btn.addEventListener("click", (e) => { e.stopPropagation(); prepareDataset(ds.name); }); + wrap.appendChild(item); + } +} + +function selectDataset(name) { + state.selected = name; + renderDatasets(); + updateControls(); + const ds = state.datasets.find((d) => d.name === name); + if (ds && ds.available && ds.state === "idle") { + prepareDataset(name); + } + if (ds && ds.state === "ready") { + $("#chk-proof").checked = name === "siftsmall"; + } +} + +async function prepareDataset(name) { + try { + await api(`/api/prepare/${name}`, { method: "POST" }); + showToast(`开始构建 ${name} 模型…`); + startPolling(name); + } catch (e) { + showToast(e.message, true); + } +} + +function startPolling(name) { + clearInterval(state.polling); + state.polling = setInterval(async () => { + try { + const st = await api(`/api/status/${name}`); + renderDatasets(); + if (st.state === "ready") { + clearInterval(state.polling); + state.polling = null; + await loadDatasets(); + showToast(`${name} 模型就绪`); + updateControls(); + if (state.selected === name) runSearch(); + } else if (st.state === "error" || st.state === "missing") { + clearInterval(state.polling); + state.polling = null; + showToast(`${name}: ${st.message}`, true); + } + } catch (e) { /* 网络抖动时继续轮询 */ } + }, 1500); +} + +function selectedDataset() { + return state.datasets.find((d) => d.name === state.selected); +} + +function updateControls() { + const ds = selectedDataset(); + const btn = $("#btn-search"); + const ready = ds && ds.state === "ready"; + btn.disabled = !ready; + btn.textContent = ready ? "开始检索" : ds ? "模型未就绪" : "请选择数据集"; + renderParamSummary(); +} + +function renderParamSummary() { + const ds = selectedDataset(); + const el = $("#param-summary"); + if (!ds || ds.state !== "ready" || ds.N == null) { + el.innerHTML = `请先选择并构建数据集`; + return; + } + const d = ds.M > 0 ? ds.D / ds.M : 0; + el.innerHTML = ` + 数据规模 N × D${fmtInt(ds.N)} × ${ds.D} + 查询数 Q${fmtInt(ds.Q)} + IVF 簇数 n_list${ds.n_list} + PQ 段数 M / 码字 K${ds.M} / ${ds.K}(d=${d}) + 簇容量上界(padding)${ds.capacity} + 重平衡改动向量数${fmtInt(ds.changed_count)} + 整数化上界 scale_n65536 + `; +} + +/* ================= 检索 ================= */ + +async function runSearch() { + const ds = selectedDataset(); + if (!ds || ds.state !== "ready") { + showToast("请先构建并选择数据集", true); + return; + } + const btn = $("#btn-search"); + btn.disabled = true; + btn.innerHTML = ` 检索中…`; + try { + const body = { + dataset: state.selected, + query_id: parseInt($("#query-id").value || "0", 10), + n_probe: parseInt($("#slider-nprobe").value, 10), + top_k: parseInt($("#slider-topk").value, 10), + proof: $("#chk-proof").checked, + }; + const result = await api("/api/search", { + method: "POST", + headers: { "Content-Type": "application/json" }, + body: JSON.stringify(body), + }); + state.lastResult = result; + renderAll(result); + if (body.proof) showToast("检索与证明生成完成"); + } catch (e) { + showToast(e.message, true); + } finally { + btn.disabled = false; + btn.textContent = "开始检索"; + } +} + +function renderAll(r) { + renderMetrics(r); + drawScatter(r.viz); + drawTimeChart(r); + drawRecallChart(r.metrics); + renderTable(r); + loadClusterStats(r.dataset); +} + +/* ================= 指标卡片 ================= */ + +function metricCard(label, value, sub, colorClass, extra = "") { + return ` +
+
${label}
+
${value}${extra}
+
${sub || ""}
+
`; +} + +function renderMetrics(r) { + const row = $("#metrics-row"); + const p = r.proof; + let proofCards; + if (p) { + proofCards = + metricCard("证明大小", (p.proof_size / 1024).toFixed(1), `KB · ${fmtInt(p.num_gates)} 门`, "c-neutral") + + metricCard( + `证明验证`, + `通过VERIFIED`, + `生成 ${fmtMs(p.prove_time * 1000)} · 验证 ${fmtMs(p.verify_time * 1000)} · 内存 ${(p.memory_used / 1024 ** 3).toFixed(2)} GB`, + "c-ok" + ); + } else { + proofCards = + metricCard("证明大小", "—", "未生成", "c-neutral") + + metricCard("证明验证", "—", "未生成", "c-neutral"); + } + row.innerHTML = + metricCard("标准 IVF-PQ 检索", fmtMs(r.standard.time_ms), `浮点 · n_probe=${r.n_probe}`, "c-std") + + metricCard("ZK IVF-PQ 检索", fmtMs(r.zk.time_ms), `整数域 · 与证明一致`, "c-zk") + + metricCard("标准召回率", (r.metrics.recall_std * 100).toFixed(1) + "%", `recall@${r.top_k} 对比精确检索`, "c-std") + + metricCard("ZK 召回率", (r.metrics.recall_zk * 100).toFixed(1) + "%", `recall@${r.top_k} · 标准∩ZK ${(r.metrics.overlap_std_zk * 100).toFixed(0)}%`, "c-zk") + + metricCard("精确检索耗时", fmtMs(r.metrics.gt_time_ms), `暴力扫描全库`, "c-neutral") + + proofCards; +} + +/* ================= 结果表 ================= */ + +function renderTable(r) { + const tbody = $("#result-table tbody"); + const n = Math.max(r.standard.rows.length, r.zk.rows.length, r.ground_truth.rows.length); + let html = ""; + for (let i = 0; i < n; i++) { + const g = r.ground_truth.rows[i]; + const s = r.standard.rows[i]; + const z = r.zk.rows[i]; + const hitBadge = (hit) => + hit ? `命中` : `未中`; + html += ` + ${i + 1} + ${g ? g.id : ""} + ${g ? g.dist.toFixed(1) : ""} + ${s ? s.id : ""} ${s ? hitBadge(s.in_gt) : ""} + ${s ? s.dist.toFixed(1) : ""} + ${z ? z.id : ""} ${z ? hitBadge(z.in_gt) : ""} + ${z ? fmtInt(z.dist) : ""} + `; + } + tbody.innerHTML = html; +} + +/* ================= 画布工具 ================= */ + +function setupCanvas(canvas) { + const dpr = window.devicePixelRatio || 1; + const w = canvas.clientWidth; + const h = canvas.clientHeight; + canvas.width = Math.max(1, Math.round(w * dpr)); + canvas.height = Math.max(1, Math.round(h * dpr)); + const ctx = canvas.getContext("2d"); + ctx.setTransform(dpr, 0, 0, dpr, 0, 0); + ctx.clearRect(0, 0, w, h); + return { ctx, w, h }; +} + +/* ================= 耗时柱状图(对数) ================= */ + +function drawTimeChart(r) { + const items = [ + { label: "精确检索", value: r.metrics.gt_time_ms, color: "#9ca3af" }, + { label: "标准检索", value: r.standard.time_ms, color: C.std }, + { label: "ZK 检索", value: r.zk.time_ms, color: C.zk }, + ]; + if (r.proof) { + items.push( + { label: "证明构建", value: r.proof.build_time * 1000, color: C.proof }, + { label: "证明生成", value: r.proof.prove_time * 1000, color: C.proof }, + { label: "证明验证", value: r.proof.verify_time * 1000, color: C.verify } + ); + } + const { ctx, w, h } = setupCanvas($("#time-chart")); + const padL = 10, padR = 10, padT = 24, padB = 44; + const plotW = w - padL - padR, plotH = h - padT - padB; + const logs = items.map((it) => Math.log10(Math.max(it.value, 0.01))); + const maxLog = Math.max(...logs, 0.5); + const bw = plotW / items.length; + + ctx.font = "11px sans-serif"; + ctx.textAlign = "center"; + // 网格: 0.01ms ~ 最大 + ctx.strokeStyle = "#f3f4f6"; + for (let e = -2; e <= Math.ceil(maxLog); e++) { + const y = padT + plotH * (1 - (e + 2) / (maxLog + 2)); + if (y < padT || y > padT + plotH) continue; + ctx.beginPath(); + ctx.moveTo(padL, y); + ctx.lineTo(w - padR, y); + ctx.stroke(); + ctx.fillStyle = "#9ca3af"; + ctx.textAlign = "left"; + ctx.fillText(`${Math.pow(10, e) < 1 ? Math.pow(10, e).toFixed(2) : Math.pow(10, e).toFixed(0)}`, padL + 2, y - 2); + ctx.textAlign = "center"; + } + + items.forEach((it, i) => { + const x = padL + i * bw + bw * 0.22; + const barW = bw * 0.56; + const frac = (logs[i] + 2) / (maxLog + 2); + const barH = Math.max(3, plotH * frac); + const y = padT + plotH - barH; + ctx.fillStyle = it.color; + roundRect(ctx, x, y, barW, barH, 4); + ctx.fill(); + ctx.fillStyle = "#111827"; + ctx.fillText(fmtMs(it.value), x + barW / 2, y - 6); + ctx.fillStyle = "#4b5563"; + const label = it.label; + ctx.fillText(label, x + barW / 2, padT + plotH + 16); + }); +} + +function roundRect(ctx, x, y, w, h, r) { + r = Math.min(r, w / 2, h / 2); + ctx.beginPath(); + ctx.moveTo(x + r, y); + ctx.arcTo(x + w, y, x + w, y + h, r); + ctx.arcTo(x + w, y + h, x, y + h, r); + ctx.arcTo(x, y + h, x, y, r); + ctx.arcTo(x, y, x + w, y, r); + ctx.closePath(); +} + +/* ================= 召回率柱状图 ================= */ + +function drawRecallChart(metrics) { + const items = [ + { label: "标准 IVF-PQ", value: metrics.recall_std * 100, color: C.std }, + { label: "ZK IVF-PQ", value: metrics.recall_zk * 100, color: C.zk }, + { label: "标准 ∩ ZK", value: metrics.overlap_std_zk * 100, color: "#64748b" }, + ]; + const { ctx, w, h } = setupCanvas($("#recall-chart")); + const padL = 34, padR = 10, padT = 18, padB = 40; + const plotW = w - padL - padR, plotH = h - padT - padB; + const bw = plotW / items.length; + + ctx.strokeStyle = "#f3f4f6"; + ctx.font = "11px sans-serif"; + for (let v = 0; v <= 100; v += 25) { + const y = padT + plotH * (1 - v / 100); + ctx.beginPath(); + ctx.moveTo(padL, y); + ctx.lineTo(w - padR, y); + ctx.stroke(); + ctx.fillStyle = "#9ca3af"; + ctx.textAlign = "right"; + ctx.fillText(v + "%", padL - 6, y + 4); + } + + items.forEach((it, i) => { + const x = padL + i * bw + bw * 0.22; + const barW = bw * 0.56; + const barH = Math.max(2, plotH * (it.value / 100)); + const y = padT + plotH - barH; + ctx.fillStyle = it.color; + roundRect(ctx, x, y, barW, barH, 4); + ctx.fill(); + ctx.fillStyle = "#111827"; + ctx.textAlign = "center"; + ctx.fillText(it.value.toFixed(1) + "%", x + barW / 2, y - 6); + ctx.fillStyle = "#4b5563"; + ctx.fillText(it.label, x + barW / 2, padT + plotH + 16); + }); +} + +/* ================= 簇规模直方图 ================= */ + +async function loadClusterStats(name) { + try { + const st = await api(`/api/cluster_stats/${name}`); + drawClusterChart(st); + $("#cluster-meta").innerHTML = + `重平衡改动向量数 ${fmtInt(st.changed_count)} · 簇上界 ${st.cluster_bound} · Merkle capacity ${st.capacity}`; + } catch (e) { + $("#cluster-meta").textContent = ""; + } +} + +function drawClusterChart(st) { + const { ctx, w, h } = setupCanvas($("#cluster-chart")); + const all = st.std_sizes.concat(st.zk_sizes); + if (!all.length) return; + const lo = 0, hi = Math.max(...all); + const bins = 30; + const bw = (hi - lo) / bins || 1; + const hist = (sizes) => { + const arr = new Array(bins).fill(0); + for (const s of sizes) { + const b = Math.min(bins - 1, Math.floor((s - lo) / bw)); + arr[b]++; + } + return arr; + }; + const hStd = hist(st.std_sizes); + const hZk = hist(st.zk_sizes); + const maxC = Math.max(...hStd, ...hZk, 1); + + const padL = 34, padR = 10, padT = 14, padB = 34; + const plotW = w - padL - padR, plotH = h - padT - padB; + + ctx.strokeStyle = "#f3f4f6"; + ctx.font = "11px sans-serif"; + for (let v = 0; v <= 4; v++) { + const y = padT + plotH * (1 - v / 4); + ctx.beginPath(); + ctx.moveTo(padL, y); + ctx.lineTo(w - padR, y); + ctx.stroke(); + ctx.fillStyle = "#9ca3af"; + ctx.textAlign = "right"; + ctx.fillText(String(Math.round((maxC * v) / 4)), padL - 6, y + 4); + } + + const binW = plotW / bins; + for (let b = 0; b < bins; b++) { + const x = padL + b * binW; + const bh1 = plotH * (hStd[b] / maxC); + const bh2 = plotH * (hZk[b] / maxC); + ctx.fillStyle = "rgba(37, 99, 235, 0.35)"; + ctx.fillRect(x + 1, padT + plotH - bh1, binW - 2, bh1); + ctx.fillStyle = "rgba(124, 58, 237, 0.45)"; + ctx.fillRect(x + 1 + binW / 2, padT + plotH - bh2, binW / 2 - 2, bh2); + } + + // 簇上界参考线 + const bx = padL + plotW * ((st.cluster_bound - lo) / (hi - lo || 1)); + if (bx >= padL && bx <= w - padR) { + ctx.strokeStyle = "#dc2626"; + ctx.setLineDash([4, 4]); + ctx.beginPath(); + ctx.moveTo(bx, padT); + ctx.lineTo(bx, padT + plotH); + ctx.stroke(); + ctx.setLineDash([]); + ctx.fillStyle = "#dc2626"; + ctx.textAlign = "left"; + ctx.fillText(`簇上界 ${st.cluster_bound}`, bx + 4, padT + 10); + } + + ctx.fillStyle = "#4b5563"; + ctx.textAlign = "center"; + ctx.fillText(`0`, padL, h - 12); + ctx.fillText(String(Math.round(hi)), w - padR, h - 12); + ctx.fillText("簇内向量数", padL + plotW / 2, h - 12); +} + +/* ================= PCA 散点图 ================= */ + +function drawScatter(viz) { + const canvas = $("#scatter"); + const { ctx, w, h } = setupCanvas(canvas); + const base = viz.points || []; + const extras = [viz.std_topk || [], viz.zk_topk || [], viz.gt_topk || [], [viz.query]]; + let minX = Infinity, maxX = -Infinity, minY = Infinity, maxY = -Infinity; + for (const p of base) { + minX = Math.min(minX, p[0]); maxX = Math.max(maxX, p[0]); + minY = Math.min(minY, p[1]); maxY = Math.max(maxY, p[1]); + } + for (const arr of extras) { + for (const p of arr) { + minX = Math.min(minX, p[0]); maxX = Math.max(maxX, p[0]); + minY = Math.min(minY, p[1]); maxY = Math.max(maxY, p[1]); + } + } + if (!isFinite(minX)) return; + const dx = maxX - minX || 1, dy = maxY - minY || 1; + minX -= dx * 0.06; maxX += dx * 0.06; + minY -= dy * 0.06; maxY += dy * 0.06; + const scale = Math.min(w / (maxX - minX), h / (maxY - minY)); + const ox = (w - (maxX - minX) * scale) / 2; + const oy = (h - (maxY - minY) * scale) / 2; + const X = (x) => ox + (x - minX) * scale; + const Y = (y) => h - oy - (y - minY) * scale; + + ctx.font = "11px sans-serif"; + + // 探测簇内的基向量(按簇着色) + for (const [x, y, ci] of base) { + ctx.globalAlpha = 0.65; + ctx.fillStyle = clusterColor(ci); + ctx.beginPath(); + ctx.arc(X(x), Y(y), 2.6, 0, Math.PI * 2); + ctx.fill(); + } + ctx.globalAlpha = 1; + + // 精确检索 top-k:绿色菱形 + ctx.strokeStyle = C.gt; + ctx.lineWidth = 2; + for (const [x, y] of viz.gt_topk || []) { + const cx = X(x), cy = Y(y), r = 5; + ctx.beginPath(); + ctx.moveTo(cx, cy - r); + ctx.lineTo(cx + r, cy); + ctx.lineTo(cx, cy + r); + ctx.lineTo(cx - r, cy); + ctx.closePath(); + ctx.stroke(); + } + + // 标准 top-k:蓝色圆环 + ctx.strokeStyle = C.std; + for (const [x, y] of viz.std_topk || []) { + ctx.beginPath(); + ctx.arc(X(x), Y(y), 7, 0, Math.PI * 2); + ctx.stroke(); + } + + // ZK top-k:紫色叉 + ctx.strokeStyle = C.zk; + ctx.lineWidth = 2; + for (const [x, y] of viz.zk_topk || []) { + const cx = X(x), cy = Y(y), r = 5; + ctx.beginPath(); + ctx.moveTo(cx - r, cy - r); ctx.lineTo(cx + r, cy + r); + ctx.moveTo(cx - r, cy + r); ctx.lineTo(cx + r, cy - r); + ctx.stroke(); + } + + // 查询点:红星 + const [qx, qy] = viz.query; + ctx.fillStyle = C.query; + ctx.strokeStyle = "#fff"; + ctx.lineWidth = 1.5; + drawStar(ctx, X(qx), Y(qy), 7, 5); + ctx.fill(); + ctx.stroke(); + ctx.fillStyle = C.query; + ctx.textAlign = "left"; + ctx.fillText("查询", X(qx) + 10, Y(qy) + 4); + + // 图例 + $("#scatter-legend").innerHTML = ` + 标准 top-k(圆环) + ZK top-k(叉) + 精确 top-k(菱形) + 查询向量 + 彩色点 = 探测簇内基向量(按簇着色) + `; +} + +function drawStar(ctx, cx, cy, outer, inner) { + ctx.beginPath(); + for (let i = 0; i < 10; i++) { + const r = i % 2 === 0 ? outer : inner; + const a = (Math.PI / 5) * i - Math.PI / 2; + const x = cx + r * Math.cos(a); + const y = cy + r * Math.sin(a); + i === 0 ? ctx.moveTo(x, y) : ctx.lineTo(x, y); + } + ctx.closePath(); +} + +/* ================= 初始化与事件 ================= */ + +function initEvents() { + $("#btn-search").addEventListener("click", runSearch); + $("#btn-random").addEventListener("click", () => { + const ds = selectedDataset(); + if (!ds || ds.Q == null) return; + $("#query-id").value = Math.floor(Math.random() * ds.Q); + }); + $("#slider-nprobe").addEventListener("input", (e) => { + $("#val-nprobe").textContent = e.target.value; + }); + $("#slider-topk").addEventListener("input", (e) => { + $("#val-topk").textContent = e.target.value; + }); + let resizeTimer = null; + window.addEventListener("resize", () => { + clearTimeout(resizeTimer); + resizeTimer = setTimeout(() => { + if (state.lastResult) renderAll(state.lastResult); + }, 200); + }); +} + +async function init() { + initEvents(); + try { + await loadDatasets(); + // 默认选中第一个可用数据集(优先已就绪,其次 siftsmall) + const ready = state.datasets.find((d) => d.state === "ready"); + const available = state.datasets.find((d) => d.name === "siftsmall" && d.available) + || state.datasets.find((d) => d.available); + const pick = ready || available; + if (pick) { + state.selected = pick.name; + renderDatasets(); + updateControls(); + if (pick.state !== "ready" && pick.available) prepareDataset(pick.name); + if (pick.state === "ready") { + $("#chk-proof").checked = pick.name === "siftsmall"; + runSearch(); + } + } + } catch (e) { + showToast("无法连接后端: " + e.message, true); + } +} + +init(); diff --git a/demo/static/index.html b/demo/static/index.html new file mode 100644 index 0000000..066967f --- /dev/null +++ b/demo/static/index.html @@ -0,0 +1,126 @@ + + + + + + zk-IVF-PQ 交互演示 + + + +
+
+ + zk-IVF-PQ + 零知识向量数据库检索交互演示 +
+
标准 IVF-PQ · ZK IVF-PQ · 精确检索 三方对比
+
+ +
+ + +
+
+
在左侧选择查询并点击「开始检索」查看结果
+
+ +
+
+

PCA 二维投影 · 探测簇与检索结果

+
+
+
+
+

耗时对比(对数刻度,ms)

+
+
+
+ +
+
+

召回率 @ top_k

+
+
+
+

IVF 簇规模分布(标准 vs ZK 重平衡)

+
+
+
+
+ +
+

检索结果对比

+
+ + + + + + + + + + + + + + + + +
排名精确检索(真值)标准 IVF-PQZK IVF-PQ
向量 ID距离向量 ID距离向量 ID距离
+
+
+
+
+ +
+ + + diff --git a/demo/static/screenshot.png b/demo/static/screenshot.png new file mode 100644 index 0000000000000000000000000000000000000000..38bcbe669948f517ea467d608287f02371aaaf7e GIT binary patch literal 236355 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�MX^j? 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/f-NuFNBpwP0Akvq}M4fE37GHyM+908YJ* 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�Qpm{3P(G43115+i)v~4rIsmD>+HtV&+d7mUVZ*$yx5KYCx1tt+_ zV-!Snf%t9o9Pi$x#Zbg3il7s5;ReC~N6{un>&7(vB_5>oS(pd=Cn5SsBv+Z9@=H;Lv0&7c>VmY5R_dM$FyV zI#iD|2%8GzIL=F;XVqZ2934(X#1Ya?&upl;BA9#`T_gEx_ihL0zMCg3G1J$xRiM#0 zfGbl#$HAGlA7+e;IElnrF;7q8QkRxV{5gx3QfzsUr|`NB@g%{g#y6a%ZD*` z)Wr`7P;}MBi}B4Q0KrUI5je_R{sT=Q&Mw?Ly4;x^-z<{{nA{l<)EpwYhcX*Y&okzj zVb4nfVUaCBWN8+ktMbT5?VWby&9%aeWn!^Fiu1(sRi^{Q5^)8D(ms{C3{U}#zv;z` z4O7p5&#T_1r-mtp!@}MkMu%{LBjz5Ekuou{G<3-X+@V5#vE5bEs&%zomhh~8jzSPe zN=|J8V(kjqOpbWP%(z~Uj=v$oXGepy5+OZkf&*bc^GTD=Bd z7(1TPoWV&|!<0K^{`|c;ytGrVm*#USnh_;zUge+I{u1m*zbkh`t-y9hxm!Ue*iCwt zH#s_d{>=6nTCA>1i0lcjDNOPsxo|nEr_Vt9z?2r7Vj{O^;fS_LOmkY$tEk!()8S`dahE%!>+F1gc#mu{m`LjK zuYX-0eX!II%OPC7&1@S1Z@D1%Cc5tz5w!Gda(k$S7V$viye1P`so3YrGB@N3cEuvl zZJj+X0!mmqT0OVy;T(}Bo} z$Q9t!;jPR>dsjEnuNaRqcUM2V%1mrR!<9p$F20fB-Kk_6&&=4imNTvEYSO9o^&1v_ zh_g)`NX5;y#=2i{g9*_4svZXdrz`SEb}z~wwZ+Sj=gsJZ?>EY`PPD{Dp+fm}_42CK z#EVT$$nqJN5f0XR$|D(17Vr;-86o4g<{Nd5=MO?cRx#TT7;4L2sQ3@RJTD{Z1fT)( z3`<9(ct<;2rU_N8LcQ|yyE=%8()7$hZxy(Z8Ds}ALn|IKFwF6G9b|d>r57e@*4Cs7 z$A;!C*CBLyF^P$y((OJ15!LZcOTPDlTJdN;+3(iPuh&WvW8${e_ODCp92*x~ShsJM zm*WKOSd^c@7~B0heoYnBaQ>qiAj|-}eJTg?wFc$p{V4?UCFCFc6C~5}&#I|8vno*` z3bZca%Qs?>cI;_VnI=G9@&1?^Pp3Hfm?Nvg6d^_$k;LYZ4Z{1oJ^3_oVMNWNc=@p9 zUP%T{jWa$29Pr2;?18D7GMV-6FRZ$N8x`(%YWFLBbY@3eOVIr#j1$FTD|n3$M}WhN zC4wDJQL7o-(7Yd;T}_aocFoxpbKLU!BX{8_i9|esP08tyu(B*Z8tvHfaxTbMV9j$# zG0g2x%~cx2{eQCn5hRAa+TZy+FDTpi)Y6M&mbqqH^KMo4Q|QSLv|UByvZbR;#*jan zZcR$HZyH!F1sP^6#8SGy7aanfnZ42B$;Z*tb zsVoHS07Q6w?or6v58WRc_hk+lrq?x+BbIyYUVxBaxR+-=&r6P;H?=ll*pIb;d91cM zm(8?thWiz9#tPTJ$EcD=00xqYC<=}?fr*0wa%|$9^r;G1vX|k5jRn$EN zG&PQ0Y|BKuFYxe?=?E){N`G`BR<0_&{BhXYtHExR5W*`;Mr9ks@fymjo1H^Y;2?(J zYF?AZT_~(<+QL8^U6q%=rg(c?9lV}cbUc;?lbP)s_2g7_w-xCiG7@P) zQm&mK%AWkkH@QCrC&h3}@>Z+Dez}sGIZ#L4x4~lR6sZZ6)!=Fhl>U$zGDt^fWHY`p zDIban64B#?RiTae%nW~t)!v{7)OG8s6g{kNPWyVq`9dpti;{fC36rd+VV6dErS4>iCJJ51gLi&& zG2oW??Kn!VU)nSa%l2y0#N~Z_GGy7P5|N+@WdQCEqi4}Dk1oK2pBGuYK61`eGc)85PkT=W6yQ(hBnQ+84^kROQ_td~Q_Bvm(XgHA$2u?EKx1({;eB>;Tok z0ez|RJ-S3CP!@g2nv3#c)WuVI@>T%S2_v!rV_Rm=V2=(xDniz316&zb9(y73{3w*W zY`AQom3tZEE4Tqtep@ih1=Vj#VTtJ4-)%hVPYO|}B`}h|BmQSJ*&a-kyCHiN&RCw+ z{F@^%Zj2xKroOEu(Dj~6%vo@mdr<$YFp`+s3CIq&c0lz*8JDg&GL!UB(KMmymaZma zEk09lY#f2m)NfuNUwYPHm4Z$mxkYh|i)03}O6Hzxw>e((yO&b=#FY6+=YuUNkwh~9 z(OjT6oN1MyDK|L5%HJoVO)?f&(-8Yp4J zNa~q;v+R6-j33|#m|D7MNAYCT1CF08+}e3aBnOKCJVgW;R=urJW*m7j$&98eB(gb6 zHQ(p)8*t#RhJ%U6MLp?zSiieZGTV;$^kL1NiwyPa$LMlPIy=Nf)8#v#R#n`S6!~%W z*D7hVY8X7Q3;T{~d_y7a)6AOm@8Eag|3`amAKJ-^7WA#5Wklm;;i~joF>)8nTRz$; zyhT{ZzsPfyj6ChWGdds02&)k$H|i{~!g4}qGw8FID*AvZQ3nb@g$2A!@F z3$b^NUJr`vCmF;RUp%0MXcn*r(6`x$gkEg+Fg44PWoPO9pR=Bx0o;7#5b?KDx_BXK zrGIXUU191TV0z0X(9OcA!tWErLEHzg{xsgl)2Q*qX#4^#JeDnf zB>6{K{%l(}5dWrQo&dPBsQyts4wf*5Ta3ms+^kKfSBj^>F2cw#Y(-ExF{Nm6Yv+;U zcT43xs_hMD#HgBOC|kL6`~w=L(r$4Jkj=TU+^{n8t35yLnEMsk|2&a9gro3%gdDIF|_fpS+`d#*|*vkC7PQZ zG0KGZrWCKg(c&c$USVq3v&c%*!}l0sRdI6%lmAeZHg~FG)mT1&$aeLJurtZa5U4!C zf-m7PHBUQ8ZFF24sEZztNzfZjX_;%1ib9TGHP?$t2qj~UTOU$eXO6}+%|7i>&xIJ@m*r2V zJvE!{oB-t+`(U&V~9tlE%bm1_ufVgQg?D)!dWv?5GvPZz*uTQajHe@$D3NI_Oy zH!6{3ZS({AUt-JuhlLSZ&NZ_yCbot$tUy%|MGcGO@ZHCGN=qZH=-b3lJvYw+fhm0#0+5r&oZMhhGx4{>{4 z_AjQ-P6k`$N|wpbDr|p1P!mIs?bQtY2;ie8Ika8QJVb!<1F1fqdqt|?jX3HeqZU8{ z^qw1A?#ClMF_=4zli&VzakEsb*TnEIRGeJ&gc<2{*B-2c4zo`)jM_=&FRuDZD~lA9 zDl3}5#34eHdfd0BW}2O1!h@k!?95x+UxcBt9?@{mF^Q8S`t|sHXEcxI@$xI)Y6-Jf zoneR{!si+%xk1V;hU+efOgPFBd%>BiiDE@9|2o0-uLA+8*-h5H_kj|?>bzpmp3Cx@ z^z$+F+`8xhC(LTI^ZWNe(X5+PIf;~ikra9YS~LTHmXCAt7)I{`#ibW`w5rKW^)N9K zHpXOOxZkpHeXC)U9TB-|I(el{`Cg0zEjR6n@5;}$!8>JW6(Sbo%-d~CJpvcKQ!xjK z0`gRN2C>sw*$k-U{*I7etg;I%`?Rf4z1pgNssFmJu9KlAwtdwT0+ zE}H6Q_eYapiIl~N*@KMds~B^4AbZ$vD(4ii8(N35VfpCWmC58C>)~xqAq%xF*$`c_ zdeQa7K1r#SUKWgRFseUOqNz7Wm(N*|^n+ihFHB=+0v*z)SfXup3b(*YnA;nzDAx;D z^o{{v!$P)~n17Qx!&wWEM8)^B;4XrhjgFa*3^TvV!hlflVX&-D5+4RiZY%Uut?#wZ zrZr@kB=PM~4CrI}KA7w z8*H@B#smV#fjnAg)MAok@ZZsLhE&KL5} zi!lI_PLv%DptY$^9VH*rK0O}J9h3=OQpS+M(hye}^T+Xg-wd`yz8I;Tz{K7Z+JEKr zhp=VSZ6Yhd{QK|~m+`jB)bA~lCP+RC81*~N=Apt2nxco}a~)PC6IWPU->ci?mlVPC zE5a5#u1&`HXrB*n^EUb)p+ZW97lh0e3yaCykKRelV%;=4+h8uiLUD=DEYSXck7$2V z;rK)mf13q808E^Fs1-dlG9wXBuxIHWUMs9wk9)TeUciAy)jeRaYEf`4fW9w<+S zG6TWM2P-d@0vpjkArZWl$eDlk;ZqPQAPK7BY3ZgM8GOKK)q7lih={Cb>ipz%L8+Q` zcu26PnR`uu`Njh~74UZ6(eiD)`643?ser{>Q3Bz&Tg%^W`gMSHk~l7Vfie{II~-8m z+)m%$mJ1kU(+YhSsAZ-2LOE|%+4Q=Lzns0kY3Y&o zterY2$v|=4fxG=qXKTN+*p(^~b}k)Gc4X%neAa`6?^2h((>|4%ymoxQ6&?CZWBi%a zQ=CieD-z)pr48*ishrdO6Vt&FDw;T=k5r6k1Af5pty?LXt?u=5S^D|(u}xjX2L==8 zgWpNlJF`bogCDMRBnzPdjk5peDcAsHA54EgWbidL)T|CS65u(Oa%x3Iej$!?^3=eN zfdaxOndcTAF9|U`*2G~T@^HA&oRI-i`VE8O^^f1-K^ss7W7z-N-l>OP;VH`pt1VX>KfpPcP_GuYUY~Rxv(JwVD&6sL>QoLnVW@w z-k9I^od;h+lLY}mDyDp&(SmfEyf}w36N3BgkA75PjSq(?oy)eGO~VPg!ZgOGab>5G z2nwJ=iiMwZ0wsUNh0m_PH37W>Wco?HlMWJPf*?eh5>;$skps2Z!4?rMjyHbl|5ZcT zSZQtxWiCqum$k-^a$MOQc7O_3BP)r&O*lGAAT2wXJ{>=O{^!BqAYVoFDmv4S|5w=< zzR6>8TOS?~2{|CqAX%Rj4`V!iTRJ{bl8n-mkSfu;t2=+FqHs=)<}Oh>im@~x5MCzmCmx#bm8Jgc!MMVHiRp(q&X$XI@caho_}E8v z0XdmmnfU!|^i^+SW@O#!Szlmavnk`&Ma8E_L``e()3^5`=Xwa#azt0Ywu4Yiq*cFE zNFB0sgymvuPwwafDvRAzeVnHHlP0`nr>qcN_?dB#XpZ%TH9Tkv1;RK}?gR_Q>Ny z)mpYQ5vDE-BJ&!zkZReS5UTcX2FnrF{l z99MS)eXyDK92SrtFSw)mcX=U}7b`6hrTZRk_d{JSD+u`d5>ldANp+INhs$4ED!2n2 z0ig20@wqqTXj@n1>L0AZqlCm6;8<0y>dVnJC-C^w`^^ZSyV?FMyN#8CqXTD)9pv{G z$Uk^C2uTS$5^#-qp8R{dU+Ul@-Cao>_u^P%FF#R0cQgCp4hI}RW9|@$Lww_0k3P3| z02OeL4KGaps83$}TOsJnNw~T>Gm-a2^{|q*`wOPKeyv#hHN3)8ct!{}vbX}H#l5O- zwHH*@EMpIfi{%LjKOxJebZtW*oQdYKUib8m9m*^=1B(&)(O8^y0dL>0e8 zf4ab;O3W;E!csNAU+dMB_uWcFVm^D0uI zc~jRD4_>Qt(^tg2{I~sYZH!@4TVJ~Ld!;~R+cfD~yQ;AOu3J`4Juwk*uJzE92={P@ zE%6pR0&xff1_nZ!((%(eq8zJ*Oj&sNZk~vj0nK;w03~W%8{al6H6FSfgwtc2o>UgE zD~^HdtTG$qdJ}wqN!1Y34>Qx4F!6ZBs54Pb977d^=#;>dB4*;bm1z9$I%Js)F~Y2A~LEAzy=EH~zmtK#nk^P~f7JfcB)jJ*GCr2n_OM zVv+4CJ zR%$|JM&S!)3zI4$sJap|0rb>`_QkQ|;=M+w+xMXq;FTydN?;%}yw1z&Swv7=aSsi2 zpW0!x+%!cHUouKFOR&EkqxRf5kb2#7mXDs?zCrhwCOUxmwEbSX$F06(6*8|dcFvnP zd1KEE7YfW|&ho+a+8@F|E$v1O>XPrQ`q`2=lHMgou8d;4)OxV987;z#ckoT`&(4A( zgO>C#JToLXERQIv`(H2Lq$FiY>PgK>W4Gw0MME$NIMqd&fCM=fm;(EqBtPl8e1-^x zMDa{_B>0p!Mc^XdZEMc~f5DtGq5wsW8@FX=lg{*M-UIvd*2P54!{JntyZ{GhXC4n4 zcvU+8u5{^iId3u4m5E@sYEofq(1m_hARDt_l<_aYvJx@hj&FQLF{WOt3XO1$?} z+Ef*w`JHjexH@r>$WqRKsMX^hfn|rWApb!j>``m6@>ymEWY9<`S@&SF_i=5-nIPzSAF9a0!$&-4!E3dUL z+l24V27tI{D>(f<>(@tBi)in(tLU?}{E?3+6j_;aMewyv%igfHfG+X$Gj)+NK}O+4 zOYafg?k0n~L%Pd3*@D0vS3=L+T8t_KJ7V{g9g}E*Chu1sRnZhaN)7;dhFWSdji=&m zT&BWDC)^e@WwBoZyLf8gTc%JGW#F!6kKr@|z@6HV$wEBxasUk%#K~W)Xn-*Ny>G7Y z`S`sLrAr?5oKs2FaH%xOLDTia8xm;dv-t2M;4dN26&ubYN(GF*5%k!;5hrPST5VAy z5;6-S{mS3*a?Vo3wW_IooW50$*TEozo=64fwcIoRw0vORqa8`Sj9c?>RfWZ|>Yt7- zEo{Q_>qppz9WkH)UiQY8IST^;izeYe32o-uam6;r9F1BJcV8hK(rm=ohZObHzc3Kz z-QE^+gj-D0TD42g4_Y}VbEkSXf6Ibe9v6YHKD2bG8WK8|{RwYdpm<;M0_TY3RTUGb8n zp2?L%Z(BAl4M7YHQIwy&yC`7ogIH?md-E$(KO%fK^Lrfpq_9Sez1Ie}O-&k*a)L18*zU8tzQ>egD->`o)cSd6 zroAENoF~n2my3ih2Jg^=_JX%QbMzb3m4?gsgKPIh*n*TIqCyx66uN(-@del-e6NEv zQ|k8X+#*}d9oL^r&Iw&wk>JU_%qIOt;v#8;|B-X^j9x`U1v*{M>QEYPX;ZCZu&_SH zhC%o(#@qENz{Ox0ry9#V39~04_3yd$GcE<13kw#F`2DX2cQ2n1iYkViQ{y_c47q6V zsY-2^^4(*5@BuY&`VLNIR~mrhV?KSvHKZfdy8QegUUa7J7G}UoOGB1#L4FLRUTKQD zD(|<9QDIE%Rv!|MnrK5g+PkzII^02edlmXRG@KE9eOR~dJ(MhS&$^2sw2K$q=oQom zvE4qdHZirRDWA(=FM1nyL$X}zVWAlt|~?lJles|)EY07AADkZTZutvM9Av>2VSA#&J8qKNj1 z*yNww+8+DL-hRQaf#T4eA6(=#u#7W6Q|WC=j@5Izml>OqsWth}gVM)o%=!e1*B}?P zc;2Myja+KNVn5__Z`<4n`$0f4Z`JI1ijzaSTm{t&2pcrMz2?Co_vcWyqf8G3t#|P zdmDzUN1=1GT%FcIW)nhsfIJx&Yg|5GPU|fdS^3h0M<)-{lXV8 zI^ktSu19hY4^1DeW?nw6C6n=9nK5pv@GKF_GVJw`dC3>!nS?O%%O3Tc0Hv$ihC(`A z^PaESCD+Wa`chipNh*4TLN&`ZFOqH=O#7+kk}Ss6-EAoK^6frp-k6gC7s9~BOR#Js z$Fk|rpKtstgGv)>MrQKk^3qlCRO4Jya!Ra|UYHTK|OF(J)@ zvDQLPjeipMnk4EI;*PWnK841^diyzyj;3qxo5n=gy4igFsvpJPtNQ-^(7=4ma1=e4v?ZDKBKO>eS%b~)PTTpbRUh2)K4bvU{h zX1U`b^`g#@Ac(v44>UAOOgTCPy8$!G&l9BP1jF2|MATOoF>LrL!)k%oEvJQK_5U{u zsA0_Ivg+GmMHEH&C^l)RxNKewVzWo)wLdTa<5u8NJeqkXoB7spKVv&Mb-&oq9@gN$ zx?!nSF=Rnc9=K~)=+S@h3I-p1ww$R1Ib5MpWn2=ojA~Zu*#g6vH4kvQpBi~UrpZ2@ zy6N)13ig!G@TEPo8_XSopC@VKAF| zzL@>63WrhQR~*>l6;ewj?Q`WlA*!SQK{(XIIQzqEFY?^GoRLi6>1jV?6NNDpzG%x! z=XRQX?IkDa^D%itM&lu+7ZDmZ>jS2Zw7Y|=ag{|AYqQH~+ej|O@7-y2$dRL;!%7}MXaz>U z*wA5F??A0*#f)OYw9{HAt>ch!PV-N|;E;$C2x7liN}72(w{@;Ecq1G~&e_+B-Q=gE zOGOmQ-NDlXxvQwQ?0UKGcP;adEQ8B)+Rw;?PgkGdLnUQ_;bEgPDA19y@0R=awB;Mx zGAm20!WpA7>-^etl+UkXx(DHntJxX)Frid)xYb-Wm6L2S)36m+LC3q=!vU>LoPNRB z3>BG5!M7J!Y;UaI!-MRKTNb2OR!iP(aZvKQh!BnL;&x}zhN!eH0abAJd(h#*Lt6-!*8*a63~Vuldx01SW}2O$d4mS0f+bV`~23!*f9;1 z{4=fD2-L}5PEKNk@OaHnANaH>iOB?vG+R@F?5R`%HPaf5HJAIHXenGNS2wRHjb{j`(bw}1Egh2 zrmMZIWR&3>(+?l5n*qfiDj>jNyV;YDT7h4iI`S_w0Ej|A1dc2P>m9Oq6y!CXRk-tC zw81?5K@0LKr~|}Sz$I$$nP-iq)~qA7RH&Cql&oOS4Vdbc@FRC~ZT{2uesa~Lw*c08 zxaL~~*v^mEJp7;_F|EAZgrKE0=*eO-yl4gQnm$;ldl>>i`YD!GJnd5)Jf1j?9M*+) zJ!gRhM|mFBpD}u#`k2ddefX3F(EA{XXx|(|AlL2antTm0KIh||vtm(H&DU0@a~KDE zrc|pkUf|D!3hnx7Bn#58s-KwdZHEjP{4#8%3vbx=F;^i;sS!P^!w1bSuS>(ATY=)j zDl?1Zk=-!4oJaRK7<^-U>;1ESgc@n&In_zp2nH{Ww1%|fgtWvkycGeZZ$DwptnOp)5}KEFdct>A`Cy8rvr@_k zXjT`SWiw^!_SQ|jNOm~KZLC7g8MM%xpa7x+rw`+X>NFasr~(oewM?3DsLGXe9dIg( zWrFDr#SF#tl~0qWD8LS)_3c$E%VqU`M~bONCG}&dux(H=ID5ssNaCQgHk~>z%_(R1 z_%E=YM^ENX1D?VrkIkC&TRm3u7so=P(1svV&IK>%dT-*G)CGaekAE}VrdEdq=4#ZuRPhOGTvO9 zmvJh|H_7k~z^c7AI~bs`5jAXCtr)tWjbzepUB~FcGnC}!)1ERNB;&~e2|-Poz46hP$gKa#c^+0%J&Dg+WbK+XAAb{@%K&mOn2~`nXieBWWJeO>@H-;@>omP~nIN?)sg>D~3Z!L* zev`Woui-egqSp_V$DscM&IIH!D80V+(UG{QQiLqtM)m0CFZYY7< z*+ToNGaD{oYt^vn(0M-=(EU-4d5kxuRGiM4z1MRq=?+2?83-}W6IG>J$}tfAMk>-t*6!e@j=Pe|y3WRBQU8DphYhmO4mOUAp~m@k?TL z1G-m6l2aIlOghvID~8X5Av1*o)wFC%TRL~(JzXWu*x%jepN0vyJWYhc{@4!_EO1*6 z^f(J%6}gz`GTnU<6@I0iIh7@;Y&|C2YKSmb!SBDY9Tt(t3&eL+I~&w3pBwF*DE0Ly zPv(5sxDmx&orn7EQO3OvsxjUTy(&jd5#XyVu=7o)88%s%x5uiVAr2`!jsGGn_U~+e z^uI;}waObYnc+1J%A(PWCd9+x+Y@VV4V7{P2c!0jjYsm4Bmq9yZ;P3gf6s@U60d?t zYeyaS`)JAa*{08|U7xWqv_Kpz?;;uj_FOHaAxK3?1*D}Uik5?0=C&(Rwwm+r?1x`h zXN6crk|dQrQBAp}6tnjBw6h#$#={AbVy&d=Fic&3dJ@>H>!E;v&aZ}qGFmo40+vM$ zt-_|B=eWm~JrjZuy7bl@pk;?PlaI!CwWhfBAf;Jn3}7DmDNMz};~nzbrB0WAHv$h< zW5_2{{t+T+VvrB_4_bWcj{_VRZWr@BM~^Fg6>|bzn8FovX6cr{4a3UBP&I|nb0p|& zkPo~Ggm0$Pv*<*~ysW~sF5w|W$n3|n#7!0w`^Tu%`?}5h=FmmI8`7m5(i%91v%a%N zi(P%WdR)%TDaGl=SCR^l4Kd*3seg-khJWpP4qUZ4s4ep}-lSH$6G(u{-$$JjW<1i- z|9L(#lFER8dc5NBDOy9z9nC=Y`Qd)D>~R~qX>%lLEYL5p*kY*D7W0(5^Y3ZX5&VGDdApw^ zdWufHPP-OGLuZ=N)ev|pMZ;~0>amsVSCq5`1OmG@f3`@kSWfl18JY-`ko>mPL{}qP zv)&`7>H})f9^Mrbd~UZ3bYKCf=^y9uG9?T~cs?Bp8hQ(kA=v;v{#U=jXaa_gWKP-Z zBM(7jru@g`sv@n7(UFG-$|wT(<<#urPfN}!1`Mardu;CDwz?YK;(N1nD_3%u%j9?%%Ck8rC^g8mM{WIB@`ek(bFi>88cdTbneVuk5=TqFc+u8F3mutDM6T|6GU z_BKtqXa!^2@EosIq9Q6*@^zt8tYsax#byrBHbRyrB+^@0mMH46&R>UpKUS4-&ZgU~ zo)S^D#M7b6W{SC(T7_>$6zzjG`ctY8ng7`rzyg?T(wlCP9;}rAk(sJ!Va7MjO+y(m z7$^PuuWXoELjlz#gx-`5SHw7E6up~8eTlp55?FOBd2un>eh$D=MA=#79QNI?R19Kd zZ6~Gf%PB>9oY$}#b26laaYzaQd1v}*1Ie_0k;H+Ph;d+}c^Pa2m{`&<5b`^_}b?*}Hj1;W)G z_Cv4r(_muCUL=dk#G%QeX5`+Us&{g{XWVPhYaJmr84>WGZ*R?Dll^-STYXprCHVm& zhqGNhg{}`pfP>>FrC zAD3d)cWHsd5|DcsaZ%xnGqS=M#DIRxhunPS<3Rj~HxPj&KL7ci0RJ_3wH${804 zCX}z*rOyND_n-OaR9DLK^eLJsKZ_$^-2Vg)wxA?r|7Grb`U9#%m`8q9&?Lgq^)?UX zsI@QzKD!U16syi2SeRHto|sk=CEx()I~luBw6c$)UxvcIen%U!wAeJ4NI1Mg{xqBR@Ys?dKmHS_k|^fX_1C`_{ye|1w1VveBZ$S6~JyA9p=KU z**faEq874R@SIkt!9y7cXF={Kj6sZ)EECha^8sY-Z6%a;MN?{Khkf|Pm8Zu&HYUrl z*<}3bCT#kAhR@w+5Q*fh#HVdFN>}aT=jbQ9_~yinTOy~X z)C^bWzXu1t;VB{NOJJZH+wE&FDCe1v?pyn2MsWMk^U0tCTVJx>vpz3}{*PM<_;!NB z8lp<1gi*}`Kk~TysybsOpsH{Ad4V6{M!_##v0wS;RzAIr+5RK#A-(qmUNx@#H$gb9 zpDkDSc?U`7+!eeD`VAUgC?uT;C>m&|e#}P2UH>-=0KQ~4=`-M<%^Wu;wVp=ikg}rl zH(L^h*)E2)HvjcZWyn_dfVw0N<7Fg8k~ojyUGU8qCk4M}YM@L715cE6(yxv3D}t_j zD}L>a-#5#kAbevFu&-GeFj*%Rrp|lW@G5~zxRz!UtdB$27|thH*KPt|jae(Lc#Po} zt?H)GrNPUm3%XwHsyW`1y@ekEFE=0MHW??v-k+wFVT;I2GXSbaZ7V(g0O?1)$Ij-7KZ(ALhgTWtGNYyrUHd#lxli<$u2Kkj78ts5r#90 zRU!M?hmYYVlzqOZSyd`xnX(u&-ynv^+qLNg-J6pL{_$C?KcWuodBZ1^s^!R$tyARZGbt)Cp~2BZJge= zHzmuuglWd4$5{3msmsj%1K1sIP^U2k!|f!$C+%dS4}VweOK+J>_vXY)Lc^PG2k%PA zrwZpcvDmz^>R%)=P0TY;XO&JB3fQr*H;$H5IIE#`pQU3^|6`zWjM^zyvqhS?BR;TjDDHoo4958vv)d?CtES6s# ztqOr$7)Ix^)Kc_`>w~UsWxQCAUve^_ad~S>_CtU`=UZ=LQM)lmN2{7@O#7;A8FiO&0%BM?W z?P+_EbxeqNX<;cTlQg@ndb;jzpbpD~?i*26l~m7qPNz@j6j8owcb$uk*18eg$R=JV z^B=jfTQtIEY$ZP3$jgL9b9uaSU3{(l(sx1vmJl;jB%rP?2q*gb{Ml_8%i6hHF(cYf z{EqN5S}AC5_=zoSy9@_;M3y#l;|b# z91zy_EJy&rUPB6N4~F=zQ8l6c>*ghoZpm6JXyGLqO~DD!J$s%sd8H}aE|1E`(QvBH z>RrfmQGd{IBm?iV-p5|lLw9$R#9>jW;7WRlU&QY)XkzE&_UF)1Y_kuyA$dp3k9DlK zR@>TmxQ67PGt>pre-*R%-QO)i4{o%z^2kmD-#`pZsq5i-a1*@I*K|D+V;5`tH>orf z*<{!rWu<_OJLi36#{Z-1tHY}5zI8VuAOcbX($dn>of6XB8<6hq1|_6Hy1PrdySuv) z*mQT^h2QVH=Q-z|JO6P#veukq#-8IH;~jI%efoE<4RJ)n;|e6b+B8So#yUiMg>T@0 zeP(zSTrJeSB06AoMN0uQL!6|kZ(#X!iG_fq669;+iDaHoAFkwSH{&d&`9ziJUBHun zRvKJt`ZnPC%oA$dMA%?-mkYNPBQ9ki?gGAafvi*;AD@A_yPdIr1b2ZTI;C4z^Jc)F zJ7N-&5u^;Lq{W$A18~&xcK5`d#W~-sC#Q-CH;O3L+gr#7I|2BpZOW$kjh;(k(`qze z?K&d=#f;jzl+)E^n>F3+Ekisye3cX93Lu&FZcH{S8DB~8m$X8C%e4e%K2_pFtOaWq zt^8<}qDPos(LS4yw?sOvv!THC2OEtPHI?HBG|Oi+dHjq9c> zR6gck0iuRf74P;cXVCuKZZu`5txz-WiHLJajlM}aYCa|@3l_ecsJ*&m(V~uhhj_g= zJ!kp=xnz5y;mE4q)AJ?j=k*XiC{)K~<*JW2&?)az5EDG|@ZE^;*bn7vDrv-&i-?6} zG1)+K%8wTRdYe-Wpu@%R1OWFs8>g?ovu^7486}OuZ#89#_bVsT;voi%ZT|beP`B-H zepq?SU-6GaHAm}^x*?{JYvm_L4-y5|K%t3%gm~XAfvmG6rZ57$!Fywro|Rk&=w3+d zhhE{b3eg%*CEbbev%{0fSR;7@50gDk+O-a+AoHZuO2ui>>dRs^*HA)I^tXC*2mUy( z@@aEcF^=qV6&$eN>x5t9s@7kqr%nq+Nw>eR<#zpi#u0g?-@bcZF^L_PcWqm4vxjD- zxXn3_}H%=CAwKNA+W!Ah31y!Dutk*YKz)50#X0ca#Nx$#T0lo8SOdV| z0>!rSYO=P-L6_fu2@?pGwFNW(@x(!`?u zSQm$;CxI+6wgnJEVps6~bl{a)6IE`!$v-!5#R~;2Sa-VNA%eR1j!)q3J*-MR1KlsD ziokfLd$iXR0t!}ad`7|`@9d|ZEU4xA&ob@@-wLsv?-~sf_OBT&$qqIZ9J%A7kvVjR zvnlBbqPAhgZr17W<=ZXkxl*j^1Muv<5T9*BpSO&4QbN78kls~NKo2~m* zl0Y7L*90*Mj*ayd_~|%t;bMLcE^UiJ+KNEqiYpF_gs`*A>JXU`K2LQ=PNlnZagy2K zJ%&WDCx4Q$F)}6VE8>Q5iFs}9Zh!+Ho~ zJTk&%ZyCaC^B}aqMz|ZE1NK+fuZ51>jYs;@R9YO@k(Ki-(aSK|l_P^FZO;?IQZE7mtmGG0{lS#+Lo(4(*-`BAdD3!KA!Yw*kb%x z{f629&}U`Ed$C9>k=<<6_quB;FzxPWO72)$yCXc6%HkVvBxr5d6me2@K6(8JKGVJK zNw?v*`@MN=w#?T<#tI_*_&{cgFY47JsKt%|WD;8q;$cV_Afa*8<@xg=w8N5(VH|mR z{*{X@GnxHTKLxCirPo?of9sP~##!=5lLOV~u<#@8xC~mIOvKe?wx~|S(@*pZ8*?qP zD1+-uEyVuuXrC2Qf(=73AFapo=S{ais6ok1F%gRU{R;Zl^;juv9(3@$;CyA5l~1C^ zI32vGC6WyE)%&fbY!(rX$!@Kf1HJsvz3XBVXWVN^&Bwth&N!jzM&QKaiFFthjT+51 zd82MkmQ3dsE$00#NsbF!2%44jHI)3ekq6nlJJn7-Z!QgzO^EELwIxgAe#4H9C3(K@ zwE2YyAJIhOcBL0B9Fwxff23qm-3k1jtU>a^4cE*l+frkUt|-m)o4>js<8ZO^_b9Da z62Znx!U%4hz0I7Fk5Upnf7N8F1kT4o=Td#})t9cRk!g8!htnuCmsmBXt9{tf8m=aY zo};^&3&ms9ee;~Es%Qi<#<3_kD*HlFtV}H|_XX}ER=n#qsBJQR7uZ6a5w+6eR_p45 z%87J63_3}0=)BfuHwN>lT*>M@<@k2HQRvE6l1#SAS5feM-Jcg5m%;GRvi9%|qG+&l7Y5q(5VE725Au= zB_kSSXqbq+U%uz$Yq0R?{ZDgV#R~eywIeC=^x$Q;lbbKs$R#b&HL7nw-iu#e9Gl#M zb)p}cSSqZyF+2>^^QsGDs)(aSafWmA02Gtp`)MSN)-sUd{QD=DliXoII$3CT449u*oi5Wdm&Lq(g^SZc3e`1KmCG4-4`)085F704yvxrnJ zAi&d=_gF5laP!&>YSMM;sJ6m24a>efV{&bO7{gkNlB)}g#0Yw+o-sv$6iqgoq_6MceXws%PQ#uLY~ymym-|;B zW@Ip6Kk+AF%odrR46eQL87hMxor_6JV_f-EZY*V=q2(o@GBOmS;h|* zKF7y}OjG{^w)IHoz;503>X3sl)Qnliip>>yqsGAR9l8ZVH1AKEyNIiM3`p*00!OU` zwOMPsUyC&P7BhZ1uepf`0%Loj4ytF`#;P6-sH}f|pM5JwOt`^mzJ3U&-m(~n@-Z@lYVsddnM(etXx0A5QRo*#n z?un0!j&P$LW#}@v?kkM_*n>MuJ?WSwz-#_q2DR@rV?z%gT6I%asaYc5vnd_yCGvPb z{V*z1;G{+3G?1KC62kadJX{|gWbK!oah=?1Z?Rv)N3T`SYyOSUX#1&?;{2_mBr*T^ zfq;xvLh!L2CoBtVhZ`3C`aoWuRtt@fO64rxX}I;4&N}7BS0+6K{pjrS6b3ff*4yg@ z$ni$p4vo_mYQ6&ayj5tBKNN6W8&}Q=N?(qFlDzIKQ*-7}Lx2z=fa*W}lEVsZVN^Ni z?l{sIaDa)Mq1uAnRdbT%w(D&@9UGk81jnxR+ZT7Udy?xF5|TZ9?=cFQ7+xDGX(Q5R zW|&81Y4x)Cbc&KP<|M&DG=(tgRSH;U(U{r<70>}!)~qEHOs((4TF3TCY(Q0F@_}_d z5wRhn1md>j4Gu^4Tk5&Ph9tv3Mj_qyd;DP2ZR7FcY4r*728T7ogS`zMOISXlrD_qG zM5*v`cX~pV9>z~)Ad@nRDvDO};U1&8)}IoAnNhDZnnUL)zE;}Y^2!`@Tki(q3-^#; zr!0NtW;K$&b`wkT{_E6M15`qS==Dg|=Y=>DEN0oc+`O38+(bqe$wWdr1@6eUr5R2v z1KP#opNyZ2uK<7BhA#-SyVQy#7L7!Os3srDzoO9%@vRXBU zrpgJ)Q4>kO|D4#9QC_l=9AcbOE?&t-x$~PnKbmJcoOAok2 zXwdF%ov$T#hTO%NZH;hDjM=XCAl+$4%z!41X{bUHj^{JuH#!PNeoKpqrNXw)me7gu zR_4i+YM^Solxql&AQDbN^LPs}b-?LR!0;yIIi5Cr47g2&Qo2?HTr){i8nKT>vdgqg zZR0<9t#-PJd6`P)U*z@qUJ@KY8)1Wy(hN8Hr<=6VG0nyI&hDT|Sk#L{IX+S|m%J4H z)32U;|CVts4#9)Pf5N-82wrSo2%_Lh+6c6jpn%uY?SrXkKd@`2hJVJIK)WKxkes7@C~w~zC?Ar zf)gK0TYn}{8ToOeZTF7I&wKLdx~>t3YNMT@X4QK>vHoZu(RJy**0;ffI5{MEK*V~h z4QH*T=TE_3)KSrK*6!Z!W(JXyz9Q#rYw7&>CTSGjJvR>6EQKxJi}W|&t;mTYJ1`_v z1OgBaG$#7l?qE7JNm1)rA z-J`XTcy76?JzQLz|3M7C-W)2Aai(os4iCHaYHvoq5*V@1Td`aq~|E9@EUK3 zw^#Gw68t;l={JFK?N$e!7TvT?ak(en4g1#8myx37A;IbAD* zf<=KT!;nUrSg19BXKpN&CpeI?@D3v2-)Ix~;30u!)?u0fbsN7EM1V~hn_ORAT7>D% z(W;)@VOX1FHRi)i zsF>#nD*b~84d}P#KKH4Q^-RFb z{2Z)kxEz!fw0vfWZPfKAZCkWyq-&_@e0C{D z2ZRr;e>GO``$MT39hzi(rE-DwwlkTG`JOHsaD4phzu((`ei<)ygcmm)sFdjE6?~AT zc~e`FOhitXtRs2aa7I`2ccGL=vB|j$e`>rMkA>f@$A_+4Yg_r$FwmpmS|?fA$Bnun zX695CHN`0<)M6Aa(e^bs3Gpki6J(qipw4w|n!4qM!e+P*ATWaUv@qU-&X4oA5G`ecoIw3s#HN9c(?=jM#LZ^$j zrLFM^@f#eJUX9Pjk>;#vy>?Z<()0Upf_EM?U{gOs^zeXdqCmAj7W{#KQUkg(g*pmR z37wnL?=le`gS){IMojFks#Vb+fZ!eq89drwWOX_CZ}*D5+N z5Vm+gzTMucIFUEP=pSNMn8vyo61Mi;yiK;u68dKVx&zYWLF>0khU3KF&Uj_1k+0L6 z?^YAbHdmB1OHW*u`hNaK&l?RCCN>I_S7LrV6?J^9Up22$#H1cKCh)Rf!qT=+LKOHD_2*zcSsOA^muZeoat#|A#`E7Vz1ozA@jWS>~xvj4t+P0b|0Qr zb1co{b$h8|$Z`G9tdvH3cg?5AspO7jad$e4BYNNM#jSMDcDdurkUfvbV>^;n z924mwfg*0p`r84&;5a@G7x&9oqG4%T&5n-~Y){if+}VtkSL5UkkGWs%L{~OQ zLSZv>*P@v69Eu*|6U)rKo>9(QnLP(C;tG#Wc8gQeo`)Xj!xGO1Ci_uiYNrxC%-CY5 z(?*f7Z}vh0ijHa>AiQcx{ST{ESQb)C-UOXJD>bq_RzOxI^{8RXk#XhWU6bI2HiQe} z;Ze&P94ljIsCGlQQmL}a1TxR8-rs)2z*ZG{HSJF*M7-_`cU+W88RLq9QG|@g%j-A< z@XHPYlYt@=dB@=ACx5-!%Z@R+W!?TQ#pk?dwj$i)0pxRe#$GyC%6>VcAiBAF)0NVb z*;Sg>^;v_XmER_v?StZmF}^xXhTKyc?PLvR+AZ~WzQoE}zshLF1HxRsHl4#QcloiI zNg7|#YTuDvuVdI1)&8o>+4WU(*&9S=JF1fvddT`E0?TT*2<#wrT;`Zbz2ymou0EMv zw9|8;x~P~s=g!|x-t^K0|J2n3JhsdW?X5EG4Q}8&*GoxEBA>UdF!X%S1N(z@V9T?7 zo!21K_LJDqOx}j45~SS>1x)v=erg%v_m3U|Zb`WAb}Lsg)U88rl4?$#XUY=qe_q#L zD|ohS9=HY1XtfF=yXdSZP9Ha=E-@7Z>`biKscj`OQI8(B2)ZH%m(;$Cr901y9=#sp z(f07_PUL_dxFTpSr2t%CBc#xsRFfSaw8c9pr1UEjf`h#Jhg>PRj0{Y6BSlKPGv_8+ zlpdqR(7z<)!$E<(d+I$&+zwT6SHYj-221{on_H*r-fAGQKAj9+rMSU^rhurR&%^|t4qk8CE?#PrHchMiz@pj0EeG#D^hwDUPxpYP`M{7^zg>-+YI>$`-O=gIXS(7Bpc~3akX1iufL0g?tYR9!*o1lgT$VF zZ&I&77YBK>u2niDDGKl9rQWL;NGl56JU`w0FOS>&(3?RuyBYoN)q1N<9_oq&V)-~W z_6Ad3Q?Sd!gPN0nt^ZY%)nt!So?-!uns)QugNl+%hbP&{9vry7^`{e49M+PZP~Qp#U32+1O)F0*!qw^UJln>+MFS2I6wIUR!kWI242J%r;X!Au(&VWsg z5T!9pH0*#IN|x4UQ0AD`Adl;ocCoXx4fUaLz=50<;%Uhq>&UHIaYf@uT>&S}uaP!b zep3+hmETrW_>ymx!-}&1c-c*AY}jiRMb>OR0FH!cm#tzOIFq|oEV#aNZU#(xvk*pj zS9IZqTfl`8+H^2SnacB=)6SCLU0V*R2N3XLT%RCDkD!o)t^$GMQUMV`CrA=Ag|b$dmu5u~51DLTK= z5xOQr@Uz#RViGgN-kmZ*@RpmXn|=3pOb4lTcXocpta{Z`o6hvHi^}q+Iq(Jxb@@+M zUjo-({9*HIxuVt$OITWL&5-VB5_CnB!&@rfUy8_c9oQZ6SR9QR697=!0<+aTO4cc? z6m>$?*C{p9JwXuYjoRbU#zI2Y5k8p2XeD@bhHi#xbR8P{Vc&gu;eM&FcH4iCd%>Y4 zWxEqEALtXHWoJ11LisF1-OT{qlvd37uS&|0dj-pT+hF;4Z}ntXlKKhlm%sh#G6cM~ zY_VOHQN&i}X;Z1yixd+6=3F@za{m1nWaM(8$!3e1&&Z5M_qlECClr%beqN*1@mw}R zCQsu|yNm2(jZADl+>WJ6|7NIv5UrOk7K8h(xP*_fj=Fz ze^F81f4PZFVL#IT+~Oz=w%9kd8GZ6y1T=;+S)9|s0Kx}WN-fDF)f6kcH&7sBCv#WM z<19VQl0Y#t$2{s($+dvNmu5j#?_-xaxCfWZ)k|Rf_SV{1=K_T_nFCblH6>CXR*Nm2 zrbFwXQ=W!5yq>ZH@i|>)s(j>}P>n%#diA%3ATJJKxlo$b5#Hl97xD0|_s_05w#rK+ zV^;1)uRyX`$*-Y6R4kX&UY0Y!GuIFaNXPVZ>)mxt6Pthxra0VfcFx-6(s1cA4}F_rRgX! z`M|*X0{}Jj9Uvme_?1qw_FPAMcD2~u>q-|qiSkr21YLKIeASn_ETLbV10dus-9U6O zclyh-w?v&vdb?pIrIKlLyFPOwjWRWqH8Nfh+S{8~M0{FI50d zC|kZamW_)xgir!k{64iX`go6SrPsjJAuQ-Je2_9k_jo$19$N#|OHTA*B<+^ngW5>!V>&fj*qfkM9l*-wc~FsohkXv(S8EV_LvJT~|G`w2+h zTO)+Co%?b+Hdfdd1{G9`g-S5wi!9EZgM?*P-nu7p^fEtyy*Ky*0f!9-M-)VSVbDRy z?Y_trwr|ZH-8^8_Z_4g!?g66^C}X^<0R%0uYoy@y49I^MTD8Cq+4d_ZCHcdkg!cpe2X)S!Ma; z>F*1ms`wc~hYsCpT~dh?_8~&r^E@CgXzX*5rSreN3ITfc&u9X?KJ;I!@a5ArM&nA* z*xk@TmKooYjhK@Jxy-mz4?@3d{9OQ83)aw8B8NN|mwuhEr~(SdG@s5ovp4}F z;H5ZYGN=6W1OmkgywDtf3mEqAyuUnKWB*-dFOO{oe^=Ja<9~a(N8uIH!ju$($mQV? z`g<$}=e>@SU6Fqz0M<}1(<`I|t`&FPr}5udvnjllkbTkq@N*+tj%>2Obpdi3aubbx zlU%KFY&E$#5Dve3qvDI0SiV*-&B0f?oF?|4*V>w$1=9uGPH&VH?4Q~F(%qF&Ci0wq zZtsmtBK<3RZ3mI%Xg;M<;tgYhqHJV)oZs24NKB6qXyHw%q*leBlG&%i)Lw;)!`}Zi zp4$B~o)!c$k?i}!LjM`JTkelzA0x!xyGO}qvHXfS6GtMKs_7>^i8_6u^rPkiA0H+~UC0;~q%i+!t`B7z;CQZ6^Lbf$EvM!n39&h&`6jp4eTNMIqyLZ&n z4^NmL${8_Y0k;bDp;$t5xOwQi2=@Q#XTL)semE zzGko3xxqN$rC40NA*?IQn}ZDjBiEJoWBT_H59R}#jnX0PMJ$?DZr5=Mv9}w_7haD_ zO}1nyG2PkqIy$^|kRbnef4jQ{jPu8zI7}=i!%IrRt-)aXRX*iDOdFAbwC~-u8{%H9%`EqKVIj5c~X+td2t@j=?xm45nhDQK6 zHmp3{{UwjSV0WNI?)@xVsfvtNPfI0?|6UoRW_lzfc@EQeG z!Wk9sjFVcd5S_lo;nX5kmHKk&&vcZ>)S?e$9b3&z;xuz?WROj|4p?F89qB(g;uT}= zb4Ri6Uz{;i#v+~<^?im|Xg4-W%Iw#bGp!akKxnv{Z5+aUwpm-Ovply{-c3rWcOhWc z93<%|os-4!xwuX99%np$ug}hA1g^e3Kd)ug@0NDk$`N_Z1@6UwtF%drHlT2Hw?8Ud zxRo@FP`x_Vx?XM2E?tGfGMRvMpsej7N3PG6@5%X#@3ENq1_pLOK`)tDl^Ei)xsIJ! z^0IXj8qD8IW0zD70~g?wHVjr%$>7V>s*yQh8d`=?PUtH)gxp*=&!J-NCuv5l_O^;_vev+dR>8{+1&%RT%l!RP%S^*r4JcDOT^OE%=%6mJh$EYBqRmp8c^ zzCj9I_#$uKd~pmDkqX}E3_s zW#sKzlU_{x$DEcNE4*8d87^ygMP%D+ap~sgtME9M&9eiD3Yzpor4=nMnfPj>%_W;? zg5>c|mkAR&h45!5oy1P+xKi4{AmUpXGFKLOJgz^xftt8CZ^mFm*`BV8F7hcA?jvTh zwHj-VU>qCoDo0IWUT{Y`k1jgk54B|&w1o>!9HBQkS_WLm|sx%$G$ zb#tgY-05Nj~meqv=tt0R|~;nuY)Be!pFPiM1w4S z7`WNiO9R)PKV|MUdod>MyJm4^t9kayKIt(g!sQBDx8JrjsL6w_+;47=T#Kr9Ca*nP zc8VTuu(n5Vb|xFb-wa{Vue1{bLt(7)xrq!^%7!(9LY>xntI}HUEQ)Rgszdxz+^;664$m-1*+T zzq%?682^TsJ%`K;pR7J~!Dopw7mC2AcpS*aUjLq@xI#pa`ppoP2UcxZ|E8=KuDY=T zH)-4~bq-rO?Uzxy$6Vk>AJrl=`e8eN74_t1b841%)k%PQ3S)}Nthr)p*8!rLJap$Ah{z^fdLvOtUnrXVfu z9$Tq`C24wqRd*7`t%ysM2bn9A%>$4*50s+=M7|^s{)_HC%mcJ`fd0; z|H^7WT}D4La-el^*tv5G7w$W}e4uChH&8s}JnKQ^tU$LdZ~(nOW}8|sW54E(KdPrj z!)RyEv?65FY`|@&>=Q=5GGu{YqHH>x`MLhjyHQ;_IgA~#=s$F_+7TH>mJdyv%UbG> zyAm_K*S`N>UqFxbNqUxE3=VM8 zF9bWg1n?>X(6xu3@MVl(9oMC$&}K%`F1_=$lO=jX)`DJjRWYh;H4&b?-CdN4tkqMw z&G-F}EjY(k^?<3O;=EU6b)_X=NO!n=Gi`##_fc630xK-1r=7r}etoV%cqC)TyO;qi^2RBTVU5X^NQQGT6T9e|3nP%Xc|x5;HF+ zv9T70XxZwcGt#Kd#uty^8t&P$IQF7%hKVSS-pOoIP$V7*8qMZa+~|~VPc}X|UbONX z;V(IS?^3Rjr{t*AJ1iZ985r`wWjz}A3*FgMF^UkyV>p>sAwWA;f4rJ8GsupCheJH^ zyqaIQJyWaneY}gTDQyzztTQqNE^r(GmX9nFz)0{1yLwbOpP{rvxR3(qI4zCf?6-M% z#OEmIroSYgKHQNxEuJ1#^y5;&ipMiTOe!4z*oAY7ra0eS>TmadE+N5l3Fz{?ID)Bc z%@y|fkvEhascOXs!)?th-T|jqrTJHRX9H(Dzfg1=#utG62?u z-{py``lO!L;Ib9GSm-Dzl^MS%?9kJGt<6PIIxzE7l$c1#k zY`3hQ6|x%UxS(bT84qzeIPc#MZ~{jGlpJLiDenmwb=6}3)!Y_`3GIZN(J z-mS@*IE&8fmb}N7{x1&ucJ1R0DlhMvI_BP>qWh z{uO9yYO1UYHeCeT8+UDBlZO&MKmW{?>S1ANqA~+A&qm6MM zB>kVR2Xj%j{B`m|B>x3?bxUM;~%X&{P3_3Mu)VEP5TWB%&8~hb8>)KLuMhu)}2~j8nK*mu(){$~vOM9l#B^t3DEkD0*Vbf5eS^aW# zcyG5g>rWZp^k`>)xSY%!)8velmVSLwZY1&8dUrpyESY0Q51G1RL2U4to0Ox`+4umCk+7xh7f>MV}D^Kf^$$45jUs^5X zx)C=Ay=)HpLry3Gx@J`dz<$xj6k|M4_uc^x>6Z=KYwsFJSS#B8%h3R4B=l|l%6a09 zHuIYJA?BApFq3b;Hq7u7rCz|U6MuzDeW z&^Xaik~JxmgF~!Ka2wI#I&O*`{*`yHNlRJR0^pbN=7Kzk>(W&U3HtcmE>x%{q=`h$ z>y|GZIsy=HtS~uC&K56jjD|P7ml7F@J+je1>LbWG*6>lh7z&t5ThL%N zgNpK%?aR<0{iZ?zBEGsqg4ck#OU+ShMJsv#!#_%TKm9;nYcbo;3WXxLf<5E7&q5M~Mt-%I)b`H*0J{0%et%3Yr(sbvZPAInSO z=bE@n5lAe1`2FoxE~WOT8&klH+1I!Ndf{VN2t{a}I;*B&fV7)sUpY%!w$0Y`nS<;6 zoZsYDQrv6|pOg8UIA?;z?jLvI$m2$gB^y(~?j)Uh~ya1hM@ zaI-mNvb@O#8CI!j_4;|Mjl*YfCjtFvX*j9I#rK?WtBuF96_Xc5Le&ZPmp^5RIQEfD z@MoLB9aa5F8j*x&#%H%s!L`~@_Vdo7^z#&YC;2}Oj9FF{t#R?DRP;~$!GdeK!{F%a4n98`h8Lh5?SCu`Z?RHSi zaj}a5f4@wUqyE@s-1L7@mNZG97Rt|}4ms?%M4ATJ&f1Gpw|}J3-<>40yIdKiJwT>) zl9wq5RS2iq*<@|k!H!*<25AqgjS8>my{cU=1u&utc$;m;2U_boQ?*X}gD{wMr<179 zilY4C$we8S7i+Dk+#GYl0vT_*-}1R99?SeA9cW424T0IZxiQ2uJ0PpaC(cW;_^Tbq z7X>dhoz36lU+^@!tvm0+2o6(fAyot57XBr&-3)>eQ-s2)=D1-Vf>aiA);6wur?aTZ zh8>v)hxvIp(%R17Y6`9*F8AG`iQHNAag=KO%mt0o3|mHFyO>+F!Q$@51EBG(X2@I9 zrmCMfjNVujq(qu92oxu1zCsT3Cs*%+WB(&vUA5!1eTNT(_S}}$e9g9-TRkr;VGgS7 zr~*vyH9lPRm4>`QusNYG9=p6&yIW+aN?pcH_$G+DhVHHG&mBA|H5Y!t(l=2m=IZZJ zh=_Zcw;4Trl9wd|vQ&C!7PHsdpGR7BSH}>0Z=dbIc zT@(Dh+!~O^TH}yzZ0!BrcU)mZw9TKOG2wZ#syS^%Cen7h5IZ?#)oc=cml36CW|f1V z2A|-^WAdi}>%nXcYjY>?YtQ)x?5FGu2ANi_tR$7@GPBujHKpoGlT0#4LDd(y29!2U zow}~Oam=k1!kMFH<@BMYTAe=xnm0d#w$Y|s7ew27Ytb*3XACO z$}oSUGw@J0Ae!=lLGP$asCVuC5V3Ha<&x$gMU#dQUY7JwvJ$UiUQ_QTS=qtkW>Jhx z?)%-kiLtfx8ylG}k-kE|&#F&6%`Hi05BdQn*DU8Maqy_}Vq)L12nCHI{tg1b1TQG1 z3rxAqaHXk?oOV#OJg#)Xs-QT1;PmS0Jjb2;3C(7{7BvXVt2SyTm8xb}1a=wfyR`}@ zMbZgyM5omuf3?P7?B6}`py$c>Z0^Vf=m%pZbJpNN9a%74!2ZoV_>12kV7omk>ux~{ zbbF11IPha1D;Z0vMMAxdNHZ5LQ)>D5S$B!jygfWVXDEv1o&Q#_lOlELtOAF{t^kM0V>cx=8smFd(PCe-dWCa<}n; z0r0|i4kL!qo}ekRA+?Ytm>2bqWIe5-`;tbYE#>#Txv5k_S$GIAUCua!RwjYDAslg$ zT;BnGS4HM@8>31ANRi&3jIVuKhsWImjK545U1QB znbFYwMOT#^Wra!VSy2CAt2Kbwyor4cywc)f%sm9iJ=&W*c=U11`=2UKV&*{Z60i89 z7_|A{``yXDG!k!@a2O_%()NO@QeV&VSkMghm;do7AG;+UmK7Jw{U(X} zUtd5x3Kd-l32Nr*x4-X#K(of8KClbov0i2Ows9FEPfXYF+NmG6<^QuafR5zdOgL?5 zNALO;$*QvuLqxErcS6--_L-b=A|S`bbr(zbBh(;V)Wl<q%rP=mYQ`VkWocMJ{& z|MO`T728|p2ivcY<7@#E#Xjn0#q)H;bh`A$n<;0xjS(!mfvj4G<_CjszYiRh|LDT)G1`9Ft?>B*r5^H?bZ;!< zi>$1yhzRUI!)L4naGIZJiXw~mjsWo7yQkxO044cj3zQt~A+ z8UOh>fwP{kjBK*ZK_ws6Ux34(v?=1j{I%&ZTO?)xO&VN8=|R`!n;rmrqUh)62L%Py z)r>vK%FAG&6gwo-)0$vFMLX6-yHMl0mZ65+>=9TN@rDW^NfBo^WEi)HdNuyyKnIO( zOT|L804+r0^4yH)wL@!I!CKdq72Dy8-PzFTIn@Rs+A2%w=t=*m6h0nZzSSsQsk`&T zuPEPDuXb(R)S!a055USuVbZ+S-y0J)k`!Wm$~sKDh;chPujmg*X!rjhzp{Ujjv zYd~}Td2l-0RRkG%wQon zqA^fv?>x4?mexwTz>lAcQJ1OB_FJ2U5^#UI!?#NvNN*-~3aEKK%J;Yjz$U}4jSu4d zD2zJ&ZV~|!)NJy9GdNr}c{4orvKbDmdufh)b;Xxg=8Z;us2st2uzU6wW@@>yoXFFr z!Lu8@1l9yUHM~SJcU_*^CbIW=(V1uPh%%*AdZ0LR(I#YL0Y~hGQDs5E9E5EuiGZs18Tb>(6`yb`n2wDQpzMuhPP5o*O}$W_hButE%-3hed%TaSRmuKEbu-scN1* zLkru*XlOio%Ohm)FkH&bm5$G+=W!KyIyjj-EV?6RR=nB{3~OECY4wy=hFirXVJBlt zJmR8w>sxH(!th@&K>>Sn4KTpr+cp}drPgof19=;OZHdz#`U)vz{BaXVK^j^Uar!K$ z-Cxcso2&5o^0ep_EX@rC3eVvvx9lfB_jOuvvjp)u>}UE>*We9pIPItLza#uCrFnfW zdd`?vta-Z_KicD`s4emFB>0#xq2}7vr54_ET=P-iz10{d{F4)XGUNT=S??S70^c&F zoRp=gvxjl!!(5p>k!5hB{e5AzFTD-7>zLMR%Y_=5TJ3E&L2c`MhOGlN&LZvsl(V^k zYHB1zn{DxS?Hqv)?+t;rraV)!b;45@u~o+$t1dU3=1_EpSl9kK9BZ5!*d z+Z&nt$y`UnRBU}lxhFwGu_ZmdKQ|`0kYP`+sDPSSZTtw)wbR0 zwb7i>SW)a7%{6M(`*%t28O$TyQR946N?U+B~#c1hb3&KVb;CE^aUj}ma zXg{t+Mnkf}*Fg;+egzW+uZ5I(%G>(;FOn29BT0?B?0mbSWK0_f;i-1qX>0JDWIQuT zc+ZEr!|fa$zhXU4SL~Yc#5|v|_q~=I>=yHa{UypCYK}BSqXle_xim_(c^w~j3VQ_u zNh*F{75zyxHREg8xX97Nj;m=}P80okd$UjtXSq0@C02cSXq2Yv){km%^F|KHhkhkK z!{K87Ju9|j8k#Sa#y+(V&w}hGED54v=_Vx#K@zjJr#Ogj;H#rs{<*GiF1-MbhVkXdDRLpZK{wa*# z`y&mJ3;!)j)4;yTz<|ZqyQQ?99X)wW7Gq}@mVgckxRh#E+;0t4TX|=g=#tSoc$vT* zvxk^`?iZUrVd6F%ZZ)ZtvZ=SHqx)e?T46~>uWH{Ces=LC+3f^>*^E@Zs^M2>LzWEPau=iYR&NbJZW8C8&_Xw>qz$BG+(I0dlYn;Fz zTS4_;>pdI0Se?z5Bu>i&>+NT)0JWnDN}9(_esuU_Uw7G%kT86vpzx)F6`XtX%|GxM zrBs`a=>)ccLin^l{RKV>Q8-s3AUfwh$)FKE;d-5oioHw5wvYOi9**X~C&VK6Ng6|MGE?;@`V^0~^G`(DWA>pCSO0BMsS=ey; z=oq%WFCMR&;-O<(Qu(36a<@evfkR+>D~x)7Ev;(SSaq$Ko}KHt`nT^2w*ZvjWD$9#iK*C8&cBjVORAGq=99c`rQEE3HG!5aZ}+c5vrq zx@+tZLC9;XKy8m6Rpa%m(p*|Uj?TSULo3oR;q^yK(MrUz-b;!ILe8D?X99Uq3FVAK zhn@BgeN4`y!#TE>i9Je+K!b2c{HNFmuf zEzO2vGG<&3lyTCD0s62BzZHxv&Aherq2{R}&ci+;9>2Sl_kI!=3P1Odq;~!Kq0ZFZ z?QUGCXziW@d5w-hgX#9xbs9PtEs2?IX5=KAs!W^P>q?Kp9*J!Ccs^;uS|I6V7o#+f zH+9K3s)mS!(-CeXvI*t0R}Y}%p>xs*ZTy@!mmt-0ua#wyYX4gGp;^ z8R24RsEmd0Z+SU54mPCL{B4m;oJwA=l z&G~&Tt5r^3Z-j!SH%g^nt>|)&j;? z;`T^9-AJl1wgiv&GL*>Py0zgUC@EUsfx_F#;=~vZD(Mk8*1!^%^q%In zStw-RZArQtn@z6w>J44eI5z1IKLogU#4cZC;XJD90Z$QNjzg4vOt@ftb$pB__5wK< zzZc=%!dHrIh$GO-Ir|k~jqc6P3SKF&uO@wjrBqY9Gye3o)ok$0*4#=B zgXP`}H@)J}!kqY5b+_{5IAE_jcUH{pua&BmOn&*`Xp=z#a8aU@%aD)a6|g3HPOh3b zzg+YMOZFwfYMuOUyg(Ff1ZY9d5Vut@H_r<|%^|sSnlc1qJj?-)4n~zIo+BiD4{85z zguVYKcHjR$A2uO|q;8y?yy8*%>oaEXt$dp_YB_2DvM%blNO~|x_=s<`U^VZirnCJq zd&D>P>)&)wdVKGSRq3DFHq^(JiMQ6)7QL4ws}#_7{t_2lWT{1e0KWd+Yx}29YdF7D z>$>G26WbnhJ?Gi>;8N+7w&|lnmcs=ztOeJImhM zf&am`N~(c)&C7psX_|UDb!P7G-)wlB-o|V*qMkJ-N*nLr-WqRs+m6Smq{&452m{iv zN)}X=z4Gw%@VC75FsoLbr>O+ z^~_bUvZMhm=EBM)WSIg@j&Z(j^ce!DmmQOixV7d{-;2_BX0!8@?xBj59A!Fv_R?N2Ku&&<@Z1TKQrvbo(BF0dV@ILdAf5b&>e=GV+7 zs1T1ay{_WEZEZWpoALLSwR~wlN?F0A=o9?$)!uOI_x=q(qwB>t&zl#kRaV-3!cTKC zfJhAplRVWFgle;VGu(!X_s(_W>)E9v8hw!occwtO)4GPJp}x-5&@|%y3Tk?pmxj>d zz3BHZYQph3x$bwnvDm?08(~@xTKBzX$F!$KJDTGn@zjxC)gG(4LA{~IG?X!JaYJ6?DF0* zipy24MSFEaC%V;;MsmLK_Q+s7mygd=ru~xLw(Q>DX?)U|KEC)vQh{)<-&@=zijU`1 zvZ#G;W?`KF+ylM;IK8tp>u;FBhes$Q6Q@$!7>D|U0d^F0lyywd50rBdSGnqjQn?T9 z#pZX6@EOgefU}wI2<<;z{48{Z!JbkTIiL&lszJs3)?R$)<)628|16`_H^Xu$vg8}v zu@cfBq2BAnlu+6|gp{I>_tBjXK6{4mM*97Dr=;+8Ncu^n8v6EOYxD8X3UMWL)i?5l zNT=RW=UIIsLG*VOxiN{c^71UVEl=~%R=tmT~>$HaPl z=GQ3uZ5n-j@Gah1cykeFiUgy))@;4)J~OwMs)eA?s~4|Me$OYO#{*RR)-tDJ-#lka zM)wfov{@An9N2++y###-ZPJiFb#=n?J+!7i!S>a>(yVWd% z0L@dsSKO})E*E9*xjYe8x-fo-=*KMuOG1 z=eV~wLPrNq3A4%K0Jkp=%g46?0}1_iX6HM(>B%~-+|)Vhs|d}G{V!InggR5WLhorp z;~a9oW7L1bf6yuWiFrZ5L7a7|MIo;Rjts|=+3H#W64U^<^2TfNSVcD~sek3_rr({? zLHP>IlsHrWtXo#==d8sCXz%F^e$q@IAky;|j)2f5q$6ILqD3)wW$NZQ-c3MTMc#I= zqdwaB`y9G+O3iI^vc~1EfWG|0tf9ddG=U!vXRrT6NEuN)j(vad8+3D%Ax3ns$8q1e zpC~AdgjF-2bC1u)W582rjRh&X{&2YWM)dh>fb`r;1cM5{{_7kC6iSnRKIVqH%@X_4 zawi~`(W;~`PjYM6)PHM~lTN28TirHQn}ef1?RLcRn>6{JRRUchFm3K5m z^T@?S| zdvf9Z%7ryH=+7IXV!PL3w$JRWO~b1Ps=fm8xHkL4cVzumwb6}6)#@n76Tf`D;GlS= zty*Z>bY$ce$@-TDH$87kVSC9Clt5{`?%UVlgcRr#Z*q(;>#kYGSSyCK8oG=s-5o-a zP@Npw+yH4B>jLry{dWL@QinqCiqQmX#OitOHW^#Q*+qe7TrOthbbqX{IgvEl^WqKg zSkc0XyWoh-%06TeR|ThB73e|L50_%GqWer{sGURWDpcTVzjpTRw!ib+e>^j*OQ13w znN%d>$5<#LhDG>L%jkp!hCuH7LO;@bmN7-w`^;=(_{&3a z;99d(*&{iec%Ew!zJrW9gGU&l34qW$TWE%>rWLTTxv*LCB}2k}cc5os&P7RPr1SdJ z%;lqoLKzF=7&im_-`QK_=4So!OZ4|z;;*U7`W5q*bLvv(Aqy*{58IK)xp1nKJ(Xwk zbjZ6e-8-#{24cTDZk+`zzxFm(r#b(G9X}q=Ri`u58ks-4e*x`@$)H_NjJ3rW>%#ui zkWKa(z$ln+dS8Juvu|+dyJ{v)9c`rdTnPTmZsYKF)#kl!xnNr)BFfGbWg4K?^I1j~ zO|_-TP8odY&1#E4(YMU%T*}(*vX{U`<|iH`8i93DhBqYFY^HR61m|~hagi*bQ)!B6 z3k!kKi*&heMx4kA`pzz+BMA(z8Sq1lQQr!Ykf$ogMJ)q(8mvcnWV@?oCzIzx}J%# zFGzTjr;9YKT3A?l9$MTH_NF}rDbA5!oRyV7ju+_J3Zb5fT{Y#R@WfHp zifnHG@%ZhSRE@S(J0Oq6sWF?FI<%Ab2z^@K6#@$HM3q!%4^$}1#8=Qid&{w@_$fdV z(Z|Ri$R`@MJ3&@V_iU~ftxZ_uYj8kBq4{K9V|C-#X(Sqez|&n)%o?p*t}dHW|Bl=A zb+i$SY`*sWdab7g2Q9hSd!TQqolkOlL$o!@pji{;sL2f}1Uw7C9!7m4FuLk#p3i76 ztR@tQByzKIVX-@%F&QUylA77PtAp6zbpJ}C=S;c z-Xg}|za4})oER999{gH`Ma_l3$))R$B@|sP`Wp|Zc-%4ovzoFektLVKl9pEAE6!@c z?44T`i|EB#wA6=c2WkycTO;+86LS4-4CnP<|F@_?TglZxqJk&KXYk3aA@|;b29E-_ zE$Q*gH14MLYTjKk>-g~q7AF3ig`=&}?^18MzyGzBOiYRKO#m^fgYMbT#JFqZlvdru zyUebDU$&6v05tVDclOlj<65`&Lwthj5Y=;3EZUs*P&!>yt67hhp~1FKD|Ljo#p+xcFDZi!6_UnW#B@yhP_c zF?eW`-IR6>y`Cp~$_4=ljeHI}pft{#!^x&Mn8$EbFRk`vSs>#gX(bq1?|3}8Astf_ z&)}2C3oSkbD)toB`uK<{-wX9QmQg`uB7j!q+(}Knqf{i8yisuZhxyI;G1~3ojr`@z zVE{pBUN~0ENl=0$kcA5sX~dS~HFv(bJ+=wTNfU5C$O1BeXKROtm;J98kdC$7&%;`s zr(Z)3ajRZGl55sXe=uezkiyasV_5%v)kNf%FbPnk4&x2C5AYl!9*aE)|r$C6=8OKXyh+d)_x%Pf{%K zBmn<&K}_ee7t`20e$+{s{hr+|dw1AAgvd54pyO4NBm8)2%SYj_Wrj2OcKb@5>bZS5 z0{T`#F6;Yb$SRtL2Q~#Dn^dp+(A!|Xhjdt2!)q}rG4}DRe1E?hk^W9-If9VK7Lo?$ z@&#D5=Y>i+(vLcKZCZrg3n!@`!hq$~=J|OX@>FX-vm_2_)d??0yoLy)E%QGng4v)H zX6aE(3NA;it>Z#grw!V_HkYcGk0S}>ha?t2+J8y>@r3M0E*z#0&svMc<4h&OW7S}g zxXL|x*F}}3&_+z8lxA4GX8Sn3Np3fqtSF?FOk1Rs>x}NFMo>1~gnH9Gwj{Pt*8jS5ZZpOah+fImME?pV(&{(ouE{ zB;nTU{4Q+I_sV(_mmRVKk3O6HD?N|lQLq;HBd{Gjhe%^TwtwaWl3n`PmRbHaS3doZ zkLB^t|Ngch3bl;5e3|;kSvKGtdunZlOgq4seDYTV(R7abOJ}jsCyX$|!tapWsYEH;9H~;4s-J|E#3phiDcQ8`NjZzJy&wcpLX~8`d;9gH{K-sZaI)!+iXN<7_S3Gy zD{BU?W%Pq*c(@UhvnTK))cp6M6fS^v4)D#N8f1b5`#)K^XB}p!@gR%$Gi#}FvcECi zhW?xD=d%%zhp7~%))?Q^uv2#tC*`Gj^6F5EA{mDcOx^9!k71fV)4$Qf0djY5J(*<3 zf;B2jz^yR8Pu9^cDKGh9dPo;^e>%v`c`i~LY6ae5z3CHENcbd>z;;~wE7>~%m+>_a zW^v)Sv&QLX_oS>AdhZMU_<{lHf)jX3&qDI~@AN!e)`==Mw*G+Uss=n=Ikrz{8$QD3 z#2T{JGN@{rj3z1GmiK$5&D7hWuGW_sm5e1xVdPTVfp9~+sc5FC=1;ql3)Jle`I1>0 z_KRxKl7vEuQ*;`(0xw0V5CMbeCGs<(Y|>KgMwyK5KaGwQz{I4rS@QTfykSfAnUg2J zGXagiS!le0>jcB0x~=(TgD4P1*0&k8QypaKqG$MYe}6%xtnyD_;T&|a*?zm;TP;LJ z1V$^BsZ~EzkC(vUd@HoyZ?8$NcYDMu<&z&^La{y7|vDFfjs_1_8cCC zmP5Ws`UU%maVr=KfR6B|u?xM9Y{6y=7zkva8fMz}RSNx7@n^$&+Wv0zzSUcmDKokw zs)Vb-;5v-`Yp}J&wEgiw-sQnmsjJn6=%&<4^yGa7lgx;Dm(CO;_Gapxp_wAlKBZJ4 z-|j_EUMZia(ai?_cfM2Of!P=Z;z+8AZ$FUAO8D$dA3!k$E1N2VZtmXD(UwhhE8$Ar z?P=F;mm|BzH4iN(1^nySEMc4cu6lhTvT8DgHOZ?{7Atw=dQU$w4vYHMQ z9v2N`#vJrSHlBldtXt_oB?K7a{v~EYZeU24zIm9#Owl5yabMqFY;Q1<33Ggwl5(~B zl^H%46C64@@CvhQ;42{hngHI+Vf2znU##10IvP3Mh}<2pVEVlC2kaf8QQ_EXx3^~V zemtQ-9s~p3p6=$S>9!S4-yQ4MeI!{~Mc(AB=a8T%nByrbdhUodLi}JQsh*E7F!YLK z718KQ*4whnm-*1s-L5M`n@hmUS>Ea4Pp$%H`!jNnt}mPSDQD`E7yL+2Hu=QKZ1=0O zQ@B*esS|8M@aMZ@w7yVP*do#3wZu>^SBdD};-gFPy@^4M4VTgAR1KTk@n=PY6j(=r zs5@jBSweI`ksaU-ZNI$gr z7An~ax-U;0qm>NVl7nrnZyQWYzldLbyhJY8()+ZGyD&I(W$fk~?2jUq7|2n2`+4=E zeTsHgPz;lu05dp3lK6GvJLh?!*0-p8N-b#3LU3K91673UD~5NZ@k;Joi_H?1BRPHJ zN7?xlR4J4?@5eJ%v`d@KRc!GYp?m-3r_; zJ@D~@@nOO#VkP*&M_M?cAE9Qy0sb{~Fp^Zp%2w~Gs7%hH^C48~;?K*rW9CcLsD5(X zGR-CDt+hKc_?J*ef)Kx>21Epl>Yc`%UT?+a?U!g0TVtAPebYa!)y}2GZG%C|)sE=` zcc9+3Wys_F*81Ue>o|HYzSzyW_vf?Z)&!|557Vuyp&I(43CFDMNqMFmPi+lnw}9Re zmJe-cN1K?I&5Su*<$r=VFS;MhS2o_-u8iET4L!@=c!$vQ?S*>9cG-%14GDMB^=2Wv zWPBInt;1>Pn*n(2OU6ZT=hYFxt54bne_(GlDy|$wpWh zp!dO#h^U{0$8k}ECinnP25L5CMF`=3b*2Ca@J9%)7Hii_tsII%&AxP`0r6ug0|BfGq|>Z7T;-yIuOn4-%G?n8jJ z_a~2e%V8M2K2$m2hpIdjk>Z>l>kn3dJ3to5&=_?vBF*{S-JiX2$d$&<#l` z7IxlS9za7?W*V|AjOTT|7=^t=WyT9bh)gkpLEXWy%#>KDHCBNc7HMw2TFQL$-uiCo zW}saP=KSr- zlfCbA?HmSak9QiDWdb8l(w}ZADZO4yQi{_xCDzJchiG_6^Yy=Bca=TLSM_{Hm}A=O z+i}@FT5a$JG9JR}@2YhMyicBhqY+gHi1{KCDMYJ`kJrsfKNf^W|s(`jKdAeO5$2ePvKP;>?${%YEX-$ z+86^uw9QSzAW=3)y~-J*${B+^>IgEc9^Q8R@iGKxlg5Nru-cIHQtKuVJYK&+$R^uF{h05?tY$U1>-xW_gWm2g5qAJgjYd&$(yUo^9c7CoAM3SVVX`Uh+RAF^;&seOW=rXkiUSHSmVz^N}-T2Mf^>%==qI5MqIq92S zkk4F$-MPrX;Lh_f55tkoC5!Voi3XfesmJso7+umX}-SPeMPwD(zUyt?p!`id%8nyd_Bh4!sW?5 zVOGg%ZMLze(iKtv(A!N}`rvk2%!R^PtfAmp(t1I1ZFZNpYBK8&Uja@j@^U8pV7X8hrMqR(lTeVeh{7Y;k~ZLe{O2n9rH{3)x$szS3v$vy|kJ$LH~HDDh*V zA?#i)i>dmg=GK+XTEQRYCTpExSO>kVxP5D^PA>)M)y`;6QR7lm-B)hcOOjh&B3_N9 zC!M7~XkN*0X7~Q$>C_K&A%B>bL8EHb0lo5XGd-gKDeE%z z;}!pz+`!j^k?74qBR89ew29L}w!u|9l+f|Oh_v7c;sh$oAeC!lkomXXC=bM_qyJ5r6~89 zc_q21ty?{FUukk5AT98M&<3rN6nZF!hJnlZm?pZ;ZXf(AnN7 zBPFH#p_A?c1GQWV=+@Y9w7VhPv7CkJ4HB*{B>a{t*NI$9tur&y{voR9cc`+Ao1uBW z*RG>9v>N!9l9lpW&hB=6dTmx&1ufvyC56nydKGrX>g(TEe4 zcK=RUVypmD>*?rYq+c6dWzH$`T)cRIInmV1m9L8>m0w4VjjFJ)XlQR9W`kKK<2NU5 zz92c)PgP+mtm%aoPXZ`GeUC=de#~f+Qo@{QrTr1aWTkEe^NT^znb?xE#%^cu-s)wd zaAu*&DO#(=;!mf$fI~*jCX6L|tG*m0INp%fvfD(;t_hI$a?2ZtVmpv)w{pgw#1^~2 zZRPVLsv0vvPaz-_$Fsy(`^So)-|N367?SI+;}abj5-!hcT!A0oE370^QL=XD6oZmm zxCJZgqf)!q?OGAN@NsD9*j%Yc}a}(soBFuE<-|T zL^tqL0Wu0|X^X>%cURpnyx6(Sb_iRv)u5UZ--wF7%Ow7MvU|T&VJiIp1$=n;m`Ny;Y7t$=eG@1drC#t=9ILiNX7!ed>OHE6R1) zr=w`96gXquw7sAUSpiN7ihcYFeR7u-YvMkJ{AxcB&4&aN|I^2d?p?VGg{K_-{6@dz zDNkm92qK{!vp3@Fmtsdo{Q5=5OLbGKa%OK9;8;MJ;FsuRXWCB_!SSf#vYdr8daeXy z+ic1Wg*~F@z;!g_Q@&?uSBF%Yrs0`#r(kD!rSlLAm8Kl(3sK{ zqf^ezqtJPP^;>f17bU%S2XO;-#lr@dEa zrN|&va9<7=M=NOtkz8y|5XI#iJH*f`< zs%c)Hw_aD_=Jpg{r*8C$9ukwyIS<&RZ@27ruA4B0RYDchDx?ZHD33Z%vMmGeO#y! zZx*i13lH6SDFxiPndw~~rVPNfjOX2cYj(T93uv1o($N7*u5Tl6TTzzw1_a#RXEWp` z28&xvCk`3hUp8X+id}dQT?=@&s$|zn=4eHCQ8C$o!M5YDPozaQMZL@~X!@@yRI7PN2Lw?B9PB2&%K&E}%!6%JN=!QQcxCjQA-vBr7Xq$bHPKk#7 ze5dd364y|aajcdeIPms>(s%wA9F81gE*mJZ3o@7*uDd84oqD!vgkE}_z3vZ3NGGPV zpD|&)KAhYYe${Z!=i_Eg%OSbi{%&#A4_gV^D?p^gvPu?kTm<`bJuIA=suXN=bahG^ zH(96yZ0#5_4BbzbI@Rm-&dP){!)hW|dC|#zD$MBXiJe2uw`ATs*QgNzXh~+x9C$;X zCmk`4x8kS#S}asanoBKa+r`_36R&VCAOl#&QS40OHAMH-VD9$kV)5cP83nLp_WCKo z=b2vPQ)NA+xT-*nnp6d=sFIf75%5@aAwRF^IJ#w!kjl{;>E%ENM1zNz?XqE*!huKA zdwD7|%ct3ak&!wN6Oo&gqNkVM?i1FxO`tEy*(n5-FFb66$R92THv=V!PP2^}8yX&h zrEgffMLJ_}gVL&O?(2v_3RbRzaFx{Nm%nS5<}o=AcbzG^r+9JABfV?imW+j^Z-z(O z!qMF3w{onuC0w@fab?R=0h)Tyt4tY-sgOjnpGf9*Oyd>n8_FN#T!>aUDYPphyP8 zL>Yt_LQ}5~lunyBG|0qx;E%?TwqMi`lk$vv9uXDQCkVT83LfnNgr4bl=u7Iqj~)xP zwdNui`LY!bLD?O3)bMSJc8qI(TvmN=`|u}KCk(CCF_<|V=oQjj2%Wc|k1oIg{K^ke z(Oo3GhJs?}9*J4@?*ulNGadBxYu7mS7I$R3WAk_~PedurRGMOholnM6=2DYBK6L># z3k658^F~s$;pWqExgi-=?M7gD0xR`SU*WUU$^F(WW^{d!Z%KObyjyu@o!@JNVe=y8 zNag1C4g%0b5WCoFK1hbb9jB#1Z!VaS4A8EbyX!>IA(HzWtu%4>*cdRKBVv0AN01~l z>%2HSSa#l{d2=#c=bzD0fHFngLtaZ1H|E{(d!i_Cvx)U?ozW_s9r1TpQ?2d<+^_qu z3Lv>xCPR9pLEM1zxwoNi1;;P zTs@;w;k!9fnK-@D?d`3#%!RBlpdA!GLgki?$?$**PRx_R0s)+X)|UNGgrKCDYEHed zf@ch!&n6mXdFBZJF$(CTto+@&U$&Ba3|JyA+#UgcJ5>*QMAh4W{1bHhFT)Oh12q{R zXZHPTri(V2DwSVBo1p#gfn&i?8rInd33ipC5zXoydm2(yAw(d4^Izx)N(0)(kL~ZB zJj%*E{^7qB7R>mH1*ov8l#p7g7dgY50-_cthjh)=G=V1}A&0d6_cz6TamKd<&&?Y63 z42b^xIo#f(%o591lVl*i=i?y=}&SVohc zJLZw%1EfIdvyZ>z$GGZXZPhkYsXu(7Z_Xz)@671qVLaopqaHDMygM}(}#Me zM*V+!HoOo+2HoHJ7l!?4xw&|b?oS@RJ@;PhsZ*#~E`SI{N1)_{f4n2--5*@>CE8f& z`@vnH=v7ehbrws_Fy(#AqM;-EKf;hdk{{QQ`I0Yu<;K-vDibcS z=FBEn0ok?P_FLnB3?ZAM3!wPZPWGGg&q)C`4G+| z5SRa99n@h5)H+;@yj;>M=5p80bq*75qnJ#t#vTx1E$2dUb>3s&$Q+Rkd*u+Be!myR zmOG>NTLc)5ra{M+sK=K-DPueAI`3FnEA1$x+_+umR|kfQ_flrfbBpg|)S?pkuZ~!a zK{Z5;-2&X6e`4?fJ9d9S?S3&(;J)f{jBEmM1by;ZFH*6|Irjqsj@Dp`l+`R=cc>?M z@#jzD%Q2asAfHF9AT>2LHP>N9N~4ERu3-q7CME*+P}ir^ScA2xrI!bQNX{F)4?|!y z^2qs?^JD~($lJ~SvMH*E?nT($mivQvlBtK=_6Ei&>sjw3#OV6lJ2ZiZtGirDoO|o@ z`~i#EiCs#Wv_vKjNWX&SwEsl^9N^V_NnYabJ8s>+byQ5h@+utbzMu9SmTJ0fG5~d9 z8Qq0rQq~rkh^jA78QX}8l7;#Ny%>+$7ch7X-kMO%%+wbY;Cf$8$}8#its#{$-U}FJ zN~|2Js4Z{mc&D?NHi>P$Ly~qg*khb?dO_@hmfk%U7iU_f?%T!;Iy4WBW6-Gyf~=mZ zpo>=~%U2z|XJS$lyl*Azyd6HcRtTj-6Pe+l?KnRqc(I@OL*I4rjz>bKW}r?qU%}!c z$Q_}z+(uh2gOrC;fR1e%pYikm>i7Q9#QJaiUZ6h{bii=_nGhQJaJ)IwhfZ3;hO|X2 z6gJb1=ILEn5i=<93@kGG7N63)x6tfBw;Gw-d2<4^M_|EPRJMOlUuiZkUL-xq7f=<1 z;~`2^>_U$QE&@6YE91X=%|^Zj7<42aS2HLNDXr@~qMWF797PpS$x5Qhq8yE+(T=Pm zd@cRPB&|c_$VwlRy{`;U1FCm9J-k=`#9mq1Do{wj2JR4QuwVif^-F|bH1}i_2}?og ztG3}|Epub1!|9TUEd4KHyCyTvX`zupjjdJm52C1y&1YTR zs0AzIa#fCGdd}9@ymUF&G{4^a(kMl-mM9kf{@_={sCAaUUUuhxutG-Zbg+0ck^kWC zF8%rW?Kj8GRL4o%hv2b#L?|{Rqxvla%YI9F;Ffp+a4*Ut= zm8{!3wTC++%|)&0jM4mn|Mx>|kery1b?1h}n>}%0priO)@T8{?^?>K7R*`fYh!6!U zz`;{ZL!7^OambnCv*8b^4&tLBhmHNQ=U^zymz-Q8Xge0D~+5O@=tt;Xx>p@7;5L5J5MeJJocCD6VEcB zg9qS&cb1Q_6>0(>xK>8J?h_l~B@V%N_dBWm+oPW^jg3(!_7}kVhHju@jdfcL!1PgI7r^4|bI@T73?r8lCD88+6a zr70?ZFHx4Oa9St&_fEy_+;cnpHmhcVzRrYolYFZOlP0L8Y|Ys82|e@!w!KLx#1Q5D zo)$$!gbiAelWI^fP<0b|fvNWSFT`DNatqKypC2qm1Ea3eLSOj>i-8Fgs0Glm$P_Wh zuJwoiL%qYd%SbP@nWkz@On7BU4bXi!5Fp7D?BKqvq1G8dxyWIEp1MW>fkHH&6Al5) z6EBggUHAusg89E-52~?R0?V;fA5b0||5~G}aY7s4ZOMpR3d7I%ZrGLs;I!(#fu;m$ z8jR)|Hhjmh+)NOoSa{2EGF@=$<|j`M@STp>9wTcnAh$vE#`j)HTdS@k{D377l{=9|wOfbP{i5@%#Hq?ka7pR2^GRL4hAEUHjsbHn-uEo~ z3eYE;iJINQ0;x`kG+I(itU$lr+y>ivLXUNhA^|i)+#|53o0Ba_x$BR3wT*{#8pgHh zJBf)pXI*EDoP%mrP$#=~=i(NTO-aBK^%uusoRtnFsFHSrJn(vaz9F|~ONEJ?B3^XF z-b=eb1D&O|MB=XAsKL#JZfVV}K!MYz908935dE@ky)W`oaSF@^^b336w^+z~F5ltl zK^CtAIf0UWAzT#V4=<1X;h;3vdxGr;f=?EId8SrAmNpz2Pv^S952Fy*N`3Dpu@z`s zZU3$|rGuJ7w~{vPmh(i*rrs$c*NluKB6YAdVcmwxh)k0qw7sD4^mAq9^j?TsVH1=o zI-yK6J3)fy@-aX$nSK38{Um&X@Lb=muF~(P4s((Bj96s}smevES31s-415(daQRtT zK}Bu-dJyil2qh|cL^%zN%s<@A{(2liNt!+p`@05aQ3|RgQYf3L1g7gpfVshKvm1l4 zT$QdVE^2|9^h{kOZeAng1pySVqOAmSXx3V#adZvJY?z~=nw z_%c@Dw4-ho{3&=^A)tzF?BdU;#_x(wiRAhY^awV5zU`I*|;a$}$RlqIAf>(k&Gs+RhNEA>kO66`a+ ztd|T=9dQ0(sHLJv%DK(CxpnqKU3um+r~BKcd(6b>+A94x@y6f2JG6dliwLqkL(ThX zoQ>Ep_g@bu@5p)s+AkTV36TS{OV80BLB5Ub>i_^;Wf zY&VRRon-b;sEY)Mn6J@|u9w>ZlNCTXi66Gkf)$MRfa8nR80=1Re>Db?!vc2R=kuh) zN4w~&=P>gW(DRv+Gs+u6!Wr}pX;I+a3$1cyBBE@!IQRSXQxY-ade2=>v@l}uP`pl= z{C#9I!ldWj0;53b131tT&^4}lSVpI?2j7r*-5=jb#?##{?Z_t1R25Chrtq@rTChM| zF&`Y2e-K0nn(I1ovV8~-1Lf=sewq16XimR!W@F&S`@#LtGDI4^F}q8}$;rxWr;|FG zf@zyNnv#&q>66-z!j`_F)_Z=#QI{w=Dx6>nK9-AkOP)k2{>XfK`Z1Gg80hpwPs@=} z=eT=;r&00(L4cpoo~7g3bHZgreWdbp^Ox#)4AySUaL}ky>Wm%k9`0l4qE*};Q<`$ZXz3ttuO9=9#;~80V|4S&}agk4hXz*N-C2#{9k~5kQ&$H zUAKLOgf8ewoJFA+zNJMbXeFPV)}*>$5}lwP?4?K(UtaCR82Ta1E2yd()Xu5V#Q`e* zgN%r1CQ5yjCwXM*$@;Z4umtFhH~PyMxb61Hqw$zMY)-av zZb;nrej&-Sybt^ZduWTpgcsJo^l((|J!ClQ2Tu+Z;_|%B9y>ijkxPAa`!!3?lL6kL zVEc<(u)QHSFP%ZZv(7lxPv_0Z*ll2BhIs_f{6G9+6ezaOo3U`(r-$4RR2}kTg*C{p zRp0)_2n`Q#67O-{F)i!$tu-2*4A|Zv91@!8&#}EI{Q`Bgm!`FqXFq7u>tj|DQd!44~1i$#e!M8VUi5ECL>m1GrPV4e}^Jk3=y z&v8}9DYk2IRd*&Lu!!-e&a5uu#GK-%m77qw3EYIxfksp(1-_z$$5#kgEa3MJ`lAUbI7LLXkW{1vUu4Zn#AlppFg2 z;1l@>2l(9l%kc%y@L5EUn8$Co5di@{-9Mk9m~H#Vuv!Z1o{X<%(&-L zmI73S28bvRG6XwbJbp_(U1Pl3>%wd0Vl^)`5eEiJdWtK|&CdVZ<9~hTPM_jyI@!MO z%X^(snvCZe4YH>^eDXf?vq+^JG=8<~qv!8?{4mske75he&F?@+BXY0v;W*>itn}Qh zG*{S|5~w|6&0M6wl&}Bt{OI-jNUAgFr!{KT(QGB3ppi!`ul>(y%8R+9@%aA#Pj4CU z^q<;)mB*_&iBBHdS)p!;1wR7|Xq$G&fsdZh6BG0&_L-qA^ozhOdSHyiU%}HXB-&3P z(lRMS(THIA44WnTkt>j^g>YKFE@z==23*cZVur@N;FmU+dG)s}wjx#{g7=PLD_CY0 zG$kb<$G0Dpe~_f<0xbMeBsL~z>K`Le%fW=c@Q?4Dj~TMWo@?i1pW3TIns*<0#t0d7 z0qzpZO*OB1>MlH3E)&QLo8_8fOSOR~Ce7YYYLtj*$JVFvG!_(d{!#Adz08sZtyZ8@v&(ra7W-cpp z8%fyVQDAy7)iO-G0TI)Lp-f>q1OBiQV#B()D9`m-)Z7YHQgr7qMCmOYz$9Pl0oy+? z8$%nR^qj)Flm7e@TCM&Tg==79Y1myZYjPb5MV$mvuL}44_u1+ykQ_H>@c&e0Hp$)^ibsM9_y>(%aEpg?mZsWFbvf>u^D> zKJRV%%UD1d@4M3~K!XLiW7WA0%-Qg)=&r^TtT$7cn94=5Sw8@$oK@EiU|GZ^(GD-K zr8%<$IT6UA;|MR(37FaBUoW#(KDn#XeeO2z?0A*vFaqFdZ|~N!11^nO&f)dd-8Nve z12pSWv=xhwPtOksG1c6Y>0RH_U@_GyiNI7NKJ#F-o!fg}d>d~?AtwoDY<4Z9RS*4n zi-K%M`;c3ko%|3-9__ZkLvDMyNH)Rxe{|=8bQh#%Ru~|$E^S~>z+(qUcJqg$PT>M- z6wP>AXgUBGP{xHeQ^DRoW;CiT$PMDZ-QQsJfm7kU%I9 z(SIBb_EEn?dPawXj{M9d8aNjAg%d%qF_5VGMzqjR73eVH;&u`+^}_XxW}gjC(%}?! zniZu~tEq8lbRtceRWmcbUs7+A51`i7SEBt~rqp&YA2euYjGVBY^sJaeW4-9z(#H~* zi=Af!Y>gfQMf)|?g;14&MoAMe*8Xh2Ete2|ow|0vs;!j@l<<~nEcKH?T=CWE0{c$0 z!N}GCZXov*<7a5Bfw zk*uT!Ec%SWqDAuh#mU}M#9wp$H+E$l-n$pH`PWlr*=>Vr?qs!sVxAhGf2O>$vskNn zmIMxG>)KyLgf_8pz#we{<)~tg!F#k88+KLfqty2)qU+vP~Tyvdgpl@HRl> zpV`EBcAkIlwtxTd?#cV5`Ro0L2r)DMTCdB zcxfbTK$D`}a?=YZl=trH9YreJSz0qfWPX~gep(mWtLZ=}ALIWuF9(PiYeQH>snoGS z%sII?+2KwoT2VL>syX=6`yHxImB-K0J6F)5oc~F%@i8|@t6a-hI)h_ADmOA+)MJj0 zZcR$rK5~&!<(wb$oqPWu$s|Euf6v&eznMw@Z6?lGlPBBo^Uzpu_pQPG%pTx4(uWQj z*>XJ(>0h@Y5~zn9>9ghboOB}g6U7DN$|*+nd6?I>?L2aD1cRSz(pz;)(y|9?%#=9( ze408b-l-_$p{A9tuxjxaGe;p?*8Pvr+90;c&$)d=ZokAlHM(x;i1>u=+Z-yz3@8&* zAp5jNHNho)#DD{DpO;}u5;!0d9xweic2e2sM}s+g{B$S_9mpY{K`I8?H-O@&s(8zF zoSNx;GAv-W4K`wuYch&1O5r5`!G-&en4rl!-w`!?u5Id3ZYy+ zO{pZXRFf|kIiSy^dMXnK<+EGg5(0g?tXMz;8vnHX$s&X*T?Nj3r$()OP8%*lVl>ZLSQjY%Nb@y0?q+mPA&5~^MH&vWDw@pA zj-}}OAB4SiR9sE7Jxl@#AwhyWB)B^Pf(CbY5AN<7f&~xm5Zv8$aCZ&v4#S`W4DuV2 z=eh5DzjfF8`p=njX8LsZsjk|!clA_gZ3VFu6$uPczp>xzuwH}wvUUgR7ceLvV?8j7 z*sY{w$SmyZ;ljGkAteOk?q2yn-Ij)<0)Z_1E=+!M4|kfc|Na0PMH^uTb%IZ|MK{ zB;^Q5(9FInZ6b8BehY?viS>_&tHW8F>kv+)$)Qpj#_YvNKNhq;8MJ-F+WIp(@Bfv0 z{jU?&{?8gL{{gfA$l9KN1?E5UF{t?Lj}Y+r({&btzuq7W41L$1VCWhC{@ec7Wo2tl zT}kz4A=D++Mm{W$qjXBqZE@wx*);L{|Qj?7=dP}K&ZwAy9`_34V(Y!g0?Ws&Z zxX5y39ZO37Cb@FEEw4K-9-sPmmHz7N>xMsr0*xMv|LZOJZ;jn^?EKsoS&TzY1oNRW zn!$?_Tf{`RuGN~|!g!j^cy&+a=IU*%*K}>`maMH$%7OKDOWoINj-C~Bno%BERNu8jKY)=o z#NRYgpg*E_p}xmpr&$Lpg~pm@BqK;<4DtZnkvVXIUxlFA#J_#(W1SP8X)e#2Ux-G< zs|}W|E2>$UsqsyKQU4>fe7v)81eh`VsRxtR_-C!SyW^X(6xm;6r=I~S{!y4@%` z3|!-@|J=MTiT_H6@_vfLD}(QnCW<}NMvrwH@AjOYpPtx322|KXO2}bwM2ao&#^RKhtM%tLZ&|}6X)F%$BwY8ut{xw- z=F9RW`v!Ubo-4Odt&Iqxf~6FQv^$yTJEPs&l|scC;`A}*F=BuV`mP3@`k-epH=M*6 zlRc~R5g8dnhFkj0Ic*6OhjnE`0|ySG2dofRQVBC|zk^bKZ_MPE9?Icq`w~YcAUkTr z+GL8GAj^ZxaxY=Hr;OWH0~N^qGA+*SC9Hh~0(j^>6i*N@kK+B*4sZ71dCqbq3q+4j zc5E~f#Ct;LTx>o%Yc5Zg-j|n`Z}$uqgblaxtdPrYUL5yy;0&ro?>oz)xMm-Ew=BV*KG^_p^mtE+Q-`mSu+qaKM9yT@Iu6RxPC@MdK*08A~bk zaI;UZ)W)PN*ult2SYx_o{HGm!a*MZNszlilvHny~%-nefBHxSJiYJxB?`oR->x{EB zGU=nd<1{93<)}#J1G0y5PuT$L$X?v;OwK@V1Nt7z+6I!ITRa$1Y;NwB)xZo4*W}^W zh3TeO5vpp6s?O7`wMwQ#nws$}9D6@1e|>bBbgmNKFcI2y3ly$>#*7Llx9IzdV-2`E(-LJy#R*9;8ZON7^Y8k?GG+XyQ4ug2(W!d{sLuvaBDfiPS0+o= zL&gcig!hjHWLhlZu6s`2jgWTO0|-UBA|uBfVUb?Q{9%HUU6Kx13M(GnQGFP4dGXac?A`;4VSb*)!Vb3Jp0q^ug2FYK4XAXk-p*hdaW@436Ag_8Hb5?yhKGV`p^_UGBD) z|Kz`Mmtl^(-fT}E#1HtbwCVm!5O!({P zJwuyS&j+ICp9PrJZc)4q=1%asIhZE`@`8uh@MOHKlnuP3^)k+fQk)sv9&h1o`N2b} z(`W{^DZc*XZ6zf~QM6ChcfP=q!s3;?No?<1j)yB>N;r6R+sEIFiKJbEpV>8ClaGYJ zPpeA6G3ypbupbm%zcACxnI@Nu05~4VAS35^`|MT~W>ww#iDlx(-2n5iUI)4F=FJ0c z)~$hG4P!SM8QXpKrbI5LA^jw`U;BaIl}t14F8p2jZ+iOF=5B92u1@TBVi~=fugW5x z+@AK&2&A&*sc!DJUKnaPruv>`X5M?Z#TQ2wN}#JPyHaNMcSC&2v;{i>zoZ_`I&n71 zT%4RR5>#gb;O-Jsm0LKan4ayY=HJm_uS2pV^8R(Yq4jhRrI_2rM|c7?4J4>JRkY_P zIJfIBObWcfYdYS3LCfDsfZ*-IHw+U@^vuAf0##&J`DpQ*#bL{)K*sjl)4tIspNFT% z^XYNVcF1Xkujj3~Ycf9eH#gwZCx_X|C--%mm-T&t&X15;h&Rg98L*#C2I4l{1oM+T zuRQBuA#tto2?ZdP%6zpv+Jql(KB(lo;<_INUbd0Abza+uGe;17k*TF?zoyebCru2T zh(`UoT=4yCIQ}P_+w;^XhNlO`*3aiW%xOk23%@3lYVNr7-HDy5 z&sT&Ufzgy`=%yq}D{YGa!$d(&DN|HtTUuV!z_Z+TI?;-+$Y26bM*XqAG&@x5W*o{( zI>=aRTBK+=rb6Sp9`NRNdB|5a47#R0nr{m(E*fVVA7w7KrlI zg5~<;2vNg9=*M(k1Lny>+0F}*i$DX)if1PU{n?4P08qaJ-e3(_m07!0sD&vs8{L;@Y^xBP?NFcG?mbn0?gyr7tXl)=+K|# zP5Dmwe&Xg5lA-PFTOHMLo(8t|IUsI9F-@c;|H7KUbJLZgm6HcoPK&&JQW|FtIOYX) zoO9QGeuy^YI(_hNGoGE?;^J8O+OBtaa&We~#(~%nytUxo>G!BvR$eEA%T8U&$UCv7 zc1%@VUKW+a>DLjjpsan}+wkOlG`n|vGOFjOqa$p~RO)?JSMYeRuRW4`VTJSQ;}1{Q zMlb{Q*Ym;qX~7r#EZKW)OHg}|pv!t;BmQvF4MuKinl$4{cC`?EzY4C}TS4K20QLx5 zx%B?U0y5V5V1lDEZuXzNFA^z;|mB#BA^(Ylv8s!7Q&{TG|{`??tkC-}mwzeL(hs9J^ z@9p&Ja;Kv+CK4v!x`d!j8u7^&W0G zUxO&;=JM;Mx{}p$-Nv(d>&ekI-m~B6D2=v|yUrh9m|yIKjG~mTY=O7yV=rzsYrZqjObmCg2Fp zbvWgn5a_lwX#m7t@@Rx-0{loijMm7ask!uYHwVzY88$?twAUjswml^W|E@Y}7*yCu zpxLzBEf`;ZSo+E^(eWUg$)3abaIZs2w?PT~F({z~Y(1gKvEK({pF;L$W@lBD<~u}i z8+WLy6iziFx(!aC76v+z^$zLYYx3H{9hA#D(0uHg{i77Ms#0v?!*m6uciKd=_yk+`nS$t zxpr_MW+%CxcVY!Wt-a%1Jz+$2iEbn5+#0FDL98WKv_CPhWJgu`1Y&?9p#wQCn|MLb8AkfTH0H?Ye=SWBGc){u8YtvnhCb9q0Kps?5smmbvmDvzepx3TTb1 z(r=LM?4unx8o>81ZmY*%m&O5gJO1!Q-a(L}(()~$(B8Ai(+B-R4cOgj16T0-6g$1PCK9q;|klY{MDjvT-%dq%|@n=d(&X{meX|IX4Yyhf@QU0KWWQ+Nb4o0vwWgr+hWLeh3RV>UeZQp2fLS|dp-k6^)OH1&pVrS{4lz)PFh zR@s*8GJb~%w%RIt1dT$3ZntBoN`@t!_$H%SfXQ#~r%p3R`CCs~gvjeuaJg4+t4BzE zEU21gwG($&e%{TxE|nbNH7?C`@3?#I5U)M;mn_SD%LM<#wP`W#41PN09}UGaAOh+_ zuDOXE>n zz8=$h>Tf%Ex> zD|a)sit$43!_JX14dLXGvPb*3@za$I#`yQV4QB%`OEnGa#;NrPb9^9y#YCg7w1~{M zW;$g-hLCb2Nb{_g^Sf0qH%TxNTs5=`!mXvA&i!o3GU?#uP9|S+q!0Rh0hjqS|IPN% z?SXkBEA7VSD@QZ&@Ykb|7ehQVn^2g4bJ>1?+<~FXbBmYLB9X{0X|6_26x2Grknb3tdX#pIXu6MQP`H*(t($r`e`UXWWS`w+zVo za64NupQo9P(EL40t^85YcQ}l{T>MIn(9;xJyMQRc`(eW$2j$%3J;pi&>eYgIF~SIa zZ|-%D5TU*kznqx2%>`rWr-sU!8ZA!SPvCC)r|P|RN2fGO_r@wj_@@z&Yq5eCSKit@64zvCxgz>U0$EZ!jpZ&X*`|Bj(R5rq<<* zYqtJqRU~KNb{pA+R&cSbZ{p0Zk(~T?ekM@jzPc0^;#h=F5&T08gL~hs)RrA2WSo6; zc|}ObbN@Z>Zbf6ZScGVKsnnK7t32*?umt?vbslgM{btPsn?3rCBf!X8Llx;PiE!i< z{C&39K=d-&tj^=EfPZ$b{Fi%@?WyRKda;WPB)L-BwC0@-$oGm2x6KXg+tb#@fz!<{ zqzK$oUJz(Ee}U2aVUgr%)dfSw)KQA82tTuxwpW|9(fK5n63o*|S#q#yc0k_8vW}+- zxwrHlPRFAMd!G7*L*4T`MJ&cNq4I3}y<7)=xN=svwTkL6`kU+P>$w^~bvbM(#K`nk zrvdZp5Iq@BBUw%1sxZ>ZrnXvatb5}q`ALwO9z)~$XKxo|Y|8=HBwRwfRds)bB~1;@ z6s6zdx8$O_!fNj-dB1Fzf#nv?HtPMsVhrbMJ3g1j8vBHDWJ#90clW-_?iVOZ{0}BN zp);m^>5jQ_zTlG(u95;!n5&O{Qf|49`5}jsgR-wd(BE zuR|3U5}im`L~KIvO7a*xgNWMo2p3ao9W&7>$CY*iiO`s-P}29VxYl!0m&*PsLOL|; zXV`?}=Ak^1*JeH@ar%kwSo^Ri>sgEG5tKqC`KlBAWSROj7lD$?r$nB92T@t#(?MHa zX%Luosuv z00s&!R371(yuJ$SsF#*XA*FJZonuz?IM?DT(usmqm?9F`!}L%B=vuSkg^P z7kdR^OEB-=Dl_q&h%>>!>*{tF5fRGk7i-LJMuDY{YIAz>Bx1C6CwnUcGx9f%4#hK< zXi7VW@;#V}!wVQY837N_<+`=pHG(VQx*S@i)6WDfW5c~7oh zFPJpjG|XuXM5la5Ai`T$NFg%(;Cr)DpyzYCx$FxL8PAzEEl6vzHt<69Q>ZA;w>c8i zOZ)8j$zU@;EyJ@bW&rb|;pr+%*A{efB`Nu%&33_Bdvk5=)@^>(-y46m-Dsn2I3Xs? zwW^@!0tbm6569X0F|x1g5ia55IZoH1~cL(adfU^hlHRW2x{AjO)P`{8ul( z7^{qy*tVgge)L91l<1VSSD09D*Q2+f;dZz)->L)9bletqF2tK&Ra<-H z-SxH0oFxkJ=y_ZV<`^sR;7F&xEnwN znU73`*dyg_!MiI=H2Klhe-i*qeG3a!f{tE_<%O>BecwTthZ?h(~$}vo(3JshAT@zI!093@uKKicYCM zC6iyS13_Nlq>Knh#`#<94tj5R6m?0VhtOT8cK+IM6l5+H400nyGPR&VMs?6D23dY}71 zb+T%*Pt=;W;;Fi-8rE%PVqh~uA)9x0A`8yW&e6ktf8SY3(exKMp8vdR*`i6rJ5Z)> zACedJRM*Rhn2zf1B0r;`ryURt)#%zVyR2 zZ`~^qqx*9k<4);kK&4X}{)6l`l6F@iBcD7oW^XWF`+wLCI#4Kw4K8JJird}ZRc@eh zrZ5GZ%5F*(3JsQv|Q3Ud49K+ye-a|>Tu@lw-<-(KcA#M<*~ zXu!S&K&R#K>_v{;_zJfShpz!a|l{eWhIDbDWq#98QMK__4y^ala ztBq}W3QtDJYV9j+r9gUt;|!No6ow@oalLf`pRe|R2S%cTPO~liBX*j1$HgL9z{f#w zdnHNZcFE~^{NF_GdJ2A&-)mJpy%o{i_7~+&zS;6vhxAjQ<{B&zI&iXRxD;~1>3G%$ z;vavC^bf}cHmOKv{~I7wfB!c=n0lr?LXlcaE@yf0zgU2^SH0Q9p}J(p9?~)NNKy>> zQrU5|Z_I)fN(Z;l>PQV@aC$T!J>oO=8CyOMINys&+cXplGoqFr(Ib@ zzW{76_}ua1P|A>MKEFZBm{AYEqFXCs?H`Yjt{W$NrMv)sxV30eb6n^i1^q_?3Sx;EHsmk_`bK^?k22H{I8890*Xif<`{Cx%*ZN|u`OI&|v^ZDE7htheAoV@(pSfPdFYtSf zJWfq!ZX%A>&{Lbn_b8PiDs$X_s`t(?RUdj1$(3c0?hfv(ur<*6Zo=p#F;uS$rn`u^!T&rb>#d(r8*|dC5zQgCg2} z`S&p2Ep4%@L0I><^h=2XXWI7#B9kJ?c`~n$l;@M+e67EH4GBGv%A@jAlXm)+4Kl0C z=cmo;>6{FiO3B$f{xk+4typ)6jAt5^)4y6yPMGS-aj!#4M;z~^H23gII(lOg&QXhH zw5>O$$4tuAGkVCG(%jX}Raa+?H^*$Zk*&_C>snlY<@8lTqAt5B7PEOk$S`~BUU(M| zc}XE9Hd8IjY!9vIPMV9oY zr5|I6o{3C*pv}MvazF~0xuGLCTjShb%CapRq%AEhwNzn=n;GV3VBqOFuhu(UdSQtD z&wHkZH*6s@#yl8yFU*S&G`C#pq1un;emQE-;v+|+6dSwNxwGS*H;Ur8b(QO)oHoLm zRQvkN_DC+1xtz#EA>BCDBx|dqtCr=2Hn1vO^$O10aMG`o!d`mH+Q&(1a&UySAZ=IF z^Nit!GL_-9qR_Od(O)GmFnqC&!OOI9&9FK`HzmH?P zudYcr2<}ckAPP0UQIKwpQ%Ts~HYG3+aWrfT*mhWjZqWbiQ{Of!4|i3|epAv*?@FWY z4OA8%-e>p8SGiy^d0sa9asW(ohG-QwfeF?^x!Ij`?R9GSf0X)P07TR!s5bEXZH*^5i#Lyp(vc z*(oPIt)1dt+E^_!j<(3^;^7fDBd?R9qOOoLQTftbz{p84K-wts#m?z~8D@*TMSP!r zrE5gE94kL@yq(21(@#gd<(xnQ&FEF&d`MfT0%g*FK&nJe&f@;Jqq4C4EghC`~+ zWd*VnUXDe7SHA{-MieO7mqR$(o-p3?D7BUj+pMv)0k)6gAA_jhqpl;B)3;AqSuXB0 z6OTom7u|-rXxUY$T3_>$gBsjJWiIf`Q%B`%Af2d5F}20iTVor4+6!qVd;2yfs;Q~j zuD2p*ybs40GIw^UZDSKDHT*4#XbC0ZDrXS}~&PI`KWDYI4Kk{%LcZoAO9sBwcP0?hyFuyBS3?)9)cHb8K z^-)MO%=MK1qu(UQ+WJ=CbOY5W61RH7dAPLX&&kE+>~1bf$6RXG*3l}WdZnUksb>3x zw1QG7K*p_<7PBjclI%XPq6ylbV(%%)K)^K)qmY19At7ASIlC|cSmfZKvgdh^SrU1>XDB8>(ctF*1}R1&q*YZ zwb)XUbFMi3yNKvi?k8?>;};ClgVC^h4^C7$V|;8Mo$Q3XRp*se6%-3_52=+%nkw*> z^wx^YizXUx2LsyT4cfAcr`GYXu{X&vxjfuG4S!5G3C30x!UYGFSaZ(D*&S`li z77|MQ{zF?K{>PKW)oKEughHRr_Y?gVn`do+BQ&0JZ&J4s7eriZS& zqF#XoS=)D&eMmEo)AY97@QZo}iMi?g%&d z+m)e?A~MO7L0-ZOCQz@7G+v18b7VznTH2T>e?inG#C|2o7}cy<_nSk&0~P8019~dJLU!oyHJFZvf&C9W^APz z%tnX=5{FZlStyxfUtq-p}m4rH4x6yq{34&Y=gY$Be6?jY#je}KZwb|2CwM?ai#N2H$25$b5Utq~? zeg4?PfKZYRm#X3tBP#nrC=Z2TYtmY$C8w}6gLY{$;_mkwv0ZIAi1r@#Cd zFRQR#t>)RZKpA@WFy>)Zr?bfv)!MV_ia^2&HDpd%UNa*yX7X4BLo`{9R6@0CzB`$x z6zI4#N2#+cddvqk?e-jW+4Lw(R|mZ5NW6syRo7e`<{{|HVyLN@TYvh| zsy)8&ds(29nvFWz$OyvfbiP9+$^74CLU|@ly(HSamS;=4#KR!;{guRID1aF`6um5@`}Ad-dbR`WsR6Le{g z;L6bB^_UdW1TRMamTc|7uBgjbq?RSo`dv;BNtTeJMUijV^i#yoXCO`sBoPyN-S{Npc~ z^EEAJuxj{;5Q%P4u@r#{pr zw8L<>7k^;LlG+uMjAtj02=|Kv-sI23jIujikJ>9X{ODn$c)A%o0qi%nTzX~x&YcKL z-};8e*`j5$sgAVO5!*W&j%~8@bZMNQFkw(N!$GmS;+(__%0(SSIPNT6ftTrOk=Wf-_J{eyTM(5`eY0LrG1SG&VVTx|CnLd{4xjwbKFymSemNcv&Sr zbUG}{jqQBoOvsh!!(igMW3YH2o!zNLW~={DaWZq+Zkvx5pc2i#k=)U%Al;XR&RJUY?E6w4j`lV>44r zZc)?p^1k3czOQ3UBV9@DmjZL%+KL!4DSty#G4V;IS3#Q@=j$mL!`c1WvvRw@rYCjP zIzEvhVwbS|l~g`zDYxrk>;xxYa~TN~(q{vu79^kHaumbn5D{{ZcG|>kZ&wV3gGVEo}AV~Q9=R(+P9uyzp^K?}In&i|r#acD(^V;nfa=)#iz6rI$2lC z!jq+BBq%;wp+ZCrCB=~z*wWD{Ns?ysdhlNr8&=RuY0OLCZ%q?>-X>?XV$>JrkB zxt}1;knng^4;iAixGpQ1FVn;e6-9y$T268~1??8UxA##32ho zFS!ka6RORgrYcXEWR@{~aFs!GrEQS&J4KD40mH7K-(@_jJ1kMgv06CCI}eyp;#B#^ z`nKlUpaGMCijD9*rl5#wt>ZY(55LJ7D_TWQP$^6-B=M1^D&^-hka_4zDtN1p*2J2L zf47j)ONLbMydkNz6mQH!ic)7l$DXS#)ToH&IH=;tB(GZpPU=znX}NOKlD=r9x-0g^ zS8Y?s0G&&*HUl(Y`NW?3y4UEP8$pjlZ@}j$)u@-eUDy@NCX>vQEGizgNV(WGtr+`I zz_0hTiC%K+lUXJqEJg%{0TeI}>voPChJ_gI!|eM?8$W1n3qVA}Hb4?fVL0O1$d*$^&%d*cy{(d@qgaLj zQjKFn19Mii^XX#~suK9{i;lCAa?8jb z9s7$s;gdx-_d*P=R96$?cZ4vaj8Xo})krS};4j*xc5AWOfSEvarhk~?+MYS~cyQ3I zUVeT`I#5ZV@<_djf7l}aRWM8OXPI62>&=PWT>T3+rfQJDBT%U2(fh{_A*BSeLAw^* zAn5O%?POVC-rh$CX7U?IoHw1Oo~}wKP?fj>>aT}OO$2Xbv(Ad3S&pObnw8O`SA0?& z-WzALsf;Taj*Sv%ypTEiR8{?N|2U0E$IZ>n1IC6L^;J!yOG={UAEC~Xw1|L%(UUT& zwqybcr>JTItFnh;ZvPL;co>}i|49|VXDTSHLNPU~7kb}eV7wWwVfKD#8jBIfA)=q@09#+4V9m2t+`L*gC)e+Q;}`Wm zh(yOkpGw$k{H;N>J;sh&2AI9-ni@k5bdiXzNh9e0iH1TLw%R8LM7k0`z=TUBx=0cr z%SOZ4O%f1L^_e~UeTKMToj&iJ=&%6BFEBWX3@34%1keC$JzL@W8qwd94oZnyYCL6u zA9^%6UEh#;57UKk%n-SQ z7iKI2?WsPUp$rAliJd~jDTw?H%+@S<8rt|Xl+tLn%r)RwtyVnqe3g}jTCsU(a{%(- z4I13Hv%MI(knU#`mjM}jx3-}H8{yS!e+658=6yn;%du*+hp5^J3sSPEr(d}^Zako z7NNDlxtxMw=mw0tpH~6B+GQN)0M#3|O2StF;IOiKK50F6%RskbHtB=#%6Par%^1I? z`r6`PWdK%-n=pm2*x)OF@Gol~kfjT6R@v?*6VxqUIJ*`@nXl$4QHy{=a4uh~6U{)A zA$xHP9HN{Wy2##!k8*$n8uJQ`uvo!>Jw8L7gHEBq&6_~`@-{}|C7-*2NI|6WL-o?m zZ9ES0#yeq?RNnE!WZY*$UA|b;HRZukHGuy&Di=Swq-3(IN=gfNi2_b?5)t_pI*x!^ z^}`O*(zVfc!hU+T$y&3^3KUh2$zu6r>uYt(jjsD}H~IT9Dy-ZJG8e_a=DsfvJ%g3Q zYb*xSQjIORkAePLD@rZ#NZV#HH{lVSC4vaD;6{M#72mN+Z~Z z+Qe%UEdj3i9C2uYAjzgh z(Q+=0uu?R+>MSGJ)veU+tN^9JgDR}r!fmC0L1%ix_yuST;y5jW++5eAG1d0RaCUH-#ElhYZGJ%e}Q^m|F$r$6KmtU0>ZR0n|}4xi)I@H`&=eHjy3+5kG{;8U%V}5sSh}A;fsJ)GUVGf)-nmx;_|&#M1@_N~WMO-} zoga(m(}Hdk;hIo;1ylKH@pbW6&BH@2gtgIL-9dW!@~l-=BzUT5+aGBKHl@leJ^55w zbkeeiw3=4|Cxs;zs2;CS@Wu2sOSGty6H8=B2?J*12)Jr1y7){~hY*EvgGeLPo4tx1 z_WIXM;@A@i?yZi16oA1=pS@3H@;j%)n9>p`+;WsJ)3ZNlbw-6>oi1orFy3$a&EQmo zP+t&1Zrqf{eL}&6B_!Ju7gAlY-E9WD_rL?j$V}I+gTsEPeC!y zc-B~qkG_WPf|qoQbj946T!^a3Oy4^r`&Q6kYLRoSBTL7hx6n`pN%D)BNHCjQOq>P& z=bSGZ3!=-Lx%Gs+e(VQYD#8Ts3F*+^<6y1v^YLyBW2>%Q=iNp_X0C|K@v_$fs?GWl zVn9|mAp4+QA+1aeR}!-m({~RodbZ~GI^$1AodMKezSnquDqFLIJk(|S)JHDWNG@a* zQ!`5VoW=S(=FW2KYPEcw^~fZC`sAFnQcv`_fs_2SdEweOgm9*JAw3wflc_Z)USPwi zUhAjLmM)v8?2M7N@Ag>7xE4hc+|Yj0V>m9(zvKac9s&Q{aMDHRagbE&Tvcg*A(YJH zyr~LhuMA%mI1a1_)^%(&-NCcM3_2_#l`IG9}Y6Y~|EeHKWgM;~r%%fu<9n0;l_}~Qh zB>U+?<)+-)g_>{U?c*v^Ue>`doemlga1n$IFhA%+VO7ngTfcbaMIzyTGuVRG6xz0? zQ*yds4^eB8ic{hZT4v3$u_BpT;NyLP>_;~vB*+jY@L}UZVn2owsQ13}#O0tE)AO3Q zrcM6L^Ix#I7O&3nUQyAOQLVl%x4ipzVxNUYD1M!w8siz}4>oz(7k=5hF*IdifC9J1 zP`+u+mA;`??ZBS7mi&0Ntn;uhr=wziBcx|MZK**OBs>`Gd zK+rj9uvFuT-l*BADJzLBgEv>kG$r71$}UxyCk$~jydZkq&Qls`xytlD6^zP`swcGE zo>L~i2gOdGA2?-byGU+X}ONH*yx(M@sDLl$&G969_CvFT2`%Bv@pDw04U~ zQa<_ID(|$HElD-5e?PndFJ14GV)a3O`9H_6&z332{r8te+Kz1NnF*7WuUy< z5Dkc9bUX8&EwLohXq4zrypxelVi+bNow+~hen)(hmE(CkYyPDI%H;ug)leu5Md`Nh zPy(X#w75-m>Lu|qAAc`d0{0$`$p7a>{qoDtAv6U*WwGyEE2h3#_BCWVro9T3xK{kx z$|ut|DJSe@Y{DyKNyGSvxBg@ULef@Yr-Z)HgX&NSbK7gMAy9c>2cz>9cTq{OP6gv2 zXKtFE>G%GhORHCztgc9P@t#99OAeXjLb0NBp0^LijIq(t!fUsO<=lh4j(T@vXL+ZH zO`)g!kWP9i1?11X;K25c2#0#P8{N?r*tR8A^4zKW|Na>jNaTG$Xn5!w&>XJLCP3 zwXRtu#hvZ9(;UP;TYm0Z5PYTml+S{hmkzS*Z{adg`M@IcC$TguBB z92V3Qtp7ifr_e5=zoZ>~{dnK5f3X1A9M^v{!7w<_RT2Ja|IHiukN&wbnVIzn4kp|I zv46nf$q~@>BvX%L2K67H&8lm4HPU5Wp6x^+)pvS3^iRm5rlywItYoQ=!_9p$D0Mur z<)egwC;eyW!m;Qq4Z=l%?Z0GgCk~t4*yvp_9I!##Z~p{M?}n?(P6)NlI!8tRmN(H? z-n4;J#E|RQ(;$NC*b-Fp!fK}DllF)j2wtpD;Ue}?h_v(!D$t<*Wk2AMHokMCr0nn8 z{RE83_>Bk6uiAx#i{@n4tw;g;_H;TQb^i3)j@&NsY&D}gq22}9mGK+n`8sN83Z+!V zlig4tG!TL|!=#d$T%Dp_hSQLfKXKJ4%N=Qyi-6W2oAix2VtkKl0(p7IJMknx;#rBu zfH%z>Pu^$z=WZPMG;)Irx~uTf&+;E8^riadHi@5V0Kei1Tf2U7-ffL@OR+C!=aXCv z6W3VQLirGzBFp6MEn|ZW+g_ke&;EKw!W93Cin=Qq+@at zH7sb3oFy*ie4y8GNsf4dxyLewg=1Ti-?Fhf?v-9^?PD0PSZMK8HKcvv%%r*}W;N-o zcS#S(S$k^a7fOtm>9ZDF0+hQ(O`6{?x&A+tGZmX=2%@A?-1-jM&%^P}{(C-QW0;o# zX--x#6svu9$mc=-w*)20@{pNzD@Pk52%j<)F4zq^;0f{7bjVfH>(yOyW0PV&{!+mM zUt~K&uJ$I_Q$|00>%U1qpGu6{bc@cDs=c;~BObq>^FIBq1U^z;u3702l7EzG(ev=I zRGmTBdTbextAo_lF)pw4EM1L}a5dpIGEurBqrJKLi!SuNVwm_fkKZWe&CQKptKG*t z_(I+IAPSIhzHQ(yX*j`BI^+7B95!HZ>tw^k-bt9{pkkw=zeYq%#o9YvCTwLYKB|e_ z#%8zp(Lv7EQ^XHvv`;lQG*)ajtw@q7klFq@89Ms~JRW_^Zh9Y;VyjNS4fTepHn_5A zCS1SGOe5G>Opi7HobLUhLU(XNQSS++zC9e<+p!ql&tCFGl*n_nwT+4K-Owa0<(RN5~Rm^8P(!Ft@!t3XT zBi1-aDFteppDoL4r&ZJN_QturBly z4f)Ql0P2!>E5TSWH!C$7CiR^CyN zs)lO6Tc5C)2X{#B`9Of(coyZ0T(|R|IQ))kZ`zf2JE!MME(6RCrL?F4pvLFqZLF=j zTVu-=4!RxhRJ@g5gGY%?XG(B^6Uy3$pX4K%Lu=r}&04Oi2Hp#L-;E&3=?YoE-@;hm zE`-8@9OY{(8+1=Qa@+$Z@kSm#YD&I~!e(c0Fh@*qW?*56pFL0~K?4h8zZs9#nn_N4 zX7;D`ybR8G_>mTHost#VhYs?5U76eHt3KC(r;%+ejZp!XNXkT!S^u0*ce5D+;lLmR z++8&*OR;@X1Dy@c>h0UQpY>xFJr*0Dmag4&bXQmKdx0z>;s17ui3|>Jtn+Y@8+X&D zd2?!F0U-Z?qBhS z{1+FV$F9H3GLxriZ-ZAu1}rMYEbu4k0i$iW|Jfc{RWCkPZ=&$PtZe+VLN=D?s}{S? zmkIJDa!n&LbaoRop+j+tz*euKs0wu@#hIDTUTnlNV-Xo%zt>r8zf*1KY0EhFrrEJo z*qBItUz1e4SDRAToEx$3cA1G!sAc(-Y691X@gD-ZUP~S0P{&yk6MG!S$p95=L+0eH z$;pVyolNApK-}N$znr($j1yjt08c#ecp=`r8hhA(O0jEni@ou#A2Lh)yQxH;YMm<- zx&wSIAg{61mZb9}dn!1UMUz~oag08vLw)6EtF0)gdhK_@@A&a;)=2M)0>^p5ItC8E zR;suD>9uswn>NAkJK6t_vab${WBaxw5FiA%AVGq=yC-PS4j!D~?$9_PI6*?N;O_2j z!QI`p(Z*?RVFx$k}RzTZs!#Ro-KRi9Jm?7jBdYZ0aj1)AgcI?-^CG?`oaZg*HK zi;ycIKV3fL$tIuqT%XxFBF;C`yI2B7@|{UI`h8#z;-iw{mgcrFFTd~WDWwsExE&&i7w#RsmhkHHo?H$G@#0R!fOb9FsTV%}0D|xfBh7@eQ<>V>KT3z2ySs<~29xU2c=r ztqn#WFP|N?{8>cxV+c@v5&mBYYpPAC2p{CGS@%A4r5Ey-SFO;`8>KhH1`3-o5>S1X zmt|mZ0d8Q|wq)jiWQw?Wqt#=Hf6Mh}G+^+F4;!u6RH+9m!-uU`QrX#i2x4;tyh~pH zO5mPzF(6lc%8fMU%bvS>YhzoUbwhVK_?=6{P}nz;4J^T!HR==Mu;; zdoU~uo0h}U*6^h^+m89VpNaK6a&LBs3CO)9KOUS$U;5X| zaQ}m#>OFqQlWI_UxkfmqZtQuw@OH75v|zdkkxBb^wNcw*ACq;{EOaEUeU=lIT zn&w!nC#0)0NmW+&e($K@zG}6^!+lt0uNHEAf%y*^)au#zeQkr&_?USu&qlk3cEJy$ z&105%-hQ<9h^kHyUud5K71md-bg6m2mIWc(JzIFR_$XNVho`}S$O%$U&|S2QBTp#tv8P_?>_II5-#pu4D9Fxw z^-9#%>--3pM5OpN99Ral=sv}BvPcaaK7)u@YZyBO#D^2_nh#Ux)qV+VXcry7sc zw)1(4og1x(4P{bq(*ufrv(djU1Cs>{4W|u%yxWMfJtrai`*$N|uQ>lniIAS>jQ{lP z7V&Lsd7C5Rzq&Dk_eX7>iK{`<=;R2h)4nN}YW>u3+qn8get)hH^A-1hOm+UD%0sIu z_YHII9shqk`F~IGzkw6znEjhnZ~qQTQ;AS3G7XaqWOHbf&t?8|Pk08lwo(GTW7Tj+ z?~wvv*$1A}h1tMp#{98BIY41*RV1 z0?HI~Oj04wb>m!Dhze%^>ub|SIj5>lAs*i3lkN%+XM)PjNTNPZPm9e=6lk$yc$z@x zkAfGpsBC8!-LQK(v>U<&O*fE>*@1VXivS=#5{&j&=#8kmyn5;R^4ZVb5(w zvLWTzCE}8z%pSdr$&Bzhn{M7!3-be=bJl; z(T`_Xm%`lKc%;SEG&rj~%))%)Q+GJ?R~v_dV7*k?p`mNq+14@NT+Xa9R!@GwMp_)v z-ZY-t7&pnV62@1Ck7-XUg-vxob4G2J*%zgN+;!qCdph0dEv5&hZ8@pR7dI2vxOzUd z)b?Yq3p@rw)qP0$_=fyAO?>LWdw8=q5}u7+pynX_>1xfCPwi5F!i4r6#v{UN&6ZDn zG_yD+DerbLB)bbX11?dm2_4&ikBfMDdw%_a;aAB^Ba$bYVN$OjEIU-3EzUQsq8+29 zwwgXxUOmUbYNeUncFxB{5jK!mY$!n$ZsFI`$6+)P_EOK(qHmL(3u>*Cuib3s>_L-d zY+iQK-;Y^3dyV}fzRVnw3mCvkeK>=66#x2zZtu$$7Ls5tv(Cib``^ULguee^0eHKr z^3(Lhr~&5|=UXaxUXBb8?Tw!rk1B8kKR*2Qz>`4abr^?@qq_h4E1RlrxQVa-`_wimtqn0J zv!9|)m94E!i{Z!H;dAh>x8S9?HfVK=@x>N_4!t%+F%QN7Df4s&cMApU0QA<|E^u{HeS_BRX3$MDm{U+l*f zk&!$a$KbifDLeJDlk_Crc!u%@>j-sm0{!M07#WAOpoGi@_&^$j(CJI-{TER$ z)O2*l<=m)x;N7Gp6u^&2Yz|85)5XN#F&qF1)}|?#7^-w}Qm=J21lyc7d$kkqtA zJxkcAfI%M9O?6E=!f?BtWaVfYRK8oy%QBG8@rhhr%3WVAH>di5$W!>;H()*f-PlLbR-Lgq_9g@RvXz-63_im1_Nop)-GFEl^0E&7Ay> ztZ`xU4vmB*Uv)pY)E%;DYo#v9oNNewok2gs>$)qhku{S1w8+DKybjRimoOn2TL(po z+}~95r9caUtJe#{UQ>ttBp|*&VRw5?;2Tu!i}z5Z(Nijmitv3?P;ajr@++!ef*caR zoE;#*8?Pz_*S?3%hkf+JB~@CS6C#Nbtcr5SlM$k>#{$Qj0F6BFTXtp3%mA#YBA{!c zoD41OEVA$DguI@s=jDzpPdAaxPw~-K=fPau9XE#9VU0yyPd8I0h+_10U>@UV$Yr5c zXX9H|&LgPR_<4nejpF|XkGT-v)rT3Um3cYKbC7xFjrA2E^H^)ObP3{bl?VOxV#3tV zJO}jbZ~qDC9ZsRO+q;2e6H2#`VkI;+euc%x{?;rbBU#_P2nVazPZdkO zaDmUQVq}8J>MES#?mx=Tf>^CjVnsOPMgy_Q$m|?Ip{{ASs%| z`RnKj#i_I*+Hhe=@vo?w%g!pa5w*P(!aaG*W5-96O^iJsg)*=Y|A{ofjpeG zZzxo&!cQ|8pyc=+oVKeO_)&?(WT39=c6w-Et_Wlzd7t2*O?B5(k9u0L(A9$F>NL7w^HYg!GpC5zn6aGcd>#u*AKg!Q3Hh}1pd@TBre1DZ z2N$UELh6QQKpYtwd4lQGMbc9_=L}xF7z{-w-Q!lQsY`8g6Zy#qNLS}jZBD(EX9*AV zaY4cBZb7Rp#w^%zhGzZ8y=LG$Fb6a`y_Z)`8|G4 zDGdlPa0ovbfhq=iT;w4ONKxOx&6ho&mhuSGG&PwYG#@he;X!PKn*TLoTt-EGZr@#P z@ZJ!r1>Vl^cTGmez{pW=bcQH)wr*tnwOqEtNO#nZ%azmhYCt`awt_J}J4h zb!Q_FFWC{_jauo7+N`{4<;nZ*~g zKTYotyB#};fn+V?5XP)ENbNDhO=J-YK4qy)rwX5~eD4k@O8v~G6X;5zjWjDfwzfv% zc5qA{q`6teXpq14!;MUgDq5p6o8^jp79ZL&btxNXu=W+L+E!G?!pGyegjK&XMuIuH znH|s@vwi3Ab_f3Y^wngHNA`~*&ERjQfUB)23t3^sAz~JxDBhn}`Yn91L64^cT2iXR zH0+^^6kZXYmj!$S@4}kzMlJDP3OH~jEFX(JeaYB4WFbA2_H?TtEhK=!6GhA^yS8jJ zPC%x*Zv(Bek1B$r-B%0EwIy13NZMIz5NliSjG5JQAPMK~jzAjSbkrI{JDG3CS7}fJ zWql@L(w3D?iWBc(vnizC{L4~jDzSh#^TW9#vY^x_m2IBV+tns9bFuBZ(c-(DZ*(Hb zi+0f}H+wY8iU?(UfU*a%p90oq!Z+)dPYbH64%gAgCgR1cqfGtBCl;7fvVWIlFp~1csk6e*c!^0_QG7wgHt_-tKBxa~Kfu&Q)5gR-`(gbQ z9`7}3H4n~g!4NVzW~4cvTlJjhTeUb>DNQ@zIlSW7MUu%e1cEG@{X)Ns zAMkLoW8&Dd%x5w`=@aH$!7MybjNV4M^G5odRKs$*-rUtmU(;cC1iDdow{6q?oG`M^ zizHIE+iRsO@YXgzO7S21e0{W)8kx*_ zJW1y8D6bvU(Ton6)54P?aj*LX)vfVVONjZ3hNJKCEcynGu^1-GtNVo!Au}@|a8dJo zkg)f4aTG@XRCW0aRUAoGt(;0mml*~EIH-<7WNXo3>#VfLh=*&pe2Y*JC(Vk_8u~HB zW(R{G+9Q_TzlZjD4BSfMbyPx3^#LrZR7RB;r@;Km_dQ&DAO8MTTfu(mM%dlItetStK!MYaKW1 z(Xq%LYG#!&9`O)kPQ=tHigw_Bbu~e>k)T+OBaj0jw<^b{lF_erSi9+6byXgRJdD10 zBB1qd$CM^k8{YeNv&e?T!V?=Y5uZSQeMkM#`14(R_=`;B<7k@i+Z(=a4T)7yw?FED zWwC1U5ovt<-*&;xcRnRe3f08sv}G367e!_c>WO)M2Rc+g`-Q~GrGRzq!Cmv_6(1t9 zOO*PACS5Yk)vqGy%|8`30$z~=fn+c0VgH~=^)5t0raABrkjb;1EIqG}L&I-iv2*qG zze=XAE|;}>)H%!8zWNe8PULFy1$%4DilTu3WG{7&hS89d=-RyL2AnUpR?Rxp3C~KN zVw`5Pa{Crj9P7gd5OGl64KPGy#xz$pZfK($ zXuHe)ki~ZF<1z%lgKU@ZD3T^e`eS0|+;$Wnb*6|2jvP)xgNAFtP~?%v@i+0ZAt#O} zWLVm9^|gkP3``WGOWcDpTf$q*TPce@az+wySfT1@H!L$h>G-qLmEPj0 z1prE6J7b|55jQrsmk0bh@8t}8iNuOEkPKLP8d<6e!N~n`C*ZR@9j)LY*Je0vFxu)F zfxT1grBHuU6N%0cDssQLx=8A?1(wDu>=!^BRrv8#TctQDkTnvks9aMe&;se)4v7m_NMyS^mcFySSnzmDbySFb zbk)}k`t>cYiu9@Knt?K**=2jGab1CV2L;jUm#*FPi>LYe^%XZZ2UEE`pvjdS+OeTEqR7XylV#A9flnvy>_RW&{1QfK|-K1(qV#R{Bozw zCoTTpLt-Mnj{M3f8~8u&#}@6DceM7>YTZEhTm&PN{(j@w()$o#5+j-BQ9qb?RZMJdiOD~M?LGcVpaGm?+%-h8^3R1uf+HWy|^YkdZiosRuQ z)7~i;*n|Bw?m#HN@h95Ma65^)e`Fh?Gnd77L=|_xzhI3kFD{TC-yw6%rM2ivD*ppX zJDfu4&^9);Ht2tFZdvho-(U6wbIzr2q*g4D(2aOI{H_E4ZXK_#Z6b?=$;MmSxA^T-4FWQkNQ zP)m4tWxHO&NJjsgSWH*@*K@$s8bBX#FM^8~N+~V}{)dA z=;NP9_8V;sWIzeU3}JtRYVEQ5o6!Hao^9_Y6c_c4Dq6wU0M{wlvJ%ciITWxk>hZ=` z8iO8P8v)^>k4MJEh1nVU=H5dMz z8>XjDIrjdRf!oCkD356dQ?GXW`}Hh$m;UBCe2!wj#SVg-gc3&m%H7@RJOi) zp^uoFV!0QfA@rjGC|kV$0{0F=YQd_>J_*}8rnryy=FJ|a=K!cbeL@x1w zVPBfH8h2}oZNU-y?Pu@?_?uq+m8aB;af@pDl-iSzV$RAFOE1yMe9zff?@wa7eykJ` zsHsM2SWH!csM#5Pi$>BZz)|Nk5LK>(#wA!T%Zc&S$w@IC59Mi9w}3G7ml9pN?>4Hm zUzmfu*^4Y`hUCB7Nikg!>IZouI-?9M?|yYaR3G`2#vH3FG9?w!{tN130F|*KI|)rr z+o0g2m36F)RLNI`wk19?Bav{vfQjg1x$ME`i!>K@ba?7V(2<=FaX4u!GN7 zdZ8U(YL)K04xPe2U>-z*bKa4gN zEf8iliUG?^U!%6B#SfXOzTqPjmR8pO8ky+|>kTO5$&p!}D0H%S$)xq{jI=~(8PI=> z@69?@fJ^p+cGPqUjuZw5VZqwPrbC}s%4)R>Dj&>Ew?L&3p%n59rk%DESMCqzr!*f6 zzYJwyqWL#FY8~a(RmaH+jNfkJD9+9=Q}YVorK1?qi+cJ`V3<-CZkus^PD0$0BWS%4 zy1wD2NjU~ow<@lKcMjLSVt(nx)$v*%Njs}1%rXw7mHy}o-H~7JW)%ou%VHOevoA*; zE`Q5=nUTiZjvEO5&U7k`i93zhYv`tJN_UxGup-p+%MQWMNEp~gb}08?Mz<r`Kq3dRV0J%}2HMU5LLb*qL0R>i=y=l6mJ z3Rl{3wP-3{8HzViu-cly~Kjqb#qmm8T^(;Q@wuAj$molZRBiRA4)d~_*Tx zL50{eb8^D}x*AlL4*FJWt3FSy&6pmucdWO;M6S>GU;5S=^|eDu29!@z7BqaPJLo%XAbnkN|Cjx@;b9c077}_ z@xAXqPjv4$g(+NlB38q|*Q-3Q05mxI(DU%0ICa7%vfoNu_Y%gZErvD`$U@7l&kI@I zbD+{gt)`q1ou*S_c4S1Waq+W(Yy^iOiL)VK@yYvY%D1OShCE@P=g23Isc}32tgCzv z>0GrfD(vI<@oP5^E$5}i&aHLX1LI|{m}xO&J;veW%2?X-+(7Jz#S-msak^9qE9e(e z+tcXbp6~2vLaJ)Y?d2z%Ce={owWS7V`UQ<$1w8i6K6nWLyJZCc3i8QYU%aC&}+m@#u<6n^4{B*B7Z!_iFE#g1+ z)<{~6r(d^r>o6~!QYahqd91SW@MWvZ8SJ0@qS&}QP9O+$KY7vMQ5dgmzD_SIC=mMl zD1oeEU@7IUa-mp>l8k3G@=D**`+=>f5Tcs56>Zx@))zv4+jw{kQ7iB`Z_MTaVQsj@My-^ocUME>B%kLlL9ahrZkWq8cNB_t&0G;$MWO*gU3Df)e> z1#WXw)Kl>!aH_+odFAGSBs!`Hrheg$`qai%9DmD1O7lW*c{X9yB4yeeEcLVcQ&TN5 zv5%fD=T$C0Wys@wZhL^h+nIw%PYYhJsn3&RR3~|v#~356u^^|B7m8p>p4`2Q{wxXk z;gm4ecjnTC@%c0Ui@ZF%r738z<04Ni7T#dkz_xaW$ zJ8>UFs}8Piuf_q9_7$0P=^@oq4#}i4=Jf{v*zH12WMJFzjag#cy6*xAzgMyI_kZrG zKIq>HY4fqD)lO%cci%m40$Mye4pt^C@z78uR!1A ztZxDYp3VX~)zMFv&4Y3P{c%@D`-ObPjhk;PX$v7#F}%fEObw$x`Xyq9O2NBQq)uT! zoKu8zmro>m^@1w_~TR(v@`VF%gI1p@hm0gREdsHZ>p6c=WGW6w*S zXYKM_I&7|;`mKKO$dUtT(acHp- z(n3vxxCbx=eWoIeRSn{>gi1&QU;eD5=tVb@u~oPPW->Qt^s$_#Heo}b^KdOsj(ScT z!?}i!1{rsvero=Oily#OftSX8lCqZs-pUV#htdwVvscdJzCV#kmtP;navlSu@z8Kg!b)Y-V$8 z+NPOn#83)ymE6atP$du#$zjT0d-DX|Vj5mPt``-eh9mk+^{M+K@;Rc1q3Ri@d_q`0 zUp0>!S@vj^kSx`*($X=e5qUQ1L4Z}r$&{{GFcO;_8*f$4kWOd7)^&a3PPq~)5wU-eGnpP|q*0a=+HfZvQ zJbwi%1v0cMp;JcwmRGOsDWo_1Nu@MSzLBr+?lF6=D9=DP#1l@UYfO{x5E;M+6-}G@ zW=_UNP)!IYd+nMv(hYnie@q7q>lpEM+9Qh7*fg@u{hpoCQt&C$_^^F!y<-mTSntfk5ruJ@xfA4KPabcn2 zo%qKBWNR~dWxWMSqv#>)@1I*FrMi6AqgJ$orHQb0wUj4vxvxWA@fLpEwKsYM*pY@R z-C+tIeKFG-+{ZU}1txc-Gtw)`P~_3P`MpwhjGSh)hV|TQ%j(XG%ETqp>RE{` zlzG?_2N#gHVEp}!fL5bs%(0T$^;GMs*Dcr=4Qq|tTw>#=2%?*AJdYo~glg8v`0QZ6 zRUQ97SU|Vudb>+4k8@=`F_O+ks`yL%~nHZVHXAQxlCz(7b~pMT!YaJtSdp8mz`@M`!d zGOc<_?9kTB&dvu>HTH3lzUe}>`SFKu&vm4{wQYXmlAl}T3Y{*YgMyz0sz+tOOB&^$ zzWs7|vQ`~)#vAkNN*98^b_U!_=2mBGAgUXshY&EMQOIW!UM9NcIw`*p)!Da z{)87gehxg`Z2R0o0P-3fwbr@mgeh(yI~*J;p1ul$3{DqAfdCfZ)Jx1*A|OY?*$HM@ z?ek2BBNFDhWO)XY8ICF!f_ZXX1CPJrvRavmwDA=WU#H6k%wpq}FM{uTYIPf3=S4g? zB_X9Wkealy5$OAOAlhe&gi6s+Y84n(G&bCAJrTQRcr*H4Jqr&IeEdUi&73KhAFkS{9RS-R?ike`J~IMYr})6{1L>J>IKp-$xD0P(DcI z<(TQ5N=|ayG4plR&7|mLmqV28mea*(S5KkiO;lZ@l}5=SND2AmG%A5>eEhybk{B2? zrFghbA)Msskaxoz>ZiU`jl>Mc(mc1$-9>fwBVVFu=?z=YBz)kJX=5&eGF&HjZZtul zCV{QF9e~r9WqTQjzReMJ^(AbvZO_v?TIO=9-3EtnCkuUQQR3cbG!t?8`!+p&*P9_+ znx=y?&hX^RVKFoS;Tt?ss^}2Z(BIe%cUMU^$#0K3mXqS3Tjz~yUru((g_+5fO`ImQ z?ZJQmZZJRA%4lN92~S5u&1Hve;U@57WK{QFvgpraB%_752Mh=JJOre5Tc8(gg$X8kKvM`ZOG^Xjyq>!rU&`t-2*z z(BfN@zZ4~AMr%#OrS^9@cLCn^-oAj zoG8Dykm?lv{yL2v#$adHa{or(e9U9s&>3NkI)3CEr7O|n@?Y-@fI)|hET zM#aAib-B9At4?UDI?O5fpg`*e>d0%Jc!|bDoYqpRbyYal0^!VM8V9K_NIcDF95a`( z#)wQ$Nc;|OyeZ2*`d}@Y`;N8+(rwLl=$>)@5wYb^K5CUu>_g^KxO9wAB!d$|T+I~L zFy{LKUm)A2edT^)C0Z)5zKBYu&n3plB)(j?-%-r#C{}{z9Gw(1#5Azsl(~A{n4>TW zp*nKSUR}D{)X4RhK>Qjho^DN+Tn2aFjhVA+w?2_Nw9=#yodf|dfoVJM*t{uFU+)gq z#n!!inM-}CT6BFDqTtutJ~^Lzv_F?=OK(eM)2bWcRcGWMA*M|;kDL)^J4oX7PDyYMOPy|pk9YJwsdmhl8eVz+uCHiUTb@~hVMLN`A}rvYjBkDS zK`E!c#+SwB`9|1-sur}qQ&BtM%quG^AM=#61|c?0)uf5{Yod)|fy~Z1iWy)Apj9^{ zj5&rBkN*&~wDi~vsWINa6cNtY$wUF(PqR&-Zrd!Sr}$TY$eD5Ri6*EaCT3i{G-&M) zE8(KD`0)N~HR#ZKjI-#lVc*MtslR`jhq~u`o|Oe#Io`^NgT{hXpQy2rx+7^ z<6@8*y1FkOxm%93yKu+XVMM;Gdn}C?tqXZ1pPr`==vZpJ8`9u9+S%#LqI}_NlYJxC z5=dpGrRpZcaO$v*Epv#y(KDky4NR1ZDlXiQd3iJF8q?mbk#1RH%QI`Op=v3Q7}Yn_ z$yQz%sN4{{BZS^U=IdBcSWWtn%fcn~rcouQ5mlt>XNZ%3ex2rT{5n(o8^v!051sE_ zxYYO1lfTFeJK`rQJm$KU4S4TQfiX#AZ!eShYbU??h)^lKHJST3Fv6`afaX$fL8vx5 z-1*~iWE!eylUrJoQdCx+IPg1DbA!-|ME}Q;nN6{|iVJ={e;7GS*~+`ivke36m_DB0 z-z^wfEV)2sbcO2Qg#-ghEj#jyM~CTnA_v-CR8pBstc)A6EgfHL(cz)1Uo??~)`|ny z1iZY08kWqFFPemniOJ0Y_JD#f`w518T|lzYmbO$=i;xqY5w8J4sKTz%iZF)4H7n0j96xP)KbCvgnN z%4=2t>{ekI1Zek{m>Z=SBxyn2&7 z@|2IvN!M3>xG@HxHN=6R;PXH=#m|{L{YD0!QhL(6-3Ty-F}Y5ot*iS?tF$+(o~f%G zj(5NAMp(J;Kf4zGq)I#VxQX_HitmI!Val%$*w$Iqcp}v`GxyWHz*ZwkTNKLj zuP|2s5~AQeC}?_6X5{WLRH&D7^|-q7q%)am?~-&swL~?$3WI88>Lvg7C~?cgOW8k8 zKJ_Ow`M8Tuu|{Ye0&ax$gLeR-S&%T5yZghrJ7^&T``k#lJca8!>(E|dv;<>lMjghmiwb~57FxtCu0+%pGx?6Z?fIzG3 zspi8i$(#|4wzl_ci+75uv3qSrb%3_;+EhN#)%2%cnn3MyuF@1hd1nhc--B=jJL0>M z-CCX>Xqio>;Uhnz@fa6wV)|zH{f^%sqIMxzd)S#ey9)83XBj>C%GXxayxUY^g4E7U zDgo276V}OgdeDk9N;d4&S`v{7#>s)lCl~eaL0|{+vxru<0?vcJQn?&yMhGC4#K=Z_ znBEZx9<(@E*{skZCCz$J-Wfv0vDb-S~#tQ(NdqbEa{QQLL2Ketm(jrxi}g zGh&DLFsmIa88h_$J^NNiQZP#+B^S!1|U(*7I^Q!kiVS_|PiYd|Y z4o|@8PPwSMR0P=*<2dF6;&+doV7p-K$5F`))gQ3iHW!Bb9FQa0aVHj2Z(ZrG3_97L zMxN$lhY2cBt^KrWEXWV(z5dp?2q>LOXnVslwZWwxHN@?Hwvs=EbE?Sa@S_Y)GLdZ` z{r&dfAz0}cD}m6WRmCs?jX3I7#$y8pWHTo;z0GrH$z*Nj;;H&UTQq(s(kUxYn18$g zRj?qw9yGN&DQpnxeD`XBg4x{Vv>bGRU-%Ie45m%lqckxH-HAAC?^o%Dib9Ol; z-n!seQ^zrwNJ<1WOTs25T?wBJN446YUf3Y3e?IbGgtHKUp$Kx|DgC5?S)~+=8scR- zdP&7C<|a-xO2gU+b!Tk9L}MasR~yUx;w1VV0a+d|>&T#w3UgtcT&^6^?(`Y(NBYz9 zSWj3_h`c)T!Fu8?i%G2@q5(@SNckmD^#wEhGi?6cc>^UaG230fDQNjh#yDwg&^UKK zd#4H5Dcvej9D=_SqU1T04`f=SNXbAT#@kYKQxbV%oBP`GYL~&#uD% zLXQ74%*=}c^R?*XX!*+?y3jjxNm3kWeg;!N0L8w)7KH+`nE7qY!w_JzBKv%$pnrfV zC3i~sdiuf5V9*iWmgy6Ak|80m1xgnHs${|bDG#&48dgjArN>&$6_5zdJ1mm%YC`{^G25^!Nx8>K(||zuLRe!a}qD|2kQM{ zCVyox4nrXPHR8f=z1^sFOFt*yyK<}9Ny`=3-pvA0-^VXK^Q=~8AO$55i0&e{=r1U2 z)aiF`KL`on3e&nME*J^u{k1qN#N$UaU;V|>!;aNF-+ab( zsq(f#V{6wm&HLgYftnmeM!Wf}wPAfkT<5w!T8j(PdOhZ3Ih$@(a4aH_lLIAz_`dtYv|pOnY?fvYXyDn*bhm9@*TU0D&&=lr(_a?;23 zwByG(Xk*dSm5SzRlcmcKI^l&%O)6~HMMuZcW`_|>y~G3#R|cD$jP>2#vbK}O1nLDA z=lNv@P{2Ez=YfW1`q_#&X1u@b?y3wZ1;t3=0_@{z*XZy;!}+ns7JP_Qs9-;c8DS zt>$D0ZBB;BWl{D?*>)P~n>i!5%ZzFblc&X|@{Tvv{%;Nt$)J5-2|aS9;jufoj>)Jkjk>Gwf4dgSI(58q+d;y9xuWr?p3T>}ZV}(` z9k0v1!PP&TNdx0}Wj4?6>Z2ThM~dK;Im@D#5_ZdBX+RWve0#wlIAvWaDr$Ks*|beC zYV{kHy#ts)z+E1Rl8Xw};`datpzcw0>&6wYh-n!e@^Q0}%17p*j&YCuBM#;(TVQ(2 zW*k!j;UO8+rb2jFBSEi-?9WZI;tcWI3$16OJS|n{7;Nn4*&w&U9uWk8n9Tj+nz^zD z%jAH0iB8ht7z-``ZnKY zW55|A2dTde5k^WN&q!yOmR!>F$wffASGCMyAW*lT0QbO+dOb@ z`Rm>k>y~E}+`_nyQT`{WS}lGQDsE05F#v>>g)?R5u-n}(8CFxvFb zrB!T`6#Ph(g|ksz-CK=gF~}B(1afzi9r`8W>F9LR=RhHgX8B>HQN!VFnZhTemmT;rZ&F)78eye#cXvU9%;+QJMPN#1NWe<+l?1x1!~4`H&D<3crF ziub3=f*cl0l#*dVBPo=I^bji+tI9?T+?U-fGG|+uYC4Y86h(y+Qba=c*tvi+Fu|e3 zsw+KD)%%VVouzNoRJ|VG>52@Kg(?_i$zCP3zFP?(yhj^m4Y8&g9w^(u65BzDUj~bP6 zxC~Pi^$;NGkiYzg9q^qC3H_A&kY)@KIXAG5ab#e$NR5`jBduVkBNaifp|bIIBlBBj z?gBR|X8lWXN$P-paav#&!oV_Z4`+(7TXlXxLo_A=C6n~!{@%3QT*SWe9s6LCvp6Gq zVieX91JQaQRG|LxG_%JfHua~ge~&m6;N-)o&EfUXQ!AM;0;?W@iSbGCHUxHyPVc)t z$N0X?WkKHFQg*r|uQah_RX~*9uf?{~(!Kw9QNraGfE(*vA`|%2{ie4&AgF#r+4Suz z&M*PNr$s%Vrz^*wc@J$3TNXbgS={c4Wmn^`l4o@p&o9?PMTERAEhkGHPn##e9`r}8 z9~LLh3VoewYl`-i=SsH!AwV>$GHiy?v(uBPHe?v4)1AnJKKq&m$uS&_lJZ@v5GFQumo z9+>D;K6!8YyFDfGdaZCHC>exK?@8ORH=GeP&hZOJ$rrlN4GVa3KDdBkoml3dt>{CHUo^OAD zy0~2E<#7V%x@qa!B{I}h$8yJ#9NZ7$-D=}T-JFuN=-qofrOw0`(jT3ZTDYhKF_CI6 znDb2Y_?>(jn=D>)+TQ0c>dY8pEab6ZJUNpA97cTWo3i3RE$(%y#<{xS1Vohtic8b5 zXtK{&4#5+957S1wNe=_rowyPR60A#+9I?EJ35=5hXO;0^g2|#`f8+FW;DQdn7vEPpauCK{g-idU#x^?$MK?7jNuQYLOt$m&V9wR`*;4M@ z%j!uCWQOJjUO{$OC4w~Pgv#eO!x4aAp;bDP6`eRDix+fDt!g}MT6Pj+|k_>ub8ZjSTXM)NicoXqn z$z|)>S8i{(;89`f6}J_WNTPD*Z8vi=-E`bG>B!I<{#-d15c}Y!l9-^8LQHMViTKsH z;NEcm*^60f5W@~A89R{g_I+oH(aTij+*N$Gllykou5KU6|7x)z38l+u_k9*Zf6HIg z=KYYf>}80`o~QtU*S;*Y*68KN3l^ zS7=`LSVDkj0mr^bGIU1BuyPon1hSbk2|05zIFcrDLw#+FG2n%G4bLPSY`^-^Lk=ND zXg=v zcWn=8Po;js_3t{OwIk;M7UO!w4XRNQYH(AK{w5o^@B4qzK*$tX zl){6X_sEWDZ?MSPXcUW_WIVZ<#Vu+OO+BA=!annYYP%Bo>-+!bz!cbBCD{ajGTjfgs>wm3W zef%tGm~O3+ zKlwY<&?H9djl@5OCdKg>kXKgvVW~kmlj^PPUir9XHU#^vUR$oCR&cd$($XH6vj=rV zobi?!Qf5n)xE$Yl_i(vc?7-bE?E02yr5{2{g`kY+-M(8dzHph&ITTLU0c`N@%})vk zFjmBNq2^G#y);*Ygw$v-bqORc)mG|09Z~t4dz{~!mI*aM$W#Hx?aR@FLParjNyX`W z$BRqCsRrNg94ZCyx*5yZGx!3Fm(}7Mb14C!T}HA?rj(vfzO^OMA7TBMOUFAf4n zSRCdWs`3+Imp_QMImN&GhRi=?=gBE`6S<0luCR45%4*E{Fk$e4F`gM)$UX38(pzU9 z#ok}_1%I9?Z`QsjJV6>ZM6;EH|3jN8+b18+o5ahz(wJ;>ABeZK3(iTnXe6{KWkxYE%w*}rRHq*JyX6GI(? z6GOhnHA_0UAzpwtp*!5|>bs8>ZI*k>-_|UO;-(3eZQ!CL##`f9ef!9yC07^>RjUpMN6Os`-hH0Z>CZT# zxIa?m>(NBja~Vk$!0DMBD1D{zlz#bt>Yd9(skJr55mA92&g#-o;U9b_nH)iWuSUEa zTK?qN6uMMCflr)EGl`9vSTjC>X~7nh@xKL0#9c5CVoAumr;h?^@S!f}=U5j0CGgc$ zx5-#dV&8$GIFOCYPB99v-2)~DU1krqo+fv$6 zv`B$s#ogVDySux)JCx$??(R^eIH9<^Yw)1KT{7ukX3jb9Iq#aaW`E!V2}w4|-udn4 zx`i=}HEjh)yzIqJG2c46ku~@L2=)2~)eXU&;`#SclH6y1EAFTT)I~ca zoQtUo(%)t>d>}phkj1j10H&Lr+u1dJNfz0Yjj8)WEDF^2{#v5)C1ES9(TeQ{RF}rk zkF5#MR7Xt->HW#*?LZkz&v`YtBI8!|!eViw6qi7TWF0Um?`5Ad<>n!8$KoG98u9q- zXX`-)sV-rY`>J=ca#hm(ZtXj5;$!_wNAc82nFXBx!Y)QrV^MSj^IJsQ$3cqnbeHJ$ z*U6?x=zZG?fsEJM@b!^h!f8Ek_d;QAOWBwHFsw1+^744eJP1k6=1K@c2Vr$gNH><7 zU%`<$I_)(9OGuVP5n()l@UuD5C)AGqLh@oH8B9I%g~!8{a}w88uM)%K)c|N4=iRx1 zs0seL0A!sp*}P3T{k5A(OZdlHSS^*ze(I?F#{RE}*Nq4}{TK}C`8q_zFdcmZkZ$RfO#s8;h=rLhTVuUA=E z7G)gH*mF9f0cFKW>1_%RyrWe+)oT(f1WvneI8)?lFwl?d|8ld=vk_`WG^GntRewn^G+Py_O?79=(y ztv)@o-c|avdzRcb!NtQ0$$M|I02&;6D85kLVwj-$LO? z-3?q9KIh_E=dCC9Uhte$P<5)=rw z_eB&<$WD9%SBI4|J%*({#cb-S>!jg?ghipulYmjUh}0X-Ey@aHjDONV@021iCt~hJ z#|+dvTi{P;ds>WpvPlsTFM6jWYjT4+_5BXks=(tyeYDAquk}F@HcsXcM=qP(6;-i{ zcvZc|vfRR2@uiNpf_=B?)UUdOkk^KUn71~4dNeY?-kc&bkCT6Zc17`8+aGMMQbOlik(&w0Hd4t=e&Ro(PRHo>kcm$CTZ z*ed_+tZp2R*pLZp)a@N^>k8BHx?bURbSI;%E3YeChvA=5W9@Kh^~9=Id*IzTfN0{Eko~1=+uGPd^G0J!b4%cdG^qcT~^znX<+CtaR-sUeB7{5YRehFxl0$SiG&U9$xLb3cnB> z1HuE)Fsv2<3WYyqel5`)i9k=(il4E^JoomvIt52Vi)ElW?i2c`d*nf(A^e$jfS=MJ z4D6jQqeCYq=23;jemF2Rtt)ss}S*h|Ti`>u&SLM&_pIZFBQ`;!d@1Zv;)_qgE#CJ}5kBn>DW0$?l zZ`^*AKLJRYWu4L8oCX_MRY1F}7{##Ty|YkC z8z}$MpF!&w5lq^1am=F6gX=_hUzEgf)=)n`Hp4~I^5X(u3i?kdZClKKk=38=V^8f| zU%VK6bt%7iK8Y+z@Xn7Y?XX;^H`64O&9nyF7+6DRYSdP|?CVzp?{^n061#BCN^2|% zbP`tI&6!`xs03ti%Ey1-L8oE|P5Lc|(wG}+#y64blOlym5S!Kct+>pR+(d=SWZ45K zsg}n3>vuJ~-qKClJK*RJl(rzZVDKAjfdA4rinXQCC`rXumpOUVAv>>B+#v_WPUEgI zZk-i+e39Y?a`+zFj$v~47iu&BBq1JYJ`cQmuZiJ$l2y}IpYiU#Z2R}5M{&AF;BSQ> zw2v1aA8Tke09=0x1(|VFwpN!Xkw?U9xZIay<|`(+bKY~mB$O3rzA@ZNcxs)HI=ndH z-(zzI7TK{BnVo1YDmpF7um=uYP;2HXb3#+CBLdd0JDk zie+DXkA8*rl0oresA&x)@M8~(CiIi!P5yF`A}l~0#pH|(bI(gHjtc8>Z72A6Sxk=Y z`z)!4M}DZgbztFEJ#7 z!3(WE**FEfc&A*u;L-0Ltq=f21gnvvroQQ4ed3JVGsOsagSdyTQU;E)`?XTh`lH~j z+&Zb`p-pzK+95wg@Y2CQ>{O1wdDg)~+|9x))lE;$mWG*rnCHOj^bJ|3KPc2_$ zuP4|SU&uc4SaylY4z2ma*a(2UtWqbV;)4`msGmF=y+d3VO7;{8c@x~rVm=r_*WB{p zevHQLt1fL5;b|7Fx!-fFkI^i!CB5$#_jEt4D95JB5X}@Ye725}0_*_(WM@Gsm3;?J zf&V+KAQW?GTDn{ArsW2m^Ro1E^^59iisEK1u`At8_a`9iyXN&j<4~E{G3iF%AHGiD}n-rdECxRu+8RwyaaDG|F$O}YDWdxfpXanqA;1Y zvSDg5S1u`kw3WX~c>_gst$$n?P(+8>>=`ku`x_VDfz?|DFUH|6I z-zEm1e@qO-+IYbgqbMvx@0!E^P(yYjmdRYohnIk=5Uoltn27%mD|0tD$i0@3@i3l| zI$~BPxf=K5WoCSwL)4Or93P^F)N+mY)d6@xze*Z$mE*&1`5=nMUCeTRT6`Om@tjAx z9z3oaZ?Ch=8hM@{CdPbXg7EXuWl-&is*k#Iv-cnutq8xeb9co@aZ6g>9#))EyzM3>=Bmp&^>1s z+K*>G2@1Jf*`CfEv#{wKxJX+4j0WoUJWqWiCAz#eqc+=tmaX;E{0>Cwcx$juJp*x>r-sKri2{Kly%knUay^Yxz_Cc zVS=7@*&I_tzsb~airF>NhCwN?)}=|)={_xlAhM)mqa$Wqy5+Qya$Km&r268r{d3J9 z9s=DKyIs~@ek2c&iA9VXQ%~ShC>M@xSeA!BJ;R=83+pRhpu45dYSc+gt5)Kyh8s`- z>hYf*eF)pL-yxMhMbvI?UZkL2p5TctdFs}^y8jMrATPX zS<)#b6~^MV%Fh(@JX$M<(PB^3&}4zKNxNMgA>hqvk!^MP0T|F#VA1+Knys{o)PmK! z)$lEDH?&iW$>ElNf+2}h?1%{WAG6NyJI3%gh<{2PSoC-TxNa4D?XlebI0y32hr;` z`x~%M0UqhV**$MTWP-A0x1fTy5_rxTVHO)rM;RDI>7^U!;>1A%xP7dG{51Ad)6?sv z=kD^U|L=G@XoFC&26?E|PUHc2z|WSB*Zm2>=>h@s^I0kvvFEppAOVaMFbh(<`Q|xVc&13DT&z73(amZ3!GwcQhv4 zPIg7iKf5X18qU~F*bPeP-MXj0{~PnZYBnyQn6&>Jg~e73F>=sOU4rls?}2^_#f+$1 zoV1+k-T*{sgeKq~n4}7qg_!K;)o=b&v&RW3`j+fIX=gN=0J)bh5iFEpmV5V7$T^9E z!YZ<7|KpXm-W7tBer7(y<$YOkDqeF?B>WB-Uh$AYir;9RUR-7IU;b;5h2&dM^55>P4@*QH5Gpu%_)t8dTOB^0x>K?`~g)?fM_rN)r8TXf_NK~34^p~!-jPxwcxYO#=BZ;D4;MMqdFSJB`+b*QDM8UGlR7joI*8WBiV4ia( zchVy{xJ&!%b{#W$f|QF(4#?d5-%}9Df9Vl>rC(Y0ZyJ*jx%R)plwig$ zqU4cN(0{+ZPRqaQk$&^P55ZTj{->b&Bm4P3hfA}p%cuMk!$rD;xKwH5MT7GHC*vA) zjr&T!U0A+vI;uAhx{#O)S7BN=6jkmO-Ly}dhpxK))@ zNTTCud#hVWd#ol8(Bclv%U_m7s|87|?QSwAXs zsl_X~1&^4sT=Ss27tu?8+@D~Uw!mvOzvWBVdfFC=8l&PRJ^v6DCi}s8i*0rm1An}1 zH=OMVtJz+mQtkAuWP1PBXlD4ApkNGfpKfxQh*)lgfE)u0Szq0t{JAIcy8)fl?tQ+}E+EBeXW%e? z6sfA-X&;YKDmxu($73yfnexBbwcy+=@@>X>74y$hImnl?SdwrjxIIMUS%!j=$;V%O z@=4ieQnTWwh;Cz3`30AUmD2h|A+rr|&QdpVKSt}fG|)%`4MOYf43#4TRgys2eAx!5 zt0<%d?)R)a!KD|OQva<9@D}_rs9dt`MQW`}QPrTK&E?mKl|r&sdhrZ*Vw3lX=BaQp z#mgq4f1AmP-66=2Wv3j9sjj$5?Z%4kVPXc?lsW>JWeKY5dg}`)R`u}GtJy%td4gY3 zxVXPtj*amAqL1)%DyQ$mz{Z4NGoCA|YQ!hxID}%1MO|-&BTP_o&`~PvQIVymcOQ>d zqQ=j?o}iwIfMvnX=V1JA@SD6G)*Gc7{)@8BD+MDNp_Jb_ z;Q%3yN7ZblTPm9(@Pglgl;h%Gqe%8gMg!?rw-%?C+>`fnN5Sc;bP-ujg+je}-7N=5 z+7ff76_ESVF0N9kCl5bwIoutVjZi3Z#+5r}<>VCiypnk!kqs_m{>IQB_dZFsO~DeVAAdOtu-St3tD!{W+Z64d!?@`%INKyZo|@cNcTP&SgSv0U$i!U4I3r?I^Pqo#p2*- zHulp08IQUt+6J+SFy^=Zmjpp!{)b$nz{;a5#*<)rt{1^VNan77G}7da#X&xho&j)P zJ#Go}7#c*^2k(Usb+|&VTF1?(*3e8A^B!hw>#pbyw9rnjKN_VugpRM_k#)=w|8J~@ zDIh8;;hj8ikGY3SLn7!am#=z|cxSC0I%|nMek1q>WGM3m+-RWhUdVnM9&XfaWhJ>h z`%VwpLq2~sUI-m~L7}AyATi>&sSlW?9=)im^X3y#50G8K5nyVZ-N&{7tyqZ` zR#Q^XyG2B-9-`;I-A_~!S1vS}q9ow~R3DfZEPwyj6FaNJB^T1r`O!y5qQ~|my3>sf z?Qyq>Ytqwb{3w0<`szmtF7fK(He}lSHid4}D>_fMw<`&n9oob(+m&W!$&vefb0Q0R zRk9=RWzgeSNq_Gw|gY*oYXfTR$13tu7c}m z6c`Cl_aFG1nEE+>YXg!}gBS9UIYJ^0SwB!nTHM%O=K7p0DZ4r14y;SKYL+|eD-R96 zKZ`;@w8uobog6%Tpa}}bli$$@kd$kA*B>;LNl6raMY&XCu28RA?c?{RV( te9L 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 F{{h4>I(Gm7 literal 0 HcmV?d00001 diff --git a/demo/static/style.css b/demo/static/style.css new file mode 100644 index 0000000..543a6b2 --- /dev/null +++ b/demo/static/style.css @@ -0,0 +1,278 @@ +:root { + --bg: #ffffff; + --surface: #ffffff; + --surface-2: #f8fafc; + --border: #e5e7eb; + --border-strong: #d1d5db; + --text: #111827; + --text-2: #4b5563; + --muted: #9ca3af; + --accent: #2563eb; + --accent-soft: #eff6ff; + --zk: #7c3aed; + --zk-soft: #f5f3ff; + --ok: #059669; + --ok-soft: #ecfdf5; + --warn: #d97706; + --warn-soft: #fffbeb; + --bad: #dc2626; + --bad-soft: #fef2f2; + --shadow: 0 1px 2px rgba(17, 24, 39, 0.05); + --radius: 12px; +} + +* { box-sizing: border-box; } + +html, body { + margin: 0; + padding: 0; + background: var(--bg); + color: var(--text); + font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", "PingFang SC", + "Hiragino Sans GB", "Microsoft YaHei", "Noto Sans CJK SC", sans-serif; + font-size: 14px; + line-height: 1.55; +} + +/* ---------- 顶栏 ---------- */ +.topbar { + display: flex; + align-items: center; + justify-content: space-between; + padding: 14px 24px; + border-bottom: 1px solid var(--border); + background: var(--bg); + position: sticky; + top: 0; + z-index: 10; +} +.brand { display: flex; align-items: baseline; gap: 10px; } +.logo { + width: 12px; height: 12px; border-radius: 4px; + background: linear-gradient(135deg, var(--accent), var(--zk)); + display: inline-block; transform: translateY(-1px); +} +.title { font-size: 18px; font-weight: 700; letter-spacing: 0.2px; } +.subtitle { color: var(--text-2); font-size: 13px; } +.topbar-note { color: var(--muted); font-size: 12.5px; } + +/* ---------- 布局 ---------- */ +.layout { + display: grid; + grid-template-columns: 320px 1fr; + gap: 16px; + padding: 16px 24px 40px; + max-width: 1560px; + margin: 0 auto; +} +.sidebar { display: flex; flex-direction: column; gap: 16px; } +.main { display: flex; flex-direction: column; gap: 16px; min-width: 0; } +.grid-2 { + display: grid; + grid-template-columns: 1.4fr 1fr; + gap: 16px; +} +@media (max-width: 1100px) { + .layout { grid-template-columns: 1fr; } + .grid-2 { grid-template-columns: 1fr; } +} + +/* ---------- 卡片 ---------- */ +.card { + background: var(--surface); + border: 1px solid var(--border); + border-radius: var(--radius); + padding: 16px 18px; + box-shadow: var(--shadow); +} +.card h2 { + margin: 0 0 12px; + font-size: 14.5px; + font-weight: 600; + color: var(--text); +} + +/* ---------- 数据集卡片 ---------- */ +.dataset-list { display: flex; flex-direction: column; gap: 10px; } +.ds-item { + border: 1px solid var(--border); + border-radius: 10px; + padding: 10px 12px; + cursor: pointer; + transition: border-color 0.15s, background 0.15s; + background: var(--bg); +} +.ds-item:hover { border-color: var(--border-strong); background: var(--surface-2); } +.ds-item.selected { border-color: var(--accent); background: var(--accent-soft); } +.ds-item .ds-head { display: flex; align-items: center; justify-content: space-between; gap: 8px; } +.ds-item .ds-name { font-weight: 600; } +.ds-item .ds-desc { color: var(--text-2); font-size: 12.5px; margin-top: 2px; } +.ds-item .ds-meta { color: var(--muted); font-size: 12px; margin-top: 4px; } +.badge { + display: inline-block; padding: 1px 8px; border-radius: 999px; + font-size: 11.5px; white-space: nowrap; +} +.badge.ready { background: var(--ok-soft); color: var(--ok); } +.badge.building { background: var(--warn-soft); color: var(--warn); } +.badge.idle { background: var(--surface-2); color: var(--text-2); } +.badge.error, .badge.missing { background: var(--bad-soft); color: var(--bad); } +.ds-build-btn { + margin-top: 8px; width: 100%; + border: 1px solid var(--accent); color: var(--accent); + background: var(--bg); border-radius: 8px; padding: 5px 10px; + font-size: 12.5px; cursor: pointer; +} +.ds-build-btn:hover { background: var(--accent-soft); } +.ds-build-btn:disabled { opacity: 0.5; cursor: default; } +.progress-text { margin-top: 6px; color: var(--warn); font-size: 12px; } + +/* ---------- 表单 ---------- */ +.field-label { + display: block; margin: 12px 0 6px; + font-size: 13px; color: var(--text-2); font-weight: 500; +} +.field-label .val { color: var(--accent); font-weight: 600; } +.row { display: flex; gap: 8px; } +input[type="number"] { + width: 100%; padding: 7px 10px; + border: 1px solid var(--border-strong); border-radius: 8px; + font-size: 14px; color: var(--text); background: var(--bg); +} +input[type="number"]:focus { outline: 2px solid var(--accent-soft); border-color: var(--accent); } +input[type="range"] { width: 100%; accent-color: var(--accent); cursor: pointer; } + +.switch-row { + display: flex; align-items: center; gap: 10px; + margin: 16px 0 4px; cursor: pointer; user-select: none; +} +.switch-row input { display: none; } +.switch { + width: 36px; height: 20px; border-radius: 999px; + background: var(--border-strong); position: relative; + transition: background 0.15s; flex-shrink: 0; +} +.switch::after { + content: ""; position: absolute; top: 2px; left: 2px; + width: 16px; height: 16px; border-radius: 50%; + background: #fff; box-shadow: 0 1px 2px rgba(0,0,0,0.2); + transition: left 0.15s; +} +.switch-row input:checked + .switch { background: var(--accent); } +.switch-row input:checked + .switch::after { left: 18px; } + +.btn { + border: none; border-radius: 8px; padding: 9px 14px; + font-size: 14px; font-weight: 600; cursor: pointer; + transition: filter 0.15s, background 0.15s; +} +.btn.primary { width: 100%; margin-top: 14px; background: var(--accent); color: #fff; } +.btn.primary:hover { filter: brightness(1.08); } +.btn.primary:disabled { background: var(--border-strong); cursor: default; } +.btn.ghost { + background: var(--bg); color: var(--text-2); + border: 1px solid var(--border-strong); padding: 7px 12px; +} +.btn.ghost:hover { background: var(--surface-2); } + +.kv { display: grid; grid-template-columns: auto 1fr; gap: 4px 12px; font-size: 13px; } +.kv .k { color: var(--muted); } +.kv .v { color: var(--text); font-weight: 500; text-align: right; } +.muted { color: var(--muted); } + +.note { color: var(--muted); font-size: 12px; margin: 8px 0 0; } +.explain { margin: 0; padding-left: 18px; color: var(--text-2); font-size: 12.5px; } +.explain li { margin: 4px 0; } +.explain b.zk { color: var(--zk); } + +/* ---------- 指标卡片(强制一行 6 块,紧凑不换行) ---------- */ +.metrics-row { + display: flex; + flex-wrap: nowrap; + gap: 8px; + overflow: hidden; +} +.metrics-row .metric { + flex: 1 1 0; + min-width: 0; + background: var(--surface); border: 1px solid var(--border); + border-radius: var(--radius); padding: 9px 10px; box-shadow: var(--shadow); +} +.metric .m-label { color: var(--text-2); font-size: 11px; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; } +.metric .m-value { font-size: 14px; font-weight: 700; margin-top: 2px; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; } +.metric .m-sub { color: var(--muted); font-size: 10px; margin-top: 2px; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; line-height: 1.35; } +.metric .m-sub, .metric .m-label { display: block; } +@media (max-width: 1500px) { + .metrics-row { gap: 6px; } + .metrics-row .metric { padding: 7px 8px; } + .metric .m-value { font-size: 12.5px; } + .metric .m-label { font-size: 10px; } + .metric .m-sub { font-size: 9px; } + .verified-pill { font-size: 9px; padding: 1px 6px; margin-left: 4px; } +} +@media (max-width: 1200px) { + .metrics-row .metric { padding: 6px 7px; } + .metric .m-value { font-size: 11.5px; } + .metric .m-label { font-size: 9.5px; } + .metric .m-sub { font-size: 8.5px; } +} +.metric.c-std .m-value { color: var(--accent); } +.metric.c-zk .m-value { color: var(--zk); } +.metric.c-ok .m-value { color: var(--ok); } +.metric.c-neutral .m-value { color: var(--text); } +.metric-placeholder { grid-column: 1 / -1; text-align: center; padding: 28px; } + +.verified-pill { + display: inline-block; margin-left: 8px; padding: 1px 8px; + border-radius: 999px; background: var(--ok-soft); color: var(--ok); + font-size: 11px; font-weight: 600; vertical-align: middle; +} + +/* ---------- 图表 ---------- */ +.canvas-wrap { width: 100%; height: 300px; position: relative; } +.canvas-wrap canvas { width: 100%; height: 100%; display: block; } +.legend { display: flex; flex-wrap: wrap; gap: 12px; margin-top: 10px; font-size: 12.5px; color: var(--text-2); } +.legend .lg { display: inline-flex; align-items: center; gap: 6px; } +.legend .sw { width: 10px; height: 10px; border-radius: 3px; display: inline-block; } + +/* ---------- 结果表 ---------- */ +.table-scroll { max-height: 420px; overflow: auto; border: 1px solid var(--border); border-radius: 10px; } +table { width: 100%; border-collapse: collapse; font-size: 13px; background: var(--bg); } +thead th { + position: sticky; top: 0; background: var(--surface-2); + color: var(--text-2); font-weight: 600; text-align: center; + padding: 8px 10px; border-bottom: 1px solid var(--border); + z-index: 1; +} +thead tr:first-child th { font-size: 13px; } +thead tr:nth-child(2) th { font-size: 12px; color: var(--muted); } +tbody td { + padding: 6px 10px; border-bottom: 1px solid var(--surface-2); + text-align: center; font-variant-numeric: tabular-nums; +} +tbody tr:hover { background: var(--surface-2); } +td.rank { color: var(--muted); width: 56px; } +.td-gt { background: rgba(5, 150, 105, 0.04); } +.col-std { color: var(--accent); } +.col-zk { color: var(--zk); } +.col-gt { color: var(--ok); } +.hit { display: inline-block; padding: 0 6px; border-radius: 999px; font-size: 11px; } +.hit.yes { background: var(--ok-soft); color: var(--ok); } +.hit.no { background: var(--surface-2); color: var(--muted); } +.dist { color: var(--muted); font-size: 12px; margin-left: 4px; } + +/* ---------- Toast ---------- */ +.toast { + position: fixed; bottom: 24px; left: 50%; transform: translateX(-50%) translateY(20px); + background: #111827; color: #fff; padding: 10px 18px; border-radius: 10px; + font-size: 13px; opacity: 0; pointer-events: none; + transition: opacity 0.2s, transform 0.2s; z-index: 100; max-width: 80vw; +} +.toast.show { opacity: 1; transform: translateX(-50%) translateY(0); } +.toast.error { background: var(--bad); } + +.spinner { + display: inline-block; width: 12px; height: 12px; + border: 2px solid var(--border-strong); border-top-color: var(--accent); + border-radius: 50%; animation: spin 0.8s linear infinite; vertical-align: -2px; +} +@keyframes spin { to { transform: rotate(360deg); } } diff --git a/ivf_pq/util/kmeans.py b/ivf_pq/util/kmeans.py index c2e667b..f3be6cf 100644 --- a/ivf_pq/util/kmeans.py +++ b/ivf_pq/util/kmeans.py @@ -3,6 +3,28 @@ import faiss from typing import Dict, Tuple, Optional +_GPU_USABLE: Optional[bool] = None + + +def _gpu_usable() -> bool: + """ + 检测当前 faiss 构建是否真的能在本机 GPU 上执行 kernel。 + 某些预编译 faiss-gpu 轮子不含新架构(如 sm_120)的 kernel, + StandardGpuResources 能创建但实际计算会崩溃, 因此这里真正跑一次小计算。 + """ + global _GPU_USABLE + if _GPU_USABLE is None: + try: + res = faiss.StandardGpuResources() + probe = np.zeros((4, 4), dtype=np.float32) + index = faiss.GpuIndexFlatL2(res, 4) + index.add(probe) + index.search(probe, 1) + _GPU_USABLE = True + except Exception: + _GPU_USABLE = False + return _GPU_USABLE + def kmeans_with_ids( X: np.ndarray, @@ -51,7 +73,8 @@ def faiss_kmeans_with_ids( # 训练 KMeans # 注意:faiss.extra_wrappers.Kmeans 读取的是 ClusteringParameters.seed, # 需要通过构造参数 seed 传入(而不是 kmeans.seed 这种动态属性赋值)。 - kmeans_kwargs = dict(d=D, k=k, niter=niter, verbose=True, gpu=1) + use_gpu = _gpu_usable() + kmeans_kwargs = dict(d=D, k=k, niter=niter, verbose=True, gpu=use_gpu) if random_state is not None: kmeans_kwargs["seed"] = int(random_state) kmeans = faiss.Kmeans(**kmeans_kwargs) @@ -61,7 +84,8 @@ def faiss_kmeans_with_ids( # kmeans.niter = niter # kmeans.verbose = True kmeans.train(X32) # 得到 centroids - faiss.gpu_sync_all_devices() + if use_gpu and hasattr(faiss, "gpu_sync_all_devices"): + faiss.gpu_sync_all_devices() centers = kmeans.centroids # (k, D), float32 # 用中心建一个Index,把每个样本分到最近的中心(1-NN 到中心) diff --git a/requirements.txt b/requirements.txt new file mode 100644 index 0000000..c7be994 --- /dev/null +++ b/requirements.txt @@ -0,0 +1,24 @@ +# Python dependencies for zk-IVF-PQ (tested with Python 3.11) +# +# The Rust extension itself is built with: +# maturin develop --release +# and requires a Rust nightly toolchain (see rust-toolchain.toml). + +maturin>=1.9,<2.0 + +numpy>=2.0 +tqdm +scipy +scikit-learn +matplotlib +duckdb + +# faiss: on machines where a GPU build matching your GPU architecture is +# available you can use faiss-gpu-cu12 instead; ivf_pq/util/kmeans.py +# auto-detects whether GPU kernels actually run and falls back to CPU. +faiss-cpu>=1.15 + +# Only needed for MS MARCO embedding generation (tests/msmacro_emb.py, +# vec_data_load/ms_macro.py): +# torch +# transformers