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
BI~M=|
literal 0
HcmV?d00001
diff --git a/LBPTOP.ipynb b/LBPTOP.ipynb
new file mode 100644
index 0000000..ef83897
--- /dev/null
+++ b/LBPTOP.ipynb
@@ -0,0 +1,246 @@
+{
+ "cells": [
+ {
+ "metadata": {
+ "ExecuteTime": {
+ "end_time": "2025-04-14T04:06:31.135934Z",
+ "start_time": "2025-04-14T04:06:30.845929Z"
+ }
+ },
+ "cell_type": "code",
+ "source": [
+ "import cv2\n",
+ "import numpy as np\n",
+ "from skimage.feature import local_binary_pattern\n"
+ ],
+ "id": "9157e102c51206bb",
+ "outputs": [],
+ "execution_count": 1
+ },
+ {
+ "metadata": {
+ "ExecuteTime": {
+ "end_time": "2025-04-14T04:06:31.144988Z",
+ "start_time": "2025-04-14T04:06:31.138940Z"
+ }
+ },
+ "cell_type": "code",
+ "source": [
+ "def extract_lbp_top(video_path, radius=2, n_points=8, method='uniform', block_size=10):\n",
+ " cap = cv2.VideoCapture(video_path)\n",
+ " frames = []\n",
+ "\n",
+ " # 读取所有帧\n",
+ " while True:\n",
+ " ret, frame = cap.read()\n",
+ " if not ret:\n",
+ " break\n",
+ " gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)\n",
+ " frames.append(gray)\n",
+ " cap.release()\n",
+ "\n",
+ " frames = np.array(frames)\n",
+ " T, H, W = frames.shape # 时间、空间维度\n",
+ "\n",
+ " # 使用滑动窗口计算 XT, YT 平面\n",
+ " hist_xy = np.zeros((n_points + 2,))\n",
+ " hist_xt = np.zeros((n_points + 2,))\n",
+ " hist_yt = np.zeros((n_points + 2,))\n",
+ "\n",
+ " # LBP on XY plane\n",
+ " for t in range(0, T, block_size):\n",
+ " if t >= T:\n",
+ " break\n",
+ " lbp = local_binary_pattern(frames[t], n_points, radius, method)\n",
+ " hist, _ = np.histogram(lbp.ravel(), bins=np.arange(0, n_points + 3), density=True)\n",
+ " hist_xy += hist\n",
+ "\n",
+ " # LBP on XT plane\n",
+ " for y in range(0, H, block_size):\n",
+ " if y >= H:\n",
+ " break\n",
+ " xt_plane = frames[:, y, :]\n",
+ " lbp = local_binary_pattern(xt_plane, n_points, radius, method)\n",
+ " hist, _ = np.histogram(lbp.ravel(), bins=np.arange(0, n_points + 3), density=True)\n",
+ " hist_xt += hist\n",
+ "\n",
+ " # LBP on YT plane\n",
+ " for x in range(0, W, block_size):\n",
+ " if x >= W:\n",
+ " break\n",
+ " yt_plane = frames[:, :, x]\n",
+ " lbp = local_binary_pattern(yt_plane, n_points, radius, method)\n",
+ " hist, _ = np.histogram(lbp.ravel(), bins=np.arange(0, n_points + 3), density=True)\n",
+ " hist_yt += hist\n",
+ "\n",
+ " # 拼接三个平面的直方图作为最终特征向量\n",
+ " feature_vector = np.concatenate([hist_xy, hist_xt, hist_yt])\n",
+ " feature_vector /= np.linalg.norm(feature_vector) # 归一化\n",
+ "\n",
+ " return feature_vector"
+ ],
+ "id": "d9d5bd6f6a9e114a",
+ "outputs": [],
+ "execution_count": 2
+ },
+ {
+ "metadata": {
+ "ExecuteTime": {
+ "end_time": "2025-04-14T04:06:31.297545Z",
+ "start_time": "2025-04-14T04:06:31.294247Z"
+ }
+ },
+ "cell_type": "code",
+ "source": [
+ "def getFeature(video_path = r\"D:\\DESKTOP\\2025\\44\\a1\\dataset\\org\\1.mp4\"):\n",
+ "\n",
+ " feature = extract_lbp_top(video_path)\n",
+ " # print(\"Video feature shape (for copyright):\", feature.shape)\n",
+ " return feature"
+ ],
+ "id": "404b8b3562026f1f",
+ "outputs": [],
+ "execution_count": 3
+ },
+ {
+ "metadata": {
+ "ExecuteTime": {
+ "end_time": "2025-04-14T04:06:32.509232Z",
+ "start_time": "2025-04-14T04:06:31.302931Z"
+ }
+ },
+ "cell_type": "code",
+ "source": [
+ "import sqlite3\n",
+ "import io\n",
+ "import os\n",
+ "import tqdm\n",
+ "\n",
+ "# 注册适配器与转换器:numpy数组 <-> BLOB\n",
+ "def adapt_array(arr):\n",
+ " out = io.BytesIO()\n",
+ " np.save(out, arr)\n",
+ " out.seek(0)\n",
+ " return sqlite3.Binary(out.read())\n",
+ "\n",
+ "def convert_array(text):\n",
+ " out = io.BytesIO(text)\n",
+ " out.seek(0)\n",
+ " return np.load(out)\n",
+ "\n",
+ "# 注册自定义类型处理\n",
+ "sqlite3.register_adapter(np.ndarray, adapt_array)\n",
+ "sqlite3.register_converter(\"array\", convert_array)\n",
+ "\n",
+ "# 创建数据库连接(带类型检测)\n",
+ "conn = sqlite3.connect(\"LBPTOP.db\", detect_types=sqlite3.PARSE_DECLTYPES)\n",
+ "cursor = conn.cursor()\n",
+ "\n",
+ "# 创建表\n",
+ "cursor.execute(\"\"\"\n",
+ "CREATE TABLE IF NOT EXISTS data (\n",
+ " id INTEGER PRIMARY KEY,\n",
+ " array BLOB,\n",
+ " group_path TEXT,\n",
+ " full_path TEXT\n",
+ ")\n",
+ "\"\"\")\n",
+ "\n",
+ "\n",
+ "def add_to_db(array_to_store,group_path,full_path):\n",
+ " cursor.execute(\"INSERT INTO data (array,group_path,full_path) VALUES (?,?,?)\", (array_to_store,group_path,full_path,))\n",
+ " conn.commit()\n",
+ "\n",
+ "# # 读取数组\n",
+ "# cursor.execute(\"SELECT array FROM data WHERE id=1\")\n",
+ "# fetched_array = cursor.fetchone()[0]\n",
+ "#\n",
+ "# print(\"原始数组:\\n\", array_to_store)\n",
+ "# print(\"读取的数组:\\n\", fetched_array)\n",
+ "\n",
+ "folder_path = r\"D:\\DESKTOP\\2025\\44\\a1\\dataset\"\n",
+ "\n",
+ "all_files = []\n",
+ "names = [str(x)+\".mp4\" for x in range(10)]\n",
+ "print(names)\n",
+ "\n",
+ "\n",
+ "# 遍历文件夹\n",
+ "for group_path in os.listdir(folder_path):\n",
+ " full_path = os.path.join(folder_path, group_path)\n",
+ " if os.path.isdir(full_path):\n",
+ " # 遍历子文件夹\n",
+ " for video_path in os.listdir(full_path):\n",
+ " if os.path.basename(video_path) in names:\n",
+ " video_full_path = os.path.join(full_path, video_path)\n",
+ " if os.path.isfile(video_full_path):\n",
+ " # 处理视频文件\n",
+ " all_files.append((group_path,video_full_path))\n",
+ "print(len(all_files))\n"
+ ],
+ "id": "4dc69bad309cb6b1",
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "['0.mp4', '1.mp4', '2.mp4', '3.mp4', '4.mp4', '5.mp4', '6.mp4', '7.mp4', '8.mp4', '9.mp4']\n",
+ "70\n"
+ ]
+ }
+ ],
+ "execution_count": 4
+ },
+ {
+ "metadata": {
+ "ExecuteTime": {
+ "end_time": "2025-04-14T04:20:52.302187Z",
+ "start_time": "2025-04-14T04:06:32.521053Z"
+ }
+ },
+ "cell_type": "code",
+ "source": [
+ "for group_path, video_full_path in tqdm.tqdm(all_files):\n",
+ " # 读取视频特征\n",
+ " feature = getFeature(video_full_path)\n",
+ " # 将特征存储到数据库\n",
+ " add_to_db(feature,group_path,video_full_path)\n",
+ " # print(f\"已处理并存储: {video_full_path}\")\n",
+ "\n",
+ "conn.close()\n"
+ ],
+ "id": "3cd83672f6901125",
+ "outputs": [
+ {
+ "name": "stderr",
+ "output_type": "stream",
+ "text": [
+ "100%|██████████| 70/70 [14:19<00:00, 12.28s/it]\n"
+ ]
+ }
+ ],
+ "execution_count": 5
+ }
+ ],
+ "metadata": {
+ "kernelspec": {
+ "display_name": "Python 3",
+ "language": "python",
+ "name": "python3"
+ },
+ "language_info": {
+ "codemirror_mode": {
+ "name": "ipython",
+ "version": 2
+ },
+ "file_extension": ".py",
+ "mimetype": "text/x-python",
+ "name": "python",
+ "nbconvert_exporter": "python",
+ "pygments_lexer": "ipython2",
+ "version": "2.7.6"
+ }
+ },
+ "nbformat": 4,
+ "nbformat_minor": 5
+}
diff --git a/LBPTOP.py b/LBPTOP.py
new file mode 100644
index 0000000..465c0aa
--- /dev/null
+++ b/LBPTOP.py
@@ -0,0 +1,61 @@
+import cv2
+import numpy as np
+from skimage.feature import local_binary_pattern
+
+
+def extract_lbp_top(video_path, radius=2, n_points=8, method='uniform', block_size=10):
+ cap = cv2.VideoCapture(video_path)
+ frames = []
+
+ # 读取所有帧
+ while True:
+ ret, frame = cap.read()
+ if not ret:
+ break
+ gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
+ frames.append(gray)
+ cap.release()
+
+ frames = np.array(frames)
+ T, H, W = frames.shape # 时间、空间维度
+
+ # 使用滑动窗口计算 XT, YT 平面
+ hist_xy = np.zeros((n_points + 2,))
+ hist_xt = np.zeros((n_points + 2,))
+ hist_yt = np.zeros((n_points + 2,))
+
+ # LBP on XY plane
+ for t in range(0, T, block_size):
+ if t >= T:
+ break
+ lbp = local_binary_pattern(frames[t], n_points, radius, method)
+ hist, _ = np.histogram(lbp.ravel(), bins=np.arange(0, n_points + 3), density=True)
+ hist_xy += hist
+
+ # LBP on XT plane
+ for y in range(0, H, block_size):
+ if y >= H:
+ break
+ xt_plane = frames[:, y, :]
+ lbp = local_binary_pattern(xt_plane, n_points, radius, method)
+ hist, _ = np.histogram(lbp.ravel(), bins=np.arange(0, n_points + 3), density=True)
+ hist_xt += hist
+
+ # LBP on YT plane
+ for x in range(0, W, block_size):
+ if x >= W:
+ break
+ yt_plane = frames[:, :, x]
+ lbp = local_binary_pattern(yt_plane, n_points, radius, method)
+ hist, _ = np.histogram(lbp.ravel(), bins=np.arange(0, n_points + 3), density=True)
+ hist_yt += hist
+
+ # 拼接三个平面的直方图作为最终特征向量
+ feature_vector = np.concatenate([hist_xy, hist_xt, hist_yt])
+ feature_vector /= np.linalg.norm(feature_vector) # 归一化
+
+ return feature_vector
+
+video_path = r'D:\DESKTOP\2025\44\a1\dataset\org\1.mp4'
+features = extract_lbp_top(video_path)
+print(f"特征向量维度: {features.shape}")
\ No newline at end of file
diff --git a/analy.ipynb b/analy.ipynb
new file mode 100644
index 0000000..55695df
--- /dev/null
+++ b/analy.ipynb
@@ -0,0 +1,292 @@
+{
+ "cells": [
+ {
+ "metadata": {
+ "ExecuteTime": {
+ "end_time": "2025-04-14T06:58:32.199713Z",
+ "start_time": "2025-04-14T06:58:32.134049Z"
+ }
+ },
+ "cell_type": "code",
+ "source": [
+ "import sqlite3\n",
+ "import numpy as np\n",
+ "import io\n",
+ "from numpy.linalg import norm\n",
+ "from collections import defaultdict"
+ ],
+ "id": "6917288db44004ea",
+ "outputs": [],
+ "execution_count": 1
+ },
+ {
+ "metadata": {
+ "ExecuteTime": {
+ "end_time": "2025-04-14T06:58:34.129528Z",
+ "start_time": "2025-04-14T06:58:34.126022Z"
+ }
+ },
+ "cell_type": "code",
+ "source": [
+ "currdb = \"i3d.db\"\n",
+ "#currdb = \"LBPTOP.db\"\n",
+ "currdb = \"slowfast.db\""
+ ],
+ "id": "dd9b84fa98c77e5a",
+ "outputs": [],
+ "execution_count": 2
+ },
+ {
+ "metadata": {
+ "ExecuteTime": {
+ "end_time": "2025-04-14T06:58:36.801611Z",
+ "start_time": "2025-04-14T06:58:36.798114Z"
+ }
+ },
+ "cell_type": "code",
+ "source": [
+ "# 注册适配器与转换器:numpy数组 <-> BLOB\n",
+ "def adapt_array(arr):\n",
+ " out = io.BytesIO()\n",
+ " np.save(out, arr)\n",
+ " out.seek(0)\n",
+ " return sqlite3.Binary(out.read())\n",
+ "\n",
+ "def convert_array(text):\n",
+ " out = io.BytesIO(text)\n",
+ " out.seek(0)\n",
+ " return np.load(out)"
+ ],
+ "id": "fa2ab158cbe0aa98",
+ "outputs": [],
+ "execution_count": 3
+ },
+ {
+ "metadata": {
+ "ExecuteTime": {
+ "end_time": "2025-04-14T07:01:06.063185Z",
+ "start_time": "2025-04-14T07:01:06.060008Z"
+ }
+ },
+ "cell_type": "code",
+ "source": [
+ "\n",
+ "sqlite3.register_adapter(np.ndarray, adapt_array)\n",
+ "sqlite3.register_converter(\"BLOB\", convert_array)\n",
+ "\n",
+ "# 连接SQLite数据库\n",
+ "conn = sqlite3.connect(currdb, detect_types=sqlite3.PARSE_DECLTYPES)\n",
+ "cursor = conn.cursor()"
+ ],
+ "id": "629eb156f332c0bc",
+ "outputs": [],
+ "execution_count": 12
+ },
+ {
+ "metadata": {
+ "ExecuteTime": {
+ "end_time": "2025-04-14T07:01:06.372809Z",
+ "start_time": "2025-04-14T07:01:06.362911Z"
+ }
+ },
+ "cell_type": "code",
+ "source": [
+ "# 读取数据库所有数据\n",
+ "cursor.execute(\"SELECT id, array, group_path, full_path FROM data\")\n",
+ "all_data = cursor.fetchall()"
+ ],
+ "id": "ba7902156f1b6117",
+ "outputs": [],
+ "execution_count": 13
+ },
+ {
+ "metadata": {
+ "collapsed": true,
+ "ExecuteTime": {
+ "end_time": "2025-04-14T07:01:06.786016Z",
+ "start_time": "2025-04-14T07:01:06.779812Z"
+ }
+ },
+ "cell_type": "code",
+ "source": [
+ "# 整理特征\n",
+ "data_by_group = defaultdict(list)\n",
+ "for vid, arr, group, path in all_data:\n",
+ " data_by_group[group].append({'id': vid, 'feature': arr, 'path': path})\n",
+ "\n",
+ "# 相似度函数 (余弦相似度)\n",
+ "def cosine_similarity(a, b):\n",
+ " return np.dot(a, b) / (norm(a) * norm(b))\n",
+ "\n",
+ "# 计算指标函数\n",
+ "def compute_metrics(org_feats, query_feats, sim_feats, K=5):\n",
+ " precision_top1 = []\n",
+ " recall_at_k = []\n",
+ " AP_list = []\n",
+ "\n",
+ " # 构建搜索库 (原始视频 + 相似视频)\n",
+ " search_db = org_feats + sim_feats\n",
+ "\n",
+ " for query in query_feats:\n",
+ " similarities = []\n",
+ " query_feature = query['feature']\n",
+ "\n",
+ " # 计算query与所有库视频的相似度\n",
+ " for target in search_db:\n",
+ " sim = cosine_similarity(query_feature, target['feature'])\n",
+ " label = 1 if target in org_feats else 0 # 1代表匹配,0代表不匹配\n",
+ " similarities.append((sim, label))\n",
+ "\n",
+ " # 相似度降序排序\n",
+ " similarities.sort(key=lambda x: x[0], reverse=True)\n",
+ " labels_sorted = [label for _, label in similarities]\n",
+ "\n",
+ " # Top-1 precision\n",
+ " precision_top1.append(labels_sorted[0])\n",
+ "\n",
+ " # Recall@K\n",
+ " recall = sum(labels_sorted[:K]) / len(org_feats)\n",
+ " recall_at_k.append(recall)\n",
+ "\n",
+ " # Average Precision (AP)\n",
+ " hits, sum_precisions = 0, 0\n",
+ " for idx, label in enumerate(labels_sorted, start=1):\n",
+ " if label == 1:\n",
+ " hits += 1\n",
+ " sum_precisions += hits / idx\n",
+ " AP = sum_precisions / len(org_feats) if len(org_feats) else 0\n",
+ " AP_list.append(AP)\n",
+ "\n",
+ " # 返回指标均值\n",
+ " return {\n",
+ " 'Top-1 Precision': np.mean(precision_top1),\n",
+ " f'Recall@{K}': np.mean(recall_at_k),\n",
+ " 'MAP': np.mean(AP_list)\n",
+ " }"
+ ],
+ "id": "initial_id",
+ "outputs": [],
+ "execution_count": 14
+ },
+ {
+ "metadata": {
+ "ExecuteTime": {
+ "end_time": "2025-04-14T07:01:07.745386Z",
+ "start_time": "2025-04-14T07:01:07.740942Z"
+ }
+ },
+ "cell_type": "code",
+ "source": "data_by_group['org'][0]['feature'].shape",
+ "id": "55e57dc7ec56b732",
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "(2304,)"
+ ]
+ },
+ "execution_count": 15,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "execution_count": 15
+ },
+ {
+ "metadata": {
+ "ExecuteTime": {
+ "end_time": "2025-04-14T06:00:12.392784Z",
+ "start_time": "2025-04-14T06:00:12.382725Z"
+ }
+ },
+ "cell_type": "code",
+ "source": [
+ "# 主函数,计算所有变形组的指标\n",
+ "def evaluate_all_variants(K=5):\n",
+ " org_feats = data_by_group['org']\n",
+ " sim_feats = data_by_group['sim']\n",
+ "\n",
+ " results = {}\n",
+ "\n",
+ " # 排除 'org' 和 'sim',其余都是变形组\n",
+ " variant_groups = [group for group in data_by_group if group not in ['org', 'sim']]\n",
+ "\n",
+ " for variant in variant_groups:\n",
+ " variant_feats = data_by_group[variant]\n",
+ " metrics = compute_metrics(org_feats, variant_feats, sim_feats, K)\n",
+ " results[variant] = metrics\n",
+ "\n",
+ " return results\n",
+ "\n",
+ "# 执行评估\n",
+ "results = evaluate_all_variants(K=3)\n",
+ "\n",
+ "# 输出结果\n",
+ "for variant, metrics in results.items():\n",
+ " print(f\"变形组: {variant}\")\n",
+ " for metric_name, value in metrics.items():\n",
+ " print(f\" {metric_name}: {value:.4f}\")\n",
+ " print(\"-\" * 40)\n",
+ "\n",
+ "# 关闭数据库连接\n",
+ "conn.close()"
+ ],
+ "id": "d9a0103dbc3f1bef",
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "变形组: 动态水印2\n",
+ " Top-1 Precision: 1.0000\n",
+ " Recall@3: 0.1500\n",
+ " MAP: 0.5815\n",
+ "----------------------------------------\n",
+ "变形组: 水印1+2\n",
+ " Top-1 Precision: 0.8000\n",
+ " Recall@3: 0.1600\n",
+ " MAP: 0.5751\n",
+ "----------------------------------------\n",
+ "变形组: 水印1+2+滤镜\n",
+ " Top-1 Precision: 0.8000\n",
+ " Recall@3: 0.1500\n",
+ " MAP: 0.5685\n",
+ "----------------------------------------\n",
+ "变形组: 滤镜\n",
+ " Top-1 Precision: 0.9000\n",
+ " Recall@3: 0.1800\n",
+ " MAP: 0.6100\n",
+ "----------------------------------------\n",
+ "变形组: 静态水印1\n",
+ " Top-1 Precision: 0.9000\n",
+ " Recall@3: 0.1700\n",
+ " MAP: 0.6058\n",
+ "----------------------------------------\n"
+ ]
+ }
+ ],
+ "execution_count": 25
+ }
+ ],
+ "metadata": {
+ "kernelspec": {
+ "display_name": "Python 3",
+ "language": "python",
+ "name": "python3"
+ },
+ "language_info": {
+ "codemirror_mode": {
+ "name": "ipython",
+ "version": 2
+ },
+ "file_extension": ".py",
+ "mimetype": "text/x-python",
+ "name": "python",
+ "nbconvert_exporter": "python",
+ "pygments_lexer": "ipython2",
+ "version": "2.7.6"
+ }
+ },
+ "nbformat": 4,
+ "nbformat_minor": 5
+}
diff --git a/i3d.db b/i3d.db
new file mode 100644
index 0000000000000000000000000000000000000000..540a0b52b238f86fdf0733c773171dd324018c4a
GIT binary patch
literal 618496
zcmeFZc{Env8#heGWS&Bls0bk`?z69JqX?yeq%=t~6iJi@DMCpIAwv=}gh~<`6se>%
zC>4!gmC__lQc}--pZodVzvuhBf4uMWuJx|w$kg@UI8{^}xR#_}2sfdf;CV{Of^#J@Bsw{`J8BFFmkLSYo(}ig2XI
zde0RB-YY%Vd-DE=OmnfbakbNSwVCQz)|b-ehE*%I9cR1R+1t5j&vkK}W#i(m
zJ=4zJh|Tj14))xvJ=JN>RDRqycq2RmC@CQnxkFlM@xIyfXU%mN777(_85s;uWmN
zXzPKGxt@`>9(Q?SeXwVs$J*eP-n{hbo&h1=-1HDX&meDZT;I&p+|p>gk#;!GN&l~c
z)ZkVhT->&e#(vxdBS-<+edjwfX^Ah;b#i#1QV}|p&7g4&he`_VLX$;FfYYwvFY7*7
zw&y1l%-jq-Pt6@t0QS<;X}}6)+UhS$|Ex~|gSCd(urQA5b0YEAx#=LaVmF$s@F$-i
zr;skKdScM6M>K+_6CQuxB@?Vu6+^vk@6fO3J34F>L5Jz;G$`#FJh2m}>AK_SZFMo)
zFncc(w6+Y2znIY^V>O)mX)iu=8AoGgor1Fg>Ud%7e!QJO)=Ki5veo*>V{ouhmTnq1
zl?EoqlEJ(kWPV#1_y->0=WUXc^L!+6Avg55S|oO;B9d#Z*gm
z;6@#B+PC2`CXIf_+^pdmsL(J`;=iQ4M;LuT!>ZY|_sw^3cMm4zFM3JcXhhGV3^Y<&
z0f8S3;gN|0EtVdG&BhnuOWzR8d?AgPxDzaW0V2nYV~pBOF)3m?7B_^`e3NJB_WKN`
z8ka$(!9sdW{Q++E8UpDliqvbu2WH_cZHPU59d2vw09nf^;MgY3ag^3XgYHh47POa2
zeHum|zHmb67bR$0y&2_tqp8-#9&|rDm!|zWNK%+&Y~F23gUb?FORxP)O
z*?M#6H2=9UJ6MRSO}ve`c^<0H9uA6WFW`Q(G59K#;>Z)O-n}eO+rmVsmu(X`e6NP^nZ~qK{1AlRP$juJY54w#C%$c)K@QIN
zNF*;FW!rX2g$mg{F&YjI{RW!t612(mIF5U0jI9qO=ts-7@b1@KsuVqhwp47TEAo$$
zYN074_KP;HtWtxxJr^J%aW&38A_8SH=b$}IiT3T#uzJz=p3W(WLtl+(`Z6ny<{n)^
zyhTcwOT*-#D0Ur&hyKLWDBxp1mV%b+cM?NsF%laQK{`AAA@t-YaK|W;l+i+;^y!jI
z($DbowiQ_GI*<07PDNgyl=@&P?WCfRl`8``e?Egn(d$XBh8*L(R3MH
zITONrh{!Zd6#FkJ?{gbZ;=_s({ByhvZkh|hJiTNh?=+r_yjg{Rk|sh3Q6c%Q>*?UB
zYT7m=o+N$h#D(5cbpF;gL~F)Arm*Z1WAnZi9w`Uo*mq0myCKaOt>A_EW3Ge44Kvzd
zu7+Rc+LOCB`%%aLE7Q5_G-JQ|4b1*{hVi;{hTos3^y0;H@sOfggfXX1qnn#KR;j*$
ztIS1AdqJpQcM$4{9-uzkWtk^cRPqdksNR?$OV
z(x$@wD6-3u%Ko@Y->!{jcx7Z?D+!$gAITcIku=x3hZOFQXWAkzVYX*BNF5Z1<9m*f
z!b78Q#O+mJvTq_;dUrRqS4AfLay+g08HrERbm)|X2zvEk7TLaVA#I(rA9jV01et}S
zQJD^hk=iQ6Mf@K0xCG+rhsQ9g>n*ESXjsEU(f^Y2{x(X)>caeo80C2g8$L(U(V=Ek
z)VLGNA0DEYA76m`FO$&EN{5acu7eVbl2B5&oz8#ONE5#PMF+iPX{K}+h8VWd&dBpL
z<#3=?)NvIWs{RK$q*7^X_9JSrVgl`#zJvwa8?d9f92$j%t@Ix(grOhD(R=T$Ax=mM
zJt7~Vv7-ZhacLy2{9u8*MvGasuAW8%j+~+0vAgJzeZtf&cM$Aa4Qb+EG1#a&ALq)e
zS#`w6p{Uz%I#PQiRpfXPwS!Ag^hq1UhZo}_nNVsPlz}=UPoepA7c6?>iq_&E={e0>
z%=)X0242j8wfA-)37SjY-u}R|q1WL4_gmPl=LGX05+mRX>b?%6RuffVnb{w-ySt2z
z=}My+0Uz+&RblWtqmEuf6{w?M0u7iti$1WDrBQc&V$|GYbkV;3*#1;7+@qqMB`m#oo?v}Mc+s~$0)BOemg+uV^`-><$uLg@W
zzoS;41I=GHjG8_E3&x&`#A~{rF-g1@uMQakk$TVJ-JwG`Tm2YL49!QO&8Bp9yqQ(%
zGzPuGBT#pHGF~h4r?ZBv!i5h_(e;oxHGdt5dI}QM&2SOEpW#6pd~V>ul@55k*9r$k
za;WuSIi~qf2VajZ^mxn~2oidV4~HB@)z#ecmS~tbpXbLyR_R(c
zK5F7(wy(asMuXOQT!qmhS!|pqm$OA3EVIj4I$m5>R}E&|R$=2;-}DkyOLbN+ORFDC
z8v0%ccpc^ASZwN^PQ?5DPm;P$6q>y$ax^F6qnjs5ZFW3$Rw=W3l`#M#suBczJXsoT
zPteO-m+{qJ0XGk;u{s`H$fUv!eyD!Zi|u=>B`%VW22uau>o*)=u}RwM32?=>o@D8<
zP>96FpJ4N&_d2urPhXaDc>3-z6=N
zv#{0nG4t83ABNsIjzhOpqQeCV)^~p{--C0DW}>8571_PzD5y*iz|_xAV9KcFbYbga
zJX^%z=x`O{zIFy)IB*IaBC6<>&-<-rZ>vF>{A#FuI+OI)H^8g?eTsKuqEuxD==dQHMUm?qA%ocFS}yU6w<8
zg4-egR~Zq`X(Igz+_Kzi&HeG`)xkxk+#g4M?vJH5_eW2S`=ct){ZWzR{)qOnb--p>
zHm
ze0_HmC@ehzp7KBO@;onc&N~GMTk1(r?IrB)D*y-IQK)xM5sU9w(uCc)*yOwvR!{MV
zYb6rcf7Xy@`A%fzxlLFI2HN+~yil6;f%D`+4DAyG1G+qGdofRW?7o~8uQY*?j#zW!T
zSJYEHj>)#%%{b)Tg_|kQn2K5HWd0p%3>FUnw}5@4y~j4Z
zkZz4Ha13?I34y)e#9`!vI&7Ri2RTz~p)_3@o*prxT?5gq-8|p6Hs6QPYf5<5?ihB?
z{eVWJUqXn|9c;2o#D{5T7{~mz93!iIY{-~RRHt+2m{Uz*{KOq#vsfE_I=(ZTa1n8l
zsfMk4hmh}k($T9qiS(`6hl{uF1LfH>A@hU{7_Bjdd?pC9rh7r$hHB2*qX%Jg%~w!;
zF%qpykFxgE9+^OfeG{X{%ipm5h>39vUQ6?bV=_TZpS&5TG9d+H+%ur{ND4MhG+`2)
zW)TDRBs?3H%!nPi2wLP52EMdovW|^Fi3O9;NX8Z#|5|EwE$2758tlV!r#```cm{XT
zcv4Z9LEsl(YlJJLxr#3=F|6j0aWixnq?83&(
zZZhlpM6|UVLWN(Rq2{7H>FoXUh>U6#8Z?%ppSLo)eow}5qlxtOLx0w$@dh%mY5gQ3
zs`&tzk|E5cfDY7KS%IDNFIav&+>S!0E)eMc{XB0_mHf1%6KDmYLROp-&wBFWz8A>q=5*4Lg!1)W9uo8_bCONcP{+#oROzsIM;}b4M{pspMIxDS2)%hPZl3
zkS_nbxOa{ijf#1Ui=$(h^aJT+wY3F&sqO%iq0_MIpbMVmRDh%6Y4YZN0=Ry8Orm~M
zEUwYO0!bGX^R&T5hU+kNmJfR5Z(myXBaX9qCGHw3nO&&SUvl%V3<83uA3u=K7F;IOh4~k>5v22Sf%M&X699m6&;@BE>a^cl4@LOO4SDzdw{w{N{JqGZ8Pyo;u
zkr+gdP<)?6QX4H;+a`tnV6O!oN2!AT1{95%555V@VVhAZ++b$l`;cAag}*p)^;rQ;
zB1>R%dNR)FD@5sC6(nPl7rl12kr5J4gE7m7!X?iT`mnnOB%5pLrdz6*n(9M$#AxCq
zQA5mZ&SUGsnV?KYRXr9)RB-#v6&qRIiE+{p`Bw)#d9#PAy*bRL`7|Blh)&Ic(Qj^}
zcmGO^RPdla$2Op=Jt5|$iNLAqA&M{eldGXB@VvH{(I^+8mD!pYs?rA`_c!3&wL6Jg
z(mK#{Az-JOgY65aqwY^7)~DM)%G0g&mN;p3DvDKVKt=)O+}SM-!sfylEAoNG`89eG
zGyG~CW8d%2Y`m`r>Y^8k$nVK0Grfd(y(83A#|I_(}%I&P~(Fcyc2oGc~;&IdLHZX_N`T{PIZlw
zNG2C!`gB<|zdeStdgU92ZrOvISM9;$6UX8*-5z*0C`LC~A464}aaee@86pYoLZX##`kK;ijdu)sAmhd)s0~0!-1t60@-JWZ;c}S
zStm`6f@(o8*8)E891rg*nowtE6?x*ei+<@C0sh0B$dA8d@Ry+^xQ#NSR(B_nzWJfF
zZ=wZ`#Nk*HtVwQ9sU;D0+oA3J9CBfb9afuW61!L1!C`wnWOVh@{MM^z>KzUv#C~9o
z=XR*kaDt^Le2MO+P};NnEHQPyL4qBBL(IC>_-^H9R8XA>ca9Z8dE6AbbRBn1_vS-R
z|J4xaO)SKkB?qYGl|5J)o(Y|M7NEw6!<^2d0LHoJBxv4^K-ul`aASE6MpGG3Ej$3J
zvkIx4x(YTf|9~G!G3xwIreTK^$XAg;Tvp!&(XV>xJqLZZ%%{|yLPd)iRMPJg)7Du4
zfin%*@+=bmjs301q2jL(Y<#JGG=3G$!nz;f7%VFa%Z%2s{xtYrPBJ?#F{vL8!@y-D
z=vt>jTt{k?FYnHRx^gP{F+`5-A0*^HV!p2&N8_a_$2UHKe%bySBzBfDc8(&n=X@Hz
zDxb%B<^7h`rT3tO{8=~*53ZTbn46s-2AW1VRc$xk3yUYsf%Xg-6%fm@A}s#;MkNq&
z-Gc*})1hvRA@fE4D~i1yL7(6Hfg$_UxMQdwM*ndmdYPM&qn(=IYne|v0+-OrmAOpY
zk3{lOWfoY~Zomu92>M0CXmXM&O8%LICi7n5N$$K^=yWJ{j~fq(J-eA7BBHc=^>QqN
zjZEdz77}%=omu}%mzD&n;{64Z7U}I}I8DchwzPgGZ?w`e-f9O(Og#vxbNX4kB9;xu
zw}tUEe5MZ#`*xjlDo;kq^mou!B+KSI)$YM*1LkO!P|l8r#kA@%@vVtfyloI(+I<8D
zu4Y4FNj@5@3bB2Zaj6RxK5U82qwATlixVlHzYq1>FJjG<0VewL4e(v2OyoB#v@Ekb
zPDH%y!SCiA+E=-V$gDest3Q^4)wWg``{fg8T|Wa(fq~p-%0;rGXch{~214OQanKO@
z#gS!3V!iJK$lEv#`}1#t%{(1YoI8s3eLS}>mTs}Z%bROq(~Jh9_&W=8OebUC&sWUc
zN&euQ_ye{l9%L$ga#;IL>ByjPb3JKYph^!&jip6uhA=LB4Y@O`h^~?5a*?gMSQuS#3jn#4bV3$3OI`-7K;&PqIW%g$
z6!Dadp$2ceh+f?YaWMy}S*Q!Oz4rsl
z>LO7u%n|y+zrZ6&d-U9)2+|Qx(f{LG*x1wrW)ev#=AVsDz9T@&=@A^eu7wrnM}x+d
zQf9H+cH*9$MUwVhVC!A~?Q8gWyEcB-m`?RNk;Gb2I5A`|vAR2%3~K6Ox8*UM
zCcFf5JA_Dpvz*ni!DL3&rV|_8QdvJZ4rw9{A`fVDj0>G1T|}*YEl63p6-@IwNMh`6
zGQx#~v3YkH?>#t6qGlW?UXHpnod%-IuLGo|rUh!}O(liy(a`+C2-6+5)7q0smX~H+
zC5|qZn7vmH{qNjlD)ZAwr1xK7Gh~|8g%mlf0V{b(%ge#u$H{D>@dusNUVW@u^(Ry^0nApC8sOfuAvrGkB+{a_m+$C5VQ%-%)
zj3+H~FL4Hw@3MB4EbN9$S!=-Q_g_Rl`6$P1>=WoS%;LDL(15O`@nE!f5zgKE7~GbR
zW_7;no5R-OaTA;2{>2-Zed`g}ew2pZiOuAPY7unkOaZSnI~4UcVlq#r!?`~m@YUrI
zu5(YuQ+v5%cPkw{I6VuLdU&HsAsn=wMQ!De!S{~!v^Vz+!@N8Q{+C}6HQmd^%2OIf
zDscC*E5yNgO$UxWl8!2NBblvlLa_1FK6D!{i@A5X`$=`XFzDue=rrc`p(fh!UM?HH
zrDTBG_-{nw<8UJ5vyT31{DVs~&O=~xE=(Ca9pQQx9?!D_gQ#1$!(c3JOK8BJ!Iz}V
zK*|cV=0VtkR1CiCMf!JFkZWn(X3ffk)j;2jza@soBlLELqX<{^79oD4<%(LE40XEolK^9g<^
zs*&9O82Ht=4}>$rv2x{f>OJ=z=$2UHkC4^G+Rhp8G#D~@Pl|DVK|89IzG323zCw4%
z1ERQ65(n>BGneeRd!nI-aHA}R&M!+D_u(y^%u)Nn#y}ff6;7b*w|#6sd*{438a9n!
zEV`26l}-mdUDc1fC)Z(SUWk>Rf+o6l^}ziTw}|860;YJwTk`ClGG?oEVZyZ2;Id1Z
zDyEp@w1h)6A=nHYgDLj@DF?0Zw;@mTDKx4nk}BmAa>0E9ZIIc{3@qIRiSh@)#``Rd
zJgSB>{O^OU!f7mU+XY_t7J}KvRUDo9>Ck(!2k+g#PP~N1VAb?QQm4=LMM@5SS!YM1
z-p(apOySX$8qmnTzIAj_w5u7g~@
zGZQ1Od*QgT<}hx7GInOBg2&{3uq!_W)7p=KTedjr79PUZBlqEb)oZq2bM$J#pJAfp
z`O8k`YKkM`lTbFDjC4cOh36TuG3UTZavj9P?s3naUx7Y)=`^1vm<-I7X;zJrAr{J-}bJ)J8&GRGU
za3%u-E~YU0GltTD-;rpqsfq31Qqa}-4&yf60F86npm*bMP+A{FUs%ec^6)nxG35qh
za?==}Sjy7XyCa}{@g#JYbEj9|NzVeN??lNc2egVgvV#u!si9I
z!Q{IFYp3+P@%Xw@m>OItB?f0pKxxV_YSOxq`Qa0XGVQ_)cP*;acb+W5B#hyMi{w
zEnu)Tg@iwRW0}3E924b!!ttw$B~
z&Y9oNKrFJY1voyQ+8RoJrjDW*%hW6Ti_v|kK?
z9fP`9=c)+zl(*7Y(NFZ(kb~GBEDp9Wa=_b16AF#Jaeapj9e0k~#|QmEm6tsbqO%*)
zCm^W^Py=17LJ-@XX&Jvqgw`(0BgGL1**2;mKNNGsev-%^+~%-DW*2dFO*<#LONT)}M+7$?LF9(+ZukveB=0
zkEP$5<3zH}fGzLh!PD?1*B+clOoJ4Kd8Ad#m%N?6l=ac@v5`1u5x
z3&GQ7BQDyBEgZd68`{A5FlVjKVYNTQw9i(=lm`kJGp!H@ChVs_Bp;Cz
z8`78_T7(6!XM%lXHiXMdU;t341_yEK-x*1n+Nd9qzzhx!qKnhB>98d
z)b#N!Y83I1wRNl5IRcYj;IpDdOvr>{Mp^F>M*fb&q18EHHtGOlG<-Cc@6%^(Q>f3N
zzHSeoF8vl{y)^;ru@m67og}gNd6B$SRE0ldqF{Se97;RHW03D{CgjRUe6y|yY6cc_
zq^@1()F+vuhGY}5uA0iq8+^YP{633f$M4VNsYwx}Ysiv2vo+}E87Dw|LJAe1IRc#H
zZ_~xgS3*(mI^v=%gb9y+F~xarm>DwaSduoA#-=xuklYvGBx^5GCn9OMnkbuq8>gH@wFCThvK2?B!)oqM
zbN^&xeB|+q*v|Wk;~MT@-xXOnr}PG1huXmkpVx3s_&X<2W-Rm-U*`H_CQ-g{4T)ku
zKx!;>ZY#ul(-(rmT|1E3+(#1kB9TumB<2Ux;FqEWV_SdG@*p_VXpeccd{-P;)F)#2
zLOZBcK1Gb`uA|du6YiOg<>$g?daP73{{_7^zJaibQ&Da52)c250?sEAc#Nc>
zpU56qZX!f79vPF75f7;IIvh$E{~cn{ms1l
zolUo%il(`B-0{UoW4M{n3n7^zV4ICNZ*2jJEfRyGi<9X>aqJsP#w+HdyxUM(EV&cicgExM=p~RYHUwQn!*RWN9B2fu#jBf>
zVdLEy=ojq6O7v@?&2$BN7PiAOe-l(RpG;I=sA9I(ZFn`&jLr~_
zBJv+6Q`3{Dpfgbe6JFVo6H+laKR^w2wiOXZH=elbA0_U6B6MI$KRGMsPozegg`d*I48&|ckJfz!l#kMWzS*DNSKg&qY
z%m#2vDQA6}tJ#c_WhdcI_*Zf^UT9zG1&{Rxz@s{iWz9Ecp0ovfvUcUWp%n9$pih*Q!)Ck
zD>#pN2+=D`Fhz&EH+zS_wis?y4({B!rX(ky9BeAU+anZc-}9wN;uhe+<#wd_rwjKi
znh}guwZp5qonV)!h8BO;lC{CUw#*V+yLmHR=geJVW@}h*Dv7`
zEHO1+6J*YtRs0+Nk31lr#IAQ%tog>ycO(~Ab3Ug+KG}V8#hKrgm5hW*x1=xPq~)yvr&|jE6!Td;h=UDf&2#F<(2G
ztuK}D_Ofdx&%exoToDZ>BJ^Opwcs9FvtdkQSwO}wV?Xv<#JLed2V
zC{PY3?Q%DWPx}OceIrUrI31a7q~EcL#ow;l0l9N8g6ykz0^91H5S}XV*P~^+wqgD%
z9m}&_AuN_hTiPrm7xLHX&Bvd`UXnmAcSW+iIooX6>xJZMvYtDyZJ1rfmP4SK6>O5%
z$4Xr>PS5rY%)5f+7CfB2i7^6Pjm>HT{k%LG+b5jDtMg%6ahJdce!|CDnqawE0@~2Z
zcjSKYREva#M>v(s9NGQM@)MSv&4I0~A9=EPAzv($d23fqM$DUyR-gPxQnXs-j$v$_{8GD5fGsaw0sDU~hEUfu?q0-Yl**Q2x-ae)*vxsL$ohwmP)Mk|
zRiE<>RT=+J+ga?&erJii-5bjgvk@#-9$jzo5mKD_oOliTFd5dltZ%B5hOvF_-*W!G
z9v)T1VyVh`Mq-jXBp3Vi>tz1>ALQSR1N#^4G`z*3G+Syvt;)iyH(oKmLhi?^l1<6!^%4
zJD&WT$Hvu^@$Z{Ps#g`T_N#^(|6lCNU5BineU#=v$ZH?={)QC){6)sLJ~lq$;w#RS
zNL6CB`V`bm`p5`qpf^Dbl`3eAy$6=-qCE{
zhV4VCxym48J})wYJ2Zu?oPU^;8J^GL>-x2gy+#ppR2ed089i{e$Jc0T@vK?Rfety*m@DNDp*iIHa*F+SZvk8>N4-+zZ=EV
z#|t)LM>u2G?BFQ-t{@UcDdbD(O8A)LNaVc|1U_r3c3?721T%ILx!@U{g(+oX^i#e(
zn{RRZH+emJKa@LJvv%@iZch%f480};4w>TxGJGWZIpH&ou(+4s(!?sGC+vN3gbXAZ
zO9|+B{0a^JOq&aZ=z#kI8+hqzgHwoa+deqeSC$Z>IGmNk%YUC^LDYn8VAiAq
zEY19F-v|_x6Q_m7^wrpJ0$*=Ep3Iny62-5&9D)1*hQD?qRWyQ?=kse4OYd^AjJ4~$
zcM)?bbuF9sN?%A|YxOe|fsE#XQQ&8rX_*$*4mlD3=|{htFJk;YMZx?vi2|%fyW$1+
zJnRwbE11ynCz$owO5|RiHfneU;o|u#A>ytj4pcs89?m$1UkV@MwbO~%3>Yd8^S6K2aoZhX;tXBWeb4_FIVkY5SF3H?!
z&DwF}&`flf>f%@`Wuk~w0<7&$7T^?H*#nb&F4ibWz^3~fMSCu
zB=e&PcKmfnP;NYZQ@utIgZ2jkOe_X4hbj1J+R72}53dv{5L$8b1*a42pazM1Wp
zR_`r^`rWp8C^DXv_xW2S?n+IA!UvP+)A*$Vd1Y1V@ZhNw@}UF
zuWj&fIt|MZ5;Nu^j1
z67M#$yz0y6p$_-#8ZWOmL7Utcf5xol&Oc|@cQYzyCJE&G8BT@Ib)~TQ55v}roMQgj
z50UOlj`cnZ!83y=hZicBT@;KVcySwfS4Q#SV?iC(y)}&qt+>rGds@$&3XR9H8|`rG
z@(^+-=>&1A;m&raa{P8G-T%*aKR5m>dKhn_`3pl?TX)@$Vr7Sl<>S}>mE^XK
zCoJCS1L+SnF+N|6WX4_Pe06+7BGX2*Hu=nW$8`K&!1`sZOgKkltQ@hbn!t`{d3cRa
z@cT29gxe_fvw%#QRmJkz8^sBHTdse^vT|ISz;?;;dbnw!2j}Bg2bM-9aV~qco{)i}
z4yRfE59*Qhl35ejl$o(U?;ibvu^N3$;Ah!OL?A!>7piqUq_j>oA{&SGKZo#wV>J0ukOYcY}xs-Q?NcgoePX`KF+{yQ%IhR)s=g#$K
zu(V=9{AZ0`mNu9>#0qqdwQ*s}4FSjIpI|BtzF9uKeG{L2eD#mI%o$q-HhKqbXlS|m^)BaL{jwJ8(Y+aD7umKJ6jRGHS47~{DtH!Z(z4b$3_2E%?
zQZ$a`7t56s)J>kx+}^m7_|Y{iZRO}f%$3@MMf4ysoUMgk!vh(`aZ?0#@aQ+qAGEZY
zpAR|KTUmXLvks8`7x$9m>8~hGOc!9VYUhvfD-`rGtR{!_c<|>}JQ=*O;j0v%_9A~i
zn;7hlB9kpx9Np13NWW(`nWAJuq|4`Wx|SU#r6K$|O_@(B3F(#Q==Dg$>`yOPTSmDI
zAv3!F(Az>y=(lq&D?{yFn4o+f{WwqDxAWVVYKE}D9{JDbNGx|;oOGFg){uuQ@N6;j
z$MOJ49a6|?-uW67xO=?3^sWJMRxa<}HS-Xw*Y&+DXXqCflse(U+G0x&kWH5YS-OJG
zL?YFx#qu@}-NNSgUKz!R{N~SN;?%bio2*IDwelb&Y4h7)Y~KQwuCPvr+%L;v>+OXJ
zot$@53PGe%6+@QswAVA7mgT52wMAeDFZIG^{&{xZeU8$u!#>i;3X%w-&F%g|e)xG`FS
z!Tk#$B+Ss$(+DWYkY68mTW0b2ladWe#uQ@0qM;OW^No&W%LyJbKt*ab~dWu
zstv
zJSo4%owIx*R?{>Xqh}2;+mieK?8Ro2R7k*8);fE+lAkLX%W5
zscaukJ9CBA={Groy_R3u#9kY?-!u4Ij+19Ui$ToJnDy&^Rbf_6Yea%Tx0ZA#QQT+1
z6yMy<((rgM7Y?v|CzAG~R%HXux^{uh>s>OO)iKJFKPK~Zo-B~_os5RS3ME#zj@|-R
zkEek-OaH!PCuy6Q0;38>uyLM_EM^hrt53mur_QpvcxhkUACOU#^FY@}4o}DL!7xit
zNcr%ebuS)`-)9--&Qw)KMRbj2&iIFdu>>!V7iPQh&)bB@MM09nNEY8FkNG69FM(v6
z=92{B)zE({3}Z_tg27QOHh)l6mN+gfC3$@ZnXspaiQ4%T5+{-mJ9PK4cD$Zm#^P>K
z$z%2HYJG^8f9-;e`nOr^TDAQCK%wOjCt~yxfjvAt%6s-OZnDjsY1U2xU-8lh(ms+B
z$!Tnw{mxS6@;v_7p*Ta5_4V9KvaFoh(eq&PTulgBkq#+;-a$^=PBz{DMk5mwcaf!C
z=)3~KLzrHOb6{qu^@6LNsGtt09Dc@JwPH}kQ5xLxhGVD5K0!I#aQi8XQ>TcqLk4T#
zvse7}2Od6Nh;Z3VG;H=-J6C%f^=N{vZ`78s#^ZNjkg3D1}rk>Ti
zsA>*NrzSCx#oizIiuoe$_>XeR$7@7ENe8NPUNT=+1i*mnBCLKMM_>Fr&+>kdkR&&c
zJ|>IfC$j#FULXO34`#A5R;BRg^rJ=`hNO=NiBnnz>xZ#jM>+Zl^4#|cO^8sxy=8{`
zHgYXLkHsqasszT(+{5zQpZUn*@;&ekYVx94`9>4QvUGp@Bx+3q8y`D_e|FGP?k$ex
zRAal&GMeA@fwXnhusU5YtAmlzCeAfCGgjvJ#xKmxAYGieG?nSx`%BPXoX0&7)B~Ol
zi)HIrEIs%Bx3!RK+z7i=c9z)-?AL46G?myhB2GW*OG>CVG?K&
z#V_Z{wg{rL;mOUz7=GA^O{!1cbs5t(waY<&D*qxKW7N|pKBd9
zleck(O^v4CXO5$e2PQ#d(*eSnuo9YNy14H|3Oj)1c}Fg`m#E?F~n;Ab|SXD!Q#6VFjv=IBBygTNLaSBfPbVsf9!7+q9JG_JXuc_
z34L)#mmb@6o4j4je{L$8F2fdyR8GG_0<*YOpParCC*aXroeFhRyBe3Ui|r1UB-u{O7lzE(tkz+Zo$4M>su|
z{4vq}cK+U_>j!nn*7Eh1s=m|`u
zP7;v}&}I2Qs~&*dA6CrUmHf4ZRL?M!8RW0`FWz3t(o`OZC!aMtNttLLl#AGKaweCt
z^5Ra`<7sI#L0M(>a=!)ezXWDfF2^mSO@LF)Ig`!LPbe1P6#b$|y3Ti#o-kd;=A{=)
zJCNVN$;dlwS?Bx-Y`!jnfZJo>wd8C8538cchxP^9WByNFy2)3M#o)=fFs`2&md?bY
zkiF`U;`iBVTdcTWfbroNP=0>{qk!cZcUqja#Xn(?Z7U|5jq%tXeie9sS7(0vhWwz8yi+!dYKf
zIp{FQRFJ*Tnqx<^n$NTME%W&EP@c?+3L}A!yUdj_`OXs7Px+@#lN>MZ9=Xvze7Pf^
z@f{Kk?sp6Y{^s%WLZjX;*2aZ(zgXE3krN>}AQke`%b;NQOnl`0lyCc@GVc3RiRc-0
zULa#}4}aaD{v`K3mH!!PxBf*OU*>WqiCV(#>p`52rul4MxcDemK94NAh`*PZ^t(n-
z_x|R$IWde)+f?Am(z|p#{YTl_hAiQ{6XCBJX&xDh#r3if8CheYL*HX$Er0y?OUR$)
zZM@kE1N-^k9^%Pgofb$=Q5ja=!&Y$to|A9Vh5%4MXUVu8
z{(j4=zmAd4!740z^Byy~>sH^aa?wNSJn>t^AM4y!<*yOl8Q?#k|H$)g`hT?lKk?uF
z|G(?e|It;_-fH&B$+T_;Lz_Z3(TFB{4BuReuKT5F^znEqI`;y0(V;Y*dp7*q+Sh1h
zUX4@YM5&UZhLu^;8+6?jL+t~m)BOC;xWh65+iPN>eap`XY&MYh!6as~F7~8A^3I
zHuUPyeHgv*CD#6y!k+$R7~@FMPezDZB(!2+atQ7Iyo4(EYf;i6Os`%{pfbTzaoQ_M
zSiW1EPScX4j}oM@XX{$3zr~Qwa#o^qi+iDb?`!OOU5|4`N|8xYqrsO7aoWgW5SP8~3p;%$+_N_5@XQm*D8do|w>m3}j=EXGR{xs$(|TA$lJSCYs`u
zgNIOT$1xg`y@8q=M!@IBCA69Qy@$vj3-L*`22~hWOQpjKsF%}N6iIc!bEAggr3^DV
zYX3JpyIqrR6OM+Hx?=QDUn<^iet{wjL}|jIl~@>(gROb5K(u}V4WIX(J~?>~i<{#x
zG^3W*E)}Kr2{|-e{VwKuEv9WcJ286cQFIgIo(~eqz!%dqVX&keA8p}&n_=n}w3#7J
zPtTrA?>fm^ExziC5(jtSY01fSmYXN7+h>HYzmA6f>R0ruHpSf|S5mEqUR0tynJ&_;
zMzuq#R6*H*yMGZxpUf$xDrdRh%^4w2+v~?*^{FNl4Jkz%tueINLldVR{fPJSLgDjA
z1^UEpCsj{8M`LpaXz*W?Xt7EsCeJg($a*CldSw>2Y@dM3^6o(Tss>Cx(1$vI0+3@p
z6oqbGfTbBybRl=mM&(*7a>Vs0_nf;`h;uMjXn#W&yC&M-l7NfT%5nZG6`HJ_399PN
z*h@d5yps4*~>?rI>TZ|^JCegNy=dkb=_Z`|OYcx7wOKFiPJ?=jUrP0Tz
zmZB3fq6OW^NGckJhb##BPZ{=}H9Zf21(67h~vt8#<`}2pWnU+6x
zIsL@SZ~8PxeUKVDUjdCdrqt}r0B%w+Lr?BE2@BF+#?&lLSY}=_Olm5?-#5foMjYat`}U#7A`PnfcUZvH`S4h^
zl^Tq@n1jl8IG)p_xv8UQUF8VIZ9ds1O(8=tRG<0Yw#_)G$Eyp8g6@L4B1$q&;2wv(Hq}B71X)U%V0b4y>;u
z)u-=owz2V#oFJLtNgif_G<#SBa#i`TYAnJdGjS@L7mp70L{|2!4>f(dl()1Fa!&`T
zn|qgHqBmmq&`Z>Ocnp0`58yHTBod#+V##+$8d;o!k%2XENC_dUw=*#Y+fXhnNJYPd
zu^~c+7QOgLU%mDq+clJhPqaY&mXr9NqXgaVF2?%DBXC~@!mfm4mTMD>S=bHXGaE?F
z>IG6l204$7DL8qE2Y1P}NM=ry%GK=}?OxP8_oi~rS3xA;DDs3$Xy?34dbCxYR08|p
z^)!o=)~Ungx-EP+{Y!~U{a|?E0IhqgNn4iggz$V#vd<}^y}zD7fjPizsWS2I%8=df
z<)m8E4xgA1w62Na1^!UQ7Y8And*THzTqQ+@}b
zw{$!?d97jXF{yYQTmXMD0Wz-|OViiv!jE@HVG=k88atE`G%<-ec}ZY6W-6x}4P!wq
zoc8y8BYt$W2NYfNUEH
z%2>IYe7xc)u4WGGy#JxDZP`pm=opOKm!f)o1np%{F;w7T(Rncp(M;yi;ww+4G_?=F$+(9IQe6q;SY=jA2dZ
zWLf-5VcIQo3JI(VNfZ9SIy#afx0&PL^9N|g@_f>D3`g!2Ba+|gPC+VbNHbm^Y*_`<
z?$xI;MbBA|??)KDuD}+JH%w9ZUvh2s0bDCk=FIKzzA?q4x2@Q@ITwW!ig1G4$(1#&
zA(IJV^t2?641^sZHsuq_f4qd(KUthVL@B#Gs-7I53t=E~Dn4-MeC6$n6ujAhf`(`E
z>$Atw1#MxHi!4E4XD}ijh>*ykTI5fgO8rr_I2SBNzh4|g>at2W-BhCRLV0Lh-Ar@2
z9jo6j-{Lc;m5mv@ganQPk^=eEqi&4$E<-wgI)k2k?q(wcbIGyiEK<4op%w`!PJe;t
zHk*(jx)A!#vE;F5H>!*E`J3!Ck*pE`H0dBf=O=5tGMgf#bjaCp0;)oeQ$t!ddhgdG
zv5uR2K4#H=PUAe>a~Rt;t{|uNTJXFgNwSZhVM)XrOqwQ0>&F_9%Zf`>kr9qF&NftI
z?N5;{7cuIIEJ@DrLd{8T-&<-4b*CRj$NB9Ts!5?U-zDKX`aD!`{6lgorm&nhmN4NM
z=bb7|s(Xl*ClIlo7<
z!!Gprd@giON5JdG4+zfSYFjstT9d`ed7l@R-4H^)mpY7O)cFGoSJTt9A4pC<179CS
zY#OUW)7vWPCinBDkHV?t*ktO}`OTJWQ6iy@k#LfJLaq7z_}*Uv-v{gH(%Wzh
zUVY4(M8@HF59cXr_!Z(J9nh&b!~%Po==QU{h*JN9ox*Wsd3O-EZa3q1(I<>Iv%r8Ru8rCPID6!Kh#
z_=>IExpKvJ?(Ae-v!TXmr3g-ufs^%l7V%t%L{~PUQNx#lV(;PFz&Z$jl%#1_GASbM
zBt0$MNjdM$U~*E9E-Jo+OvF^2($8lvBCfHM(@#OEFA;N|aJ^=q8a!i%*=0$tUQOnF
zZjF^ldfW<1^_frFnL{X;#>h1F0|p9Dpk-@3-l@%{?`9%o`L80SNk+lHH3|)nq-fUf
zJVYwQGwU^fS-r?uy6hMSLD8!S8h@U9C*vq-og+fd>BCK{9YF)9>8VZ{nW!#8a@YU{
zcml9b7{HBZBG@sy0srF)`vho>vLfv~
zu?OoP&7z=Ua}2NVLrHKu#wSLxpHjzhApRVQFa3awQ>(Bu{5T{7awuZ)W0VN1(u|3H
z5Qz-NjajoGIbV3){9f{g`fo9X
z$}Ak>$mKMhBI;JABV-zFlFl3nM;!j>b`Yvff
zIOsZt4=g7gjfLrpW%E_muj|3^XFVupqfN&e2Vu4v^D5c=ry*=OM*;4-Nuf|dnmkgG@X(X
zA-{$u$VV(d*73`T-u@AiN=npZq>7f!5_tV&5?D_S%Soxk#Z(dcyu1K7Y=sLy)>Fa9
zB;3EMO}F+uL|aQSYkUjr^!FrrU!rUC1mM}NiA^iFQ|J8$u#3Kgi)NKfq*j*QP(K0T
zvEG#Ts~hd-t0{8*4J?1r&c?hP!?#L{N8yMzo!ZZNgN@sbJdrkZYTUq3`gYP%ISiSq
zn=mlmPFsC(S$ZVeEe@SE&G1YfLE4xyEV?+EI&N1&^36U9
z9%*OmpIBfx;~dMGo`*?c7ijIrBV;_2PeaB#>6`v!darU4{M=;h9veZE7spbRt~J`T
z7EySm96oVp!DQ2E+$#$u3lSG+@GL34k$a|RcXN9o;j}|Qoc5l0f|?|E)b>h1ccTgh
z(qpJ&vK;eIUO=uBWk}{u5p`Bt(1o#+>7ZUby_r0Lj3-pHNiPa0SGE-G8~o_X?EgUu
zcnDO_hE+;2)FZ8lX=-3XUm#La*O1qrQ2On50SeRXG16g$@0_n&LgGYfomdUCZ8b2P
z=ZWyLd#p}(9XaoOh)=4$aF$l0l3;DB_%lc;hTZIPm;l}1){n(K+*~N~jnu;mS>OdH
z8g{tE3I&I$l5}YAY-bWNUAOTl1gL(s}-oN#DubA
z3)qpa1LUk*i{EXek>#Fg1wZe{ShCcqUrZ56C3fu%gVTpr1
zZm%^VnSC>8nB%~{wizQ|Vh&ROn!`=yB7#3YWHyy!kTa>Ad#=w|(jp$UI7`!cZWr;?
zDjoE?_aOSY7BzNGC!H`Wnz}>@zmLx&FYjFTNlk)!f{RhMaWTeRSWf4pxIQwo2V11C
z((qL&TKQuM(v&Yzz@QloaC=ZgFMg7pm?~2Il+oz^8@C4K$;WLQO!f@o^6pNWcRTUTZTHjUq^O{V|d~p^1RGrO>LdfX_F3;G+;l
z9@s^}0S8#Y^l*ABAVdAu;S}!vn1!~VM}&AJRopg(!{K+lr_18#tK~#mswYWj{)9nH
z{U-hXT#jg$4@_K<_b!fhZ?9&A$`X(~R{Pzx@LQO{&0{GZpYwvyX2^LvySjcjw<_x89Xw
z@8f^jgo#Vh_~9jLJu=|6Fp%`bZSZss#-c(>6B5l
z!Lxzg$XQ8}9apga!#(sB9-=-&XPTE1g^PDS;kl^;yp}(}pCn^2?imf3<&jtUGn_w@
z1?`9Tu(fIyeOjCe;bp&gLy3Dh3~VDV?jJztc4_qAxJ3Dbigdwi8TsvYApJM)Oe;zh
z727$zt-1>f_l~1M)3bPcN1fi*Po|{VHtZAUA@S+e1w7LaLs+yJr6u+gZ##FV9IHYy
zx6f7XEB_l%xsYN8`8DY_!R&h4ouol8b0&J?`repK+bu>nf6&
z@h0rPD+bZ1;^!{EH2=iPmV^;GMB1UB&>eoJmi@G5Rewl?I#b2Rt^f-)l)5uxP
z8#_6_cdxM`bgNPi-`yWz+sygckz2r~ugf7p&i`raHqH-Z(-K5Tt-!xO#p&J^DSlMk
zPUo|7Kw3`>%zY8_hr7UJF4F7#jhj;Tdc$S)~}T5`fr
z&91`iSs^-}ro;96Z0dO-L)9p+fa=y0*Ket}T#h3vYuN+0bmn%r+
zVKc6TpJpA>=CEryPr^mvIK4s$S)Y&M(WT#*U>XbicrkL?bOqL4cDUC2iFc2~QF6JN
zYUsxWTq)~@x8^jma5u(XHvuXf69R*d+4S?E63uJcLMJhcQ5CoVYLLQzA40lefMc+y9T{ECrpw<
zv6Rp+4JNS`m{cYvci_K
zf!D9lzs3;y^*OM68%LM6hoSM1Bz2ceqs-eSSU*n(!*>d
zKwZY4QN;PF&u&P^jyHBFar*`NbJO8=u8#G5`vB1>byyZXL0ZcN%$WTPauXghue{l$
zb0QyN%OfFQ>;d)s5Q_AiiKu!-674;V;FD$$f7Xl8Ge_}RIvHBWLLsWjp^D?o$W`t&
ziiOP(S@8;=PH~#4j}KUzK^&BYg>ld000s1(rVXV9NObN-+Eiz_$i1XT94~6$F%zFo
z)-#i9gOK)^P1dr0
z`gqV)8>FbQCX~EamSWmYQ18zX@WvluTQU~Vh<*q5zRjSV{f<;}NPsVrZv@p{U9hws
z#8dm*>_cx6u0+isw__r3)v`lZ{2dI(_i;PI_9TKs2&gxqz#Aj1`GqWWUUFPYuoxnL
z9Yjo&INE0SvM9qK=U`
zVcm-buwbX5r0)u(rNA%z6f@~9!}|-0q#JseEwmIt6mKaqtG?2b`LEH*Od)nbl-!+$
z@FLv|8|O+=krya%+GM(zl1<_^OJO&7fDFPGkW98cY2K9=-X~+qRzb3AO}aRp+i)Erc0p*=??-?Qw-=Of0t-%WqXuNt*?+=m@Vg@2
zF71N8X&JUHT*%=rskEqCg$8F!(O>sCL~?mDqB4zen6d=f<$KT+oI>*k`rtIl5YtCp
z!)6-|3TbSmpRxiJZ@G)E$W~*@3Il5Upn+ss$5J<#;=`p5ly#Qi?6FvQwuHgia3TUf
zjUq^jLi4>Bsnzpo<;TtRw^tq(0e6wcc>#BZJ*4)w2`HJHP5i+Nlz(6hiEWvW#`7RI
zpYzPB;xR&!b?M$!4huUTN6W|ZNO+SS#7os^^~`Kcf9Z|vtSAH)ETI6ihb+`9nY8?X
zAj?+#j_!f(_@yMc#s$0)S<-p9mqyJ0MQzG-N^8kPS-^GV$p}HC@g(P;Xh8~GCQ^{o
z9XN$^K1IK)p>c@wG9NmNM78l0BRd&2sm-kDbrocP6Nzowh~7m~(4O`Keb&uXR2_mR
zwy)7UH^zd&YISc$@m0vvRh2Ba!ms*U5iLZDIjptE|&OsbJmC7qV
zW`-?N*Ws7mjkpcZ(c{a5)2b{sc5e<06xQOlg)aiG^~3xht}Z>{QSf|adi(bb#qV+?
zJx(uG=uiq8hH~$2Rx1{apbK&ITR@oxPQT}s|6@c~2cn5d
z&m+H8LsWdIiCmJ`Q|ZBvyoD_us19?bwsqS{FkBLIj)RC=j{{
zQIl}2(^KMGygxxct)NEtAw1#zX4U>-(2P%y5B*1JbY&mTjDnol8}w3*t@WNF
z*=rlgWRDZNRllIFE|(mhE5l4EfHsVh<8mV|!6`(TdTL}z@#=GU{+&hvvpK%!U;usM
zyl_?W&ZDJ!Ds8>g2xC7vJgS(CPt!Q>wEPe_#~4!MXd$HJOHrEVdTQ3r!MlTDq}^J|
z)%%mw>*7g;D5DP=dAK;u6Q{E8KBqhs)Y#s3@p|NQ^|6Yu|jepoV+pZR1oKl+6e@H^+g
z7sFF)PZH<&JKkI?@>5Ah?+&g<2-JRW|3ZS2^ASHgGp*3d4I8?
z@h?uoc1{UNe+nVLH`7QW@+TUn%0VOUGo2|`r}ba#sCuXrhc<@e+Fd15JZwxdhLzyU
zpJ0yPU!aafQ`}-3x-e-sN0n079!(LDH=LpibywY
zy5jzdHYjuV*By=rQ%RvNm3ovIT4JAFE@ggMkAf~+tU09&hbwbocH7l2zf7!_*@2+nei6ih5A?S_^Si0*Fo+Pul!d
z_!PnA)y(&zgp2va%X&%|#*0!xK@d5INI*`ITOF2Tj5
zbiCA#CP7tKx^gjriYHp|?}kUxhGr2`%lbwoC0bNi?N3vRY%o1oly3Kaho_S?8P4BG
z4MiL1zL5g?mnNg#=Q+KryFso_r|9Q-t{#5kau18{;FB4TLP}O)wpIqG7dU{m3gh_O
zk`^ZJr%yd>ls2O$Zxwa*8d6lR2MLO<
zr^8lbp?S<{73EEMf
zh8Gih@jX3>D%bdukZb{$btyv3-kPL$Cew$%31na#iUOM!p3`*htoc>asY1@rQO=oM
z{#76~y>9TrvdHy*05un?@a4^eaa-aW9_c4icI9pofBXWf9VzthYIS~+PZWC3jfFP9
zoTmO&rFlEg(xUAG7`i-`e8!xlZS!B#pVR8ppV5OziDeY})PUS%$Iv5XJAT|BNlLCr
zM)R+g#P@uGckkut-Omi_So4^@5EA6Or(UJo{z`D!dmo7(b@)nw+mQJF3HFYy=CDi=
za^ieCtqT^BVrmR>n`YA$x{a0My;NlJ0ei2!#5S7@nBH{ZR}62aM#p!w(&Q#-PcY>_
zzr%3Icntk~e3dpYiRI>GC8&XW?rTbDyNw7xs8b*BIR35w+c*?)vy%7zF_iH!3e`Sg
z8AcRy~RQW+64DtXT&j#iNO*^~5JI+Pxs|BfOq%STr$n$*kVxjWc_e9m4a)uVH$
zeO@gM>l@KjbrEO=kHWk>Ybf&WVC9HCy&HbZQb>a^rIq%3h;#nytEhO=ddexf0+sN?
z_*1$Hf?v0j6K$stV`pLfwruJSE2LC;F0boRI=U5%Y5j{t`b^bmo_&dSY^WiDuCJK&
z=O8Q`WeH{TX#AN5>bNnE1Uc@%Zt_~%8>fQ@_s3G`nIuYF9fTNfL8Kl4JEuRN>QX!5
z?-Y!b+1KD%I*q9Ydy%gAEo``Si^(6HicY5%CMa13E1w!%n0ygQo>?TCFG4Y#PhaG@
z6@0I4S0GbhO#KzLB&xfZ<%vCqOV&ixuZjj=Z4>o)Cjke_D11#enQusV<|&0iadVGQTnTRWarMHm>47SQtBa^F3-+kL{4o>AlWNwjaqc@(ZTprMyPFvoWyYb9$M=%_>G
z6<^#~WXU&qkqV!-A|&sQXZ6-*lqEYA?jn;YfB!i4ajODfq}h}ok?uuL?-XLpnFyRiBRm~T-Vg!G6Zs*YDQ}z8v1MT+%|}|`dcB9%P8^u*Mz+FW#|mY0VRz1
z(8Wegiu3x*wskhbbh#kCeI-ufw~iv?YbXoO4PlaH5!mXtlWerSsjSqCS@inRf{zg>
zcdSB|%2G;y*nXCX?dlgE?4oF7_^ok`rWlGe2NP}sY}G(+tkdOjubA5C0K>!Q`E
z%xMZ=zt@;{N|j>0Z5W%rYck0@F>0^;N~N>o=>F2__%m{hFtH56F%#fb{~q6`Or?j#
zzfm`QirQk_=u>b29$^_BWlhGtUT8ethh}zfIVhByNVEHkMFw&!y60zjS|Ca(ee7*XF2zlffkvex)W;BRn
zjE*vuINhbf!*cu-PGgwur$naJ-yo*=k~)|iS!!yL%Ct@hT&uwFj-!;9ScB<_6Zt=9
zr@?5SGfct`P#B3(mvuh1ja8#Dd+}yI2QlG0)((YRjSK3F(+-K1=WC@$S!ZhCY4BdCQ
z1kDv`RG(l&`i6NNk0D9%pR~!vGl^8^UZsJsXOQ+C%TK9_KKd*iX@jL4hOb0|
zzs8dPCPS(fkEge;kLY-xCO<)Z0|g~~hF?}SeVvwq;y>M(BEJqnI=YxIErw><6fD@)
z!~6~y(yfWs6mr>;7DsdY4T;fM*Aqczov9BUW%XC>s|OMC9Uw@@*GicgI2&%R;s2-c1g*I
zcUwf6-!9UJGg9nT339{WZqP^B1=x798ReBMfl6>YR_
z>L`kEQY3{ZG8{*@iy}Yl=I}{nmM9v_E;di2*eORieQ^`3l&Ocso;H%*u?dQ9JZjY0
zM}y-h(mJ;kR@!}yR0M>ut?Vi+x4)#f_c(utJzPfB*;AZ{x(};Yoys59O`;7w*RXTb
zVp4fljw{OD=-R!67Al{|{n`Yo4bP^5ge
zt7kD7^`fl{=hEb7#1~*HJQBS-t?d|-*Oi2{{F=k}@Zy5i~
z;v#NVo5a^@?j*C5uh=dwyEs|o5b8P4<3PK!^w}bxR$Y=NQKK(-x7~nzQ}4k`jMJo?
zd`7)T{AubWC+Lq^!h(MNMX2U2Ahg@^Z5%jqY)gFB;-v1-*)ifsm8>#d*QJwE~vw+^7P^Zx2^&}!Xo!Y|e(6Rns
zy8QSRvV^ty+e8czGunJKdMlo)FdqUDJW@KhRmHv#rN$SpjsMP!;>b`c8+wMUa?Q*9l
z)@jgRpi4H-7t)LUDl{VVolV|3i3*h+ab#5iJ}D=#l)%Yk-&ce#oox6OTG9(a7s?5a
zB&Sv`zd`O7iYJ%xIX_g`FW?00N4wy>{23zimQ#9sCEe0rK~Wj+%wMcnO1?V#Y05@M
zy$M#(+B%-DXn2w2;@4DYGoCNu(aGvkhOlGd0_u^PMn6Nx(#VEmlsij;!_yy7&EGh>
zpfr=ckP+n>2c!vIP+N)pX!Y?;q(lhQP@FF7
zKJLk7W;U>qvtLNEa|V4EOrwkE$I{~kiu}O*<4`)JN}5uSS?+6PI_fCO-_H3+>@k~&
zY0oBNmscn?w!5N8Oq>7vZXIh2FeRIDzTjdWF+6!LY|m}R^l?d)y3CjacC=F7HeTSm3GEKBvBm3O0r~lssgvq$HI@RTaQLNk?(VRe%!&$+`Fktg)_$^CbExJjlRq2
zyUHng@=pYPZ=$K6WzbaaMpK>UBB0BjoUd-6??J9KeBF(@H@h+Kd_I~VMv$4|C)U)E
zi{g{V$hT4$ksPmUIp~js1=*;dZ%CW>CBsW?6;*Yeq`c>{P_Gi_G7P$4a()%xtbZ&9
z9?XZ)QA@Jds>VB~+596O4=K>%4t2l00)s!}=;Vy4{4;5FxUx&1?@xnF$-JDpdX{3(
znr@QY^9kDFlC*Gp3W`quf?MMwy1#uBCbd?e*GLc7VjbD$!YmrrsiE#m*Qs&l3jU;#
z3rM=x2$MNhEGu<3*;>1^oLiZk7WOFTJF$h+;L_GxVwWOwNpn}>K)~+;%@2j>7
z5wVIS-|vWqis_WKLzupge?=8H?~$&HJ3idliqe19V#>Ers=Snl%qNGD7q%ILH8LDF
zRYj`vI}s6g3bj6CNl|$ojQZX1Jo5`Son~aqA4FQwdGb5*jBYrI@LOL^=G(94GE2|C
z!^^bQs0cw-
z*ljeaP37~HxpP0g1)ay0NqFKaO5)C&!KA%t{4|4JCrI&4YQAB^jc|Pa^^0`xrx35K
zmrl7PW1c`fFGlnPB3=Jye@>a(Q>kFL1O7tk_8RiBUr+Bo2vU!-KIuH+GBtVK5QuT$
zKh4Tz+KCgW?$&(%46Pqvt2vwiq8uL@jll#2kLcls>u1dXFjyG+R_cMn9KMWS#+GJUP)dP`VPJrC%)&_b#>tOtu}vnlt{7j~`An4Zt!vuj41uqO6AwmmsQp6yy1WwK?d4LI
z=Ua%hDPIuiWlU=CxcrrEvNXJJ5C*qI`1d!YL*}$H)wNYJ#omLgt?OU*&g?Wr4eFBf
z{B>k;Qh;=$&Vg;;Mf@M@;QDw12`9NyXB9gPKNZ`o*U3vs^WKTPB^vmF+Xhu=*!^@p>-5
z@^uO&rH1p>gSmcFFNqau{(!c&GSX)1L114xGBv#rw`2@I@R~h8!2KE}c>F^rZ=lVdX@
zqnE#F`pKgR9%)5JtsVB3XR{%v%h0zj#9Fr`yn2~UuRGpDcwqzGsh&jE5-(}~yfH9s
z8Nu^axw!3oij7v`e8e`X&@qE?V8_c@yBD9fxU7Z5p+Z!Y)WGUNJE?xmMLwq;65Uyb
z-LW@u#Ca7OqNY;wi&0cAkVi|l#h`l&*E2grLv7l0#LNCeZhqIP<;QXwzV(_8%~d14
z==Uf*b{Dsl2B<=zfa2Y@V`|Jn&Vyc?r1iW|-Na$-e)9a@7wM!Ocm$IBcF>vNUQBqF
z!`cJaQYweN$XauI6-z$T2M1|>!QWP9b^8$U0$shcdX{0odVR+69rhDhlG6#Pt$Qwj)nW>y++0&B0W}`ZZ%-Twt
z)mLf!lnuyeFGf&m9mYSmEU|Bl{8qTD~)%0>_(D
zl|eK37HSZ5SxGa>ZScrA0QZLDu{B+aSkilv(F>zDVksE^R(!aY^Wnv_X`$HO5mbO(udMEUF1=3&Mqq(f`
z8rbe`<#uv*QRuHJ^yr}^f5vWGc%Hll=P~P$SKNrvwh+mr&HcS+pUW!`GL!
z(jIn#I@7~(|I`e+Y_XF1R?A@b8$MK|LME5fI#$YJun_tpUM|u|LYlX
zY8=};@fVx1>xTK}QYAD@_+~D>C60N{Pi4dXuXyU4wOFrj2L`@}BP&b`*CvLLP|_&W
zjCu(p-%8Ybel~M}4@T}!g}w1Tw#i`%z8unK>7v7Ad*X@tja5sTM{Lr6z7)<)cg$>a
zEX=Hehq10KocRimhK{f`)B1e{s^7pA8{T9279Do??_BuR=;6t!NTjqUuz7u{=H5z0
za2c6LmcoO`Tbj=EiusCL15=Q^T$SfoGvz;z9CaTb(wM8yio%wYFqhl>KcCn98S?D=
z=W>?vPbC~Je(>DpzT$;$p2gocOP^`oOU7@PUS29r^D{mVm^<%J;aNIOL+7vm^*_J+
z$c@>3Q-r)(F-y$VLYinM)VA8;lgU!vg04+G4UK&~_ceXYGI}Bm`(4bnN5{gt@gDox
zv;sPp=P~#9$>t)d-qE3-wYA)mQ%t@?Dc@J;R&L_Ol
zQ{vbfjfv&~+A+NJ^C9d;(mhi})igZVtBmMx^~|8}Fh}^0p@vP{c<%;%;agq8^18}t
zC2ME7FOTv9b;H^E(gB{eTnoH!EW_t>e^A7l$oH` |