{"metadata":{"kernelspec":{"language":"python","display_name":"Python 3","name":"python3"},"language_info":{"name":"python","version":"3.10.10","mimetype":"text/x-python","codemirror_mode":{"name":"ipython","version":3},"pygments_lexer":"ipython3","nbconvert_exporter":"python","file_extension":".py"},"kaggle":{"accelerator":"gpu","dataSources":[{"sourceId":52950,"databundleVersionId":5973250,"sourceType":"competition"}],"dockerImageVersionId":30512,"isInternetEnabled":true,"language":"python","sourceType":"notebook","isGpuEnabled":true}},"nbformat_minor":4,"nbformat":4,"cells":[{"cell_type":"markdown","source":"# Google - American Sign Language Fingerspelling Recognition with TensorFlow\n\n這本筆記本將引導你了解如何在本次比賽提供的「Google - 美國手語手指拼字辨識」資料集上使用 TensorFlow 訓練 Transformer 模型。\n\n該模型的目標是預測一組視訊框架中的美國手語 (ASL) 手指拼寫並將其翻譯為文字（短語，phrase）。\n\n在本筆記本中，您將學到：\n\n- 如何載入數據\n- 將資料轉換為 tfrecords，以便更快重新訓練模型\n- 根據資料訓練 transformer 模型\n- 將模型轉換為 TFLite\n- 創建提交","metadata":{}},{"cell_type":"code","source":"LANDMARKS_DIR = '/kaggle/input/asl-fingerspelling/train_landmarks'","metadata":{"execution":{"iopub.status.busy":"2024-08-08T07:19:14.301617Z","iopub.execute_input":"2024-08-08T07:19:14.302938Z","iopub.status.idle":"2024-08-08T07:19:14.307483Z","shell.execute_reply.started":"2024-08-08T07:19:14.302891Z","shell.execute_reply":"2024-08-08T07:19:14.306314Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# 1\\. 準備\n## 1.1 安裝 MediaPipe\n\n特別是對於本次比賽，您將需要 MediaPipe 函式庫來處理資料並將其視覺化","metadata":{}},{"cell_type":"code","source":"!pip install mediapipe","metadata":{"_kg_hide-input":true,"_kg_hide-output":true,"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"## 1.2 載入套件","metadata":{}},{"cell_type":"code","source":"import os\nimport shutil\nimport numpy as np\nimport pandas as pd\nimport pyarrow.parquet as pq\nimport tensorflow as tf\nimport json\nimport mediapipe as mp\n\nimport random\n\nfrom skimage.transform import resize\nfrom mediapipe.framework.formats import landmark_pb2\nfrom tensorflow import keras\nfrom tensorflow.keras import layers\nfrom tqdm.notebook import tqdm\n\nimport matplotlib.pyplot as plt\nfrom matplotlib import animation, rc, rcParams","metadata":{"_uuid":"8f2839f25d086af736a60e9eeb907d3b93b6e0e5","_cell_guid":"b1076dfc-b9ad-4769-8c92-a6c4dae69d19","execution":{"iopub.status.busy":"2024-08-08T07:19:17.03266Z","iopub.execute_input":"2024-08-08T07:19:17.033277Z","iopub.status.idle":"2024-08-08T07:19:17.039144Z","shell.execute_reply.started":"2024-08-08T07:19:17.033244Z","shell.execute_reply":"2024-08-08T07:19:17.038142Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# 2\\. 資料集探索\n## 2.1 載入訓練資料集目錄 `train.csv`","metadata":{}},{"cell_type":"markdown","source":"- 使用 [`pandas.read_csv`](https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.read_csv.html) 載入訓練資料集目錄 `train.csv`\n- 使用 [`pandas.DataFrame.shape`](https://pandas.pydata.org/docs/reference/api/pandas.DataFrame.shape.html) 印出形狀，可知這份目錄由 5 個欄位（colums）和 67208 個索引（indices）組成。","metadata":{}},{"cell_type":"code","source":"dataset_df = pd.read_csv('/kaggle/input/asl-fingerspelling/train.csv')\nprint(\"整組訓練資料集的形狀是 {}\".format(dataset_df.shape))","metadata":{"execution":{"iopub.status.busy":"2024-08-08T07:19:23.351409Z","iopub.execute_input":"2024-08-08T07:19:23.351789Z","iopub.status.idle":"2024-08-08T07:19:23.453951Z","shell.execute_reply.started":"2024-08-08T07:19:23.351752Z","shell.execute_reply":"2024-08-08T07:19:23.453035Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"- 使用 [`pandas.DataFrame.head`](https://pandas.pydata.org/docs/reference/api/pandas.DataFrame.head.html) 印出前 5 列，","metadata":{}},{"cell_type":"code","source":"dataset_df.head()","metadata":{"execution":{"iopub.status.busy":"2024-08-08T07:19:27.711256Z","iopub.execute_input":"2024-08-08T07:19:27.711959Z","iopub.status.idle":"2024-08-08T07:19:27.721671Z","shell.execute_reply.started":"2024-08-08T07:19:27.711927Z","shell.execute_reply":"2024-08-08T07:19:27.720698Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"## 2.2 取出一筆序列資料\n\n**`train.csv`** 中的每一個資料列都有一個 `phrase` 欄位和它的 `sequence_id`、`path`、`file_id` 等欄位。\n- `file_id` 是 landmarks 資料所在的路徑，\n- `sequence_id` 是 landmarks 資料檔案內 landmark 序列的唯一索引。\n\n下圖是一個範例，顯示文件如何連接。\n\n![files2.png|800](attachment:751e38db-4def-4177-bf5b-27071bb1b3e3.png)","metadata":{},"attachments":{"751e38db-4def-4177-bf5b-27071bb1b3e3.png":{"image/png":"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RUXx5ptvMnPmTJo3b87KlSsxGo3a+krjV9rLq9fr+frrr1m6dCk//fQT7733HmPGjMFisWA2mzl//jw9e/bkgw8+oG/fvhQWFvL9998zZcoUvvjiC7799lt69uxJZmYmo0ePRqfTce7cOU6ePMkvv/zyu73JBQUFAFy8eJFZs2axdOlSQkJCOHbsWLnvL3t7e5YuXcrrr7/ORx99xOzZszl69CgXL14kLi6OvXv3MnToUHr16oVer8fe3p5vv/2WatWq8a9//YvWrVvTvHlz3nrrLW2ddnZ27N69m/HjxzN9+nS+++47nnnmGRITE9Hr9VqZt7e3Z82aNQwbNozFixfz6aefcuDAASIiIjh79ixbt27lzTffpHHjxtp6V65cSZUqVfjkk09Yvnw5Z8+e1abzrFq1ijp16vxumdLpdFy6dIlp06Yxd+5cWrduzZYtWyrUcXL16lV69erFli1b+P7771mxYgV2dnY4Ozvz3nvv8fLLLxMQEMDWrVtJTEzExcWFzz77jJEjR/Lkk0/y5Zdf8vDDD7NhwwaaN2/OP//5T2w2GwMHDuS9995j165dXL16lcTERBITE+nTpw8fffQR+/btY+DAgb/boBPibjNICMTf7fHHHycgIIBevXpx48YN3NzcePvtt7XWva+vL6mpqQQEBABQv3597bOhoaG89dZbREZG8vHHH8uQeumBajBQp04dXFxcCA4O5tq1a2Xe9/X1JTo6muTkZPr164eLiwv9+/dn3rx59O7dm5CQkN9d9/bt22nWrBkDBw6kWrVqTJw48U/PCb5fKIpCixYtePXVVwkODmbw4MFUr16dc+fOAeDv70+NGjUYNmwYGzduRKfTERoayuDBgwkKCuLChQtl5nSWJjSlf+t0OpYtW0afPn1o2bIlBQUFHD16FKvViqqqtGzZkmeeeYbw8HCtF3bdunX06NGDl156ieLiYlq1akVaWhpZWVl06dIFT09Phg0bxsqVK2nXrt0t0xbK9FLodGzZsoV+/frRp08fHBwcOHToULkfKyUlJUyZMoX69evj6+vLrFmzCA8PZ/z48SxcuBBXV1fc3Ny03nWr1crw4cN5/vnn8fPzw9PTk7y8PB566CEiIyO1xsTevXsBeP3117FarURGRhIQEKD1lJeua+zYsYSGhlKnTh2WL1/OgQMHmD59OosXL8bV1ZWTJ0+W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+J1x48aRmZnJnDlzMJlMzJgxw/jZoUOHAIiPjzdea9GiBXFxcQC89957xuuffPLJr96nb/fu3fTq1QuXy8WhQ4eM3/v444+1l/4PEydO5OTJk7z33nvs3LmTsLAwWrVqRZUqVXjnnXfYv3+/UZ5+fn5kZWVx+fJlTCYTDz/8MN27d8dkMhEZGUn16tUxmUysWLECgBMnTlCnTh18fX3p2LGjUefy+zgcDubNm4fJZCIhIYEVK1ZgMplYunTpNd+/YsUKJk6cyIkTJ/jyyy85ePAgI0eONOpz/vz5AFy8eJGxY8de9XpkZCSenp6YTCbCwsLIzc29brty5swZAJ555hmef/55AKKiokpWAd/mQczU1FQeeOABunXrht1u5+WXX6Z27docPXr0qvfm5OTw3XffMXv2bL7++mu+/PJLjhw5YtRZs2bNjDqIjY01Xu/cuTMnTpwA4LXXXjNe//bbb3+1Q1u9enWOHz+up0WKSMkMvHa7naeffpr33nuP9evX06xZM+NRuJGRkezcuZMFCxbQvn178vPzGT9+PG3btmXLli3cf//9wM9PnypTpgz33nuv0Xg2atQIb29vrFYrLVu2ZNKkSRw9epTjx4+zf/9+PDw88PHxISEhgZ07d+Lm5mY8ErJ3794MGDCAvXv30qdPH3bv3s28efN49tlnWb58Ofv37+epp55i9+7d1/1eFsvPD70zm800bNiQkSNHEh0draed3YDXX38dgBkzZjB06FBatWrFnj17+PTTT+nRowe7du1i/vz5bNu2jcDAQD766CM8PT2Bn59aFR4eTo8ePejSpQsLFizgoYceYvXq1aSlpfHmm29StWpVDh06RPv27VmxYoVOoH+Am5sb/fr147HHHmPZsmV89NFHvPTSSwwePPia7+/WrRvh4eH079+f1157jbS0NOrXr098fDzh4eEsWrSI5ORkli1bRkREBHv27GHGjBls376ddevW8e9//5sPP/yQkydPcvr0aaZPn37dIH706FH69++PyWSiUqVK1KxZk5MnT/62L3iHTcRUrlyZp59+mg0bNrBs2TLeeOMNPvvsM+rVq3fVe8uUKcOgQYMIDQ3l7bff5p///Cc//fQTERER7Ny5E09PTzZu3IjVaqVx48Y8+OCD7N69m9atW7N7926++eYbXn31VdasWUN0dDSjR4/m8OHD1/1sAwcO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/f18fHz48MMPefzxx42RmKysLPbt20e9evUICAigX79+REZGYjab6dKlC2+++SYVKlTAZPq5B5KXl4fZbOYvf/kLHTp0wG634+npSZUqVahatSply5YlLi6OiIgIAL777jtGjRpFcHAwPXr0YN68eQC8++67PP/88wQHB/P1119Tt25d43M+++yzvPnmmzidTgCqVq3K119/TY0aNejYsSO7du3i8uXLBAQE8P333+Pj42N8vuLcWyqJMjMz+eGHH3jhhRdo2LAh999/Pxs3bsRms6lwbpPs7Gw8PT3p1KkTLVq0ICwsjAULFhR5j7+/P1WrViUwMJDNmzczfPhwatasSZkyZfjvf/9Lp06djGPk9OnTnD17lk6dOlGnTh3efPNN1q5di8lkolq1atSsWZPAwEACAwNxd3cnJyeHLl26EBwcTEhICLt27eL48ePs2LGDe++9l4oVKxISEsKPP/6o8ZUbEB0dzfvvv2/MbJ08eZK4uLgi7/noo48YOXIkwcHBvPLKK/Tv35+UlBQ2btzIhAkTaNKkCY888ggHDhxgyZIlPPjggzRo0IBWrVpx9uxZ0tLSiIqK4oMPPqBmzZr069ePn376iZSUFFwuF/Xr1zfabF9fX2w2G926dWPcuHFUrlxZB538KZKSkhg3bhx9+/bl9ddfZ+fOnXz++efFa0bxDooXJTrwFp4Ar+Tr60vr1q05ffo0VquVFStWEBYWhslkonr16nh7exvBE+DSpUtER0cTHh6OyWTiyy+/vGr0ws3NjYCAAADc3NyMdWPu7u7s37+fS5cucezYMb7++mtMJhPPP/886enpAEyfPp2uXbvSo0cPI1T179+f6tWrk5mZyerVq+nRowf+/v40atQIi8XyP9alyR9x9OhRatWqZfx/uXLliIuLw263q3BuE4fDQZ06dfD39wegfv36VwWkQgUFBXz22WfGiEi9evWuOlnk5uYSFBRkvN64cWPS0tIwmUwsW7aMbt264evryyuvvAKAt7c3P/74I8nJyezatYuaNWtSv359QkNDSUhIoKCggOjoaIYMGaLKusEOTJMmTTCZTFgsFmrXrm20f4XmzJnDtm3bCAoKonv37qSkpODm5lakLbZYLMTHx5Ofn2+0gWazGZvNht1ux2w2G6+bTCYSEhLIy8vD19eXCRMmUL9+ffr06cOBAwdwd3cnKCgI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"}}},{"cell_type":"markdown","source":"使用 [`pandas.DataFrame.iloc`](https://pandas.pydata.org/docs/reference/api/pandas.DataFrame.iloc.html) 取出「`train.csv`」第一個資料列的 landmark 檔案，作為示範。","metadata":{}},{"cell_type":"code","source":"class SequenceSample():\n    def __init__(self, sample_index):\n        sequence_df = dataset_df.iloc[sample_index]\n        self.name = f'Sequence {sample_index:04d}'\n        self.sequence_id = sequence_df['sequence_id']\n        self.file_id = sequence_df['file_id']\n        self.phrase = sequence_df['phrase']\n\n    def get_path(self):\n        return os.path.join(LANDMARKS_DIR, f'{self.file_id}.parquet')\n\n    def get_df(self):\n        # 獲取 Parquet 檔案的路徑\n        pq_source = self.get_path()\n        \n        # 設置過濾條件，以過濾出對應 sequence_id 的數據\n        pq_filter = [[('sequence_id', '=', self.sequence_id)],]\n        \n        # 讀取並過濾 Parquet 檔案，返回 Pandas DataFrame\n        pq_table = pq.read_table(pq_source, filters = pq_filter)\n        return pq_table.to_pandas()\n\n# 創建索引為0的序列樣本\nsample_sequence = SequenceSample(0)\n\n# 查看序列樣本的屬性\nsample_sequence.__dict__","metadata":{"execution":{"iopub.status.busy":"2024-08-08T07:19:54.689046Z","iopub.execute_input":"2024-08-08T07:19:54.689713Z","iopub.status.idle":"2024-08-08T07:19:54.699823Z","shell.execute_reply.started":"2024-08-08T07:19:54.689675Z","shell.execute_reply":"2024-08-08T07:19:54.698975Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"現在，我們打開 parquet 檔案並獲取特定 `sequence_id` 的資料。\n- 使用 [`pyarrow.parquet.read_table`](https://arrow.apache.org/docs/python/generated/pyarrow.parquet.read_table.html) 將 parquet 檔案轉換成表格（pyarrow.Table）。\n- 使用 [`pyarrow.Table.to_pandas`](https://arrow.apache.org/docs/python/generated/pyarrow.Table.html#pyarrow.Table.to_pandas) 將表格轉換成 pandas.DataFrame。\n- 使用 [`pandas.DataFrame.head`](https://pandas.pydata.org/docs/reference/api/pandas.DataFrame.head.html) 印出前 5 列。","metadata":{}},{"cell_type":"code","source":"sample_sequence_df = sample_sequence.get_df()\nprint(sample_sequence_df.shape)\nsample_sequence_df.head()","metadata":{"execution":{"iopub.status.busy":"2024-08-08T07:19:56.008857Z","iopub.execute_input":"2024-08-08T07:19:56.009552Z","iopub.status.idle":"2024-08-08T07:19:57.539564Z","shell.execute_reply.started":"2024-08-08T07:19:56.009519Z","shell.execute_reply":"2024-08-08T07:19:57.5386Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"由此可知，「***3 creekhouse***」這個詞組包含 \n- 123 列，也就是有 123 個影格（frame）\n- 1630 欄，包含序列編號（`sequence_id`）、影格編號（`frame`），以及每張影格的 1628 個 landmark 座標。","metadata":{}},{"cell_type":"markdown","source":"## 2.3 使用 MediaPipe API 進行資料視覺化\n\n- 選擇詞組「***3 Creek house***」的手部 landmark 數據。\n- 使用 [MediaPipe](https://developers.google.com/mediapipe) 的 [hand landmarker API](https://developers.google.com/mediapipe/solutions/vision/hand_landmarker) 命令來對這筆資料進行視覺化。\n- 在 MediaPipe 中，一隻手有 21 個關鍵點（如下圖）。\n- 參考：[Data visualization using mediapipe APIs by sknadig](https://www.kaggle.com/code/nadigshreekanth/data-visualization-using-mediapipe-apis)","metadata":{}},{"cell_type":"markdown","source":"![hand-landmarks.png](https://ai.google.dev/static/mediapipe/images/solutions/hand-landmarks.png)\n圖源: https://developers.google.com/mediapipe/solutions/vision/hand_landmarker","metadata":{"execution":{"iopub.status.busy":"2024-08-08T04:36:28.636829Z","iopub.execute_input":"2024-08-08T04:36:28.637501Z","iopub.status.idle":"2024-08-08T04:36:29.700724Z","shell.execute_reply.started":"2024-08-08T04:36:28.637461Z","shell.execute_reply":"2024-08-08T04:36:29.699721Z"}}},{"cell_type":"code","source":"# 使用 MediaPipe 函式庫提取雙手的 landmark 資料\n\n# 載入 MediaPipe 的姿勢和手部偵測模型以及繪圖工具\nmp_pose = mp.solutions.pose\nmp_hands = mp.solutions.hands\nmp_drawing = mp.solutions.drawing_utils \nmp_styles = mp.solutions.drawing_styles\ndefault_style = mp_styles.get_default_hand_landmarks_style()\n\ndef extract_landmarks(keypoint: pd.Series, part: str) -> tuple:\n    \"\"\"從序列資料中的資料列提取單隻手的 landmark 資料並繪製在圖像上。\n\n    Parameters\n        keypoint (pd.Series): 包含 landmark 資料的資料列\n        part (str): 指定手部的部位 ('right_hand' 或 'left_hand')\n\n    Returns\n        tuple: 圖像 list 與 landmark list\n    \"\"\"\n    \n    # 取得對應部位的 x, y, z 座標\n    xs = keypoint.filter(regex=f\"x_{part}.*\").values\n    ys = keypoint.filter(regex=f\"y_{part}.*\").values\n    zs = keypoint.filter(regex=f\"z_{part}.*\").values\n\n     # 初始化空白圖像和 landmark 列表\n    image = np.zeros((600, 600, 3))\n    landmarks = landmark_pb2.NormalizedLandmarkList()\n\n    # 加入 landmark 資料\n    for x, y, z in zip(xs, ys, zs):\n        landmarks.landmark.add(x=x, y=y, z=z)\n\n    # 繪製 landmark 到圖像上\n    mp_drawing.draw_landmarks(\n            image,\n            landmarks,\n            mp_hands.HAND_CONNECTIONS,\n            landmark_drawing_spec = default_style)\n\n    return image, landmarks\n\ndef get_both_hands(seq_df: pd.DataFrame) -> tuple:\n    \"\"\"從序列資料提取雙手的 landmark 資料並繪製在圖像上。\n\n    Parameters\n        seq_df (pd.DataFrame): 包含序列資料的資料框\n\n    Returns\n        tuple: 圖像 list 與 landmark list\n    \"\"\"\n    images = []\n    landmarks = []\n    \n    # 遍歷序列中的每一列資料\n    for seq_idx in range(len(seq_df)):\n        keypoints = seq_df.iloc[seq_idx]\n        \n        # 提取右手和左手的 landmark 資料\n        results_R = extract_landmarks(keypoints, 'right_hand')\n        results_L = extract_landmarks(keypoints, 'left_hand')\n        \n        # 儲存圖像和 landmark 資料\n        images.append([results_R[0].astype(np.uint8), \n                       results_L[0].astype(np.uint8)])\n\n        landmarks.append([results_R[1], results_L[1]])\n\n    return images, landmarks","metadata":{"execution":{"iopub.status.busy":"2024-08-08T07:19:57.6427Z","iopub.execute_input":"2024-08-08T07:19:57.64355Z","iopub.status.idle":"2024-08-08T07:19:57.654596Z","shell.execute_reply.started":"2024-08-08T07:19:57.643512Z","shell.execute_reply":"2024-08-08T07:19:57.653599Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"使用 [Matplotlib](https://matplotlib.org/) ，由圖片集創建動畫。\n\n參考\n- [`matplotlib.rcParams`](https://matplotlib.org/stable/api/matplotlib_configuration_api.html#matplotlib.rcParams) \n- [`matplotlib.animation.FuncAnimation`](https://matplotlib.org/stable/api/_as_gen/matplotlib.animation.FuncAnimation.html)\n- [Embedding Matplotlib Animations in Python (google colab notebook)](https://stackoverflow.com/questions/61103994/embedding-matplotlib-animations-in-python-google-colab-notebook)","metadata":{}},{"cell_type":"code","source":"# 設定動畫嵌入的大小限制為 2^128\nrcParams['animation.embed_limit'] = 2**128\n\n# 設定保存圖像時的填充寬度為 0\nrcParams['savefig.pad_inches'] = 0\n\n# 設定動畫的 HTML 格式為 'jshtml'\nrc('animation', html='jshtml')\n\ndef create_animation(images):\n    # 創建一個 6x9 英寸的圖像\n    fig = plt.figure(figsize=(6, 9))\n    \n    # 添加 Axes 物件，填滿整個圖像區域\n    # 但不顯示 x 軸、y 軸\n    ax = plt.Axes(fig, [0., 0., 1., 1.])\n    ax.set_axis_off()\n    fig.add_axes(ax)\n    \n    # 顯示第一張圖片，使用灰度色圖\n    im = ax.imshow(images[0], cmap=\"gray\")\n    \n    # 關閉圖像顯示，以便動畫在背景中運行\n    plt.close(fig)\n\n    # 動畫函數，根據目前的影格索引更新圖像。\n    def animate_func(frame_idx: int):\n        im.set_array(images[frame_idx])\n        return [im]\n    \n    # 創建動畫，間隔為每秒 10 影格 (1000 ms / 10)\n    anim = animation.FuncAnimation(\n        fig, \n        animate_func, \n        frames=len(images), \n        interval=1000/10\n    )\n\n    return anim","metadata":{"execution":{"iopub.status.busy":"2024-08-08T07:19:58.045482Z","iopub.execute_input":"2024-08-08T07:19:58.045985Z","iopub.status.idle":"2024-08-08T07:19:58.057482Z","shell.execute_reply.started":"2024-08-08T07:19:58.045949Z","shell.execute_reply":"2024-08-08T07:19:58.056689Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# 使用\nhand_images, hand_landmarks = get_both_hands(sample_sequence_df)\n\n# 顯示右手圖像\ncreate_animation(np.array(hand_images)[:, 0])","metadata":{"execution":{"iopub.status.busy":"2024-08-08T07:19:58.409736Z","iopub.execute_input":"2024-08-08T07:19:58.410081Z","iopub.status.idle":"2024-08-08T07:20:09.289596Z","shell.execute_reply.started":"2024-08-08T07:19:58.410056Z","shell.execute_reply":"2024-08-08T07:20:09.28872Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# 3\\. 資料預處理\n\n為了方便和效率起見，我們將重組數據，使得每個 parquet 檔案包含 landmarks 數據及其代表的詞組。這樣我們就不必在 `train.csv` 及它的 parquet 檔案之間切換。\n\n我們將以 [TFRecord](https://www.tensorflow.org/tutorials/load_data/tfrecord) 格式儲存新資料。TFRecord 格式是一種簡單格式，專門用來儲存二進位記錄序列。使用 TFRecord 儲存和載入資料更加高效和快速。\n\n參考：\n- https://www.kaggle.com/code/irohith/aslfr-preprocess-dataset\n- https://www.kaggle.com/code/shlomoron/aslfr-parquets-to-tfrecords-cleaned","metadata":{}},{"cell_type":"markdown","source":"ASL-Fingerspelling 主要關注手部動作。因此，我們將採用手部的 landmark 座標和 pose landmark 座標來訓練模型。","metadata":{}},{"cell_type":"markdown","source":"## 3.1 取得與手部運動相關的 pose landmark 座標。","metadata":{}},{"cell_type":"markdown","source":"這張圖說明了與手部運動相關的 pose landmark。\npose landmark 也來自 parquet 檔案。\n\n\n![pose.png](attachment:1389643c-6068-4c7d-9275-0b42f25b836e.png)\n\n[Image source](https://developers.google.com/mediapipe/solutions/vision/pose_landmarker)","metadata":{},"attachments":{"1389643c-6068-4c7d-9275-0b42f25b836e.png":{"image/png":"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"}}},{"cell_type":"markdown","source":"## 3.2 提取關鍵點座標的標籤與索引值","metadata":{}},{"cell_type":"code","source":"# 手部運動的姿勢座標\nLPOSE = [13, 15, 17, 19, 21]\nRPOSE = [14, 16, 18, 20, 22]\nPOSE = LPOSE + RPOSE\n\ndef get_labels_of(ax):\n    labels = (\n        [f'{ax}_right_hand_{i}' for i in range(21)] +\n        [f'{ax}_left_hand_{i}' for i in range(21)] +\n        [f'{ax}_pose_{i}' for i in POSE]\n    )\n    return labels\n\n# x, y, z 軸的標籤\nx_labels = get_labels_of('x')\ny_labels = get_labels_of('y')\nz_labels = get_labels_of('z')\n\n# 所有軸的標籤，也就是待訓練的特徵\nfeatures = x_labels + y_labels + z_labels","metadata":{"execution":{"iopub.status.busy":"2024-08-08T07:25:18.393187Z","iopub.execute_input":"2024-08-08T07:25:18.393777Z","iopub.status.idle":"2024-08-08T07:25:18.400199Z","shell.execute_reply.started":"2024-08-08T07:25:18.39374Z","shell.execute_reply":"2024-08-08T07:25:18.399302Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# 快速查看 list 的頭尾和長度\ndef glance(li, Nhead=2, Ntail=1):\n    head = str(li[:Nhead])[:-1] \n    body = ', ... ,'\n    tail = str(li[-Ntail:])[1:]\n    length = len(li)\n    return f'{head + body + tail}, len = {length}'\n\n# 預覽標籤列表\nprint('x_labels:', glance(x_labels))\nprint('y_labels:', glance(x_labels))\nprint('z_labels:', glance(x_labels))\nprint('features:', glance(features))","metadata":{"execution":{"iopub.status.busy":"2024-08-08T07:25:08.538051Z","iopub.execute_input":"2024-08-08T07:25:08.538402Z","iopub.status.idle":"2024-08-08T07:25:08.545283Z","shell.execute_reply.started":"2024-08-08T07:25:08.538376Z","shell.execute_reply":"2024-08-08T07:25:08.544422Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# 從 features 中提取標籤的索引值\ndef extract_idx_by(pattern, labels=features, pose=None):   \n    if not pose:\n        indices = [i for i, col in enumerate(labels) \n                   if pattern in col]\n    else:\n        indices = [i for i, col in enumerate(labels) \n                   if pattern in col and int(col[-2:]) in pose]\n    return indices\n\nX_IDX = extract_idx_by(\"x_\")\nY_IDX = extract_idx_by(\"y_\")\nZ_IDX = extract_idx_by(\"z_\")\nRHAND_IDX = extract_idx_by(\"right\")\nLHAND_IDX = extract_idx_by(\"left\")\nRPOSE_IDX = extract_idx_by(\"pose\", pose = RPOSE)\nLPOSE_IDX = extract_idx_by(\"pose\", pose = LPOSE)\n\nprint('X_IDX:', glance(X_IDX))\nprint('Y_IDX:', glance(Y_IDX))\nprint('Z_IDX:', glance(Z_IDX))\nprint('RHAND_IDX:', glance(RHAND_IDX))\nprint('LHAND_IDX:', glance(LHAND_IDX))\nprint('RPOSE_IDX:', glance(RPOSE_IDX))\nprint('LPOSE_IDX:', glance(LPOSE_IDX))","metadata":{"execution":{"iopub.status.busy":"2024-08-08T07:27:25.911042Z","iopub.execute_input":"2024-08-08T07:27:25.911399Z","iopub.status.idle":"2024-08-08T07:27:25.920798Z","shell.execute_reply.started":"2024-08-08T07:27:25.911371Z","shell.execute_reply":"2024-08-08T07:27:25.919968Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"","metadata":{"execution":{"iopub.status.busy":"2024-08-08T07:21:05.951035Z","iopub.execute_input":"2024-08-08T07:21:05.951776Z","iopub.status.idle":"2024-08-08T07:21:05.956414Z","shell.execute_reply.started":"2024-08-08T07:21:05.951747Z","shell.execute_reply":"2024-08-08T07:21:05.955702Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"## 3.3 預處理資料集並將其寫入 TFRecords","metadata":{}},{"cell_type":"markdown","source":"使用提取的 landmark 和 phrase，我們可以建立新的資料集檔案並將它們寫入 TFRecords。\n\n這大約需要 10 分鐘。此後，對於未來的實驗來說，載入資料集將會更快。","metadata":{}},{"cell_type":"markdown","source":"要處理的 parquet 檔案有這些：","metadata":{}},{"cell_type":"code","source":"file_id_list = dataset_df.file_id.unique()\nprint(file_id_list)","metadata":{"execution":{"iopub.status.busy":"2024-08-08T07:11:23.817669Z","iopub.execute_input":"2024-08-08T07:11:23.818037Z","iopub.status.idle":"2024-08-08T07:11:23.82392Z","shell.execute_reply.started":"2024-08-08T07:11:23.81801Z","shell.execute_reply":"2024-08-08T07:11:23.822939Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# 設置影格的長度為 128\nFRAME_LEN = 128\n\n# 創建目錄以儲存新資料\nif not os.path.isdir(\"preprocessed\"):\n    os.mkdir(\"preprocessed\")\nelse:\n    shutil.rmtree(\"preprocessed\")\n    os.mkdir(\"preprocessed\")\n\n\n# 遍歷 file_id_list 中的每個 file_id\n# 由於是對 file_id 遍歷，所以不能使用上面定義的 SequenceSample 類別\nfor file_id in tqdm(file_id_list):\n    # Parquet文件名\n    pq_file = os.path.join(LANDMARKS_DIR, f'{file_id}.parquet')\n    \n    # 過濾 train.csv，只獲取 file_id 相同的資料列\n    file_df = dataset_df.loc[dataset_df['file_id'] == file_id]\n    \n    # 獲取 Parquet 文件\n    col = ['sequence_id']　+ FEATURE_COLUMNS\n    pq_df = pq.read_table(pq_file, columns = col).to_pandas()\n    \n    # 更新數據的文件名\n    tf_file = f'preprocessed/{file_id}.tfrecord'\n    pq_np = pq_df.to_numpy()\n    \n    # 上下文管理器，將每個以下 for 循環的輸出作為序列寫入文件中\n    with tf.io.TFRecordWriter(tf_file) as file_writer:\n        \n        # 遍歷文件中的每個序列\n        for seq_id, phrase in zip(file_df.sequence_id, file_df.phrase):\n            # 獲取序列數據\n            frames = parquet_numpy[parquet_df.index == seq_id]\n            \n            # 計算每個手部標誌中的NaN值數量\n            r_nonan = np.sum(np.sum(np.isnan(frames[:, RHAND_IDX]), axis=1) == 0)\n            l_nonan = np.sum(np.sum(np.isnan(frames[:, LHAND_IDX]), axis=1) == 0)\n            no_nan = max(r_nonan, l_nonan)\n            \n            if 2 * len(phrase) < no_nan:\n                features = {FEATURE_COLUMNS[i]: tf.train.Feature(\n                    float_list=tf.train.FloatList(value=frames[:, i])) for i in range(len(FEATURE_COLUMNS))}\n                features[\"phrase\"] = tf.train.Feature(bytes_list=tf.train.BytesList(value=[bytes(phrase, 'utf-8')]))\n                record_bytes = tf.train.Example(features=tf.train.Features(feature=features)).SerializeToString()\n                file_writer.write(record_bytes)\n","metadata":{"execution":{"iopub.status.busy":"2024-08-07T09:04:34.293816Z","iopub.execute_input":"2024-08-07T09:04:34.29424Z","iopub.status.idle":"2024-08-07T09:14:00.621091Z","shell.execute_reply.started":"2024-08-07T09:04:34.294204Z","shell.execute_reply":"2024-08-07T09:14:00.620101Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":" Load the preprocessed data","metadata":{}},{"cell_type":"markdown","source":"## 3.4 Get the saved TFRecord files into a list","metadata":{}},{"cell_type":"code","source":"tf_records = dataset_df.file_id.map(lambda x: f'/kaggle/working/preprocessed/{x}.tfrecord').unique()\nprint(f\"List of {len(tf_records)} TFRecord files.\")","metadata":{"execution":{"iopub.status.busy":"2023-07-04T12:28:54.269827Z","iopub.execute_input":"2023-07-04T12:28:54.270876Z","iopub.status.idle":"2023-07-04T12:28:54.329602Z","shell.execute_reply.started":"2023-07-04T12:28:54.270838Z","shell.execute_reply":"2023-07-04T12:28:54.328666Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"## 3.4 載入 `character_to_prediction.json`","metadata":{}},{"cell_type":"markdown","source":"This json file contains a character and its value. We will add three new characters, \"<\" and \">\" to mark the start and end of each phrase, and \"P\" for padding.","metadata":{}},{"cell_type":"markdown","source":"","metadata":{}},{"cell_type":"code","source":"with open (\"/kaggle/input/asl-fingerspelling/character_to_prediction_index.json\", \"r\") as f:\n    char_to_num = json.load(f)\n\n# Add pad_token, start pointer and end pointer to the dict\npad_token = 'P'\nstart_token = '<'\nend_token = '>'\npad_token_idx = 59\nstart_token_idx = 60\nend_token_idx = 61\n\nchar_to_num[pad_token] = pad_token_idx\nchar_to_num[start_token] = start_token_idx\nchar_to_num[end_token] = end_token_idx\nnum_to_char = {j:i for i,j in char_to_num.items()}","metadata":{"execution":{"iopub.status.busy":"2023-07-04T12:28:54.331015Z","iopub.execute_input":"2023-07-04T12:28:54.331597Z","iopub.status.idle":"2023-07-04T12:28:54.356079Z","shell.execute_reply.started":"2023-07-04T12:28:54.331564Z","shell.execute_reply":"2023-07-04T12:28:54.355235Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# Reference: https://www.kaggle.com/code/irohith/aslfr-transformer/notebook\n\n# Function to resize and add padding.\ndef resize_pad(x):\n    if tf.shape(x)[0] < FRAME_LEN:\n        x = tf.pad(x, ([[0, FRAME_LEN-tf.shape(x)[0]], [0, 0], [0, 0]]))\n    else:\n        x = tf.image.resize(x, (FRAME_LEN, tf.shape(x)[1]))\n    return x\n\n# Detect the dominant hand from the number of NaN values.\n# Dominant hand will have less NaN values since it is in frame moving.\ndef pre_process(x):\n    rhand = tf.gather(x, RHAND_IDX, axis=1)\n    lhand = tf.gather(x, LHAND_IDX, axis=1)\n    rpose = tf.gather(x, RPOSE_IDX, axis=1)\n    lpose = tf.gather(x, LPOSE_IDX, axis=1)\n    \n    rnan_idx = tf.reduce_any(tf.math.is_nan(rhand), axis=1)\n    lnan_idx = tf.reduce_any(tf.math.is_nan(lhand), axis=1)\n    \n    rnans = tf.math.count_nonzero(rnan_idx)\n    lnans = tf.math.count_nonzero(lnan_idx)\n    \n    # For dominant hand\n    if rnans > lnans:\n        hand = lhand\n        pose = lpose\n        \n        hand_x = hand[:, 0*(len(LHAND_IDX)//3) : 1*(len(LHAND_IDX)//3)]\n        hand_y = hand[:, 1*(len(LHAND_IDX)//3) : 2*(len(LHAND_IDX)//3)]\n        hand_z = hand[:, 2*(len(LHAND_IDX)//3) : 3*(len(LHAND_IDX)//3)]\n        hand = tf.concat([1-hand_x, hand_y, hand_z], axis=1)\n        \n        pose_x = pose[:, 0*(len(LPOSE_IDX)//3) : 1*(len(LPOSE_IDX)//3)]\n        pose_y = pose[:, 1*(len(LPOSE_IDX)//3) : 2*(len(LPOSE_IDX)//3)]\n        pose_z = pose[:, 2*(len(LPOSE_IDX)//3) : 3*(len(LPOSE_IDX)//3)]\n        pose = tf.concat([1-pose_x, pose_y, pose_z], axis=1)\n    else:\n        hand = rhand\n        pose = rpose\n    \n    hand_x = hand[:, 0*(len(LHAND_IDX)//3) : 1*(len(LHAND_IDX)//3)]\n    hand_y = hand[:, 1*(len(LHAND_IDX)//3) : 2*(len(LHAND_IDX)//3)]\n    hand_z = hand[:, 2*(len(LHAND_IDX)//3) : 3*(len(LHAND_IDX)//3)]\n    hand = tf.concat([hand_x[..., tf.newaxis], hand_y[..., tf.newaxis], hand_z[..., tf.newaxis]], axis=-1)\n    \n    mean = tf.math.reduce_mean(hand, axis=1)[:, tf.newaxis, :]\n    std = tf.math.reduce_std(hand, axis=1)[:, tf.newaxis, :]\n    hand = (hand - mean) / std\n\n    pose_x = pose[:, 0*(len(LPOSE_IDX)//3) : 1*(len(LPOSE_IDX)//3)]\n    pose_y = pose[:, 1*(len(LPOSE_IDX)//3) : 2*(len(LPOSE_IDX)//3)]\n    pose_z = pose[:, 2*(len(LPOSE_IDX)//3) : 3*(len(LPOSE_IDX)//3)]\n    pose = tf.concat([pose_x[..., tf.newaxis], pose_y[..., tf.newaxis], pose_z[..., tf.newaxis]], axis=-1)\n    \n    x = tf.concat([hand, pose], axis=1)\n    x = resize_pad(x)\n    \n    x = tf.where(tf.math.is_nan(x), tf.zeros_like(x), x)\n    x = tf.reshape(x, (FRAME_LEN, len(LHAND_IDX) + len(LPOSE_IDX)))\n    return x","metadata":{"execution":{"iopub.status.busy":"2023-07-04T12:28:54.357552Z","iopub.execute_input":"2023-07-04T12:28:54.357878Z","iopub.status.idle":"2023-07-04T12:28:54.377004Z","shell.execute_reply.started":"2023-07-04T12:28:54.357848Z","shell.execute_reply":"2023-07-04T12:28:54.375972Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"## 3.5 Create function to parse data from TFRecord format\n\nThis function will read the `TFRecord` data and convert it to Tensors.","metadata":{}},{"cell_type":"code","source":"def decode_fn(record_bytes):\n    schema = {COL: tf.io.VarLenFeature(dtype=tf.float32) for COL in FEATURE_COLUMNS}\n    schema[\"phrase\"] = tf.io.FixedLenFeature([], dtype=tf.string)\n    features = tf.io.parse_single_example(record_bytes, schema)\n    phrase = features[\"phrase\"]\n    landmarks = ([tf.sparse.to_dense(features[COL]) for COL in FEATURE_COLUMNS])\n    # Transpose to maintain the original shape of landmarks data.\n    landmarks = tf.transpose(landmarks)\n    \n    return landmarks, phrase","metadata":{"execution":{"iopub.status.busy":"2023-07-04T12:28:54.378597Z","iopub.execute_input":"2023-07-04T12:28:54.379078Z","iopub.status.idle":"2023-07-04T12:28:54.388933Z","shell.execute_reply.started":"2023-07-04T12:28:54.379047Z","shell.execute_reply":"2023-07-04T12:28:54.387959Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"## 3.6 Create function to convert the data \n\nThis function transposes and applies masks to the landmark coordinates. It also vectorizes the phrase corresponding to the landmarks using `character_to_prediction_index.json`.","metadata":{}},{"cell_type":"code","source":"table = tf.lookup.StaticHashTable(\n    initializer=tf.lookup.KeyValueTensorInitializer(\n        keys=list(char_to_num.keys()),\n        values=list(char_to_num.values()),\n    ),\n    default_value=tf.constant(-1),\n    name=\"class_weight\"\n)\n\ndef convert_fn(landmarks, phrase):\n    # Add start and end pointers to phrase.\n    phrase = start_token + phrase + end_token\n    phrase = tf.strings.bytes_split(phrase)\n    phrase = table.lookup(phrase)\n    # Vectorize and add padding.\n    phrase = tf.pad(phrase, paddings=[[0, 64 - tf.shape(phrase)[0]]], mode = 'CONSTANT',\n                    constant_values = pad_token_idx)\n    # Apply pre_process function to the landmarks.\n    return pre_process(landmarks), phrase","metadata":{"execution":{"iopub.status.busy":"2023-07-04T12:28:54.390157Z","iopub.execute_input":"2023-07-04T12:28:54.390665Z","iopub.status.idle":"2023-07-04T12:28:57.27719Z","shell.execute_reply.started":"2023-07-04T12:28:54.390635Z","shell.execute_reply":"2023-07-04T12:28:57.276222Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"\n\nUse the functions we defined above to create the final dataset.","metadata":{}},{"cell_type":"markdown","source":"# ","metadata":{}},{"cell_type":"markdown","source":"## 3.7 Train and validation split/Create the final datasets","metadata":{}},{"cell_type":"code","source":"batch_size = 64\ntrain_len = int(0.8 * len(tf_records))\n\ntrain_ds = tf.data.TFRecordDataset(tf_records[:train_len]).map(decode_fn).map(convert_fn).batch(batch_size).prefetch(buffer_size=tf.data.AUTOTUNE).cache()\nvalid_ds = tf.data.TFRecordDataset(tf_records[train_len:]).map(decode_fn).map(convert_fn).batch(batch_size).prefetch(buffer_size=tf.data.AUTOTUNE).cache()","metadata":{"execution":{"iopub.status.busy":"2023-07-04T12:28:57.278747Z","iopub.execute_input":"2023-07-04T12:28:57.279103Z","iopub.status.idle":"2023-07-04T12:28:59.133943Z","shell.execute_reply.started":"2023-07-04T12:28:57.27907Z","shell.execute_reply":"2023-07-04T12:28:59.132922Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# 4\\. Create the Transformer model\n\nWe will use a **[Transformer](https://en.wikipedia.org/wiki/Transformer_(machine_learning_model))** to train a model for this dataset. **Transformers** are designed to process sequential input data. The model we are going to design is similar to the one used in the [Automatic Speech Recognition with Transformer](https://keras.io/examples/audio/transformer_asr/) tutorial for **Keras**. We will finetune only a small part of the model since we can treat the ASL Fingerspelling recognition problem similar to speech recognition. In both cases, we have to predict a sentence from a sequence of data.\n\n![picnogrid.gif](attachment:9c4fc53c-6b08-4404-9369-34f391fb78d6.gif)","metadata":{},"attachments":{"9c4fc53c-6b08-4404-9369-34f391fb78d6.gif":{"image/gif":"R0lGODlhWAIYAfcGMQAAAAAADgAAHwAHHgAJMgAaRQD/AAEBAQMDAwMRIgUFBgYdQwcJCwouXgwKCg4qTBAQEBAoQBEdORMEARQUFxU7YhZAdRcdIhdLhBoaGB4FAR7b+yAfICEjIiIsKCUmJiUwPSVQeidAYCdWiCgoKCix0CkoKCkpKioMBCseHSsrKiwsLC0uLS0uLy9ejDIxMTQNADQnHzRkojUbEzVMYjVhlzY2Nzc6PDoSADpCXDsmEDs7Ozxzqj1MRj6lQj7hQD8xJD8/Pz9Rcz9ciT9zpD+BqUBsmkNERET/RkVli0ZDzUZtjkc0IUgZAEhGRUhZYUlF/EpJSktQWkw7IE1NTU5leFCGuFFPTVFtsFIpClJYUFJ+oVNTU1QwEFRUVVZWVlZXV1hYWFmdzVxcXFyRwV1PRWBe4mBhYWGGpGRjZGRyh2TdYmT/bGVBH2VLMmVaR2aWwmg4CWlpaWltcGp+aWtram6hy3BvcHSedHV1dXl5eXqJnHt7e3t8eXur1HxJGXxwY3x8e3x+f39RKX9dPX+iwYBpgICAgIGBgYKapYO22YSDhIS+64dqmYiIiIqLiot+b42Ni45ZI46Ojo6PjpGRkZK535VmNpWWlpXA5JbI6JdxSJnQ95qamp2Ea52dnZ6dnZ+fn5+tvKC4xqJoJ6SkpKl1PKuZiqvO5KysrKzf+61+Sa2IZrGxsbKys7WUbrXL07XV7banlra2trfk+rm5ub2FSr6+vcPb6cPp/sTk9cW7rMXX3MaRUsbGxcb1/seZYcegdcuwkcvLy8/Pz9HR0dLS0tPT09TU1NadWNjY2Nm/ndvb29ywetzNv93s+N32/eC4heDZxuDe2+Dg4OGrauTn6OXl5ebEiOj/9OvPoev//+zr6+z4+u3Im+3Vre/fxO/v7/Ly8vLz8/P29fb29vf///j39vn5+Pn///r6+fv7+/zgrvzmvvz8/Pz/+/3y3/378v39/v3/5/3//v3///7wzP763f7+/f7/8P7/////6f//6v//7v//8P///yH/C05FVFNDQVBFMi4wAwEAAAAh+QQFCgAGACH+LUNyZWF0ZWQgd2l0aCBlemdpZi5jb20gdmlkZW8gdG8gR0lGIGNvbnZlcnRlcgAsAAAAAFgCGAGHAAAAAAAOAAAfAAceAAkyABpFAP8AAQEBAwMDAxEiBQUGBh1DBwkLCi5eDAoKDipMEBAQEChAER05EwQBFBQXFTtiFkB1Fx0iF0uEGhoYHgUBHtv7IB8gISMiIiwoJSYmJTA9JVB6J0BgJ1aIKCgoKLHQKSgoKSkqKgwEKx4dKysqLCwsLS4tLS4vL16MMjExNA0ANCcfNGSiNRsTNUxiNWGXNjY3Nzo8OhIAOkJcOyYQOzs7PHOqPUxGPqVCPuFAPzEkPz8/P1FzP1yJP3OkP4GpQGyaQ0RERP9GRWWLRkPNRm2ORzQhSBkASEZFSFlhSUX8SklKS1BaTDsgTU1NTmV4UIa4UU9NUW2wUikKUlhQUn6hU1NTVDAQVFRVVlZWVldXWFhYWZ3NXFxcXJHBXU9FYF7iYGFhYYakZGNkZHKHZN1iZP9sZUEfZUsyZVpHZpbCaDgJaWlpaW1wan5pa2tqbqHLcG9wdJ50dXV1eXl5eomce3t7e3x5e6vUfEkZfHBjfHx7fH5/f1Epf109f6LBgGmAgICAgYGBgpqlg7bZhIOEhL7rh2qZiIiIiouKi35vjY2Ljlkjjo6Ojo+OkZGRkrnflWY2lZaWlcDklsjol3FImdD3mpqanYRrnZ2dnp2dn5+fn628oLjGomgnpKSkqXU8q5mKq87krKysrN/7rX5JrYhmsbGxsrKztZRutcvTtdXttqeWtra2t+T6ubm5vYVKvr69w9vpw+n+xOT1xbusxdfcxpFSxsbFxvX+x5lhx6B1y7CRy8vLz8/P0dHR0tLS09PT1NTU1p1Y2NjY2b+d29vb3LB63M2/3ez43fb94LiF4NnG4N7b4ODg4atq5Ofo5eXl5sSI6P/068+h6///7Ovr7Pj67cib7dWt79/E7+/v8vLy8vPz8/b19vb29///+Pf2+fn4+f//+vr5+/v7/OCu/Oa+/Pz8/P/7/fLf/fvy/f3+/f/n/f/+/f///vDM/vrd/v79/v/w/v/////p///q///u///w////CP8A/wkcSLCgwYMIEypcyLChw4cQI0qcSLGixYsYM2rcyLGjx48gQ4ocSbKkyZMoU6pcybKly5cwY8qcSbOmzZs4c+rcybOnz59AgwodSrSo0aNIkypdyrSp06dQo0qdSrWq1atYs2rdyrWr169gw4odS3YhPnn6yqpdy7YtTHzu1rnDxzFtQnzr8rpzVxJuWnx0/7mT57aw4cNI8dUjSDhj2mvMzC1mqK+yZbsM6dFbqG/yP7uB/4VGTLq06Zl0/e2qJOqZ6MF5G79eJxvvOs9x3aXDR4pArne3BS6Gd+pTp1Cw0v0jHBftcnnNCQNWNxfw2dju6uWWqxycqG7xpnH/MwevFa5/9OC6s7t3r+zT8OPLt0i3XRsADg5IsPSuIN3RhL1HmGf64CMJAb9MltY78miTgQQseHDBEtDgo5xw+giYIWP08KUQPvqsEoEq9zBhxT/exHCihwK9J9Bo88Uo44wE1aOPKQjAgYwwKBSgiyyplILJeYTBI0sn5/EFDiilQCNPPfjsgsko5tBzoCinfFfgk9qksAU1x3hCgR/yxLNLKbjIQxc8Z56XFjilfFcPYfbEeeYzu4jiC3Ld/BOMELywYgINo4BThiJ8SRNnn/CkUkstoeAyGI2UVhoflJIIwMk79LBCwy44AEDBBAP48c83WQSAQKl+aqDAAQ/Q/9LPJQfkF8I2pByAwKsudHNWPV2KoaY3GcCxDyEXeCBBIe6A40ayEfiBTzAqnPCBCKj8ow0TyXKwAC+bQODBBxdsoY8tDZwChIQ1OBMDGfi8EsO4ItDSDrcedCCBIstZ6u+/bhGGjQYBPJFIN/qwA0MFumiDQwPd/EFAJuBk0YA0ODAcjQY8NAPAEsyscoAdpgCAhjR/CKBKh8DOIAQmlLixQCy2LGDJNZc8oMsl+6HcwC06hIDLMjqM0M0lC4wijRsPgLvs0g/80ssCqrATgxHbaDMDGe3M4AIuwuggAzhTVADLMkAMsU12ALft9leACdTOG64mwEg7GsiQzo0EpP/SRAI9hIFDAnpMIIEUbyjQwBsJ0CLPPZDAcgmC6fQSACfycJmCBy1AEIEl87ghARhzuJFAIm3IQE89znziyQWaLLbKA7d0IcNiwMx8SQW//MOKBLnUbG8MW8jzzQxwBJMAKott8sAwXRhhTughVOjZ29hnPxVd8+wSizvxCINDAcTAUMM2/6wiQCI4RMAFFWCoAckEIlxBRRiJDOIbp3MeSAs9trhcOjKnNSucgxUXYMQ9pgCCOZxhDntwxRR48A911KMewJAAJwTSiwdIkAgFmhovCFGB34iIFlMb3hbW0SU45C4WopkdLKZghG7cow23Uoz2dsjDp9yjCQvIhUD/DtQKHIzAHP2Q2DAsBg16gAMW0UAAEeihj13gwhYDsIQ+tGaH3tDiH7bQ1F62mAIyuKMdUwhBNgZRwno8ER5tsMA26vEKIVAiBXD4xzwG0QBc/MEC0EjftzZRwnecMIXt0AERtDUDMUSDAnb4xz0GYQFiRG8bk7wV23rIyU4SZS7A0M8ZpoAADIADBgVzAwBk8A5bIOABadBAA7LxhwPQ4A0H4EE7cECANOggAKgghQC+GMDYrWOLGjjRP4AhAEUsAwUiEAQTGgCNYGRACICYwQi4MQgJqOENFCDDO4BBARrIIQUR4MUlGpALfKxiAbSwRQFoYQ8GwmEZWwudN98w/wA72EMH57uhHHXoyYIadCcgeocwypABD2zhGexAgQRiQAEK6SMewQACBaqgi3/AYxMp6AAatmE8N2QAW+swxQNyoY8McuIs+PhGEOwgj3TYww1J2MYy3gCCKsDQH8Jwwg3Q8Ix32AMSNshBIRgUj1M4oQdOiEAsViGEX+CDFTnIBTBEoAt9CGMHSXCGEwqxDnAglQai2MZNt0AeQuSUoAeNq1xl8p93QKk+MNDbQBSzGLs86YI20kd20jOY0PwlMAU6S7+EY6O9Zi5DaJFHeqyTFmGoARqTbMAvBqiYzjznOdIZjJoAQw/lNAZEL5qralf7ksxlbh30YMcERrC29f+0yLXSGe1cRKOmx8ZNNDBS04sC41rFwtQ6vLWOmoLBARCo4AJ2cMc7rPNb51AXtceVLHCHy9ruenclwwFEIUSDGZwoRh7OcMQiYGGOzlrmu/CNb09+CyOcUHEx9eCsfPfLX4RSJyi2YVF/B0zgAhv4wAhOsIIXzOAGO/jBEI6whCdM4Qpb+MIYzrCGN8zhDnv4wyAOsYhHTOISm/jEKE6xilfM4ha7+MUwjrGMZ0zjGtv4xjjOsY5JU1jh7vjHBq4vkIe8X7qU4xF1yEMdBKEOIjv5u/9pAQCmzAF0iObJWJ4rXeSxAwC8SgVWzrKYD7plG+gKACQI85jXzMkynzn/zf/CrZznTOc6z1nIbC6xmxGAZjUXGM95FvGe+1wpwigjAytQQbUUzehGO/rRkFZ0B65AjkCreNBwphRhiDHlTnv606AOtagBUIcrW9rEmPazjAhjDACcgBrIQIYyZE3rWdu61ri+9axjzQwOTDkVgjm1npdjZj5nmkasBkALPnKN/IgKGYsVdohTXeh/tJoF/6CNnbc95yaj4wgASEMYABCE1EobxNTWtLUBgG0XUYQuyAgCABAwi398AACBCPa5P5xuZK+73RgJzCIYMGUKjCEPBAf2OvYd3+tupN8zSjbAM0KXcHSCCp3OTwaoEW2GZxjiq/53xzdyjEWooNNe/zC3x1UrD3GEgxsvLy99iP1mVcdI4iO/CD6aLBB33CIKBziClQG9ck4SJg0ZsFYLxmHqmcuj2IRW97UXKw+55EUu7cm61rfeHuz8wxcAcAJfiF50s1Rq4eCesgLE0fSKgPzmIpeOR+Dyj1kA4AgLJ3vZEeLuGPEF46+CANv1zpC3zwfn0PnHLc5wh8Y7vvF1qMPjHR/5yTf+DLX4h5Vrcfex790h/6k44RHDlyh4GT+DDzjNjW3zw8e9yYsYtexHvYh/nOMfnMd72z9/Fw+1ggq7N4081LEOddze9ApAffAlYniKuIP4xB99UxDf5EmE/ROTqIT2MbEIBDAgEtqvBP8lOiEHAKigE5TQ/iRA4QQATML2uL973nnPEL6QQw8AyIBgpF+W+iJf+fyHEM3HfGFBff9ACQCgBwaBDgAAAQZxCwcAfAXBB+4Hf7k3f/THd/AWBAcAAB8wEIVVGoTRClFABVQQBcjABafnAKmnc6tHaAFoEIQxCUfwPl5gDcsnFQaIgHlge5nDF9yAH+ggWPJgZXYXBZqXObeXBxV4exeYg/TnIZhAAWfWAZrHdC3yFGeROTEog5nTZI7gabXwBSvIdKLldFAHZ1xYeMVFEAungp02DUToY1SxgwDQgzxXcfjBc9kWf0i4cBX0D0z4fk4of1C4d3FjDWMwZQjAZ1b/SA0kUAe3kHdd+BN9VxEIqAB8dgtgsIJsRxCViGkCxn+hwRdn4GUHAAHMsBV2iIepFQ57OBALx3l/KBBNNogWaIiVyBKb4RKasUMe4gorAAAH0IGO+A/U0IEAEAW3oHJIsQ6UkAd6kAeHcA05xxCEcQ3SqAeS2AnzNmW3QIbJRwHKgAjSmAeVwIcRgWmVcI58sIruRhfcoAf0eAelUIr/sIh8BgG+4Ah58I+PAIhT0YqBeGWw6AB8OIvL2IeBiIuFqHu7iBK92IsBhxmopRAy9xkZSSl0hw6HwGeNWIzHuA6+oAcZ4GWV4IxBUXV6IQ/yNmUZgIOyUXVxoW1Xtw5w/yEXVoYMnmaP3wgAt+AFp0cBxXCSU+YEKseSeZGTegGKL8gCGDdlDqAMmqcXuWFlzOBpYVCV62Bl+ogfxUACnfYCGLgcVkcb2yFgK/l6B3iHBamHCCmLfsiQt9iE8QeROlEP70B8ebEYvwWKf/khPoZcZqEXebGR8aEeWScQxJB2fNZpxzgQ1MCEAMAHRuF/AEBwJ4CDgRGAyjBvBCcIpfCTQTmUyCCWBMcFcneI/vGCKzBur5IBVJkQ1OAA3gcAZ2AQYXBmDkAMNoCKQaCOEakTrYgP5/CD/xCEDjCEg2GEC4kOe7GEdvmEwykShLEKF3ADQLAvoaEZFOmCAuhRbf9wAUcwAyLwC5nTNp8AAbqijJAJAFZYhIAICsn3CdeIUF+3CJQwCYtADRjHZx9gjQHydY5ACZTgCMNwC4gwCZHwCNTQCY4wCY5QCsPAiJU5mo9ZmuN4DPeWfFcwWlfWChHaoMyQCosgoZ0QGoO2AmTIZ7IJCo4QCY7wCalQoI+ACcQAAaeXBsoQoZWACMSQBrxJDC9wAMm3A/NHGLfgCI8wCUBaCgUaCZ3QgkBhgJUAAIJgEOfQgDACgRJIEIIwnbqYE4SBIxGgAwigCOFhDb7yDv2BD9wwDeFwPQYBGMGwA1WAWZDwAnCgDhfpH/hgD6lyAxPQAM8wQDFScb6wqL7/MAy+cIo/+WmRKRA4+Q+Y0IDDcJ82AR3uYGWI4Gnh+I0BWkGd+g+f4GmlcAeeNgwv0Gk7UKHfqAcYCo5CuaEdCgBXUJPP9w91sKqtWnDZthfaBnUs+o2ySYVTpgKmN2UkMAw6mnx1kAqoWgdDWqRHqg40aWVh2GmzsKyiwg3BOik+YYDWBwbEQAzFYAzFgAxg15vIYAzGQAwPSm7UcK7FcK6dSIh3WZab+g+9AAA5oAMDoAneoAEJkAn6oA7voA/w8AcfYw4eopi2pRw4UgC5YA9dgAC0hQ+bIbEFwrBxMABgIEtNRKensXCtEKnvGWrHeA2LwHbCVX4px5oxASOP/+Blm9iiaMYNo4GhfJYKTJh8CkAM8vYqRwCrfCarpNmJyQcByHCrVyBzQQuWXZZ8HCCDv8lnxeqiyuBryWcDKvgqNuCsp1cHKduIAJAKvcpnvVmkfLYDMGJ9mogAtxC2AMAB4UAUBrits9e3neYIuYiXOIEWvWBLGcsJ2EAqmVB1IAIPcQAANQCxdAeK+ZU+sJILN3QAkTtdtrVX7kAP9xAHATAHhQoNCxsjC+cKpzdl7Tlqx/iZQUCVC3cMEAABxKCpG5F47/YPxOAKs9AKwxCmmgiUQmls1HALvpsKJWqhQHt6CEAMVXt3SJuAswqUnchnFMChp3eDvjsLqWANgf/wjQwAvd/YAeVQC7Pwu8XwD1nLbjormxlwZi9QqwDwAmQLrWfbgWr7jW17ZkHADen7u9RwpckHALWggnzGAdeAvLXgCplanWaxWxZhgDebATZAAo0mlghwAox2Aivgaw7AAhxcLTZwko8QuPw6d7tIGMtgA3uwCec5MAOwuHNRD44LANJjQR51C6kwC7zQcyECACt1Q5BrDgyyw6ngCj/8D+ngD5tAA6HgBluwNjKSuqhYjO4pascYDq0aBJVGGEKJCbhLcT3XhXwBhw1YfsOroQCwAsXgnlxgd2jbvK8ytEUbdBW6Kxc6b5vItAdAAU+LipjnaZUQCStIvsmnAsT/8JgAMAbse3otwLT517WnB7aoaL/s+Spmy8dp26tN65uoyIyedgje+CoHUAv0+wHE4GxhtyEhERqX6BB2eAf/EA7kMA7kgA7XgB/hcA63zHYpi5S2PA55q6r6Sp0jEZjrCCDRQCqWEKw2/LiRSxjygsUJUAVClD5CjLlxgADn8w/+8Aoz0IGpmAQdRRidgRYcW8X/oLoF7LeRyQxiWQqB6I1fQB/0dV3U9Q/DkHkMCRF8sYgwKaSddgtXoIwfgAwO0GljYHedlgqq2mm+qYxBAKtTlgejWdBXkHHI4GtTFga34GmYwLcAQKSd1gHIoKNTJgf/8KtohsbkSAGdBpUz/z0MBDdlaZCyD11+alcMLNBpRwB2xAgAjuCNnVYLUZl/xYCsuDrGAhg3+uxw1ABs2VaJBClgB8kihEGLi8UXeXAAxzym68h1XKe7sVx4WNdkGzOwssEPcXAA0mNICHAADPACGTDXFeAkq7DNmbu5m8BnDOAB8XsAJZRttCEXiGkaVvzOfTuSlgoAXEB3nEYCagkSQhkIeSsRhHEHLbADL0AFgtDZnu0LadDZL3AFxOAENrADKnAIrbACO2ADLJAKlfABsW0DxfAFL+DZZzAMNrDaH4AJodDZNvACtcAHJODZTmAMqr0DLHAHvqACO7ADH5AKlADbvz0MacACnh0G0P+72i+gB+4wBsQdBWmw2jYQBMbABbv9AmFQB9xtA1EwDEGw2iTgCKnwAqt9AiYq3TZwBMQQBu19Br6w20FwAp1QCtK9Ay1QC3cA2y/ABcMQBeCdBjR7Ed4YBqt44TLIljyoeYBBGNxQK1amJk12hBUEGFbmkPvK4XsFEXcgB/+BEYTRzP00DcYga86QBZqbDt6AAgcgArEgDtPAChMAAFYgD3s9xN0cuRsDACIAC9wgDZswAXCdDhJMKYvttxZqhXyRlVYoj6Kijg9BF9cg2y3AAizQAmze5mzOAnbNrK7g4gNRDueADniODuqw59BZDnl+DnyO5+5g53mODl2Z54P/nuflcOiCjufqkOePnufr4Od4Xg7Ph+iULumSvg6AruflsHN6rg7lQA6dDuiHHumRvuiF/uiprueh7up7LupdyeeR7umFfut7Xg67CwYkkOZr7uZtDucd0LSVMHSa7eFumYe1HIuUOpeAWJdhLbig9w/l4KjW3qjYfu3GIGUt0Iw0rg/NTNcQ4ADjDgGvUgPaPE+A8Q75IAmEvQ22wNf3UQP1cAkAYLGN5Q+DgAAWq1hn186rC8/wGWyfGZ//sMsU0HrY+A/IkMWzN9fkdtYJUQ7iMA7jUA4Ub/HjMOnicMsbf8vkIA6L3vHjIA54TvLiIA/lgMsd7w64XPJ6XvEh/8/pFY/L7hDy4iDyLZfz4vDoKC/qPG/pJV/y5aAONS8Og17z43DzNY/xGk8O62DxtxzzLG98KD/oLw/1Gi8OgP7yPZ/xuLwOIW/xul4RKg3P2AuPxz51w9eWrmiQzN6HXP3sgiim0t4Qs+jwo3Zm+ObUCoEWzczIndaB6P4HCHABUnAFXHAFXwAE9x48l0vEMuC43mwO2LpwzTABAqAJGXJBWg7wjP3wA79wYbiVhFGhKyDx4SkOnxAKrv/6sO/6NCpvFFDsdC4Q10AM76oMuR9rxCAO1LCuxqAM5YAMx4AM8ioOxnAMx1AM4WANun8MxlAOzJDjxcAM5cD8x0AM1v8QDsXA/MYgDr2f4+fADN8vr+Tw/dvPDdywrsxPDtOg+8VA/O+6/dcQDtFPDOFwDd+/rgBxTlmxY8WYUSuGrJiycsiMISN2TZyxYwXDXSOG7BiycsweGmy4kZi1cBmPERNHjVhBhsoeGqP2T+ZMmjVt/kvVKdROnj1DgUqV5sCBOtz+4buZlKa8f8YAsPgnT90/SgDy/Jt69F84AA6y/lv3rxaAKGBlTs0DYNK/c2IBHAmLVKlNd/98cXjRQu9evnpfQDgAoEMorXMNM8U2YUChcNOoWZMWB4CRen8AXMaMmUAuWwce5LLX5oAMcVkQGDH3Dp+7etE0CFAUtZ4+w7X/bd/GnVv37pthXQFQkFn4cASCZRLjAMAV1n+VAJzBJ5c37js2lE2XeY3gQu3IFIq79vAYM3QKT1Irt9FhOG4ZvZ+j9hK9d4XWJno/Rg6jRmTqmG0s5ppxVjqJG24e8q4chBxi5hyHTrIvIYUuklAZdP5jcL/xylEGQAHVMyYca8RDBr6EYEqPopHEkfAY8ExqcCCIYsIOt1Q4mKXGqJp6KqqpqroqK6S48mqmsMYqKyzm0lqrrbHgKiw3dQykssoqrSlnBwDSMIqpGuVpTTFNmKJtHslq+EcSACLYY5JIHpkEEUD26MYWAD67pw0AZNgnDgRGMCeedMr5BxgFBNDk/596ZtOxUUcfddQ34BCgtLjhMiuug3+4+QCAMNDRigoAQPmnrunkQTVVVVXdKix3pNONG2ZmfUzCYsYJTyPyqJlVGWvGAZE9946BT7z5vCvGPgSR0S+hjdbBEKYLe2VvWQXF27VXbkryjhgRKzwnWma6Q4YZDj0cB8EQR6RPQWfRm5UZZcIJR0JkwHNWGfjivebLVf+Vp65xxInKS96Ycgoqqaiy6h90UK2Lm67Q0QdVUGchy2GL/2GSLbeghBXSmSIpRSZTv9QnGsUsAYs1eOI4AM1eDliAlnpk4ocQDoyQZxXPcrnHzxrquQQBAhKV6WUEGvgFHzBpEzlqqaemKf+sVoYb6tLLMv2HGQC4MGqqYRygAJkdqZZJLoMbbQ9ZfB1S5iuZwuGvmG/xc9chasipqD4WKzoGV5OQufAjGmmyRj2O4tNImZC5hehuZPQVl1xzO1ToQ+/WJTHv8UI+EL+3j1FGSbRtUltHhHtcuCo9bDqnK5tuAYAKm/RQy+Mn4+ItOt9/B95LVB1FTLFMAsannpdjNqedJtZMZJhd3EDgADL+8RlPPWswRxsUPEvEF1ncuOx6d/Rh9HT119ctrFsg+IADDjrIIDBLiTOOm06mUtKLLdNeX3QehZS2QeRFcJsKUpAiDsDZzRoEOoaCMkKMBqknWSzCj+D4Uzi9pU3/gNxwFrFUAjcBagVy3rKGvQp3knFlxBiX89BEKmK37mykIxsZj01C55CUEMQYpWNfTUr4JR4pbCqPAAAFXvAFLzTxC6JCABea6AUujCEIAMjAGKTYxBdkAACP0N1beIe24T1KHinTwAAYARakKA018hCGBoZCgQkExgXbwEf2fpEnAHCPHsCo4wEYEBgADAGPZ9RHIqEWREY2smriIMc4xkGOcPChOPfDlHHkAqp/HAKL1PCdI3U0pHIxgyM1jNtMhhSveXGjlPqihjLkRQ0HIcs+6smPhgjnkQ7WhBuylFc5rlEuWUpnSO5BobN2KUtlPAaY6MFcgMQBzHmxy4a8/8xhTcKhDGaCh5nUkJsoiZgwH/0DiVpDJyaF44gwgkyc06mLygRgiXqs43wvA4AL0qEOfCyjDChAQABAgAZz3MwUNKPFPbqAABeYwx3pEIYbAMMAECTCHBV7Z0aDOMSatEIFADiAOrkWMKbgYxEAQEAqzqbR6eBjHepYxzrwwTjShVMqMV0HqnAq053KAx0WvGUGdekf+YQspu5wh0zlYc+Y0uSY3RKReBjiDpjaM2BIlYoykHWNpSI1LDXkCIayuZSdejWpr2IpdlZnxH9MAgBXqEUpUjHXVIACAAyQ61xLMYtAAOAFs6BrKWrBBQBEop1jTKttFviQbsgjOvSIx/80kuVYpLwjlsxoLEbbw4xATWMk5qDHotYxDVl2ox6qSWxqqRY8plzjC1sjJEqNMxNlEBYAlViparHDuB+CKmS4UQdF/IZDY2hwIxdKSDFA2dKtIPNupONkUtRBn4iELFfHHeELdXu6tZbTdTZBh+xqcosDUMFp0sFdkz6G2O0mZYiLLKFcThYVtPoufYuaianQp4+ctte/UXOpTDBBAZQSkmvlKEUaIAAADpQsSv/FzUwnV67oqlKxWJlch7ZFXOMuU6vLdepvb/LUyFkjww16MADRwU2t9st3rVUmfCZ8OAibsYjebdjDArapienDHT79B8bKomNQdcxJYkxxjdP/hqpFLnltTkuVU5l8lDI62bFKxrLqZGKMK8qWa9S4jALOwIyoiDjLSUFHmtFxjrXtBh9qPoc7woHDwA1VzWkOmZlR11youuPO87WJT+8sF7lop2/nuHOFz3yqG7euYULaSle+cqSMKQktuTuyOxe9aU5DeDX/GEceFBBSrl2DCo4YhskIredOU82V9NGPe5DRZuyQ2Fsiu4biwtnqgzX6R48GIJEm7ZYknYVjmF5vknm9bGYz0lS1SM5ICU3rZp+OgMXA9q324526sPo2tg6HsnWDFIwYgyC+rbZuuuvoIAVb0kYitlmWhOzdiTvd98b3KJlCjTFc5gOlKpi38w2p/3WUw+CEYpx3qO3Ub/M5cvbWjToOXg6BD1wm6/51u034bplQutjzVm+9K25xkpe8JqbqBAMyUJiRm/xRC/KOtzmqFHBD3OVTwzjDND4kjpsFSfK+dMiR3PKbF/3eXrrFGYzOSKTAfNaGmbl7HX5rou/ZgwpceqB9rXN8lCOmU5GYA8px07YImS0xJZSRk131rLe903Uhx8LdPsB/wFwZgK711MPN9rnjJudVEcRNAACBkPnirU3+hyDo/ZYE9t3x+S4p3x8/l6aTbnJ4Z+4J9z75qOXcrR+gwhGcMPooHAEBChj96I8QBRtgsfSqpwIJCtvOxnPe9ryW/O1HXPeVUP8E873Tu811f5t1gwoR6EQ+Og/xD0I9qfbDh370jS4OA1mDG7kXYvCxH/11N70VtbgF+Gsh/vGLP/zhHz/6z18LV8QEVCKXfvzlP//sa1749K/Juu+vbkprGv//B8DHq7ntg77uQiupqKqdUsAFZMCXcqz+Y68AlMAJdLkBpMC5WJ0WUB+kqIUD8L8LBMEQbDYLFMH845EVALWJU8EVZMEWPDiC+Y0PLMEZpMEaI8EaZIpiQCkGYAAF4EEfBMIfdAAf7MEhFEIiVAAj7EEhZADG278ahMIoZDrti8LVYQBKUYBK0UIs1MIsrBQv5MItPD0EaMIoeD4pRMM0dKQbhEL/eRCHNxyYN4RDOaTDOrTDOpSkPJQkcSAUNfTDP2QfNgTEQSTEQsQyQaxB4FHERWTERlREQ4TESHQzKpTESrTES9xASsTETeTETpxE+yNATxTFUfTDIZEQqiPFVFRFTkTEVXTFVyzFrSCdDtk8WLTFW0zDdTiHXWQzXPTFXwTGYBTGYbw3YyLGY0TGZFTGZWTGZnTGZ4TGaJTGaaTGarTGa8TGbNTGbeTGbvTGbwTHcBTHcSTHcjTHc0THdFTHdWTHdnTHd4THeJTHeaTHerTHe8THfNTHfeTHfvTHfwTIgBTIgSTIgjTIg0TIhFTIhWTIhnTIh4TIiJTIiaTIirTI/4vEyIzUyI3kyI70yI8EyZAUyZEkyZI0yZNEyZRUyZVkyZZ0yZeEyZiUyZmkyZq0yZvEyZwMwETSyZ5cH/S5mbYLJZ8MSPyyOJfSB5d6sqgjyn2kh1I5n5l4hx9Lh+hIStZ4SiFCqqRah3QIGHpQJMWSPOA5iqA0ppLKyqYESPQBoH/gSZpIBwvDjUWhS6hjytpYxH9wBlfYBnBwhWeQO7Xcx+TZB08gKKf5B344hTSYg1Ewh39YhjGIhaScCaYQhjE4gzAYgysohGVQg2dIB6s6mdXwqpLiyrQpTdI0FaQizd85q7ogBQL4BWBAAEZohznAhZZJKi9RTaQSzHlkCv9v0AACiIV6SIfQQAAOqB8jSAdbQABFqAeDqYuDugAVMIEMQANWCABOsAnEk4l3yA1aowdYQYrYnM3arAYF8IOboLVQ/E1sZApTACkrQIpgQAArQAd4GAQA0IRkCIDYkE7sCQBLiIdtcYdgAIFfWIY5wIQ6UANeYAp48IQ02ANAKIR/iAdZoFDQXIY06IMx0AQJTYNEAMxgUANIOIM9gAacWUwSrQfz9M9M8IYWUIVvkINKAIQ5QAWmiIfFrFCLcs/3pEaksAccCIE2KABooIdqOAAi2AZ3YIc5iAVgOAAAzS98MAUBUIV04MksVYVeQCkOQCh7WKgLGDUZyIdBOID/D0CAB/iFXiiOC0iENggA2WsAaJCEA0gAGziACoAGeNCTDzgAC4AG86RNRqiG2oyG6rmACUCUffiDA2jUQQUtIW3HuvBPTkgMP0gH/QSABHgCVPixXvhPjDKZfzAFBLgBLnCCKoAGWwgAVUgGANgCc3BORUiG+0QH+yyCaKBVc7BPOMhVKzCHZjgAHqgHYBCAUbiEAUCFeFiF2oRTOHiHmVGELD1PTUhURsAGBKiBbmgGALACbzgNaFgGFMAAcwhSS4VGfEgHSCUAUTgFDQCUdHgHYSgDObojOI2NV6GNulgFAPCAFogBEXgGWP3SANCE1jgAOzAFAqAFfGAHDSAC/5+hgBMAgj2xT02gB3swDREQBF2QB0mQTXr4Bg3YgktIIg+IgQOwAmylzUxIT25tWHk4WSugTU14B3tognRdV3Z1xroQzqEIKQJQBWHYA3WFB5W1hFxlhE9DH8cyBYW9KXkwhQGQ1QGtB2P1g9jMBZOl2KlVA0RYBEeABSqNjXgAB09wAgQoAFzw2n/QBpSVhAFQg0Uo21gwVPRUAG4FADigB2+YACsg1UThWZ8F2nTk0iwtBGkghmAAADKQTzsArc7wA/982pmgh+lEFJm4mVUIAFog1ePhWtq0A3poBgUoAvskg3e4h0XQBf+0BHrohQHIhHeg0kIgBQHghDw6AP8/cE4/2FlE0IWH/QX/1FYGoFk4+AfhtIJuLYLu0QAMqMrEPcfkaQcYaIBtUJR7aIIC8IUsOAAPSI47dc4LOIEV4AA0qKd/IAUFGJOYooeD+lIAiA0mFYN7EN8PcIBj5SMPQIEAYIRZhc5vgIEAeAENeFtS0NOWZRqPBYATGE69DYA3RU9FjdzARQAZeAfLuAAvwoDxtF5zRAptiIL1/LRgyAFduAdPKAMp2INn+AdhoALV2wE4CLBgkILJfIceDgYa+IVoyIFYwAcTvt1vAAQpSIMJ4AF3kFAqqAJUwIdo2GGmAAdAaFVcSAdJEIAzcAI10IXosAdI+GIifgUhMNf/KIgFb4gCVdCGK7AEfGiHMigEeQAHSPACOZjeJxzhazTGmUhKxAPPEAutsAzKrJQOg/mGGPADfjgoOwg0JkMfAUqkdyDZX3BLKvtOrDutpUiV1Rgee5gCgqJSK6iHn+3jZJSKqDQZe1oNdMgppODKr6uL8VyqdEifd6AYqahKfFAHeQgNojWkq4wpx3qHdXiHRHIpmEqHePiDAfhac/CS6Pxlpkiq6FCHp0QHbAaTY5aHeyAESxEBaPDKVH7I6NSHeNiFVICFbnhCfXiHZRCFbvBO3UCfp8QHZyiFUdgGMDHncz7liwtM26jn3DDKK5OJgv7ng+TJ1YipoNSNpIJo/+zgSX3Y3IfCuoW2VKBcFNpQaI32SY5OH5Am6ZI26ZNG6ZRW6ZVm6ZZ2aYMcypfOyaZqS5nOyVTQA7OxaZycBDnIA2LQg9/baZasi1DohDHAhH+oA0cIhV2LMFS5y6F+SFC5g3AIBUT4Bz3AB19YDqFWCkCDaqmeyKmQg3AohSDAhLLghlRYDaJjinIwhh8yijIT64J0KdPJPlfYgUj4gjRghitYhFmo6vtDCqa4BRs4g0DQg0OohOuQt6wDmMiW7Mmm7MqebK+ua90aysA07GHgA0eYhE9IPEGwhjFItYFOm7DAhDTQgzwYAyeQA0yQg0gIN9QuRrzmNNvObHGCGP8jYQpuCAVX2DXD/gdHYIZh4IJO2IGSqYRbyC2lmIpZGINW0IMoOAQq+IA7OAQWiAJlEOGbQ4pbSIM6IO/yNu/zRu/0Vu/1Zu/2ToNJiMDdzqjoOJl1oIaTyQM9IIGYgJXOvoIEO4NhkAMOOAMVqAWIQwpQQQYIsAHB8gVxCIdKwARiOIG3yGiTY4rfSL4N5/AO9/DLsJ2olm+m669r8AVquIMxyINQEIQxCAVlgIBaPNVOSLpKqKt/UAZ2coTlCMxPQ4YO2AFj+AdxuINHSAVE+IJZwAQVKBlUbi+mwBgwFMMpp/Iqt/Irt/ImBIOjcPIR541iCII6IIGSSYUM8IX/M8CtMLiO/v6HUiCGPCCYPLgGQQiEfyAHYqgNpki5Fwi3O+AAJvIFZbiGUMAEa4Dsf3CFrPnwRWf0DS8OL+ByL5/vNs+DIEi1OyAGfKiFOkB0lfIF3DqZ1nKCO3iBT7gDCriDKCCBSpiFHKG8f7gGB2gBPD+HFoiCHcDzk1u6DFf0Rvf1X98aAIB0EZ88X1aHY0f2ZFf2ZWf2ZcdtgbSaMzCGLyCzQHBuPSCVaziEcKiDD0A3gNt0ZHgBUdmBNGgFubqDK7C3ungECPCFfxiGNOiAVLgDQoFqpezy7eL12AL2fv/wR4906ct3hiNIBeKCpG6FMfiHRXDupUaGUMAt/1+wgVqsi1tYgRc4Akxw7hc4ABuQiTN49qX4hzEoGVBJBRKQg+VQEsy2uH3395f3cIAn9r4jIJ0ohZvH+ZzX+Z3n+ZzvhAMfeHFECmLoAC4Qh0oIg1o4gk7ABBtI8ju4BX1AhuU7maJOg3GIhEr45VoYhjzgA45xsd7AiUWgiTFQABbA81cJC3E4d7MJ+rRyeZiXe+ST+bd/O3ife605cJa/x/COghfIg1pIA19YbGU4gyhohTQwm8CPEqRIhVJoBVc4Ai8wbaSog0A4BF9AzKTQg0y/hk9YhBagd4U3FWbIA0S4hWGY+WaL+7x3fcyoe+lbHQpIgzOw/dvH/dzX/f/dt/00IDAOuD6+r0em8IU0qIQxGIMOqAMb2AFBUIEdoACF/wcncO61QYdDkKtU44YgaIFUS7wd0Hy8M+yrkAduOOySIQYKWA5lkIMgoJG2KLrWf33Xj33u+4dj8CuqSQ5hr2l/BAh8+m6V0ufrBIAgYyhAUKGnFJU86Gxc04fvH8Z/5fRc/Ofq2o5DX/R4PDDrn7uMGVPe8fVPHsZFk4ahG6YC05VQVFJiqvRSJdCgQocSLWr0qFGYrg4cAOD0KdSoUqdSrWq1KgIAXv7h64j0K9iwYscKhWkMAIt/6NSxbev2Ldy36ND9owTgQwYAjlCS7ev3L+DAggcTDgvzVp7/i+5SsWBwpZI1jMxeLAIjFB2ocv+GtWJ2RV+5NNeYUUiFL6XKlLfSZFz3T88dZOH+CbrD7N8sbqnq6ONa+PdgpUyvEi9u3HjWrV2BM29O1Czan4IvplIAIJUvAAhconbu/Tv48OKFXiT2BSbGVBmUYVxHt1YUV/9cA8Wu8d8jTCvlsWh1GuhFcpwEkzr/nMGaa7cEgtEtXqRRIHrjSZiRcE0ddyGGxyXHlVcTemjYP2elFeFfFznilAJ1DFPHXdzgQ+KHMco443gXcRPGNfjQ5UsdLrmWEjJnwNQhTJVM8s85/+TRyWkXldOCSyRedAsXL13kGhd1qPUPM3W0ksYR/4uk1B2N31WYIZppTrXhcmW6qRJ0Iw7mzjCT2PCUDRQc8AVGHb75J6CBGpWSILW8lFIdj8yXEjo7EPMiUCmlksc/BZaCIEzDREFfav+kkYo8KSm2wydbtmJDILPQB6OghJ2pJqxpsulnqx7GKZ2rPH7gVFaU4ForsMHSqBpr7rxnw2wYUcEHSn6mNEwQ6JVDBUaaTdLJr88e0WaBrkDATXokILOSsL+9Giu6GmrFYbm2hhgdq36FmpFuVziQEF20trsvv79ddEYpKtmQQRp1qMAnu5H+M8ZJF92xSHtcDJOtp5T2idILPvlyRwvFqBVvv2Sdmy7JVs0acni3ondaqP/uuPwyzDHL7LI8bOnTWykAbOobyj37LDKXL8jxSBpRUPBFEEzdNmRQKdUSRDjyzLLDATac8YETFnl1ETIfULPZOP9YEwUAYDiRARjU/PfzXyOX/HZUJ7PNnMo8F2bsP7cAcISoc/v9d1AF8qGAAjZQcR0+XgCg9kX6XlQHBRns0AIAdaQBgKIF9gmTTP9Q84EDHFDgVBC3iIMRyIAnVZKFcLv+lNyqC6ayjcQgczvutx9zTO69964MMsSA69osADjRt+zJ+1wgIpGwl8oBAR/OuN1AqVOKLycFksE/mADQCko1ywNpGnT9g0wUdRwBAAlhc5W68mWx/jr92q3bZvz/8r47YoF2OXAAAgIoQAc4QIABPIACHMAAAArwAP/zSZJqsTfk5a+CwiqQI0pxkVAg7k4ea9xQxsEajFzhDPrQAwBuwRcK4WZB/+AGIo4xuoCZD3/wi5/b6key2FlQLCor0CMAQAEVfIAERiRBB5xSxCWeIC8OOEERSfABFYxuLxGcYPV6qMU/uWYSFpMgtihAga81rk1eIQcV0AETG9zhH2EAwG24lIdUVeo1PglFJQ4BgM90pCPuWNkWWbiU1tVvOOniYSCP8sO6AKCN4RjHOMRxDmog4FvkgORsWmG8fzxyHLO5AwCOdEW+ZTGRpnQXtILAhTEooANBuIOLLkaU/0McIQyLCF0dVkApmPDBF74YRkfkcQY9cCEMqnQR0/5BjE/UwTSnzGHJmGIhQqoJkaccyiLtQikyiQMADujORWpxgChIJyV5OIAo/yFBUurrmu78TuOGkYpQpMI+LHQHNa5xDnScTiXXaEUnAlqKr/lmDJ7jQyUm9o9xVCIUtbjGxToSill0ohShcASkAglNNEmzKcNpSgYgsMP7tfOdqNvfS/oHAEqhoysw4YYD6TK+AkmQnOroCl3yEEokqROLJTUpUAvToeWMzzfXmIQvboGIOnQiWb9iISdD8Q9l5EEZqYgjnIKZt1pYYxbMeARJbii7jWaoowhoigce4AFDRP9BAR41ZIasGdSfiCiljKSU5i4SDm9qbj49JSd9CqTTdK6TgnM9LHDksY7FroNM+KAEN0LRCWa4wjRbc8c61LFYmMCEGl9zRCjCMQwVYnYd8oAROTQ2DGs4Ikk/TR5ZOZoVAGSgBBvYgyEMca/ZAoCayCEpYuGE0prdtY6+2asD+uqamvq1joPlaWFLGdzpmusfvwxHLYjBjGKchEzyuwU1uFEK8PrSIkQRR8BSYY1wYMJQrx3r/NJlyAwcARB7UIQWEPACPbgVAi0QqW+JI9egZnOlxtUrX1vz1+YKdqejNCygTnva3lD3KxIu6p9g0ophUAMZrbDGMaJkFNd0Qhn/nk0FN25BDH2krhyVcEctapEKRJAxkbEtjjSdQjAqyAERR4BAHzKAgCsgAgBVgIYaABhX4FK3wHi9GHKVu+DAKsnBPWVnu3rjDraYVkaZhd+WvVum944HJqkoBjVSgQl8MGNc8FtOKIbxz1RcgxI/vcgwMIGMUujBsqa8MVWakhULdYALacCCHO5gAwAGAYUAoMIXziCKNCDAOhgaMFCdjI9zvCgl3PCmTOXxHp19TB5Jeu6DpTuji8RjGLwjRjdOCyAKZwR/RtFHPYJia6HQGsMqwUeuoaqSetCaLDc7NlCQ/Y94SKMYyiDGM3Yto0yhmA+g4EZTzUsUvVZCD50I/0QpPlFjo4gDGcdwapm6nLL4qskCQjBELfKgBigowQc/0NMB0vAFb46hESngwgJ5+1vlkPln+FCHmFdXV+LahSRAQQcAIOCnWxyAWkDhg5WjW/DxuAMf2JjAAFAQgEz0xhmVWAQmdOHrPpEZ18H+9U/1EY9T5AEVWXyRP2RxB1T8MSj1eDlZfv7zYv/D5QKxRxMCIGQrrNBN5cmDIzqBCdOIFSPX4MbVw6vqX3N94+TpCtjDLvaxh30l0q7uIMtKAQRk4ApQMEMqCqaGRBjC3v/zphpowAApGAIAL+CCdQKMFSa/ieyGP3zZIxSqlT9nuECkrQ3CIPkwjEFxCADD5P/DcIYg0PYMmR8Y5qDr00DB5BsoAIEOEsAJf2xiAtJMQCHqIZBag/2PEaLHi1xKbA6dFuxwmjBX6nGPOACADPP5T+PkwY8/AKAI8xmfV/RBD9z/sdinoUfRUeeV07pD6LQPFe7rAY84JCAICLBD05VX8BcxXkbh6ARBF+UcQD8FgAeQgBmwkIpOGCIPZ0ugI8QAAjjBnZzVCGwADXzBChwABcBCIdyL4K0J4dFI1YWFjWCCS6zEOvzUIgXRpVWFFV0ZhI3ZP7SDBoDAFAgALVTDAQRAFSyCGwAAAajC7NWaY8kDrmHEO3iFO2Bfn7gDheEDp4TPP8BDGwSAHeCDOUT/iEUo3yAggPGZ3T9QH1DEiz6kw6/t4EoQWz0AYa2tQzoMXwKUwQH4QTok3Kqxi9eNHWCc3VEgHhx2RUooAwBwABjUQj9tXduwG3EwBQLkABQIgQIcEARkQAdcginowAFkwB1YBwTQgQvsQCOUAduhwij8TwRKBaZJSDDFoSd2hWscQwLdgCAQQx4WxSJNwqPNQim0YinsHwAwwCu6oiug0Au4giuWwixcAQBEguhh2fxVYK3Jgz10wRAQQgXoQhwgABF0XDGen6z1SW+IwzRQQ2S8RDxMgzKkAzxQQzf0yTVMwzV8Y9F1RDhMwzQ8A+qMnwLAAUZwAzIUQ7S9SD8M/8IB2EE9jEasARukxEM4WoM5yF4Rmpg5mBc3HEO0YQQ1eiNMdKFFjMY4/kM68MMgiAAkXEAmpF9w9VFYiMMZHEgahKRIjiRJluQZyMEXtE4LHMIshI3XWRgfWkVTgMAQGMINHMEY3MEdyEHlccEgJMMLNIUTrMADlAAdKADBvIACQMAcZABcFccmigfXgGRJVqVVkuSBhIFIPcUL8EEp5EjjLZxKOZxKQBwErBzFWZxKYBxhjV5z+NHGsZis4cM7zIMn5AEt/EM99APz2cG8cIU++MMrxEBTJIAa6MI/sAMKCMAc6MAAcAI+fMMbuF4AiMAozMs+eEIM9JYEqAE01P/DPiyjO3oDDgDAA+TlH1HkATxBGTiFBKCBOUDKMrjBBADAANBAJrzDP0TDARTAL+BDOuDDKhzACGxDP7yCIgIACBSCGv2DZFJmDoxCbNKlDxIdYsGEMkwMmdlIyQyipbHP0iRWTJqMEkBBFexAFETBDoDOW+VBJTjFIxbBBoRAAA2i8UTBU0LlBMYIT9SPAD2FAwQMGjpZqXkaqOnDH9FF8ZCTGolalbUlMFpgY80MzCRIBlbg0JVdb8QDNUiDJ0zADHpFPbyDKWTFBXxAbVrANrADDFjIAsQCix7AAHwACrQg+vHDJfTWBXTAWYUANMzDMtqBPWSBaaLmO0zkIDz/xQUI2QEw3T80Q20mAAdMAAIMgCLgQzRMwAP8pjy8wyoAgAvIAzAE0JK2oCLIgzbgQJV6AAQgABKGz/QB3UbOxx2AT9VdhDpEQh7wgR70qZ/+KaAGqh4IAos4BQWcQStoxkvCZNrh2AGAwLvdC1QAkFsdQSm8AQVMwA8gQQ8MYutQQV5kogQSHAkqg6CeKqoGqiDIwXd+gByUArigouMVV15xUoK1x5RhRINB6AgahdcFgQIwiR5mxNA9nD5Ew1kBQAKcaVFdxMcJAByUAz0IQ4uSgT3AgGmKAi/Mwx8cQAjoQl1uggIswC80AwIQgB/s4DKoqR3EQxwEABrYYwHY/1zHHSlFyqAivAM8XEJv5gLSAcAQ4MI/gEOSkuvHbSlwCieY6oMkAIAR/MO9YsA7/AEChAAu4MM+iGsB5AJg/lyF/YQyCOuHcIMCkApWzd94yiQA7EAe7FaOZcUJBIItkMIZ+IAPnNVZNcXcYeIHkioJMgc3dEAG5AFXwaRY0iqU3apfMReVoZoIDmsVns8OTC3VVm3VBkFe6AwxQG1QWMQ66MMyzMDaBcAWmAM9vAOC/oMpAAAGoAPu/UMwSEEhtAMMIIAf1IM8KGYAKAI8MMMzfEPSWQIpIIALhINnhcMmEGc3xAFSHgABaMLa0OMT1gA+xENiwoAAcIK5+mao6P9DO+DA3nrDBPhms3xpmJLCAVTAKHQDOIDCKHwDDggA3zKDNXyDDiAAs8rpx6KYtn1FZsUF8AKvPIgDe6DOEIpnoxqHkr1AHrhVziLQDJSBLJDCGryBW3UUACgAKqBCXgicfvpsmdRM8I7v+LYUMyQJRmDWaxForUaZgjGtrj7oL/YqUbjGUhyHWwHAGTwVUmwNPogDtdoti9GDPOSDPTpfQ+YaPbDoY77Ex+VYR8WrIRlSBTzDMsooI7wDOMlDPTap7OED0gUAJ9gCAmDANnRFOuwD88HBxzXAb3ac6ZoD4GZFAlQBLMgDNmjANBmSGHQu4LiUy0xoELcM9IHFBmL/QqkI42DwoBL3Bf3Fjd/xl/0BQAqYAjCcQQ+sQQGZ1crSQdYuGfhaEMsYLbyo1JMdl9IuF6k1bca55VdcxDVgAih8Ah3XsR1/QkVRDgR0Qr6IxUXYwykkAjQsR4nKwAAXsD3ywPOdRjm4A4tmLkZ8XACAwAtU8gvYAAiMQrdegCW/wA2YwBKMwwUHABy8SBBysD1aAe6BcNJxQi8cAAZ0gwbLw/ghAAtr6W8Gp+luQxGewhRQaQD4gTZoQAC0QCW3gA3YQAswq3WizKJG46B4hK808RKXWcoKGAC0gCCMTlY4QBtMwRMcULL2VvYiwuiIKlVEpd8886xqEz40Mma9/5A3lYMQ4s2CIonLaIbTapwfhwUXBEEcLSqwfW4AMEL2mcIB1AABQ8oqIEAFQEM5rsIJWAHdNnAJxm4mvG07AMIT4MLaKvTNvMMrREEhuCsCrMAEIKEQ9obkNun7hDAnZOkMZoQ2wEAAaMIwEwAt/Nw7NKwLmIMnqAEuiN8mAIAFSEMTCEAm5Jrnel4ssJjvSSURs98fsd/4XJivagQ1FEMpHEIejMGBeB4XnOQdoJj7oCHXccORLGrIPLEmAoANVEL3StMYPG/9rdT6eK+6hPF1zup7CkJQrEPE+Ul2qGVG6JGvpJpAXxhjM7bn0MUGOrE/NGwFwEI4CIOaGl8Rm//eASwBNYTDK1CpH1Q0ZAYnv0bAKDyDNLQBAvimNxDzFoQXK9SmHwBpABTCJlTpleLgi1AkAjDdi4QwI9xDFiCAZV6DMHRB6kLDkB7AEDxDPASDDrtAOiyjCOgCPIhrA2zDJSBABFgCN0hDt7owNIcHW6fvULjGNRyCkdSBHIjDHcDqNSxCIMhDIDAvCVCBHsQRWqvEuGiRW7+1DUwCB2hHAMmBwCkZy5KzrOznYaWizsxCLdwChfuCJjnAhFP4LQxDENkAMWj4LbjC4fiiYjuHVvnFRQCuU0jTQ6fDyuDDmHbUARiBOTwyJ/CFPbRBb9nf49LlbK94U9D48AEAHNT/o21awk84YZOCn3D/gze0aOssAA3iQzDUJgNAgIWMwDtEAwr0lgDBQT20g47vuAxqQqiUHTxhhDGUwiKcZCXoZBTwKRV4wdDcAR/cwSTABFpXQipgRHmlwW2UQx4cQykEARudgQpE3F4011wF+KQiEFw7QvcCAKveNduagVPq9V4nzHR14KRKRY5Z+lSEID/P33n/mj6AAyDoAASAgBo8wxn2Rm8E5zKUQQZQQA8UQjd4bhPMYHCeBjx4AhBQgAdUQSw0yzvU+q3nQCGYLbciITGydgTEAt4qX46SQZMU4wCYeT2oegy0+qunA7HpgzCUAQVcgBoQggIkwQkvwxuk/wAFMDsWFqGwQ0Cxx0JUm/d8RIIezEIoyEHYyEEdiM4RMMOznQM3hAM3YEIaGMNJXcz+yYET3LkNpE8GjIEjgKoD2MAsGENkEAM1YEIQOIEKtd81OXr9+WEdCkLWygE3z9YVmIESMECyovOocnpwLVIkAEAHREEQ/PzP74B2AP3PHwELRJwTEH0U7IqilHi5LIc+mNbPAZJvdMU7NFaf0EM6nOH08cwY80XCnsavEzARQ5+ooUOwdWGX+SBm5dr47CAY8rRAymH3Rf0QXh9GnG2frENsUsj0db13wMQxjIFrKEManJscpEEefMQ7UljYGEMeiAmukEMb5c0YlEItUP/BHdxCJYhUK2ACRAlFLYTBCCWTO6H8W2cAHzilHHzxBzhCGlzAAORvNTl4o7ezgbUUpHyaA8jUwS2YGumI/Dq9sLhUDvYerd0MSvQaUxMrrlnEvHNFD96Mi2PfzchDOhQbPVCY8nOFDxZFxw3jy4HTyyEoraFGE27/+3gInnbCnjqCn9aB/+kBH6TBGLDsJwRCJcyGPFwKQCD7J+/fP3V3Svmy5mjcvzS+/tWpdKTgtVLUZj26ZpDgvzF5Cq4rOJJkSZMnUaZUuZJlS5IEXR04AIBmTZs3cdqcyaEPBCpBADiok0eFTAQzcybNiQCAl3/48LmUOpVqVasjCRoDwGL/oLp/lACAFDkyXNCx/9z9qwUgCtqCXvMAmPTvnFoAR9JGvbqX7z96+ujVo4dPX9++hUdCjarXcGPHLfWiS1syDzNitW4hi8LBUdTJxJww+7cu6rFHguoEsRElgw0nCs6kCneMhYIdk5SNhorunzgFXup2fDyc+EmYMpUmzzkzQyBEO3Y4ujLzwFGdAJAqt8nUKdTi38GnzLq169ew/9BBJcjtgAPeUL2ubatu97+4c+uuxfs0PHjEJPVSTMABCSzQwANNUoy//hjkqyN31omQNz02GgmTPDqwxqB1yvknlS8KkocxdM6xxhhliLlFjw4WqUOOVGp5oY7/RnKFpheI/xmowR2tOi477bRjqgMzzOhJph+BTI67pxjj0UkH/9GKK3m8Agskr/grywEsR7OrrbHgkosuu/Zr8smr8PnrHxrPTElBM9uMM7EmoyJmByq8+OKLHWy4S5zEbgGACmoGkmcyk8TJA5kOe3MiAw7OuIWbcMaZBYE0BAEAAoiEk1NOH5PUbiYEEBhBCQcOUADJm1ZVbknvPI1VpfGmrPI8LKPSkkuR5OvSIPvEzO+uvGQdDs7+otKHsTeLbbagqKih8JhjmCklDQgOeOGRYZjxRQUHAEDAFR0XxMfQ3sYgBp3LShkjAwgyAOAD116AoA50QgEgDV+ddRLUUEVVwAEFrP87MjuDW1WyKSb77ZfW8qz8NcugdvXS1zDxI5PYhq0K8MCPQQYZpWQ5jjUqbiopJxxqhsnjBQr6oICKO8c44xhvqXBrQSajGuYKG86opJZQuKCCm1Iyu4YPElrogJg6SiG3ZAb/Bdjqq11dGNapPX2YSvPEevYfXUfila2Lgc1Yv425PgmwNelZc0022647PIJSeeGKMzqZJQ0FqGFmHHTEOWaHO9RJlGc4CaImimIK6uSIHElyIo9IHHAgA9GOtbuxqrEOXfRwte7c8/68thUkdAwViZugysFnHXd4m+Xsc9xxp8P7xlx759MLihux4YEvnjiRAtHwH2XkiPoprxD/UcGGQ86IWsTEdhYpFSfugOADDcs5h6BOAIDoEQDOeHZr46GMKeHR4c+6O9PZHy518wIxSZ6gTPJFUJMypbZh/Q54wisI8eqXwKsQBBSIiNYYuFESanBgB63gAAvIgT2GMUZE1JDDB45Qhzpw4QhyOAIAKlGQidTFHfRTYEtAFz8Zyo9hLwTP/cAyhmLcgoe38IUrEOCAHvKQGOfbQYp6WIwxBEtjBDydAeUWRRtOkSVRccUJ0xAKTITCFa1ARAc+cI1yUCAVURlHBqVWEsaM4xqBK4YvarEDRMwiCkdQHhX3EsMZ7hEnr3IhHqtyv0WwCifIARIi/tEh3/2xZFBE/yAgIanGf4yDGrXoBCLSEIY86EFmtziCHvAhjlTcQQ6uwMQsduYdqByqJOgYwws6k0hiEEM0LYwkS/TIR12Sbn63/FyUyCMPkZSCBUcIgjGPGQRlLhOZxtyBMpt5zBVEjTeLrJ8jD+hLbbKyJIl6SGEw4Qs4uqIWvmClmRQjD3V+DXuuKMUsUqFBbervH+7b5T1r4sd5QklKOmIkVc5lTfZhU4r7hKS53GGohJ6lILeIJyYwUQ7MqIRAGoTQPw4RDmvMYpbvMehL6mlIfO5Snx8NJDCnFKIIrZSlLXXpS0njFoEaj6B0M+kt18mbUpCDiPoIBKfmxJ+Kqo8xlRCHL//O4ItSxLNTBs3lSONX0ptK5WHnUMdVsZpVrW6Vq+pABzq82iHblemaUXzkVPdJkFngaxi30EcnOIemf1zjFv/whSOsQY1OOHGeT4Xq6JbEV7SihCDHAMALdjSMAf6zYTUdrEHTIhtX3MGtxGgqQP9RjGH8oxKzuMYwosbNtIb0fX8NnVQfO6t/GDYDh9DDa2EbW9nOlrax5cNrEbHEKIiEsf1ybGrniY9wcGgjwmzMOcrhDnLEDh2MmqpfTYs11AL3JGlRbHRrYgOPDtSs2aTuR3v7XZdAF7sAm654sWeNQzjiEe1173vhG1/5zjcSjzhEKcLr2+4WFL0HDVBjPAb/XPKWN0nn7a9gD3yS3yaYwQ3WkT0JDD8DHxgfYO3qhTGcYXQwlLsItKmDQZxatYaLVCU28YlRnGIVr5jFLFYAAEC0vhDPuCQLpvGNn/uPVkR4jzmTMY5nbGMgD1mbBPGFE6iQZCUvmclNdvKToRzlKF/hCIggSH6JPFghZ5nLeNTHh7scZo5tWcxlrt860ZxmNa+ZzW1285vTjGUzf5TMc7bznfF84zrnmc999vNj9/xnQQ+a0FQMdKERnWhFT+3Qi3b0oyHNo0ZHmtKVtvReJn1pTW+a0yTJdKdBHepHf1rUpTb1n0l9alWvusypZvWrYa3n/YI51rW2NY1dDeSAAQAAIfkEBQoABgAswQCkAFoAVQAACP8ADQgcSLCgwYMIEypcyDDhv38NI0qcSLHhQ4gVM2rciFCeAXccQ4ocSbKkyZMoU6pcybKly5cwY8qcSbOmzZs4c+rcybOnz59AgwodSrSo0aNIkypdyrSp06dQo0qdSrWq1atYs2rdyrWr169gw4odS7as2bNo0y48cCAs27Zu4XZFwFZgXbAHAACga1eu1LYeIiBAAIACBKx6DewtsSEFAAeGDNmA0JZCBgN+mSYGAAFNkT5BIKQZk4ZPHS6Gxjg4gOApW7p3riDIcCeUHAV0GUDw0qgMXL5LFQDo8eMMAgUHHFSaxEUCBQMIJjiQM4aDA+BH9wIwkGENEjqv+9j/OFBlQ5HjbBUcauRkcNHtr6F/ESWqx5lPXJSYoYAgQZEtuNE1By2GpLAUADYIEgoUUJTBRRqO+KEEcggwoAUEgwEAwiggHKCAUXk5YEEjpWDSSyMNILeXF6X40ANuPZTQIV0UpEFUYnQdkAMUZrwBCCmmUPECA3XRgYQPABwQwgY0DEbXGard5dN2SQIwRiVqOOLBZRR4cEQlY0jiyQVj7MCaAhcwgBlhT/yiBms/UQnCiLNcYQJheekFgAJXmJIMBVTQQddgrBXqhSg3wPlTXkNA0QiRerWVF2Z7zeDJGD4gcYNArbEFAANnHJbZTtshIIEQVQTxlmJ17XXAAJeQ/0KID4fx5akNLCgaFKEO5PHFZmvmRRghpKjZGqt7PiHIsUMlSRgAcqQhLKuDAhAFCE7aRdgNv4yC2ahx5hlFIA7sqedbYXjgHo4AUFFKD1LeeOsiH0B3rpX1tpZkXh0sC26z9nZwyA5UVjkGCdApRph6uTKLVKmFBcKFXoQZEAbCCuslBxUJKxWpvdCeobDFGOc1wBDSOvwwlZQCwIUeDGw3xgeeOpAEFCLQBV9T8OVlgyPPyUEBa0HocYMIQ1Ol3QeHHEEHBDbU4USt/y41qXYQqKGEGldkkNhdVTrVFpWDiQBFDiNbdbWeCnwQAHoIbdcUXOdKyuxbcmOFHVMBAQAh+QQFCgAGACzCANYALAAjAAAI/wANCBxIkOCBggMPIlzIMOEBhQkNHEAwUeBDiRYRNNwokSLCDBoNABgpkGJIjBwXPnxI8eCNEiGA2HjxgQOHEEU8UshQMSXCiyUP0NiwxMaOHmcEGRKzAdEXLoYMUUDQEqJPAw56QDh4oMcOqgcpNJLiAcwtOU6i2pAI1KdGHz98pBnz5cqiKD189FDQI4zADGPmFKFRJ02ZFG03VvSwRouNI07GYApEB8maFxnuAFAA4ICLDS4UpGmUgupVAwoM2BgjsPMLLQg6ZABT544DBQ8Z0LiAgALi070FKuDigIGbGAq8MJh4IIMjPD5AIlAAViSAq25ITYlyBNMjQbZsnf8Y82Ek5yhsfngwQLUqSY4H3dgqc+NFkD4QukwJ8khPDDec5WDGDeyBNdKBVx1wx1YiycHZQxTAwYotgMgxBBQgaHQggiVxpNEYKqAGwA5BHAABFWpA0UgcJihARRq4kbThdSkBoFEULdgIgAhQzJHGESlIQABYX9gw0YwjHWSDFFVZNRICANiwwkM7NKIECAFc1x5FUZCg44wPASDKLz2cpNB1nQFAAhcUICIHBQkc0NmWADigBQOdySljmjec4SMEEKQ2UJIA5ACFGiEmROhIFMiRJ5LvPfTBIrSccaR1D4lghhA0tiaSnHKqcAdXCCZ50HQGULBHLE8ceWCYBoz/IYicUHbEEgDcHYTmrigZQIUjLLTUGpgGHJEHBGmKVJUcHJBqXZKpqnHHHbh5NCiNcxa7iAPDsgWAg91yaMAZ0IjCEkPY2miACpN8wN6GBkQh7K5QAhAGHz1ckBhCe2r0gSDutgRAB1T0ZCsAEOjhl0U+0WsABI/sUCAAT7G30oEvOCKxxaftehAEeUTx7h1OoEYRwh+MoQcF7J3maWfKopbHFZvJkcGuGVyoRocui+Tpp9fJcQYENBvQgQ1XHJKEEkOe1PO1oF6nRSNDZHzGCyZoNMG+T2MLNANQQHEFTyRx9TS/FnkswQMmUZenz2cPapGec4K1Elt3xw03UHPiFGZAAA7lHXenw4qL6bN6N/Re4gEBACH5BAUKAAYALMEA1gAwACIAAAj/AA0IHEiQ4AEDBxIqTAgA4cGCECNGBEDR4cGGFDNiRIBg4EOJIAtmPNiRgosbGS5kWOnBRQSBJkxwRJAwpM2KCDuC2GAA0Jk0eQzt2VACUBhDjV4goPjRJkgANAUqeNIDQAYGKQyFATEmVZQgTsJEMUBBQUanEA9m8OHBAIcMEO7Q+eEDAIcxNCnUuaMBwocoadI4wInWIwAPSNZEocIYDCW6XhC8QIjwSokSDCBodXCAsNOPDHr0YAjggJYdCFhQcVLHBIMDCooUUXAAAufODQt7dPAHEouBAD6cKY0ghSMkPkjSVOAw92eEFBBkOALI1qpOV6LYGBSDC4nciHsw/6DJsOnnjm5IecrDIsMMBWDGZChjQFKHMwI7skiTgLxG58+1kQwhIyWkxQEIdJEBADkIYVsLckChBASleaYbbBzkwQFUBnT0whUGUJQBFlCkIcURR2CRQwDmEQSgTS0gslRnNEkhwg5hfJGDBdHVNAFlIHXk1FJHyFGaQAAoAcUcKRwwAXNS5cHAi0iG6FlNIMkRBUUQnGEIBtEJdFAAwclhkYsVQnCBcw1hCREDi4BwgiM2IKAAR0dWeAUVHYLkACyooESBAx3Q1iJUAIAABRYQOAQcSQCEsQOHEymQyChShHFFItBI0adICF2ghBqNLiUmQhVS8cFB5lV00GAAOP9RSiEvKCTSkQjYEAiFHeF6kAJXUOAmcKVdBMAZdzhAnkQXLdWBHhR0yGqHAEAQhlkTMQRBIp9o0VBUIVG01Ad68FqlW3eciuZSAEjxSyLS6oYoB5h8wCFDLKRLm0HUAlCHHB6ECSRaiHZQiQkcmkoFAMzhxlFnHyzCp6O6ATfuJN8hmUYHCAqpEABcCGJvvBUbthQHgdi7VB2G0kQRAxUExpyQJT8a4lIU5KHyGIaGCIEKVSxKUs1PHQRBIBxAAGJpLexwxx0f5HABR0RLVGFHDggyhxQQcBFIEC0MZuewVRd0UWcXGGCGFjZA4PCnZWdrsRAWTKBQry3GDZyLBigZcCeSnRmUd9UAMtUwqwCSrfdEGFWpeEgBAQAh+QQFCgAGACzCANYALwAiAAAI/wANCBxIsOBABAgMABi48IDBhxAfAlgo8IBDggguJqQYsSNEAAgAdHABIkMHGzZolPAwEcCHDBY9ynRIUQGAJxvIGJBzBhAcA1aA9JBiwJCBixdlFjywEIJAAAcUPMHjwQDCNIbOhDrDoYyBNCYUWE2olODCHj+0OLnjCJEjJEg+KKSQJoOCNIKSXGBwI4whGzHLEuxhwEeQIDs8cOhBh8oZwBDGKJyzoUhGE43KZCx7IGFCB4DkhBSIUAsFCmPG+KBqgEGICGNNOCArWCCFVaSE6bkAAUIMBC3GTHyBxIdoBAoUIOx8VDCHGCqipHkjyUkoTGM8kWpzIAqHhSwy7P+wMZYswrIAAkjq9YaDgwMMEGRYBMGNKR0i64hFiEBQjtoFgaTDKnVUZBUAV5xhgE1HJaFEEGfksYgZUCSwGYBPBVBHFAM5hEAfQMC3whgUGnAYCUIIEUBgGNJkAHkJ2dSBEkOUkUYMFIDw1AF1WRURVB45BIEjHVCEgIJKoJBRTAGItEhnSS0VpVUsEsTBIjCtoIcWdvnoGVM2XOGjQVBNRCZHT4X0AhZYGACTQyyWGQVMzZkVkgejPGEABxDcsAcEQBIkpAFmvKdcnRWFVAegU5IGwBG/JHJFGFzA8ksPgTJkVQJppIEoRgZcUMdoHznQAwRMpTGHFIAaxFRCAaT6wcWnjlLBIa0PURDIF0xlqulACgTywlMdMhWFClCSeZRIiXQybLIyUeAIBY0qcIRTuIKkkCC/qDGmYB1MwsCvGRSYUFILAUkBImB4gCpTAO6gx0YUQaipRRcBEMQiwyrUaEeBcZFGmVNGuRADctzB6IWCwSuQHGBA5ZCn2voIwAk36MFhxRiaZYAeOwh5xatigXQDoSzg23GHjjKwiAndNTcRBzuMIYgSFkzwb8dMMcWBIwrUYQMAFHyQhxwvfDcBbStDFBILe6hhwxhnONHBRkft3LSgSkBRxQ4KQbWZ1k1zhIAIQgjAssdbK9vhhWgu1bbTy8UtqFIBAQAh+QQFCgAGACzBANYAMAAiAAAI/wANCBxIkCAAggcOGFC4UOHBghAjSjRoAAGAhwMvJmSIgOHEjwgFWoRQZAkHDhQAcEgRYaEBBzYoILCIEaTEiwMPXNhQAlAaA3kMNTJQIk2aPgbSTKhY02ZEBCldQtACIYOBDFcaWbFDp6oXQ4dIHOjY1GlDHwKjUKESRA+eHzcQKCgzRoGWPGQ75OETRWZZpwjQntnh5MiRIHiQ0NmBACgLA0cO0big0JCBGArM5lwI4ICUMxgPfBjjQMuZDisQXbzBcwIACEEgJDTr0QCAKQZkUTlwkcIBKhx0nvHBJsiBCUVCiBT4F+JYAxAgIHghBRIpT6nScClzKUaGMwoDr//B48Dj2NmaGfwh5SgKBwgoDoB5ROENqT8GnJhIyMBAkDMBNMZQbSAppMAlydzgkm0G1NHBBDE48JIaOThAwQ5qQIEFWZoVBIADbfUXngEqLOIQAjYIdEYUBkRhBgiZNWcTb/nlcdCIXAhxAhdfjGGBCAEekAEkMXboXGNhgNaYbTkYgEVsE8z0nA1UdAbSRTjxVpZCdzjBGwRjCKKEBK41NNARVjEIUU0KLIkeQgAoMMkTOURyhJQWCfScAXJAwJxzBrRwQ4AXZZASjRGB4KSeFS3JHAD99bfla7EAJccdeeCCip8RKUSBBY1I2FFCOOkZhBZWRhRnFXJ0kIENlYjmogYDBBKUWRCCFCmSR2DsAICja27EQB1RSOmUE3poNJCjVFhVK0IePKHHERU9KxEVcihLEJh5gjSKAVIoZG2nSVXZrUAm2FjkRssNK8gcFBj5px5B/EoQFSw+JdAL/jFqJJYG8LFDRQRF1ekYeWRwnrwMWkRBICQQfMAYC5qZAQt5hDGukY11sAgEB2WQ754AKLoHvzIybEBqDgCAL0EwRaHGsht3iBGuB9wxsAMZgMFHECYoQIFrb6osURR3pOGBE3V40YKfDKVsNEFmCOSEbGpOrZlCSvhmr9ZG8oYo2AxvJLVTAQEAIfkEBQoABgAsvwDWADIAIwAACP8ADQgcSJDggQMGAChcuDChwoIQI0qMiNDAwYMWDyComFDgAQATQ0p8CEDBh48NGQK4CBKkyJceLSIAQGODkBcmOFCA8EIKCAQKFDqgMLMlzIktL4rY8ATIGD2YJjUSs2FPHS9hDElJgfDj0YkZUG6M8eKAA4wp0IjZw6LDC0ON7hzc6PJrTA9I6GgJM2YMmFJrfrAAesBJmQ6HbABAQOFMHboP7YJE4OEHHRtHggTZcQWPDzo3VirQcoBCnzE3GBy4oscG0bovK2pkfKboZDoZFIw50+KAnA4I0WwYCPfFxqMkLwJhBUQsgChHFGa442ONHI0gSkRQwDjIBAQIYH7/dAABwocTZ1iZOhWGRAcgUxiMAQ9gwo8facAjcMB9LkeRCDEgiSmARBFFCzrooMUZNoCxCik6OBHEYiA5EAUYGnU1238hIaTAIKs0RxIAWiTURRsIQDAHBQpkQIINSUBxA30W2VXQDnIYoMBsz5GGUgdmKOGFF3WcoYYSHHAYEWwQaWSAHkEYMNN4Y1yQQRBcyKEEBhRMsFIUzRU1UkGRGWQAA4I4IBNII0BhCBUQLCblRgpQQcFiSg50nEMClSlQeFTkYREADowRZFgKcQRABnKs1BFELcm5EUZMYnSHDQhoIQcLBqgZ1EXH3TCGk0vqKAUHKjnKZHg5QDFEGRuF/6eAngl9lEYHK/n5pwE3/DLKGWAYoEYiJmhUqQEcKIGFRTtOOlBd8+XK5KAXoKGFBzYEgosuL8hZ0FwQXJFGV3UdlCsHVIzY4QE73PGCB49KdFAdjYqJUHjhpXFFV/EaVBoFctyh2rRNCnQHF7lqGOsZqNrb0EAQZAJLEB/tCSBCcgRLl0wGZKAFnl6hpBC+dcCSSHg24ivIEVI+hFAGCPeXKEgIAaACIldkwICNA3V1xw4tUxhGWeGZO+dHYfBxwkV5wqRylFMaQEmcUmbU5wen/YkRzz0TikkHOgLAwceThUeoBEFMcsLIXJtZtQOHkJBQECwsZhsEQkCBhQNyElrcdngcRPKBAWCYsBAEQchxhhRKJADe1m1HNJMJd5AghwIQOCHHEVS80NHjkU90rwEvwGGG5le8hqfZfIb+LcRKKAG2Q+DVmJLfoQe4c+1mJuqV66LXCLxAAQEAIfkEBQoABgAsugDWADYAJgAACP8ADQgcSLAgQQAADCpcyLDhwgMHDiIUiHDiRIoOMzpEgKBiRAMIIBa0qLHkwAMAKDiIeIAjAAQMEB5QgMBAwo4XTToUSaFECSAUKgLwYujDSo8ohebUSbCmSAYlivQ44yjPDQeGDEWps2jRmBZRohxNulTnR5AhD2Sg4wDBhyBRqBiqtKVEjxZBtDRqhAIkWaYFKfTIkBblGSdkARwIA2eDFJQGUkTJwyFhYsA1ffzwscPJC5sAuHxseaCDnAlywrSs+SJQCwiJE5o1AMGH5zN36pz5MsmJDw80a8pZeUfOxAMeGhla+VfnSwQpriR1wCFDlFRIfqxUAGDHDoRfziT/YGDgQJQ0FDCWjMiRo4IDd2y89KjFRo9IlQGokNMSQJENPYAEAQQhlbURZBW5oRpHMx1Q3wEsOBIESmHYdMADRVwgkEizZfCHGzdwkcYYdZhiygcV2ZRBHuWtqIUHPQgRAAIKBKfYWesZwIQtm4ARxQ4tqNDGJolE8YICGXB3hQooUcAGElhAIcJz5Tkk20IIuBHEQC9B9IUJZwBiiw4H5KBEXHLQ0cMTSsAWEmgMGXiSQHeo4BdIAPxoQBmktKGCGlDkcAIFHAEBBGlwMhSRUldWmUGFNU2kgCAZZADJGEFcIEGkNVHhAUQpMoSTQVe2ZMAYn71pgANmKPEEC8eh/zVTGhmUl1Cj5bEEGoMQNWeqCWmYCsALedSAQVvzORXRBSyCapNB/QnmAKO3NmXAFSmolUYfJzgQHGS22vRCHQ2qd5KpVUCzBws2dOCBFDFBa0AHaojgCGIDdWQhqB3tkKpSBEFU0w2FaHEEV7D8QoWpARsAAhRm1OoSRR91tOgRFPT6rHosCQwRBHr0oUYGHBakwANpGKIASHDK1DEAdzDnrLm5IuTAHYKskOtDNJp3CAcs34pQWrTlUVhSVcLZURp79MHFvjgGvJoBHyyyZX+gmXrAEVqgpdSilgHAwTOxpPeSSTVBwIcXAukrU0dhvNAg2FfitEMfYwSYNNoCnb5RR01uK2YAFR0gKtOGISlwRh4MRM1UTQYEEYnEYTtwxUppWcag2I8gRiVg1nZwyJY1c1BHeQyiXhEVgXzgOOiIr5rHGQTZgDppOF1wwxxpNK4q7AZBPkbMNnFhA2kVKeCEGYG2/TrwGwoUxCEfGHDGewAwwMERXIwxRg5DEMArrtCfa0AGlNiQxgUv2FBH+gMeMCPkiZavUEgUMJ9HEDbAdhLR9tNIRETQJpGUbGcIDOBD8nVABQJGYw40QEAAACH5BAUKAAYALFcCFwEBAAEAAAgEAA0EBAAh+QQFCgAGACy6ANcANQAlAAAI/wANCBxIsCAAAAYQElRYsKHDhxAfHhyo8CDDhBEzakRoMeHEiR5BXtRI0mNIkAItokRZcuNJlTBjwsTY0iFDmThzsqy5MGbInipfmuRJ8aXIijp9Ek1pVKfQpiNbzoT6EWlOqVBpGk3Z8WrNnUmDVpWJNanBsF2jRuSIduzWoEt/UmyLMy5Tk2LpdnQJka1Wqlb3ZlTbE+/Yo2QJf5wLl+tJrmIB92VLeCHglRinNkxL1uDblYsbbz7cmWley1Wfbr68U2jUmT7VIhbNOPJZyo1Z4qZsk/NQyGnPOoZdkvdf0phpliZp9bjqwLS/QlbeFPjj1tL3pj4NHDtPt5k71yO161muZq/ky/tGm743a83tJaKPHn817ItH60tkrD+u4PgBAQAh+QQFCgAGACy7ANIAMQAsAAAI/wANCBxIsKDBgQcOHFzIsKFDAwofSpx4UKEDBxApanSokEKYMBASbhxpsGMjQwpEklwpEIEBQxwyslzpskOaiDNXKpQTRGbOjQp3GJKS8udKE41eIMBpVGOQN0WbatzJQKVUiQozUPE5dWZHQ1eWAlXIFKgBDo2cpCwLMaFVgQkneDVAYYwDkQcQ6C3rcmBKCSVAiB2psE6KAyknMEUAgQIHGiWWOJGT5s4YNRtcKBhMMWuagRdKVDlDGgwXKlzGVNlQxMkHCAIV3ICgd6Lb2kFUdAjiBHORHSxIcKDAQC+CC5vJGq/tsC9OBB8W5blDhXiGu2Xd5lWZt2/DpQxoU//YQemWEjMfyIpcqj0vB9idDSx1eWCIkkqYOuXhYmZESrGctWSADbkkEuB33kEwBhZK3ECBQBTIoRhbBs0xyhlvNaRQChk4EcYLChSlgAFhfCDffAH2NYYTGWpowAfnQXLDCSdkkAEDBkBwBUMqITDGVi0y5NINSmARxRmLHCJIHmlQkcchNhwRxAsfeNCDB7UdcIYoQHaFgCHpMcVABh3o8UELL7TgxBh0IOGDSAygEktI3j0UURpcwIVAiHkZsIMTBSHAgA9aHICjFnpgSeFCCl2gRBUOQFCcQXLEhFBCDqQB2w56kKSQBGYo8UYYUaAWxhlhOAFGGC5BMEVI8h3/cMQONwjyYJ22KQDCF3o5kAEJUUYxBih6pFGHJ7Z00ZYBDiQCzRiI0YRAFICWBcFnDCigwyYsinXAGqP0sBdJLikQxogJ7WmAEyQQhAAfJmSUBxI/ZDAuuQPuSB9dcuCokEsc3HHYGGEsguWBhIHxoEh/yleQJKZEkoYW4iJs1gdgZISAphn12QEgydzhgZtR5eQSF5a+EEasfaVgSiNmKACBDzYk95NLGcghEBgZEJTBC2WQYggGASy36EguOVHjGAJB0AIfadwwHAXYbSeVRVykofQYaRzxAbrsXVVQXjWYUYUTK7i719E5pWuBEinMF6TY7k4gN9229Yl3QQEBACH5BAUKAAYALLsA0gA0ACwAAAj/AA0IHEiwoMGBAAAQPHCwocOHDxVCnEiRosKEBhQeUGCAYcWPETMmTIhghxcHCBCAXGnwYsIDAAIYakQBgUeWODNmPACTiqEUCm7mXHkR5oEjeXgOHaoRAIQxjSAcULmU5UUEAFo0KpOy6kqlIhUYcjIBrFeWMM9w4Sm0IsO2OAEcuQPA7MSpVG1WpTDGkIOOD5Xe1EijhAe9RLEG2Rq04VSOBqgy4HCESxo0G0AooAqy7oFDVyZQZWtzJEYQJZ6c6XSHxIcMCC4gXqkyzBmVek0LRODgRR49mIvAhlm3I1yKWF/o4QzTAwUKKpykSXPlSI8ODjwwsMlWMEusFB5B/zDAMSGIDWKuyDHQgfjLlKV1dwaAVcEhFSNNBDmTpkSFzS95hhtWpklkkUD0HQCBWgBQcAQYcgThAH3wzUaQRCN9lCBPAGSghBIe3HFHCxyIBJhIGE010HENuYShTS+UYsYQVHSQYWkFMQRAUA48IRWLLRloEwgGqOFIKmEEleJxNhGowBzQyLFRRS7aJAIUQkzARZMcyscWghyEQYUce4Bgl0NVKgBAFDkAcAV+QXUXAF5dFZlIGGPYwNGXB44EUwZvHEABGO4VKN8OuNDCwkApAVmQixmBoMQQDshhQwYqqECCCies4IEKHHRwRR1ylMIGEoueORGGCmGVAxRDGP8iCBVRBGGrrUfYyscdiDhyxAo++OCEcZ2h6KcDhgRwBQPEXQjAB7mMEkRYGTgyrKpoGjuSAlTc4MWOCoSbEkcUCJJIFe/Z5AAePhyG7UGGkjTHFfEm1EEeL8DEABB/JdgDEj5ENh9GKt0ABRZABLHDrUHYMAaSO4TBBSC2DMIABfRpoQV3xY6k0qtCvHCDDTa8AMQLnwjywQstdNBBDJe8sQkpMfiARA+bOQqvSFjVccScGA3wQB1OxOsGKbaYEkMH7eYcF1ZhqrSZQENAkQad8AEwhS1MpMATfDq3KFIaJYp0xBhVCEFASgXy1FhHdS7VAhcCHWDDGWFAIG6hfmpWdBZMCqTBgAEfpBHGX1N9zXdxZ51owxEZ5OFFBrt1Wa+BZyEAghp3cMEBSQUa23hBKnUABRQ6GNUsQvKNTpACIoAQgLYZuu7QVHMS2LrtdyGIEe8OBQQAIfkEBQoABgAsvADSADMALAAACP8ADQgcSLCgwYMGACBcyLChw4cQIyIEoFChxIsOKWpUeOAAxo8DK260CBIkxYQbPVLg4LFkRJEaDyAQaCgNhJkuM6LcKJABGENeHHQ82DJnwp0eFUBgEciJAwU4CSIoWlTiyZAUcQYxNCaDgaEFZRpA4LXqRwAyESCgeMWQIQoIFBDsGBWBkQ0i1JoUODVhCz11MkBQULVqhjBalpTwMPZsQpkcTIRBxKIj1QMUI4C4weWODQhjO161ekABAAiGGnHh21cmxQMfSmyQQyEmWo0f1zrI0+jK2pmGmY5J4oKwZdGjLwI44siGR4VTcaq4w+UIhLSEsSZ3WNTBnTu1oWP/jlCkyhgqLzSq7Ttyu84dgY4khIr5wI4tG4pAZb2TJEgIHKShh1dqUcTBDmlc4YEHN+n1lWhGQaAEHFHMpBELUchhAwNJhQbAWkadBAAFUOy0FCJacCDXSVMdABpaZmFUkQF3ALLDARmkMUYQDuAmUGkMUAGLIBcwAFpJWQGQYQNKzEFFEAZQcAQDGXwQxBjfjRHFGKgIEgUVe2Qzx4cyrsWBIAYMAQUIcjEwyi93hJHHGDtQQJ8Bxh3QAZIeIcDHCQdQYAgCEBxxhiB7UPBVTJhtBMFNJq01RhhDgTHGGVHQBZZAFDlQ5QtU/PDDTTE29CEALwhCEQRRlCIIZhCs/8SBVy1QYQAmmFQyZxA2rOGDA1/lBgkFEKThxQtqVnGHHGeMocUVTuzwggcZZGCaQhDgkcGmED03hxlCjGEDWg2YEUQH16FkGadLQRDEGkh00JdEM70gChRDADfWFUE0ut56hCngAxJ0UKGFD1FF5BEEoWACAgV0TeWAHl8VCBNaPfzAQgeXSBIARjMF4goHLaJVoHwbUUCCDTsEccQYp1TSSjC2XDIvRDM5gUx6ChDmaA5QSHHHI7p+sQPLLbxhCytPSGJKDI3hbAAHvjjRHwU7cHFGHWpAkYMJ6GanEQqSAHGAAxD711BLjqwGwQU91CHHl1eY0BFLI0Xc6LoKH1EgARaiQDuGkxzcpN5xx3EK46KlMoTACPgyYafiH/ZpwMc/DiVSSTJREIRcmi5+1VVguYeRTKH76KNRazeqOusv9bc57FbxRLtytt/umO4RBQQAIfkEBQoABgAsuQDVADgAJQAACP8ADQgcSLCgwYMIDQAAkLChw4cQCR44ELGiRYEMFzIcOPGiR4QLMQKgaABCBgUICnb86BEAgpchvTQycSClQpYWNS48oNFBizuG0qRIOTIlAwgISOI8qLMmgB1BxtQ5chKpQgQLFZQoccGA0qU6BU5ceKJRIycOSCoFACFKGitcvS4dGJInVgAZolAJEkNBzY4ZEKgIEyUM0rRfcWrkubCDkzEcDqD0yhjEBjJnPCiom/hjXawnvETxwiGjAZhsg1Qp4QKlS4YrFY9kfMFQoygKxI4FQOEGHxsQGEy+ORfj6YUOxoR5kcIqRZ7Jx9hgUPNl7LkU70LgcsYGw6QwKRT/WaJlx+aRpzuznEhUwZU0RzQicI1XzYYiKf8WV6nQZRA5Tmw2FmMkcCGHByAglRJW+3FkAAUS2CAHbgIlpdEJVMjxAXs2adQgQUoYkAMF2VkIAAd5jJFBSC/JJddGxVE0wR5KpHHVXSTU8UVk/S12F2Mw4sTTAXo4gcAYcjDYQRg2dCCZAzckcgMDdy0EQUhBfkTSGGnwJAUsQ4hQSS15nBEFF1EcQckviQShhRZnnLEHLBsyuFRKR9zB1g6o6AKFGWMcYYMNH1zggAIXUHESBRlwwEEibKxhJ05YfXBHB0HUkeYRIKgx1GKxAcBABzaMkYoBPziwHmVsYcJHGi04/+AhBJVc6VdWje6wyCJ4IIHHDhRQQJxFzwm0QydpBFZUTX7tIAdSEASRxhh6rIHHIXXQgUQPSQ1bEUUXKCHEF62E8eNzGimAhRJzXBFFFBDcgIQPUVBHAQIQyJolRBNJYIYSZYzxF0U7jYWABWbs0B9FPVyQlA5d7GDKJRC4WFFSQTwRRB6MdexxSk7cwewBGbQxhQF39GKLJ5dIgthHYAShh6zsifTczXnssBMQtgDTByZvuNHivg+l9EEaeXTgUlI3Mw0kAA4g8gEEK0ACCRCR6YTeRSnVgYl3fq2ltQIZqBAEFWZAkcYNGTD20l0fpWTCLFFg6ZIDJr0QhRx3zFsBxrtUaCHECA7cxXRYF4HbyBwMtBDFGKIVVscdaUTxQgYOqCofSh16SLRDFDmgBBRznCFHGl7swEFaIoVVnVgfsieEEvlqvVG3GE20knrYicUi0x9qaVzwLAUEACH5BAUKAAYALLkA1gA5ACQAAAj/AA0IHEiwoMGDCA0CAJCwocOHEAUCQGDgwIGIGDNKZHgAwYGJFTde1Ehy4MKJHU9G8ULBosCRJUky9HgSQIcjjQyl8JhyAkWKMR8uTHngCIUoeqLs4JAiAAIEC0WUqOAxaMKLTw0sROAlZxQOHGkCoHAEzYYQWa0WBPBxIwcwXK5EOQEVgYIDGRx8MPBFiwEPEKqqJUgRggMKQcCkeeHgKc+FIDZYGePh51OYajkuDGPoDhcKWgEooLiQQ5QqJVwoEJgV82ADCjrIMaRTK1SJDDzMqdMBAoPRLl8bADrciZwoGRQ4gA31wAsIXMY44fBxpOuSbUMaAG3gSAaLVT8C/xCyYcsOCG0vBs+8UOCHMGMKwgTwIsyTEh7uChaudTsEG1eccQJDExGngA1jgHEBTNcJBwIUVXyRAUMDAXVgGmBAoFV2/BWEgBoGDLEaUEA5sIIeNoDG1nodsmaADXM4sMMhFLRnAANX5FEJdy6yBVSD2FGUwS2FHNFBH6VQEYYed3xSiii/CPLCBxQoAMBvFVmnVkoAZBDKKL9UkoYUZ8ABRSNBtIDADXv0cMYcYCg5yh4fddCDhkA6BJ5AEARByRgUtGBRRyIokQNPl20FgQejjOJBEGv88AJwQcl4hytHnNTRUwpMUEcUFSlgpQEOHKAAB3QgscYdNvgAAaURXf+knANR5PGBIFGYeplL1clBBUE3/IBHKQb04EMPDDi2X0QIYKCEHDYcEMUZE1EY2lBspVFDDmekkaoP34kq7mUkKaCEGRcgEEQe1YnH0UUoPQCFEmVolZ9FgzBxwSCXBJYnQhflIagNfYzan0UEgoeAA0IYopUDU0xxRRimVDOKAaR8p9FFFFyB1yIThnfwSCs+FZ0BKdhiSh56eOIGBRB8ZyOzLwYBgCMfbKpdSK3VZMAiN0AAiSe8PcZWSQCM8UIeQXTEml2J2ngABBRkkIEUUGABBFgoDWptrAZAcEceVxA4c0UOcPBCFIrJUYccYVwhhRIi8CReUB+R8InHdkFaAMEHQYSRxx1jfBFFFFxQcQMHd53kE7xfk/SRBGaIMgYViJ/x9hc7dECBA42f5CJP/FEk7xBOrPB5TZFbNBrpLnZ4AAUTHJ1lotmZzXqLA320q8+8yxR8TAEBACH5BAUKAAYALLkA1gA7ACQAAAj/AA0IHEiwoMGDCBMaOKCwocOHCQ9IhEixokIABhRIPACAocWPDg8gMDDSgAMuURQsBMnyYEmBGTykaWRoAoCXDD22hFgSwAsuOw6FOWLCAAWCHga+3IkQwUSBDo4YaFSmhcSRTg1kiKLGgAuVB1QyVYjgxRgDY3bYmMBw5IsLOwxwCQNzrEGRGA20eHHkrAoGOgfmMCBGSwYDHVfaVcrRAIM0Bgzt0LhSrIIXX+YYEFFS5VKmgTMcOSRVQ4CnAincEOQkw82eiwUyzPvhzhUbGq+qhBDChhwtNyBgBHAzduLGFI6cObKCOMaXCJYYKALks2y7gT/QpcLgOkEGXrh4/3U8Mm/slRcqtAiTZoXHjQM5OJETxIECBgpGBo6tUogBLDYJhBVGB3BARR0v6IfAgk7tZxcCADjQSA6G2LAQR3lBUEcdri3E4IIknTcQAArUkcgZGfSRRlgptOCEI5WIgsoY9yEmUEcYxjabAWnogQo0dVzhSClodDLJGGPYoAYqdPQ1hxxcqCHKBVpBOBZeAkEWxRlPQCCSEgbkAGFHC4qEHwVBjEKLDT4g8YKDD10VgI0QqOCIHl6CuNAFQqShgHkj3uTDD47IQUeVjVmkEwRBhOEIHxjlB2FbCjhRx5gYeeDBC/Ot8UMKEDrlnEUqgZBDFHmYwMId3TWI6U0ABP9RhwMMQPACEmxo8QIFCmSAYUfEKWqSElBIgYADi1ygE3HwJSYFFEPI4UQPPhCXgQMHOOAGB8CCxJEaQiDAACLNfebcUxJMFYCoBwBhyiWLeGKLjYBCxBECrAKQRxDd6pSTbCJRUEcLFGxyiRRjmMJKFYDEEcOOFo2kwhEA/FZciDfSuywFizhBiiQq2DBHSgsG660BUXTwRR3DiUTSgmKNSlAGaoBwRB64tYUaSBDIcaDLCzkns7gZUJBBBo0KYgYUR+i3LJwOjcRBH3WI9R0EH9hABXty1IEWFUcE8YIHItxo5VgAMFBkBljb8MUdd8ghVxRUcEGFDR1gK5F5E9U72xJGFkBhiAF5yDFGECRQAIF9QiuV33V66iiBEhT8etBV5XV7o98POlVm5sFyLmJDv4o+OkWmn05RQAAAIfkEBQoABgAsuQDWADsAIwAACP8ADQgcSLCgwYMIExoAoLChw4cJATBEsBCixYsIDxyoyLEjxo8GERyYuDCDgpEMGYJcaWBjS4IAHAQxFOQkgAMIJHpk2dClwCAcHERxJOdKIxsGThpAIFInz4wLnRrI8EVgmCAvIBygoEAgABAlQjCVSPEpQZwHuipQcQYMGANOglDUqZEClzBVNoToavZszp+Grsi58yID04EMIZQoMubODsMQGJTtO/YmByqGDNhoirglhyBpNkwd+bKvwJwSIazIEyaFAwo5c04QyOEFojsZIFBwQLf0SrSoDUAYk8ZJBo2TAUAoUiQNlSAUNLqUylJjVAAKbMihssPBxsOkT5z/2VAiBWqfUfsqb5HhCpcxxyeiBsAgChg5HTx0EOnbtFcDQ0AhxA4QkHWYRCcEMcZUEjlFnX84YaGEFGrNZ8AK7xnQAkoNPuifVWNMcMaCZGUQRiljBBFDIbpIwcIHHHCQwRNzMNCfWRTZcMgBVYziiiBCYCJIHY6M4UQUN+SxRw83REEFF1/EkgsHaKlHEQR6fLDDKLTQYYYZanzA4U0adSiRB0/44IEC/PGEk0CHLMIFFRTsJ4EBO3x3GJtRofZCGHgY4MNhGDGEUwAbKSdHJSwwgFJXCBwSBABMoSQQBCa8IEcoSLAxBlJL/eYVBzaEgsl/Nwl0gAOIkKBSdkF4/4EHG4bk4cgPPSjA5mQXUcpQDlyk8YIjEPx3FgAZNDIECHxgcoQJQfzww2OUQgBBpR+lFIASUOR5RwtJoTcQTtxSwYGjOGXQAQSSvKGFKaQUKy5ENyGQRA4BfDFGoiqNG1UCalBRJhCSuKEFJLYAE8klg6Cb7UIOhIEAC32QZlCHh+nxgkZT2PJKGmOU4R2f/fY60mUMHKKVQRvp2aADgoBwQhienCFmmdKt5GseL2hG6WldcTgQAx3cYEOAjXhwXk6W/oZdGnmMYahvClCQQQbiObLIGTu8kMMQA6A1Zkog+ZpBIHX4pEAGL0RxRh11nHFFEC104N1IaVVZ8lM4VUORSoxX3GHAGVFEYcARHZjZIE5NeVjdSCBAgcUbc0Rxwm7BnSaSdNKltDffTF2gxAW8qsp4h6g6DmFLb35oVoOu9xUQACH5BAUKAAYALLkA1wA5ACMAAAj/AA0IHEiwoMGDCBMCWJiwocOHDRcCMDARosWLBRkypLgRo0eEEw9UNHBApESNIz86PJBRpAEEMBEsNHmSY0qVBlkiOAjhpAIHLCUKPHkTJ8mdCoQeUJAhiiEqUaKOSUPhJcmSNDt+xMoxgyEvBpx8SaMnjyFDUqioTWOIwgGYb0vWVPl2J4ADHZywHfOCAwQHAhFULYlAwQS5M20WfciVYgYbfM58oPBX5sSQiAFE6MEAAgcONJYw2LnV8sQgeqIccXtXYFIANiAgcADhhIE7kDZsyJMGzJUSG1q8xYgYQoszY46okLjTtIMqG9DICXPFyZEjQETQoHzXQwWYHg88/xgi5cuZDlmHAlARZg+lKkUeKEBA8yjLq3GJT1ACJYgCkQDmccYNUR1SSim/JKLAgvRhRRhcLNV1n0UscZEGUDOZoMcvvGByhgoZjBbECjE5CB5pLzmI0U47XNGBFAdwcEUptfABQgcSOQgAfTIVZhJFBkDA0oIlfUQFGHtAgYUefDGQY0zzmbZQDz50oIINLBxBBxJ02OCDD7JN2NBwFwQxRy5mmHHYQjHBpZ4DGbyQhhw/IHHGEVH1oAUSWvRQZwYkQbQjAGPcIYcUECB312s2QXDDGV9QcYYcNjDQgQ3zufQSTBRw8NBcDHxyB2EG5EEFkHHeQEUadYSxQwdOzv9UIgAOxADBBYSQkkGREU1EHwBnOKJTg1go4UQYh9xxQwYOvMbmayEe4GiurPSxCikpNAYSTWCUIhJ9VmEAxRUZNAighAspEAQpl2CCyA1urBLDAQzsGqhDACgAghCVvPDWSApQEMQdSP0nVJB6nfGGLYNAYHCDHgHQARRQAOJAawI96EQevwLAAAU2yHGGE07s4IBgDHDVGq+M5StEI0dcJRNHVlExBAhcUOHEGWBwkClhRKl011JXnJGTZQp0QAUUZpTxQcozkRrSwRHPXMkZS2UsUQePInJCDiA82ZhGQ310l0wzXmyZARS8sMgYLXAw9I4N3jWXUUPJdYgeA0FUEEQaYwSBI5t1UZTVYjjZfUAoLyDwghxcXPGCUOASdDfeA820owWN9DCGZDODp1jQiCcOQAAAQMDfERPCRDXmFiVmQAsn6AT77QNFiPvuV/GOd0AAACH5BAUKAAYALLsA2gAzACEAAAj/AA0IHEiwoMGDBwEQBKAQocOHCQ02ZMhQYEOIGA8iMICgYsGLBiiCzAjxAAIEB0KeRCmypUuRJAmaDNmQQ5oUAVoeeMlzZMmOFSHYiGLIkIEwVIJwUGAR5caWA30aPEA1JUUIH17keXSEQwYOBjh8aHFmEqIjXgwx4Fi1J0YABxjc0HMmSteKO082RJDhhqFGdTj0hKkRBAgVX+pciWIDgkcDCijYKFEiBgWgABDYEEXXho0PVGlSPJjyAhQogI4ogOlgx5gzVK6kKVEkTZAoY8KoeLHn154DeRqFUcCScMGUEArloKrgQ5DbafKMCULi8oEJJqPIOUMpkqNQG0pM/zhqY7xC4zIlVBkWJcgXOXrS2MjgADNFCgo6xIrVg7iBC7S98QJxKe002nEGOKAEFKEoZQIFosEEAQQq/LDGHXTMwUCBAEygQAZe6FGCECgZKJUBB4BQiBQKmEgRAgy08MUdYdzxyQ8+cBEFF2nckUcaBviwIQA2hEcVVAcFcAoXFDmQwQte1JEGGEfIwUsiSmWAHUMOdLADFWv8cAcXHHjwxAXFnYfQAVgk4UQaixkghxMZwGiAFNDsUSIALRq4EwMUHGDDHUj8ANeRDwEAwYJp7MCBAyJ11IEgQUCwUwoZmMRABhcAQYgbH2SQghs+9JcmQg1JkYoTBiLQIkMU6P9hKQUtXEGKKWmckUYfh0BiyyqL9MGKLXGc5OJIFx1wBgd5MEmTAhCcUMkVeYTCxw0vmELIBV45NUOfKDDhgFUVSUWRAoswAIEaI9ggRRpjINJJFC94AMFGHPWEkkUhJRrSThAsspEFUKRxhBRYqCGYR3uWWBWiAu1EE6qicXAHn4bkIAACOUAhRAAEHutSTAsxtNMKVwDgxRwbObGIEATsSRhUj5F0Xkc7nGCAIBtFR5zMUaFHskU3A0BFBnccYcAiTGaWUr8wnUgyXkx9EcUZLRzywqFEjyb10FCbBMAdmOiRB1j41gw2ROfBxWcpxJzRYr9rD30eVQgIAcUZodUivTZFJiEgghICoPi033+bFMAE+yLuN14mHe444n1PTnJAAAAh+QQFCgAGACy9ANwALAAgAAAI/wANCBxIsKBBAwcOKlzI0CCAhwgPPITYsGJDCB8kQjzA0QAAiw0PICB4gEOaRldWpNC4EcHEjyAPUjCwY9GdMIZiXBGEKU8QEjbkUEDg0qNHmBZHOukT5kgLBghAEFHQkUOQKHIaNVKhUWBChRwdSJjJJY0TGyYcQOhAJU2JDYKisIDw8ICDFTGipPFyoQMFAF0LfhRioEoaAxRsgOFCJUydLylAhMigRc6VMWdsKMhwAYCCI3MajVGAILBAChfGFDIjZ8eYPGEMkIDgEgDRkR4ZcNhxJs9bG3UNiQoiEmZCDkrMlFqEaUcGCCwnUvDhY+DLAxOKlODihAKHULSk2P82mpCCEiUTMhzhKNEBhw4qqDD/sWaSkw4c6AJ+iACCjUeY2PAEBRxNZABRb2RwwAdRUHBEGnnI8QUXR7yQgQIePPdCFG3lQQULPkAwxyhntJBCERtUQJpRCD2gRBpjPIKIE1EcwQKB14nEkn9OaIEEHrqoomBURVxAmkQIISAEFFVk8MIRL+03UQcOROcRAj2scUYaaVDhgQcMQFWagQcoIMUOB7QApYEGMNBBC2WYQsgNO9T5whSSACIUAhN04MQaSHhAWm3GiZQHRjsA0IENRxzBhRyI8JEGKW7YMMYYX+ghjC2e1MHFFbYMckAPPlw4JlJJnpdHKo+ksYMKL3zj8JdItL20wiNlqNXBC6QMcuCgpg2kwBBKnMFFgdcRxZ9AY8jxlVcQMMDRSAmhOhACKczxghMR3VZgkgKlcYdX17LJpkEcdQkloTl69kUYz5IU00hjNGVblB89ZIEZY7AX00JH2CtQXUdBEIQSUKyE278HtXDGussCwIATelg4FMMHAWZABousO5Jnbe1QZbwYE6QxBK0k+pEDlx3BgEClkVyyUYClYsMBEFzxMG4LzyzYRAfsEYUNaUTBs8w+D7zfBVCYEURpBybd0EQBDJFDACJJPS8DVCGttUJ1ef01WGM3FBAAIfkEBQoABgAsVwIXAQEAAQAACAQADQQEACH5BAUKAAYALL0A2wArACEAAAj/AA0IHEiwoMGDBg8cQMiQ4UIDACIeQLBQoUWBEx82bPgQgUeCFAl2AKHQgMaNBCMKnEARgEAIHFyUeLIjyA4mJTZ4CMLh5MaILhFALFKkBxUvY84AKrLhiZZJhuTAEbOnURAFPlMCHTgx4pGcMTp0UJHhQIYbNwQZGhMjg1snFEKijIgg4gtHYzxcOOAyiqE8WmxyiEEBq0KPQg0CBaowIoU6d1Y0RvBCjiFDL+oCQKDA40SKfBlKBKpgjKAgfAE44ALmTAYHDhRsBm2x8UKXWmcDYCDBhhwwWEWA6LHmCEQAhy0iR357sUCXi4HmgGIGkBxKoqizQaKFBIOBiWtr/+aL4MJA6BEvgHgBypAZUb4wXTnRCAQEDxl2TLpiwIEBBSZZZFhEavzyxAEASuSAElDscYYTQGSAFXKCdOaZAy9wEcYZPvRAkWYRcWAaKj0YINRyGewhQgDJ0VWGHAtxllh/dCDxww4OHECBGlScQUULqoW2nARDOKHABzbsEEZSZ0BCCitXcKBSQT2kEAYXOyDySyIUpIabSaoxWEceaZyhRRRX2PDCFKuUQUUadYQRhBuEQMBXYx+EsgYSHrZUEkEgYOEEaIzxNYaUBzAAAQim2JKGE0Gs6YYjILDwQwaeTTlQAApocEhPdYFWFxVl3XkABChkYIINpdhiSpcPNer2JUgHfPAIA5sRxMAVEDBXUUgtEHMKCpmCOWtKdR1xx2ajZTDGc7h1dYQgHlDA1W0N0QWAHGFMZKIBNtzRFUSNhZHHdybGOtdxAOhhg4lCRZFGrqkpcMYZQs2I0nnkAkDBIdbyxYUNn0UkQiNnVLSvYscJ9QIiEBmQBgXMAmCDGUoEYNLCDANVFxdymJhwRBDkkccDEmDFcce+GpCHEwCM4RIVggzaWVYrQzsaA4LUxEIfaUBgklw5K7YYXxxggQUkLcRYNELoOQeBEkrYqfLTokVnkgQXfIR11s4F+OfXP806Ntmiob1vQAAAIfkEBQoABgAsvQDRACsAKgAACP8ADQgcSLCgwYMHDipcyNBgwoYQIx5EoODAQ4kYCyZ0UKSIRYsZQxpAYMDDhhIOBh5AAFJkQ5ZXqmQ4wCEKh5UkXS58mCKQApJOGpVBwFLnTgQiSmiheMBGIwpFjS5EUGQDCKIH5ARZKVUhyQ50Lvw8wKVRiqhdCZJU8Ogm1zSNYuRMKxDAwzRRAAxEYChGgIEAAku1a+BCETQsEwKwESRnYMF6XeplSWNDEawIbMiBeuCxZ8kjAUDo04MBUQAUDBmiYNHzZ4yCOwMQxAKrAgBUGp2o6Pp1xMiy9UQxoCD0jUOJZff+HdkuAgBnwiQ8ULHDIdYkKT7GeVGh3dYrOx//uSO7s4JFKgxYJCl4JFeFnVcGfh54gBDkEHx4QCDhkQ0A9HWnXksIhedARQx4cAUWBiSiRx9IrKEGFFhM154B39XVmUM/oaaEEpC0UkolZ+RgAAcZeNABImZIMd1c6mFYl2+eMSCIGUq8kEF2ySWkhRNjeHFbbDidBsBtMg504BFp2JCAewakAIR5FbEgnQJHjKFFDw6QpFxggqACwnsGdKAEGbXIEcYYZ6QRhhSm2PIGawJxgZ0BDviABB2PrXDDB2dQkQgqL4TW2QlKmOGEDYwyasIFbRByhRxn7HDFHSlUxJIHPqSRxkyj5DLHDVBBQJiMASAQxhUYPgScXQ68/4CJJ6RswoBd372ASB6wJBKjQN3Fd0AdV4Tn3kfP7bCDDqu4sYgcHbyRwkqLpIKED16SCRiGAByyA4CACaZAGBAAy8AHgJCySiKuvMDADz2gdRCAADiwSAuGBpZQEDbIp9gEXUTySyJryYsQvR04QqdyDuSR0mTPdZDHGDZAUBSBLwGgK5Lg7tACuI85sYgNA/b4W2hR5PEdABnUUdxzFEhwxx0vCwhbaGGcEdoRJGOYgQFQOAFsV7gCcMcRqEkHgApjjCHEEH+l9Rh9gthwBWNjUNHvhnTVxS0FZpiRhhMPh2fzYBgiUIMSE+gFbtfzUvccjHAb5FrdDPmGt3eRdQIdEAAh+QQFCgAGACy+ANEAKgAoAAAI/wANCBxIsKDBgQgOHABwsKHDhwYOGAhQpEhCiQMVYoTIkSCDDSUUMkwYUWPHkwcYnMkgEoBLABo3nnQokUIZBAkBvBhDQeJChjMhInBRBadLQ41eIDDgMujDpRlAQjiAQKehCS+BOj2YkAEaA0apfgGQc6vDpSyChAVgw5AJkmYbVo2igirQMAZsKFga1+DCDHeqMlVIwZACiVr7RgRAocQSnAsTUmlBVfFBDyAnCJQIoVRPhZYLRpHDYCAABV4MpTgssy9GQVMHnzaQhoKC0ALJ0qbC0GXVHYbAgrasm8OdxTABQEBEQffwuDAXLtpxWqICAGd4l8QYPfHBkTjBMv91MgYxU52Bmk782bpg8spaGQuBcmSFAQ87VORoBELh0oUEhWcQUFUlIAIHNpwhSCmFmJGIK2wgcUgdZkCRAUEwZcTUgKddhAUUiYBiQB5HcHACBxT0sEYeL1Rh20bq+dSeaQzccYYFLyoUwFL/reBLHTJuiFiGyeXGFAMgRMGiAnudp8BUCDAJQBhUXNEHSwBmxCMDQy4GAhRmADIabWmMAcYll0CQ2w6HSLRDID54wKUBDHywkJqjfMbQQgPUYIiJAtlgQxBSXEJKHU54AEEeDpwGwAdI/ACBS0/oIkgadYgySgZEwoRTGldgKNCTt8mRyh1dADGqDXSkcQAHiYzhQsWW8Z23UCA26MZXSQAEIcgLttjyAWtTloIIC3O+NOBiHAjCmpYAZICIAwZMoQMVabzRBiWjlLKGDxk+NBIAR9xB1p69CZLrfwZAQIgtzmhyww/geudeRGABcEcQlRnlBV67GkABJIQowKUD19n7XVXL9cRXB44clhCTRyByBIwKO3SuCnwgtIgKGypQQyNzlLYhvk6dCwYXDIUBRkQUqLCHAUpo2BdQADjyAgt3OLDDGGcEQcEFF8xoVmUcYIEFJFJcoUJTRhNX81sSQYbbQQdIAMJFgl0tV0tePxX1VgEBACH5BAUKAAYALMAAzwAoACoAAAj/AA0IHEiwoEEDCA4qXMhw4AGHDSNKvEADAoKHDjFKjJiwyAYRChCIFIgRwMaGBw6AKJEhpAEAMEuaPKnwAAIgTkQiaGEi5QGYMGkatGngQJ8ORTM0MjQhYVChQy+G2ACC5JgyAX7OhFrQp4sSIBQoOBCkxUiuBzFe2ZEwZRgpNp+idQiAQ52LDzMYajQh5da5RQG8CAIAAYADCgxFuSh37k8PavoaNuAgD97GXH8qKLGBwmGBNvgUfgmYZOEqLhg8BEDB0BgHJjFD/dlBy8XAeg1Y1Fo64ZUMcR+aSOMAb2mEdZ0cNvkzygmbq48bGNMh6M8MaYjG/hsxJUnDGYJA/xcIIIoTxA8nD+Te9SV6kxKqcCjYQU5CAwEQklyftq2Dhwd0sIMSBqRhoA89HKGEEgq4pxB7Mx1wgRJSyBHKLZ00YkAfeeBhwBovGDBCg+RtFJ0QBiSxgw0cZJCBDhRAAEEGPchChU4QoSRQBoIcccFYpHlnEwIvINKHDVrdl9CSJTokghKNUMEABRQ4IKMBQGRAEgWPOEDBIWBAAOR6Jl0AwUzMCQGFGlykccYVUVBxxBm22AKcAXI4QZ4ca/iggEkO9ECBAmPkkshozAVwQ3YxOSCWDn+8cQYVYSxywG4Z/GAABfdBI4oWaYwyR1wvAeWmfuT5VVcpeRBiCgTu6dlpwAuOFKJFqu29xEd1P613URpRMLAJKYBwwEBIjmxoEUI+aTSQYSog8lSvBtiQB0wapMABGJtIIsgvbPzAgEjs0WXYGGGMdp8CiyBV4kO9ILIHguM6axBzCC3yQWEzpUGFQIwZoEIeV8CEQEj2PmgYB4uM1SAJiyT0JwMfUJFHdaN5txG/XKSbECLuGpCBElDApRG1J63miA0CXXEpB3LUMYRuRDmWUAd32NCHCWH4q0JIDkhnMABDmNFIEE6QSJp0+1WgBAjUalXuXAcHXVjCTDuYdUNToxUQACH5BAUKAAYALMEAzwAnACoAAAj/AA0IHEiwYMEDBg4gNMiwocOBABQaAIDgocWLByiK8IBg4cSIHi86pAigxYYSCSUCWCny4koAEIr0MFBR4MuWFisC2HElIUwGAFLibLgSAQAGfVTQhCBlDIWOQ4kiRFBkAwiBEAwZcgA1qkMEVkpkQKDggKEXNL2OzJCmrMADekxIVGvQqJYPbwGcMOAEQU26eQ3EkDPxQMcTjWwo+As44YMST2p2fNG3K2CKB1wYoLH47ZgUCEOqBamlR+eMURqleNt4IAuBkg+kMUSBdeOgYSB0hWmgtlHRaoNEIVjTBuyEgI0ySAOBpmGBZ4LO9WrYqAInH16y/GIi4sAAAy0T/1Ro9GNQBTWgnAlio4eHDCOEuDUcdKJzg9INMJDwgQSXPKX4YUAkkYSCBBKGQGGfeR6xdJABCgAgARRmlFLKI3kYUkYQH2Tggw+OGBKAQqFlZBNy+BmQwR5Y5DDBbyRmdAAFrTiigoOslVffeBdQ0UcKEbIEUwAAKJDQHSw4oMcYNsnoYGh5XQAFHIuMIUcaUWR5BSmSEAmADYGQeMaHDDh3AAMKJDIKA34NRIESWKDwwgk2hAEGGG+YQogXX2RwR3MdOfADGxlAeMATqNwhyigQIBTUSgcAcoSjkB4AgQIU2FAJJYMMApsDQeThgAEcJBKLabo9iZADh3AQkV9+1dtHwY+mGFAGAmweoAVhlHgwH2NFGdACIva95GgeQRyQAgod1GFKGw4kwgYSM3VU044fGTXGF2l1G8QdKSnEgS0GnJHLKD54YFuKUyHSQUTeIXAIawFU5EQlY9jQAVcikfQBH2UtFAZB5zG5AolGeWcRSVeMQRGpjiwWlAQ1GDIGlBC19KgjNqyURwtY7YCFATkM5GhU3lEQZhByAJDBGHq8kIIE9eKIMklOqKHGGXJwYYIDGLeG3AUGQBFFBvV1NN1tBkAgRAMTGGai0AeR1Rm2VJvcLXBZZ5x1QAAAIfkEBQoABgAswQDPACsAKQAACP8ADQgcSLBgQQAIARhcyLBhQ4QCFTqcSHGgQoQHIBLUWLHjRQAZE3YcuRBkyAMkUxqAKPKAy5UcVTI8gMAlTQAITMaUWTIhQgguPOjkaRDlSgYhQHSgkmbLhiUIDBxQEJWowJcIq2wQQ+dKBg8uIFCFYGiMg5dWD7Q48yQoVQMIFHh4YUOOIS8U0KpEQIPGnTAUEDCgWjWDoUZOHCiuKRPlhQ0bVEhFUDUjBUFXXgisabSxgSVPptrM2WJMHhtRceqVWVOLZJgQozR6QTmk1c0GznyAK9LAmCgTctq+LVAOB94YHXhRQBPrbZQU7kBAGDWqEyc4pfYmGjVDHQQeOIT/PCGHgknKAztPROkyNUIhSqQgWcMlyhklUDLQpBxg5WT/E3GGkgJO6AEHFHP44MMipZyBxRDMZQeSVM1JNNNVICjxxCGLRMFBXiZlcEYlTnCgAAVSHUSQTekZBRIWBuQwQUbtucTcETHYcAcdSHRggAITwlVdVQVlJNAYVzCQ00VKwmUABXIwAJIPP+Dho4QWwbVHIg6k+KMFanChgAGKMdDBEaQMEpINQdx0QAYqBCJHTgI9UUUHYORRByq6eODkkwaY8UUYV1xBBRcGlGHAKnPIYUIdDjDAAIUgecGHFj148AstYRyxQwYtgFAZAAqI0IgNN533AQQHfBDJIlRs+mLKdCJlgAQScszxhE8sXmUZIhlslFBOR3CQgSSm/LVDG1PkQAUePShpU43C5vTCIjSehxIHZyCkgAMnamFKL9DAElhcqTmEEwBR3EETpQqFoRmQIOE0hSyJ9NDZdgytm0YU60qEQBgRCXnAtR0khJKFE9WLQCAqZJfTFVFYhBAXfGSgGkzqNZwRBItwIJECaZgnkAIPzJFGTsJVRtK6Nuih3QcAR3XAGVBAmCpLjQFwRR0r3XGcAy+MIYcSFzBGnE5zeKWFAjb0EYR50xIXUUZjYjHGGVNT56XV/tUkAhRVMDfZTmC7dEEO/REJdk9xvft2vyDVxDBxAQEAIfkEBQoABgAswQDRACsAJwAACP8ADQgcSLCgQYEADipcyFBhwoYQIxIE8PChxIsLKVLEyFGjRgMJN3KMaHHgR5EjBSI4sBKkS48HPMpMaeDAAYIIctpEQDGmTZkfMR640IMBQo0xAdxMChRlRJZFNixxwqLqBxFVjij46OCnx5Qgitx40cNJkDIbNjTKsyjSIkOGKK50epGlEwdzKT7YMinPCwhAxjRK07XnyJsIqFA4oMDASgRpKDi5E6KCwCt6nLwI0PJwFAobb54IRLFDWg03UzQypMDmYQNcOACggKCmDTAAFCC4ISJhzh0xWqfkycVADyQQGlPJYPPmQ5u6b9Z03RAxyC931iDBk+IBlBwAeLL//Di3ZvWKcsGYMYNokSNQlqCA0I00KUKQHhI9MX8wfAYFWoSCiRIj0GYTJLXE8NNRICW0FQCCQLOHQNJR6JgBIECxhx4vMDZBTFsdIUcea/hgmEUUMZCGHDdAcB+D4Q0BhQgLKjAFBSCdwYEDP/gAwXg9AeCBFItQgZRCCJxhwAQUcMDBB0EAYospDBwQBQcHeKBFa0zxlAg0VDDm1UZKGSCCEokYksYYYVzhhA0xtOHEGWNQ8SMCdPjAJWMAcEBJFRAoBZRLBwhhgBormNCaUs0xBkYqkgxigA9I7JATSBlMgqWgg1IYQAqGBCHXpTsB0MEipJiigAc+tATBE32w3JBbTBPRdYADgTjBX6MAUHEFELYoKBcAN0jIZ1MlTSRHECwRWtsYJzBhSxtL8ZRHIjc4FxRDIS0rKEFyKDDBDMLxFEYYj20LkXNpHBEerQacUZtPIB0xx07OVQgRp3K4y5MBEFyBUG0G2NCHdEoRjBGnaTgh6AtUqASAAyNgkYJJISW7b1INg9RwSBScAYUSCdM0UVJ3nHFAHzYckIETgrCQQgYmG5RQcymnkQIVeaxQocYmJ6wUGlBUYcOiCtdsc00I5ADFBQTrqzRBTLE0AX9TO0ShfVnvS9fUAQEAIfkEBQoABgAswADXACkAIgAACP8ADQgcSBCAQQAEEyJMyLChQ4MCD0pciBCiw4sKDw48IBABR40YQ0aUeOCAwZInB0oUiXGiAwoHENjgAADBSgMWWRbUiGDEhgoODBlyYBIlyIU6K9YE4ABNCTpBDFxJs+NgSQQKburEaVLBoh4ItAxLoYDCmDEqMijAeTInSwBdvxpgcIcLnxMGM9wxNMbAjScQkG5FqODREQAK8oxBGGlHggMUDKVRUAhaCwMI2AomGBMzxwx5ghzosMYHA5sOxGwAYeDFFQRBFkFAebEmzoEWoIgCVQoTkjU1S4Yo4QFBhkZOEDihYOAjRMEcGYg4IaVTISVqxpwIcKdSEMQGMrj/aZ6BrwIvYUpqjshZBBQzfXY48KiByYE8O/SsgLukyFrjGgTgiC4eGAVScw6wcMcIIDjAgQ1OSLGKLSjk8UEGjyhwQAkbZBCTRwbkMcpjHLGHmQEgQNHIHY50EggXKpBwAhCbnJHHCwAcgUgHF0SQWWcZnOHRRANl5l4SKWQwn4EHhFGLBwghgQQECGSWGQBg4GTTbQwpwMEZQQxpG2YGAULKDC/g0QMDGprkwBk9xFTRRSYhcgSZcNUUQAus2OIDHhCcltlaakBTRZ6bFbTlHS+caJIbpvSBCSFI+KCAAh4dsBYiorDAJUsKVLLfQISYgsMcHvTgAaYe2dToVYk6qpRZBotkcOIEEEBwhqAg2sSAIxkE15xOsz5iq0AH6ErUjyDWEdWWW3VkgA2HODCQsiXGxMAYc5gYrbQ26MEATtgiZBIGUIAA4rcEZebEIZlhe2UYahhAQWbsJpQZFWkAoGtgAGSgxxgaQptvu1hidkZWVDxymVsHI7tQGHJoEcMdu3obMWcRqYHdYcJu7BBH7olQZUklirwRQRNsB6J6Ko9c5coxX4TvxgEBACH5BAUKAAYALMAA2QAjACEAAAj/AA0IHEiwoEAABxEaXMiwIACFDw82nNjw4cMDAA4coMgxocWPCCN2XBgy4wEFHBCY6LDRAEKMIyWaxChigwhDaRRgFOmyY0gEDyEEqbJB1JhGMQ4AhcBAY8+JGjUCQLDDwIszp1KlgHDHBAAIqPZIVUjwo8cddXZkqDPmAAc+CCjk4aAgVqKxDjUiQGCAwoUdcqjkwNBozQeEV+4A4NCIShAuTsn23AnAgRIoqe5E8gNlzw8fUwGcqXJBTqMJaSBYHBiSwYgceVphUfKoz5UcUij44GIAKIgNRajsODBmjoKQrAHcgKIkDQsNTQ+gIFRm7xgKGXuUWGLIhAE10J6c/4yoQIiBRzleUFDhpc6iUqySEdL4Is2BKomEGkqBYMwoDwZshNEFBpgxhhNXOPZCBxdAgMIbd+gVxgkblGCAAhToNEYGAbKGwAJ7qPCURRpB0IoNGHnwQxUP8IXAAQ6AAdRCChjQwYVKBfhQBnls0gYEeCDRAwO9HefEEQK1NFAAB3iwCAQBwqQABC84YoopeBzhAQMK7GWAFLE80VtDQRwS0kZAkCLMGFoIOZCLACzyixRONeTFGVNtFAMphPSgwJa9wQnBIyD0JFlZBtThRJ4IQNDBFV562RsAaWUEFEwkISDICnnaSAUANQoI1A559LbRoQUBRcEiGYDqaY4PAYMFhCCqidohQ0C9wAcDCHXARWiTPgCFeS0pORFQVPSB0AefvvjQDo1AIUGXMQkE1BhjAHDCpxhBoMcdFECgU7UDYZSHDRlQgdEXiNwQlbHkAsCAHlEcQUIfYzggILwxIQSUCWZg0YcKsZJb0QRKmKHvrQYvpBEDRPLbsEF1TsyRxBQFBAAh+QQFCgAGACzAANsAJAAfAAAI/wANCBxIsGBBAAYQHjDIsKFDAwciPpzoEIBFAAcAZIAAMSFCig0tQgQgAYQHQ1EQIIAoEeTBAwgsZiixYY+hNBAiXnTp0WJMjUfyoFGkBcEOPQwAOGjBAMHCiQpXAqCQhkqaRU4g9Mlw4MohAGegqTGwkiHCjxc7cDmDRY4cGyqP6EkYBcwZUWkQKAg58IAFEYtq5RmrxMcPjgfSaDmgIE2jFFQctByI8QAEBRmuQDGTKk2dOYUMGfgxQaACOiEYSDEE4IUXBRgp75VgBkuqTobUOMnAwIGjGAaO2CB7YMQGGmVeHMgAS9TKhRkxCoFiYYJeyxk6kDIFPEMe2BDoVP+50cgLggyoRDXNmBHEkDlBnIy5c0fOGC9XJAEDAjGKigcGLHFeGjEoAMEdF0xmgBJQnLFDFE7c8AFHFh2QRyUCOUBHEcftxYACB0QRhYIAgCCEIQE4tdN1R5TyBgUK/ICEFgI9BwAVGcRGEEw35FFjRzABcAIktpCShg8+OEUcAGqEwsBTBD33wndBQsTADFeUQsoagEQkUUQKoIJKBmQ5NGVSKqZASjJn9PCDZCwFuUMeF0y0EguCUAAAbA64wUQYO7IEAAOI6BnTQzHZUEmOTkU0RlkXqZhHEGRJVVGik+SogEpydJRQkEHkgZFPH4UU0wuPkBmTHHtBFFNxZlBzENFKZT0EQEwZHJIjAHLoSZZFZZihRE5eunSrRnpwwCuZFnXwyBkJJAAilCCRmisEUQShVB15tFAptTxhFIBGgiCyww6LXJGQSgEoGG6QHZhhRh853cqTWZSpNIISDJQJ7r19VajAwDr9C/BBpR5srMIBAQAh+QQFCgAGACzBANcAJQAiAAAI/wANCBxIsGDBAwcMKlzIkCDChA0jSjSAcKLFgggqUoR4sSNFAAAyCtTocWBCDxEQIABAgYLJkgcNICixIQUAB4YM2aCAwEBLkh0TQkBTpE8QCGmSGqqjxdAYBwd6XkSY8c4VBBnuhJKjIKECCF4alYEoUqICAD1+nEHQ1UGlSVcuXJA5wUGaMSkclGW40kCGNUjoUO1j48CSDUVUHgCgAFEjJ3sHAlh8QIHML6JE9UjTiYsSMxQOJCiSWPEcWoZSGARAMSPIF4FCQYFy5UoaR36UdEXA4A0EtgBAjLJhwDJBkCsZWGhUClOvRg26hgxT6scLBQhElAChmEIa1scVH/8IAsXMG0CkNnFp4WCyATpIfIQ0sIGGypVjniJkTRnAmEpqOGJCBihk0MERlIxBCCsXjLFDSAxcwEBrB4DxyxwqsQaABCLsMcsVKkT1EFVlkJIMBT3Q0dN9K2XkhSg3iITQEFA0EsCIZC2GgA6RvOEDEjusmFBGDpwBQUWTISBBDmoEsZEBk7GW0QEMXEKKjxAI1NN+N7QgE0FsBeBAHl8gByV/ihFyiQNfinjTE4IYd1xIIMmRxpAg4UjFC/eRBYANv4zyZEFRAhCFIO2t9BBIYaww30YrUVFKD0Adt98Oi5AgE0j8hWHCfFMC0EGclRK6aQeHPCgQeJ5uKlNlh6iOEBJHCyXJUiBcIJfQGCas6pocVGxKa60fASDHGVD2FIasmw4gRBoB0BkZsSsBwIUeDLDG60cOJAFFDqsO2xB/i9ngiEtyUBBSEHzcIIIAXZWEJgAfHHJEHRDYMIcTWSoGU550QqCGGVVckUGeAVAEE2XJIvDAtxlNW9KIyDlwQsJTwnRcsYVuqfFEUl0UEAAh+QQFCgAGACzCANYALAAjAAAI/wANCBxIkOCBgggTKlR4oGHBgwcQRBTY8CBFBAszGohokWAGjAYAiBQosaPGhRU5HrxRIgQQGy8+cOAQokhJChkMgDz5sKNEGhuW2NjR44wgQ2I2IALDxZAhCipN8nTQAwLEHjsQSDSQwZAUD2BuyYni9MVGhzx1GvDxw0eaMV+uLIrSw0cPBT3GCMwwRo0RGnXSlEmBVuNED2u02DjiZAymQHSQrHmR4Q6AAwAMuNjggkGaRim0pjWgwIANvSEPvNCCoEMGMHfuOGAgkUGPCwhw7jyZW6ACLrPbxGDghQHHDI/w+PiogIGCkiN5uiE1JcqRSo8O2bJ1YswHkQoORP9h88ODTq2XMWc2bMCNrTIwj/SB0GVHkEh9YrhBACCHmR4HaaWeSOvxdIdVIclR0gEZmPGKLYDIMQQUIAy0YIG7JcRfGCuQBoB9B0BgwBxQNBJHDApEMUcAFZ2VWYE8RaHCZQCIAMUcaRzBgQQXYHaAFy9wNBJmG5kmxYImicTfCyxgFkQjFLao5AFUnAAAkikBIMovPexk0YsNkcAFBYjIAYFVWklEIwPApSfSgJjdcAaOZ5Y20Js1QqGGCiG9eOWbDMrhZkMEvlnSB4vQckZEhUYkghlCYITRejRitoJlCgxJoEUIlEbBHrE8wWihaY5xCH/8EShRpk5EkRmcgA7/RIUjLJQkUKFvGnBEHiL6CFFDcnDw4kabHkSBGrGFtxVBlE50BCIQ/JlaQ3UwACacAp0BjSgNZXjnrVcacMIkHYRbEQJRZErgWamGwcdthSU0kpIGfBDIBxYC0AEVNL6KHgR9hDGQVAr5iREEjuxwZaZfcHErsZm9kDBJBBdssAEQ3OEqf3c4QTEAEHSnB5qjMXsrRgrkwa9nwvaZwYRqhOTtaM1mJscZEFyRGQc2XAHJEEoQsGzJBeHpkBaNDGGDI2O0oIJWE8RLNLNgAsCAElBQkYF6akE0NUJVRyTBA+FFBFJKX3/76rl2Evlri2n3CeimIL16Ftxxh/QtoUUWCulQxXk/HLgBAQEAIfkEBQoABgAswQDWADAAIgAACP8ADQgcSJDgAQMHEipMKJBhwYcQIxoAMPAgRQAYM2JEcLChxI8GEXgUScHFjQwXMqj04CKCwBUxAhzg2BGkRIoIFRgAscEAoDNp8hjas6EEoDCGGq2wWNNmRAA6BSp40gNABgYfGnkBMaYUlSBOvEQxQIFBRqcQM/jwYKBDBgh36PzwAYDDGAUHKNS5A2FCByqG7k5EWzGhByRrolBZDKbSXC4IXjg5eIBKiRIMHBgK4+AARsIOGfTokRDjATA2FLC4EqWOCQcGFBQpgpdCZ8840VKG8AdSi4EAPpwBkPCDIyQ+OCJYTvOz04MIKCjIcASQrVWduETZMSgGlw/EDRz/1qJA5MyOuUHONOCGlKc8LDLoQKDlTIYyBiRdSOPRw5wB5n3m3HMGtJEMIcSZRh8ACDCBAgI5CAGBAy3IAYUSnSEUHmENKcBBHhwkKNJqBohkQBJQzBGFE0FgkUMApl1EUHoSHdTCIQiIiIAUIuwwRhhSWCDABMSlARtwCDVlIkg5HpFGQuYpAYUBHxygQHkHKZAHA5RVNNhZhX0khxMCOZCGGiNQEMBywJEgx2AT4RQjBBfkRpFDBQHAwCItePCIDQhMoJBADFJEhZc0OgALKifZ1gFeTRGaIwhQYAEBQ6UxlCMYOzA4WE2eKZDIKFKEcUUi0EhR4kPEHXCBEo10/ybShiIpAAAV4M1q550GOICRE6UU8sKgeZb2giAQeNqlSAhcQQFOFhFKnK5n3OEATUwGlwcFJQ4IAAVh5OgZQoQmCQAEiXyiBUUcgbRRcHpc6hl6HNRB2Wc15QiAFL8kUmKkHxXKASYdFEooC3msWi50GNUhhwcUmAjwTTl2UAkJheZoABWexvnvAR8scmiSHAKX4weTnMCgZ2mAh9tCAFxxSAfQTYyWwIKYsPIckGqoZwVp8LdeyRAVSkEe4Clwl4nnslBFpQgtSTSrIkFwCAcQHIpRCzvcgbQQEds8tYi9CjKHFBDIvMMLGdIk9tSEenaBAWaM8QIE+uokMdw34SeGgBBCBJDkkne+zfdECMC4aoIGGU70hq02N26Yh9+08JcaEgtSQAAAIfkEBQoABgAswgDWAC8AIgAACP8ADQgcSLDgQAQIDAAYuPCAwYcQBTo0MFGhxIoCEThUkBDAwoggBx6YOPIAgA4uQGTocMMGjRIeTAL4QEFjyJAAHC5EoODAkw1kBKYBJMYAmhdBvBgw1FPiTYgLHeg8oOAJHg8GEKYxdCbUGQ5RxqQx4YDjyKcEE/b40ePKHUeIHCFB8oEihTMZGJwRtOSCgx1hDL1AiPYggB4GfAQJYsMDhx50qJyxcQBCGJNyNhTRaKJRGY5oDyRMCAFQHYUOEWrJQGHMGB94VBhgECKCQAUpKFAsbJHCKlLBEF2A4CAGghZjPNpA4kNOVgUKMibknQHIhyhpCElyUgrTGU+2uhz/iJJBIIsMO2xkdCgaI0gADCTZInSBQeUDGQ5BcENKx4EOdXCEEAJq5OARbwwdoMMqd7BngAIAXDHGgx4hkIQSQYyhhyNmQHGBe7wBEIAcUWRlEkV8vACAAi2E0aEUApEghBABSJQTggItpF5CEHagxBBlpMECBTZolFMauk0nUoJPQbAIBw9m9YQBWGig0VkKfYAIAAmduNtFBV35EAeLZHCACnqEkUFP0ZWEAAA2cJEVRV6idmBBdzL05gtYYFEmlgSNBEAUHHwEaFYAeDDKlBxAcMMeENxoEAQGmDHBnBaJ9KYckT7EJQBH/JLIFWFwAcsvPUjKUFYXnJHGlw9l/zDHmyDm6EAPEJiUxhxSdGrQTgikQcWhFGkUBRVzqkrSQBQE8oVMtWaKQCAqumcSFSeY+FGONnaQSCcvFBttQRQ8kgGXBSnghK85niiaQoL8ogamhXUwCQOwGsBBHdHeSAEiYHiQa51o7RBIl7sF8Wp0F4nmURCLhIsaghN5kUZJA3VQkUcHOiBHHRTkZBOOA8nhBZcOvcptRyfcoEeJ6JJsmAF6BLEQBcM6mNMNlbLglMx4MuAICQBQIWeOHNxwhh5KhHDpuAjmBACZCtTxwgEUfJCHHC9cgMAEb24LdJgAvLBHFUGcccYRHVz5Zr5jE9SQElCgrdCNCEENNMcIiBYghABdYiR23HhmZJZFg/9MuEEjxx0QACH5BAUKAAYALMEA1gAwACIAAAj/AA0IHEiQIACDBwwkFLiwoMOHEB0eQADgoEEABw5YbBix40MEBiAUWdLBQAYAHFJEGMjAhkKKFj12tKjggIcNJQClkXPHUCMDJXYGMpBmAgCKMjseUEDBIgAIWiBkMOmlERo7dKReMYRoxdGKMZMyNODDgBYnVKgE0YPnxw0ECMpoUTAmT0YAHfLoiZJBo1iCGcueMXAkSGE8SOgESdjnhIEgh2hcmGjIQIwAHGVqzHhAyuCEGTucYaDFQIcVizTewGkUQhAHIMVyBDDFgCwqGgFQMECFwwEOZ3ywObK0SAjAskE6gHDgxRVIpDylSnOljCkdF8ZoROADyaQJC2P//x3o4A8pR1E4OECBwEskCm8MtDEQJUZGBo/PBECQcfxYBZckA4JA/CVURwcTxODAAQ6okQNTO6gBBRYgHRSWWAAwsJYDA4FkAiIVKuCSAWdEcYQTZoBQkwEY+SfQQU7kcVBCIHEhxAlehBGGCBZMIFAGkChgkIsEhXHGQRXmIFAQEMCFlAE2UGGAAhX5dSFYM1ZUkF93RFGRA2MIooQE/BkAV4tH9OXXiwOFpUBs/W0JgAKRSHFEJUc4CSeNBsixm5ZbGtDCDftVlEFTazo0IBYcItmmhRBM2R+gCj0ViwF58JQHLqhE+lBCFITQiJAgNcRnEF5gdOGLClQhRwcZ2PFQiShqMJAZQ3AdsMMhIFVI4JQAhLHDQBM5hNF9dUSRa1JH6GGhQoClVymLn3rwhB5HmHlrRFfIcSxHEIwhnrEDjWKAFKDJlpAcXj4pkAoyCjlWhwYwUIcgc+zm4kF6BPHVQFREYeanBrzw2Lz7GhDIDkcNJAcEF4ZX11RlEmmmboGQQNBgq2bAQh5hrGqxQB044ulUVcYGwIB7GCwykcWixiF9DTlgQxRqGGDByBDxeYQgANzhEgMZfMFHECcwBV6cPAcaxR1peBBFHVywADG0Lzet0ERmCOQEBQkdxbTWHikBdkzbki2RqsipLVvW4wUEACH5BAUKAAYALL8A1gAyACQAAAj/AA0IHEiQ4IEDBgAoBJBwoUCHBSNKlLiQoQGEAA5qPIgAo8UDFieKjFhR4QEGH0A6LNmQYciRIg90RHgRAQAaG4S8MMGBAoQXUjwwUKDQQQaMCWGOPJhR5gERJZ7YGJOn0qRGdjbskeMljCEvFDq+VBpRZgabGRW8sIHAAUgDKdCUoPTiQ4s0jQyZfEu2IEgPSOhoGTMmjJZSa36wOKDAwJUyHRCxVZBhTB20CvsWRODhBx0bQYIcCSIFjw86OxQquAKAQp8wINxS4WODQtK+CDkioHAGswEEdTIoIMwCgZyUBhJtEHjAUKMXHftmzvgbCKsXKkFSOaLwQh0fa+TY/wRRIoJACk7cIiAL0gEECB1ijGFlKtiYEx2ATGEwBoFNBT/8IIdGCvjXUXTsGcDAJaYAEkUULcygAxhn3ADGKqToMJpGDjAQRRhOzeSUZr+1YQt2BzXkxUVduHEABHVQQNkJOwwBxQ3rJYSUZjIhsIMcBhQokwFUaMEUAB1AYQYVXNRxhhpKHHXRRSq9NJZfHfERhEzUOTDGBRfs0OQQGMgoUxRA+NfURdQ9VFBmEjlwiAMXNWbACFDwQQUEBgTQ2EEMUEEBTQ1FhCCccA60HhV3NARBGGZEmehDGcix5o6FKrSeiLcZZMAdNhygRRpAGECniE0BcMMYXI5FkwJScP9QEnVjNXYEFENQYdNbfFkEQBqy8jWlQOvd8MsoZ4BhgBqJmMDlZgdIoAQWjYmVVIogHTAGUdl2mhEAF6ChhQc2BIKLLi8AkKNBCCgAwRVp5MZQbusR1QEV2bra6UE73PGCB536RVMd8VoL53ppcOErc281dQAFFMhxBwPCxnTQHQqrRKVNCIwhq03MuUkTBJnAsqW6hC4lkBxh/EZdihl4oe5tNGW03gFzwJLIupptGsgRLqeaQcY0gyTWCohQkQEDJHp6QB47BA3SGOlilK2aAITRhwrYNq1okIIEQeVBlbjFVIoJcdDHGMSi7TWxBkBQSQeMAcABGC8z5YAER0x1ckLFbxO0npwmJBRECwAUuBAEQkCBxQStBl7WehxE8oEBYayweBBypJGDEhcEwLPknq6nQh4n1OFeD2k4EQWKxLpE+kTr2WBGIz3IIeh6M9/s5uwTQaAEFBewqa7vIU0KPHMIDOWfxrnp+PvyZQ1JfeBuLx8QACH5BAUKAAYALLoA1gA2ACYAAAj/AA0IHEiwIEEAAAwqXMiwYcEDEAcmNIAwYUWEBSc63KjwgECPFQdGJDhSI0eHIQFkcOARgUsACBQgPKAAQcQDIU/qBEChRAkgEHAi9GLoQ9CKBxAAEIpRZ8eSDEpY6XFmUR4DDgwZciJn0aIxL6JEcaB0YlOnBm3ahECH7IcdTqgYwrSlRI8VR+Q2QhHA5lm0BjxC6JHBr80zUS4uDQNngxScB1JEMZQB8kXANn388BHECYvAALyIVMohDQQ5YZYKfCFIhQPQOXUK9uHExpg8dc58idTDh4eaEOUoOJBHzswDHxrJCcoULUwEHK4IZdAhQ5RUSH4EVRrEBs4vaS4w/zCA4Iqh1zhlk3epwAGAOTaWIgVzo0ckDghVGFdaZAMNmg68RpFJG9kk0ExuvIEAeTQdoIV3LyxyBEJhUHRABEVcQF5gFAXmkUccGuRRBn+4cQMXaZxRhymmdMCUSnQIlEEeWnjQgxAMxFTTgrB9NNJCHjFhyyZgRHFDCyq4sUknUbSgQGEHXBGDUhSwgQQWUIDQ14IQXabagQ0h4EYQJC3FhQlnAGKLDgjkgEUOV6RBRw9PKEGBTUJxCKKHAzIE4h0qMEgeAFTscEAZpLShApY5fHAnAjYAkZR8FmkE0Z6KmTRihTwuxUAfGWQAyRhBUCDBQDVRscKkS+1ZkEvpff8E5kcLgsXgggqYoQQYLSyoFo8KpJHBoB2SBJqFl16aU1IGmJAGswC0cBUGr8GUVJcAcKDHgPL1edBgMmVarEALXpHCARmkEYgJCEyQEGSQUWRDHQx2W6ZHZ/zyyAs3dOCBFO6JaEAHaojgiBNNKSYSADvEZ+C7HKrm0Q2FaNFDHYfA8gsVzBoLAhRmQOAStzNldARzIIV4UFJ4OsCHIGpU5iqqD6RhiAIbTgStZXdA0KqrFsFLkQN3tCZoRzEhEMUhHOTcY0QQ5CGUq5gOesYefXCB7MwisWzAB4uQOSm3IAZRoWWzQkbaM7FQgBOPHC0IAR+iETuTUmG8UC9GEJfGFUQfY/Qgq1M8quirfF1S0YFqCk+KwBl5BAzYQDwGEcmwSg3oABXugQSish084kRLcE++YQeHkJmQUh3UES9oZQFwxbp/mU4rVnmkoZENd1zLMkIU5CBHGu5lbntaAo1xx3ihBRY7AAo4YQYUObQ07vHGGnDEIR8AcMZwAFB3xBVnjJFDDQLUZBH2SBvAASU2VJEBv3dEYoMDEJBXU8QEsi+SARSY3h26ExTKfch/HPGICJSQP3JxDYEJ5NDIIGi7S1HQAAEBACH5BAUKAAYALFcCFwEBAAEAAAgEAA0EBAAh+QQFCgAGACy6ANcANQAlAAAI/wANCBxIUCCAgwUJAkjIsKHDhwYNLiyIUOFEiBgZLjy4EWFFjh4zilRoAGTFkiAHhhz5kGNJlCZjyrzIsuXMmzNrUoTp0aXFlDFf6pSY82JPlzeHvsTJdGLOoSaJyoTJc6rIjkg3qoyKcunTkSer4pQo1udKmhGb/iz7lWpDrE2jqt2J0WfauFZXdm1JFihepG/Dvu1q9K9ZtFVJWiR8NCnghHqt9j3s97DiwIghs+3IuDNirUl3cuXbUyXhzSlNB6VoNPHdwmNZPya7lDFa0I3t/gRqerJT2L6PaszKeXHI25zlXnVLMzdroZIz/gbteThPpRGpNj9L9Lrgmlh9QywXyhz71vJPlZunS3l79PXZiaPWCv+52tX1NX/Vm3+w3Mz9kbZXgDrpBl9AAAAh+QQFCgAGACy7ANIAMQAsAAAI/wANCBxIsKDBgQcOHFzIsKFDAwofSpx4UKEDBxApanSokEKYMBASbhxpsGMjQwpEklwpEIEBQxwyslzpskOaiDNXKpQTRGbOjQp3GJKS8udKE41eIMBpVGOQN0WbatzJQKVUiQozUPE5dWZHQ1eWAlXIFKgBDo2cpCwLMaFVgQkneDVAYYwDkQcQ6C3rcmBKCSVAiB2psE6KAyknMEUAgQIHGiWWOJGT5s4YNRtcKBhMMWuagRdKVDlDGgwXKlzGVNlQxMkHCAIV3ICgd6Lb2kFUdAjiBHORHSxIcKDAQC+CC5vJGq/tsC9OBB8W5blDhXiGu2Xd5lWZt2/DpQxoU//YQemWEjMfyIpcqj0vB9idDSx1eWCIkkqYOuXhYmZESrGctWSADbkkEuB33kEwBhZK3ECBQBTIoRhbBs0xyhlvNaRQChk4EcYLChSlgAFhfCDffAH2NYYTGWpowAfnQXLDCSdkkAEDBkBwBUMqITDGVi0y5NINSmARxRmLHCJIHmlQkcchNhwRxAsfeNCDB7UdcIYoQHaFgCHpMcVABh3o8UELL7TgxBh0IOGDSAygEktI3j0UURpcwIVAiHkZsIMTBSHAgA9aHICjFnpgSeFCCl2gRBUOQFCcQXLEhFBCDqQB2w56kKSQBGYo8UYYUaAWxhlhOAFGGC5BMEVI8h3/cMQONwjyYJ22KQDCF3o5kAEJUUYxBih6pFGHJ7Z00ZYBDiQCzRiI0YRAFICWBcFnDCigwyYsinXAGqP0sBdJLikQxogJ7WmAEyQQhAAfJmSUBxI/ZDAuuQPuSB9dcuCokEsc3HHYGGEsguWBhIHxoEh/yleQJKZEkoYW4iJs1gdgZISAphn12QEgydzhgZtR5eQSF5a+EEasfaVgSiNmKACBDzYk95NLGcghEBgZEJTBC2WQYggGASy36EguOVHjGAJB0AIfadwwHAXYbSeVRVykofQYaRzxAbrsXVVQXjWYUYUTK7i719E5pWuBEinMF6TY7k4gN9229Yl3QQEBACH5BAUKAAYALLsA0gA0ACwAAAj/AA0IHEiwoMGBAAAQPHCwocOHDxVCnEiRosKEBhQeUGCAYcWPETMmTIhghxcHCBCAXGnwYsIDAAIYakQBgUeWODNmPACTiqEUCm7mXHkR5oEjeXgOHaoRAIQxjSAcULmU5UUEAFo0KpOy6kqlIhUYcjIBrFeWMM9w4Sm0IsO2OAEcuQPA7MSpVG1WpTDGkIOOD5Xe1EijhAe9RLEG2Rq04VSOBqgy4HCESxo0G0AooAqy7oFDVyZQZWtzJEYQJZ6c6XSHxIcMCC4gXqkyzBmVek0LRODgRR49mIvAhlm3I1yKWF/o4QzTAwUKKpykSXPlSI8ODjwwsMlWMEusFB5B/zDAMSGIDWKuyDHQgfjLlKV1dwaAVcEhFSNNBDmTpkSFzS95hhtWpklkkUD0HQCBWgBQcAQYcgThAH3wzUaQRCN9lCBPAGSghBIe3HFHCxyIBJhIGE010HENuYShTS+UYsYQVHSQYWkFMQRAUA48IRWLLRloEwgGqOFIKmEEleJxNhGowBzQyLFRRS7aJAIUQkzARZMcyscWghyEQYUce4Bgl0NVKgBAFDkAcAV+QXUXAF5dFZlIGGPYwNGXB44EUwZvHEABGO4VKN8OuNDCwkApAVmQixmBoMQQDshhQwYqqECCCies4IEKHHRwRR1ylMIGEoueORGGCmGVAxRDGP8iCBVRBGGrrUfYyscdiDhyxAo++OCEcZ2h6KcDhgRwBQPEXQjAB7mMEkRYGTgyrKpoGjuSAlTc4MWOCoSbEkcUCJJIFe/Z5AAePhyG7UGGkjTHFfEm1EEeL8DEABB/JdgDEj5ENh9GKt0ABRZABLHDrUHYMAaSO4TBBSC2DMIABfRpoQV3xY6k0qtCvHCDDTa8AMQLnwjywQstdNBBDJe8sQkpMfiARA+bOQqvSFjVccScGA3wQB1OxOsGKbaYEkMH7eYcF1ZhqrSZQENAkQad8AEwhS1MpMATfDq3KFIaJYp0xBhVCEFASgXy1FhHdS7VAhcCHWDDGWFAIG6hfmpWdBZMCqTBgAEfpBHGX1N9zXdxZ51owxEZ5OFFBrt1Wa+BZyEAghp3cMEBSQUa23hBKnUABRQ6GNUsQvKNTpACIoAQgLYZuu7QVHMS2LrtdyGIEe8OBQQAIfkEBQoABgAsvADSADMALAAACP8ADQgcSLCgwYMGACBcyLChw4cQIyIEoFChxIsOKWpUeOAAxo8DK260CBIkxYQbPVLg4LFkRJEaDyAQaCgNhJkuM6LcKJABGENeHHQ82DJnwp0eFUBgEciJAwU4CSIoWlTiyZAUcQYxNCaDgaEFZRpA4LXqRwAyESCgeMWQIQoIFBDsGBWBkQ0i1JoUODVhCz11MkBQULVqhjBalpTwMPZsQpkcTIRBxKIj1QMUI4C4weWODQhjO161ekABAAiGGnHh21cmxQMfSmyQQyEmWo0f1zrI0+jK2pmGmY5J4oKwZdGjLwI44siGR4VTcaq4w+UIhLSEsSZ3WNTBnTu1oWP/jlCkyhgqLzSq7Ttyu84dgY4khIr5wI4tG4pAZb2TJEgIHKShh1dqUcTBDmlc4YEHN+n1lWhGQaAEHFHMpBELUchhAwNJhQbAWkadBAAFUOy0FCJacCDXSVMdABpaZmFUkQF3ALLDARmkMUYQDuAmUGkMUAGLIBcwAFpJWQGQYQNKzEFFEAZQcAQDGXwQxBjfjRHFGKgIEgUVe2Qzx4cyrsWBIAYMAQUIcjEwyi93hJHHGDtQQJ8Bxh3QAZIeIcDHCQdQYAgCEBxxhiB7UPBVTJhtBMFNJq01RhhDgTHGGVHQBZZAFDlQ5QtU/PDDTTE29CEALwhCEQRRlCIIZhCs/8SBVy1QYQAmmFQyZxA2rOGDA1/lBgkFEKThxQtqVnGHHGeMocUVTuzwggcZZGCaQhDgkcGmED03hxlCjGEDWg2YEUQH16FkGadLQRDEGkh00JdEM70gChRDADfWFUE0ut56hCngAxJ0UKGFD1FF5BEEoWACAgV0TeWAHl8VCBNaPfzAQgeXSBIARjMF4goHLaJVoHwbUUCCDTsEccQYp1TSSjC2XDIvRDM5gUx6ChDmaA5QSHHHI7p+sQPLLbxhCytPSGJKDI3hbAAHvjjRHwU7cHFGHWpAkYMJ6GanEQqSAHGAAxD711BLjqwGwQU91CHHl1eY0BFLI0Xc6LoKH1EgARaiQDuGkxzcpN5xx3EK46KlMoTACPgyYafiH/ZpwMc/DiVSSTJREIRcmi5+1VVguYeRTKH76KNRazeqOusv9bc57FbxRLtytt/umO4RBQQAIfkEBQoABgAsuQDVADgAJQAACP8ADQgcSLCgwYMIDQAAkLChw4cQCR44ELGiRYEMFzIcOPGiR4QLMQKgaABCBgUICnb86BEAgpchvTQycSClQpYWNS48oNFBizuG0qRIOTIlAwgISOI8qLMmgB1BxtQ5chKpQgQLFZQoccGA0qU6BU5ceKJRIycOSCoFACFKGitcvS4dGJInVgAZolAJEkNBzY4ZEKgIEyUM0rRfcWrkubCDkzEcDqD0yhjEBjJnPCiom/hjXawnvETxwiGjAZhsg1Qp4QKlS4YrFY9kfMFQoygKxI4FQOEGHxsQGEy+ORfj6YUOxoR5kcIqRZ7Jx9hgUPNl7LkU70LgcsYGw6QwKRT/WaJlx+aRpzuznEhUwZU0RzQicI1XzYYiKf8WV6nQZRA5Tmw2FmMkcCGHByAglRJW+3FkAAUS2CAHbgIlpdEJVMjxAXs2adQgQUoYkAMF2VkIAAd5jJFBSC/JJddGxVE0wR5KpHHVXSTU8UVk/S12F2Mw4sTTAXo4gcAYcjDYQRg2dCCZAzckcgMDdy0EQUhBfkTSGGnwJAUsQ4hQSS15nBEFF1EcQckviQShhRZnnLEHLBsyuFRKR9zB1g6o6AKFGWMcYYMNH1zggAIXUHESBRlwwEEibKxhJ05YfXBHB0HUkeYRIKgx1GKxAcBABzaMkYoBPziwHmVsYcJHGi04/+AhBJVc6VdWje6wyCJ4IIHHDhRQQJxFzwm0QydpBFZUTX7tIAdSEASRxhh6rIHHIXXQgUQPSQ1bEUUXKCHEF62E8eNzGimAhRJzXBFFFBDcgIQPUVBHAQIQyJolRBNJYIYSZYzxF0U7jYWABWbs0B9FPVyQlA5d7GDKJRC4WFFSQTwRRB6MdexxSk7cwewBGbQxhQF39GKLJ5dIgthHYAShh6zsifTczXnssBMQtgDTByZvuNHivg+l9EEaeXTgUlI3Mw0kAA4g8gEEK0ACCRCR6YTeRSnVgYl3fq2ltQIZqBAEFWZAkcYNGTD20l0fpWTCLFFg6ZIDJr0QhRx3zFsBxrtUaCHECA7cxXRYF4HbyBwMtBDFGKIVVscdaUTxQgYOqCofSh16SLRDFDmgBBRznCFHGl7swEFaIoVVnVgfsieEEvlqvVG3GE20knrYicUi0x9qaVzwLAUEACH5BAUKAAYALLkA1gA5ACQAAAj/AA0IHEiwoMGDCA0CAJCwocOHEAUCQGDgwIGIGDNKZHgAwYGJFTde1Ehy4MKJHU9G8ULBosCRJUky9HgSQIcjjQyl8JhyAkWKMR8uTHngCIUoeqLs4JAiAAIEC0WUqOAxaMKLTw0sROAlZxQOHGkCoHAEzYYQWa0WBPBxIwcwXK5EOQEVgYIDGRx8MPBFiwEPEKqqJUgRggMKQcCkeeHgKc+FIDZYGePh51OYajkuDGPoDhcKWgEooLiQQ5QqJVwoEJgV82ADCjrIMaRTK1SJDDzMqdMBAoPRLl8bADrciZwoGRQ4gA31wAsIXMY44fBxpOuSbUMaAG3gSAaLVT8C/xCyYcsOCG0vBs+8UOCHMGMKwgTwIsyTEh7uChaudTsEG1eccQJDExGngA1jgHEBTNcJBwIUVXyRAUMDAXVgGmBAoFV2/BWEgBoGDLEaUEA5sIIeNoDG1nodsmaADXM4sMMhFLRnAANX5FEJdy6yBVSD2FGUwS2FHNFBH6VQEYYed3xSiii/CPLCBxQoAMBvFVmnVkoAZBDKKL9UkoYUZ8ABRSNBtIDADXv0cMYcYCg5yh4fddCDhkA6BJ5AEARByRgUtGBRRyIokQNPl20FgQejjOJBEGv88AJwQcl4hytHnNTRUwpMUEcUFSlgpQEOHKAAB3QgscYdNvgAAaURXf+knANR5PGBIFGYeplL1clBBUE3/IBHKQb04EMPDDi2X0QIYKCEHDYcEMUZE1EY2lBspVFDDmekkaoP34kq7mUkKaCEGRcgEEQe1YnH0UUoPQCFEmVolZ9FgzBxwSCXBJYnQhflIagNfYzan0UEgoeAA0IYopUDU0xxRRimVDOKAaR8p9FFFFyB1yIThnfwSCs+FZ0BKdhiSh56eOIGBRB8ZyOzLwYBgCMfbKpdSK3VZMAiN0AAiSe8PcZWSQCM8UIeQXTEml2J2ngABBRkkIEUUGABBFgoDWptrAZAcEceVxA4c0UOcPBCFIrJUYccYVwhhRIi8CReUB+R8InHdkFaAMEHQYSRxx1jfBFFFFxQcQMHd53kE7xfk/SRBGaIMgYViJ/x9hc7dECBA42f5CJP/FEk7xBOrPB5TZFbNBrpLnZ4AAUTHJ1lotmZzXqLA320q8+8yxR8TAEBACH5BAUKAAYALLkA1gA7ACQAAAj/AA0IHEiwoMGDCBMaOKCwocOHCQ9IhEixokIABhRIPACAocWPDg8gMDDSgAMuURQsBMnyYEmBGTykaWRoAoCXDD22hFgSwAsuOw6FOWLCAAWCHga+3IkQwUSBDo4YaFSmhcSRTg1kiKLGgAuVB1QyVYjgxRgDY3bYmMBw5IsLOwxwCQNzrEGRGA20eHHkrAoGOgfmMCBGSwYDHVfaVcrRAIM0Bgzt0LhSrIIXX+YYEFFS5VKmgTMcOSRVQ4CnAincEOQkw82eiwUyzPvhzhUbGq+qhBDChhwtNyBgBHAzduLGFI6cObKCOMaXCJYYKALks2y7gT/QpcLgOkEGXrh4/3U8Mm/slRcqtAiTZoXHjQM5OJETxIECBgpGBo6tUogBLDYJhBVGB3BARR0v6IfAgk7tZxcCADjQSA6G2LAQR3lBUEcdri3E4IIknTcQAArUkcgZGfSRRlgptOCEI5WIgsoY9yEmUEcYxjabAWnogQo0dVzhSClodDLJGGPYoAYqdPQ1hxxcqCHKBVpBOBZeAkEWxRlPQCCSEgbkAGFHC4qEHwVBjEKLDT4g8YKDD10VgI0QqOCIHl6CuNAFQqShgHkj3uTDD47IQUeVjVmkEwRBhOEIHxjlB2FbCjhRx5gYeeDBC/Ot8UMKEDrlnEUqgZBDFHmYwMId3TWI6U0ABP9RhwMMQPACEmxo8QIFCmSAYUfEKWqSElBIgYADi1ygE3HwJSYFFEPI4UQPPhCXgQMHOOAGB8CCxJEaQiDAACLNfebcUxJMFYCoBwBhyiWLeGKLjYBCxBECrAKQRxDd6pSTbCJRUEcLFGxyiRRjmMJKFYDEEcOOFo2kwhEA/FZciDfSuywFizhBiiQq2DBHSgsG660BUXTwRR3DiUTSgmKNSlAGaoBwRB64tYUaSBDIcaDLCzkns7gZUJBBBo0KYgYUR+i3LJwOjcRBH3WI9R0EH9hABXty1IEWFUcE8YIHItxo5VgAMFBkBljb8MUdd8ghVxRUcEGFDR1gK5F5E9U72xJGFkBhiAF5yDFGECRQAIF9QiuV33V66iiBEhT8etBV5XV7o98POlVm5sFyLmJDv4o+OkWmn05RQAAAIfkEBQoABgAsuQDWADsAIwAACP8ADQgcSLCgwYMIExoAoLChw4cJATBEsBCixYsIDxyoyLEjxo8GERyYuDCDgpEMGYJcaWBjS4IAHAQxFOQkgAMIJHpk2dClwCAcHERxJOdKIxsGThpAIFInz4wLnRrI8EVgmCAvIBygoEAgABAlQjCVSPEpQZwHuipQcQYMGANOglDUqZEClzBVNoToavZszp+Grsi58yID04EMIZQoMubODsMQGJTtO/YmByqGDNhoirglhyBpNkwd+bKvwJwSIazIEyaFAwo5c04QyOEFojsZIFBwQLf0SrSoDUAYk8ZJBo2TAUAoUiQNlSAUNLqUylJjVAAKbMihssPBxsOkT5z/2VAiBWqfUfsqb5HhCpcxxyeiBsAgChg5HTx0EOnbtFcDQ0AhxA4QkHWYRCcEMcZUEjlFnX84YaGEFGrNZ8AK7xnQAkoNPuifVWNMcMaCZGUQRiljBBFDIbpIwcIHHHCQwRNzMNCfWRTZcMgBVYziiiBCYCJIHY6M4UQUN+SxRw83REEFF1/EkgsHaKlHEQR6fLDDKLTQYYYZanzA4U0adSiRB0/44IEC/PGEk0CHLMIFFRTsJ4EBO3x3GJtRofZCGHgY4MNhGDGEUwAbKSdHJSwwgFJXCBwSBABMoSQQBCa8IEcoSLAxBlJL/eYVBzaEgsl/Nwl0gAOIkKBSdkF4/4EHG4bk4cgPPSjA5mQXUcpQDlyk8YIjEPx3FgAZNDIECHxgcoQJQfzww2OUQgBBpR+lFIASUOR5RwtJoTcQTtxSwYGjOGXQAQSSvKGFKaQUKy5ENyGQRA4BfDFGoiqNG1UCalBRJhCSuKEFJLYAE8klg6Cb7UIOhIEAC32QZlCHh+nxgkZT2PJKGmOU4R2f/fY60mUMHKKVQRvp2aADgoBwQhienCFmmdKt5GseL2hG6WldcTgQAx3cYEOAjXhwXk6W/oZdGnmMYahvClCQQQbiObLIGTu8kMMQA6A1Zkog+ZpBIHX4pEAGL0RxRh11nHFFEC104N1IaVVZ8lM4VUORSoxX3GHAGVFEYcARHZjZIE5NeVjdSCBAgcUbc0Rxwm7BnSaSdNKltDffTF2gxAW8qsp4h6g6DmFLb35oVoOu9xUQADs="}}},{"cell_type":"markdown","source":"## 4.1 Define the Transformer Input Layers\n\nWhen processing landmark coordinate features for the encoder, we apply convolutional layers to downsample them and process local relationships. \n\nWe sum position embeddings and token embeddings when processing past target tokens for the decoder.","metadata":{}},{"cell_type":"code","source":"class TokenEmbedding(layers.Layer):\n    def __init__(self, num_vocab=1000, maxlen=100, num_hid=64):\n        super().__init__()\n        self.emb = tf.keras.layers.Embedding(num_vocab, num_hid)\n        self.pos_emb = layers.Embedding(input_dim=maxlen, output_dim=num_hid)\n\n    def call(self, x):\n        maxlen = tf.shape(x)[-1]\n        x = self.emb(x)\n        positions = tf.range(start=0, limit=maxlen, delta=1)\n        positions = self.pos_emb(positions)\n        return x + positions\n\n\nclass LandmarkEmbedding(layers.Layer):\n    def __init__(self, num_hid=64, maxlen=100):\n        super().__init__()\n        self.conv1 = tf.keras.layers.Conv1D(\n            num_hid, 11, strides=2, padding=\"same\", activation=\"relu\"\n        )\n        self.conv2 = tf.keras.layers.Conv1D(\n            num_hid, 11, strides=2, padding=\"same\", activation=\"relu\"\n        )\n        self.conv3 = tf.keras.layers.Conv1D(\n            num_hid, 11, strides=2, padding=\"same\", activation=\"relu\"\n        )\n        self.pos_emb = layers.Embedding(input_dim=maxlen, output_dim=num_hid)\n\n    def call(self, x):\n        x = self.conv1(x)\n        x = self.conv2(x)\n        return self.conv3(x)","metadata":{"execution":{"iopub.status.busy":"2023-07-04T12:28:59.135236Z","iopub.execute_input":"2023-07-04T12:28:59.135606Z","iopub.status.idle":"2023-07-04T12:28:59.149116Z","shell.execute_reply.started":"2023-07-04T12:28:59.135574Z","shell.execute_reply":"2023-07-04T12:28:59.148261Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"## 4.2 Encoder layer for Transformer","metadata":{}},{"cell_type":"code","source":"class TransformerEncoder(layers.Layer):\n    def __init__(self, embed_dim, num_heads, feed_forward_dim, rate=0.1):\n        super().__init__()\n        self.att = layers.MultiHeadAttention(num_heads=num_heads, key_dim=embed_dim)\n        self.ffn = keras.Sequential(\n            [\n                layers.Dense(feed_forward_dim, activation=\"relu\"),\n                layers.Dense(embed_dim),\n            ]\n        )\n        self.layernorm1 = layers.LayerNormalization(epsilon=1e-6)\n        self.layernorm2 = layers.LayerNormalization(epsilon=1e-6)\n        self.dropout1 = layers.Dropout(rate)\n        self.dropout2 = layers.Dropout(rate)\n\n    def call(self, inputs, training):\n        attn_output = self.att(inputs, inputs)\n        attn_output = self.dropout1(attn_output, training=training)\n        out1 = self.layernorm1(inputs + attn_output)\n        ffn_output = self.ffn(out1)\n        ffn_output = self.dropout2(ffn_output, training=training)\n        return self.layernorm2(out1 + ffn_output)","metadata":{"execution":{"iopub.status.busy":"2023-07-04T12:28:59.150502Z","iopub.execute_input":"2023-07-04T12:28:59.151099Z","iopub.status.idle":"2023-07-04T12:28:59.162664Z","shell.execute_reply.started":"2023-07-04T12:28:59.151057Z","shell.execute_reply":"2023-07-04T12:28:59.161746Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"## 4.3 Decoder layer for Transformer","metadata":{}},{"cell_type":"code","source":"# Customized to add `training` variable\n# Reference: https://www.kaggle.com/code/shlomoron/aslfr-a-simple-transformer/notebook\n\nclass TransformerDecoder(layers.Layer):\n    def __init__(self, embed_dim, num_heads, feed_forward_dim, dropout_rate=0.1):\n        super().__init__()\n        self.layernorm1 = layers.LayerNormalization(epsilon=1e-6)\n        self.layernorm2 = layers.LayerNormalization(epsilon=1e-6)\n        self.layernorm3 = layers.LayerNormalization(epsilon=1e-6)\n        self.self_att = layers.MultiHeadAttention(\n            num_heads=num_heads, key_dim=embed_dim\n        )\n        self.enc_att = layers.MultiHeadAttention(num_heads=num_heads, key_dim=embed_dim)\n        self.self_dropout = layers.Dropout(0.5)\n        self.enc_dropout = layers.Dropout(0.1)\n        self.ffn_dropout = layers.Dropout(0.1)\n        self.ffn = keras.Sequential(\n            [\n                layers.Dense(feed_forward_dim, activation=\"relu\"),\n                layers.Dense(embed_dim),\n            ]\n        )\n\n    def causal_attention_mask(self, batch_size, n_dest, n_src, dtype):\n        \"\"\"Masks the upper half of the dot product matrix in self attention.\n\n        This prevents flow of information from future tokens to current token.\n        1's in the lower triangle, counting from the lower right corner.\n        \"\"\"\n        i = tf.range(n_dest)[:, None]\n        j = tf.range(n_src)\n        m = i >= j - n_src + n_dest\n        mask = tf.cast(m, dtype)\n        mask = tf.reshape(mask, [1, n_dest, n_src])\n        mult = tf.concat(\n            [batch_size[..., tf.newaxis], tf.constant([1, 1], dtype=tf.int32)], 0\n        )\n        return tf.tile(mask, mult)\n\n    def call(self, enc_out, target, training):\n        input_shape = tf.shape(target)\n        batch_size = input_shape[0]\n        seq_len = input_shape[1]\n        causal_mask = self.causal_attention_mask(batch_size, seq_len, seq_len, tf.bool)\n        target_att = self.self_att(target, target, attention_mask=causal_mask)\n        target_norm = self.layernorm1(target + self.self_dropout(target_att, training = training))\n        enc_out = self.enc_att(target_norm, enc_out)\n        enc_out_norm = self.layernorm2(self.enc_dropout(enc_out, training = training) + target_norm)\n        ffn_out = self.ffn(enc_out_norm)\n        ffn_out_norm = self.layernorm3(enc_out_norm + self.ffn_dropout(ffn_out, training = training))\n        return ffn_out_norm","metadata":{"execution":{"iopub.status.busy":"2023-07-04T12:28:59.165417Z","iopub.execute_input":"2023-07-04T12:28:59.166088Z","iopub.status.idle":"2023-07-04T12:28:59.180979Z","shell.execute_reply.started":"2023-07-04T12:28:59.166047Z","shell.execute_reply":"2023-07-04T12:28:59.179924Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"## 4.4 Complete the Transformer model\n\nThis model takes landmark coordinates as inputs and predicts a sequence of characters. The target character sequence, which has been shifted to the left is provided as the input to the decoder during training. The decoder employs its own past predictions during inference to forecast the next token.\n\nThe **Levenshtein Distance** between sequences is used as the accuracy metric since the evaluation metric for this contest is the **Normalized Total Levenshtein Distance**.","metadata":{}},{"cell_type":"code","source":"# Customized to add edit_dist metric and training variable.\n# Reference:\n# https://www.kaggle.com/code/irohith/aslfr-transformer/notebook\n# https://www.kaggle.com/code/shlomoron/aslfr-a-simple-transformer/notebook\n\nclass Transformer(keras.Model):\n    def __init__(\n        self,\n        num_hid=64,\n        num_head=2,\n        num_feed_forward=128,\n        source_maxlen=100,\n        target_maxlen=100,\n        num_layers_enc=4,\n        num_layers_dec=1,\n        num_classes=60,\n    ):\n        super().__init__()\n        self.loss_metric = keras.metrics.Mean(name=\"loss\")\n        self.acc_metric = keras.metrics.Mean(name=\"edit_dist\")\n        self.num_layers_enc = num_layers_enc\n        self.num_layers_dec = num_layers_dec\n        self.target_maxlen = target_maxlen\n        self.num_classes = num_classes\n\n        self.enc_input = LandmarkEmbedding(num_hid=num_hid, maxlen=source_maxlen)\n        self.dec_input = TokenEmbedding(\n            num_vocab=num_classes, maxlen=target_maxlen, num_hid=num_hid\n        )\n\n        self.encoder = keras.Sequential(\n            [self.enc_input]\n            + [\n                TransformerEncoder(num_hid, num_head, num_feed_forward)\n                for _ in range(num_layers_enc)\n            ]\n        )\n\n        for i in range(num_layers_dec):\n            setattr(\n                self,\n                f\"dec_layer_{i}\",\n                TransformerDecoder(num_hid, num_head, num_feed_forward),\n            )\n\n        self.classifier = layers.Dense(num_classes)\n\n    def decode(self, enc_out, target, training):\n        y = self.dec_input(target)\n        for i in range(self.num_layers_dec):\n            y = getattr(self, f\"dec_layer_{i}\")(enc_out, y, training)\n        return y\n\n    def call(self, inputs, training):\n        source = inputs[0]\n        target = inputs[1]\n        x = self.encoder(source, training)\n        y = self.decode(x, target, training)\n        return self.classifier(y)\n\n    @property\n    def metrics(self):\n        return [self.loss_metric]\n\n    def train_step(self, batch):\n        \"\"\"Processes one batch inside model.fit().\"\"\"\n        source = batch[0]\n        target = batch[1]\n\n        input_shape = tf.shape(target)\n        batch_size = input_shape[0]\n        \n        dec_input = target[:, :-1]\n        dec_target = target[:, 1:]\n        with tf.GradientTape() as tape:\n            preds = self([source, dec_input])\n            one_hot = tf.one_hot(dec_target, depth=self.num_classes)\n            mask = tf.math.logical_not(tf.math.equal(dec_target, pad_token_idx))\n            loss = self.compiled_loss(one_hot, preds, sample_weight=mask)\n        trainable_vars = self.trainable_variables\n        gradients = tape.gradient(loss, trainable_vars)\n        self.optimizer.apply_gradients(zip(gradients, trainable_vars))\n        # Computes the Levenshtein distance between sequences since the evaluation\n        # metric for this contest is the normalized total levenshtein distance.\n        edit_dist = tf.edit_distance(tf.sparse.from_dense(target), \n                                     tf.sparse.from_dense(tf.cast(tf.argmax(preds, axis=1), tf.int32)))\n        edit_dist = tf.reduce_mean(edit_dist)\n        self.acc_metric.update_state(edit_dist)\n        self.loss_metric.update_state(loss)\n        return {\"loss\": self.loss_metric.result(), \"edit_dist\": self.acc_metric.result()}\n\n    def test_step(self, batch):        \n        source = batch[0]\n        target = batch[1]\n\n        input_shape = tf.shape(target)\n        batch_size = input_shape[0]\n        \n        dec_input = target[:, :-1]\n        dec_target = target[:, 1:]\n        preds = self([source, dec_input])\n        one_hot = tf.one_hot(dec_target, depth=self.num_classes)\n        mask = tf.math.logical_not(tf.math.equal(dec_target, pad_token_idx))\n        loss = self.compiled_loss(one_hot, preds, sample_weight=mask)\n        # Computes the Levenshtein distance between sequences since the evaluation\n        # metric for this contest is the normalized total levenshtein distance.\n        edit_dist = tf.edit_distance(tf.sparse.from_dense(target), \n                                     tf.sparse.from_dense(tf.cast(tf.argmax(preds, axis=1), tf.int32)))\n        edit_dist = tf.reduce_mean(edit_dist)\n        self.acc_metric.update_state(edit_dist)\n        self.loss_metric.update_state(loss)\n        return {\"loss\": self.loss_metric.result(), \"edit_dist\": self.acc_metric.result()}\n\n    def generate(self, source, target_start_token_idx):\n        \"\"\"Performs inference over one batch of inputs using greedy decoding.\"\"\"\n        bs = tf.shape(source)[0]\n        enc = self.encoder(source, training = False)\n        dec_input = tf.ones((bs, 1), dtype=tf.int32) * target_start_token_idx\n        dec_logits = []\n        for i in range(self.target_maxlen - 1):\n            dec_out = self.decode(enc, dec_input, training = False)\n            logits = self.classifier(dec_out)\n            logits = tf.argmax(logits, axis=-1, output_type=tf.int32)\n            last_logit = logits[:, -1][..., tf.newaxis]\n            dec_logits.append(last_logit)\n            dec_input = tf.concat([dec_input, last_logit], axis=-1)\n        return dec_input","metadata":{"execution":{"iopub.status.busy":"2023-07-04T12:28:59.183833Z","iopub.execute_input":"2023-07-04T12:28:59.184379Z","iopub.status.idle":"2023-07-04T12:28:59.210509Z","shell.execute_reply.started":"2023-07-04T12:28:59.184346Z","shell.execute_reply":"2023-07-04T12:28:59.209323Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"The following callback function is used to display predictions.","metadata":{}},{"cell_type":"code","source":"class DisplayOutputs(keras.callbacks.Callback):\n    def __init__(\n        self, batch, idx_to_token, target_start_token_idx=60, target_end_token_idx=61\n    ):\n        \"\"\"Displays a batch of outputs after every 4 epoch\n\n        Args:\n            batch: A test batch\n            idx_to_token: A List containing the vocabulary tokens corresponding to their indices\n            target_start_token_idx: A start token index in the target vocabulary\n            target_end_token_idx: An end token index in the target vocabulary\n        \"\"\"\n        self.batch = batch\n        self.target_start_token_idx = target_start_token_idx\n        self.target_end_token_idx = target_end_token_idx\n        self.idx_to_char = idx_to_token\n\n    def on_epoch_end(self, epoch, logs=None):\n        if epoch % 4 != 0:\n            return\n        source = self.batch[0]\n        target = self.batch[1].numpy()\n        bs = tf.shape(source)[0]\n        preds = self.model.generate(source, self.target_start_token_idx)\n        preds = preds.numpy()\n        for i in range(bs):\n            target_text = \"\".join([self.idx_to_char[_] for _ in target[i, :]])\n            prediction = \"\"\n            for idx in preds[i, :]:\n                prediction += self.idx_to_char[idx]\n                if idx == self.target_end_token_idx:\n                    break\n            print(f\"target:     {target_text.replace('-','')}\")\n            print(f\"prediction: {prediction}\\n\")","metadata":{"execution":{"iopub.status.busy":"2023-07-04T12:28:59.212026Z","iopub.execute_input":"2023-07-04T12:28:59.213058Z","iopub.status.idle":"2023-07-04T12:28:59.223599Z","shell.execute_reply.started":"2023-07-04T12:28:59.213027Z","shell.execute_reply":"2023-07-04T12:28:59.222846Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# 5\\. Train the Transformer model","metadata":{}},{"cell_type":"code","source":"# Transformer variables are customized from original keras tutorial to suit this dataset.\n# Reference: https://www.kaggle.com/code/shlomoron/aslfr-a-simple-transformer/notebook\n\nbatch = next(iter(valid_ds))\n\n# The vocabulary to convert predicted indices into characters\nidx_to_char = list(char_to_num.keys())\ndisplay_cb = DisplayOutputs(\n    batch, idx_to_char, target_start_token_idx=char_to_num['<'], target_end_token_idx=char_to_num['>']\n)  # set the arguments as per vocabulary index for '<' and '>'\n\nmodel = Transformer(\n    num_hid=200,\n    num_head=4,\n    num_feed_forward=400,\n    source_maxlen = FRAME_LEN,\n    target_maxlen=64,\n    num_layers_enc=2,\n    num_layers_dec=1,\n    num_classes=62\n)\nloss_fn = tf.keras.losses.CategoricalCrossentropy(\n    from_logits=True, label_smoothing=0.1,\n)\n\n\noptimizer = keras.optimizers.Adam(0.0001)\nmodel.compile(optimizer=optimizer, loss=loss_fn)\n\nhistory = model.fit(train_ds, validation_data=valid_ds, callbacks=[display_cb], epochs=13)","metadata":{"execution":{"iopub.status.busy":"2023-07-04T12:28:59.229412Z","iopub.execute_input":"2023-07-04T12:28:59.229925Z","iopub.status.idle":"2023-07-04T12:37:14.361541Z","shell.execute_reply.started":"2023-07-04T12:28:59.229885Z","shell.execute_reply":"2023-07-04T12:37:14.360476Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Plot training loss and validation loss","metadata":{}},{"cell_type":"code","source":"plt.plot(history.history['loss'])\nplt.plot(history.history['val_loss'])\nplt.legend(['training loss', 'val_loss'])","metadata":{"execution":{"iopub.status.busy":"2023-07-04T12:37:14.363202Z","iopub.execute_input":"2023-07-04T12:37:14.363581Z","iopub.status.idle":"2023-07-04T12:37:14.697265Z","shell.execute_reply.started":"2023-07-04T12:37:14.363546Z","shell.execute_reply":"2023-07-04T12:37:14.696235Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Submission\n\nRefrence: https://www.kaggle.com/code/shlomoron/aslfr-a-simple-transformer/notebook","metadata":{}},{"cell_type":"markdown","source":"# Create TFLite model","metadata":{}},{"cell_type":"code","source":" class TFLiteModel(tf.Module):\n    def __init__(self, model):\n        super(TFLiteModel, self).__init__()\n        self.target_start_token_idx = start_token_idx\n        self.target_end_token_idx = end_token_idx\n        # Load the feature generation and main models\n        self.model = model\n    \n    @tf.function(input_signature=[tf.TensorSpec(shape=[None, len(FEATURE_COLUMNS)], dtype=tf.float32, name='inputs')])\n    def __call__(self, inputs, training=False):\n        # Preprocess Data\n        x = tf.cast(inputs, tf.float32)\n        x = x[None]\n        x = tf.cond(tf.shape(x)[1] == 0, lambda: tf.zeros((1, 1, len(FEATURE_COLUMNS))), lambda: tf.identity(x))\n        x = x[0]\n        x = pre_process(x)\n        x = x[None]\n        x = self.model.generate(x, self.target_start_token_idx)\n        x = x[0]\n        idx = tf.argmax(tf.cast(tf.equal(x, self.target_end_token_idx), tf.int32))\n        idx = tf.where(tf.math.less(idx, 1), tf.constant(2, dtype=tf.int64), idx)\n        x = x[1:idx]\n        x = tf.one_hot(x, 59)\n        return {'outputs': x}\n    \ntflitemodel_base = TFLiteModel(model)","metadata":{"execution":{"iopub.status.busy":"2023-07-04T12:37:14.69864Z","iopub.execute_input":"2023-07-04T12:37:14.699051Z","iopub.status.idle":"2023-07-04T12:37:14.712397Z","shell.execute_reply.started":"2023-07-04T12:37:14.699004Z","shell.execute_reply":"2023-07-04T12:37:14.711401Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"model.save_weights(\"model.h5\")","metadata":{"execution":{"iopub.status.busy":"2023-07-04T12:37:14.714168Z","iopub.execute_input":"2023-07-04T12:37:14.714609Z","iopub.status.idle":"2023-07-04T12:37:14.846428Z","shell.execute_reply.started":"2023-07-04T12:37:14.714557Z","shell.execute_reply":"2023-07-04T12:37:14.84546Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"keras_model_converter = tf.lite.TFLiteConverter.from_keras_model(tflitemodel_base)\nkeras_model_converter.target_spec.supported_ops = [tf.lite.OpsSet.TFLITE_BUILTINS]#, tf.lite.OpsSet.SELECT_TF_OPS]\ntflite_model = keras_model_converter.convert()\nwith open('/kaggle/working/model.tflite', 'wb') as f:\n    f.write(tflite_model)\n    \ninfargs = {\"selected_columns\" : FEATURE_COLUMNS}\n\nwith open('inference_args.json', \"w\") as json_file:\n    json.dump(infargs, json_file)","metadata":{"execution":{"iopub.status.busy":"2023-07-04T12:37:14.847672Z","iopub.execute_input":"2023-07-04T12:37:14.848009Z","iopub.status.idle":"2023-07-04T12:38:12.218172Z","shell.execute_reply.started":"2023-07-04T12:37:14.847979Z","shell.execute_reply":"2023-07-04T12:38:12.217133Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"!zip submission.zip  './model.tflite' './inference_args.json'","metadata":{"execution":{"iopub.status.busy":"2023-07-04T12:38:12.219686Z","iopub.execute_input":"2023-07-04T12:38:12.220028Z","iopub.status.idle":"2023-07-04T12:38:14.316241Z","shell.execute_reply.started":"2023-07-04T12:38:12.219996Z","shell.execute_reply":"2023-07-04T12:38:14.31501Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"interpreter = tf.lite.Interpreter(\"model.tflite\")\n\nREQUIRED_SIGNATURE = \"serving_default\"\nREQUIRED_OUTPUT = \"outputs\"\n\nwith open (\"/kaggle/input/asl-fingerspelling/character_to_prediction_index.json\", \"r\") as f:\n    character_map = json.load(f)\nrev_character_map = {j:i for i,j in character_map.items()}\n\nfound_signatures = list(interpreter.get_signature_list().keys())\n\nif REQUIRED_SIGNATURE not in found_signatures:\n    raise KernelEvalException('Required input signature not found.')\n\nprediction_fn = interpreter.get_signature_runner(\"serving_default\")\noutput = prediction_fn(inputs=batch[0][0])\nprediction_str = \"\".join([rev_character_map.get(s, \"\") for s in np.argmax(output[REQUIRED_OUTPUT], axis=1)])\nprint(prediction_str)","metadata":{"execution":{"iopub.status.busy":"2023-07-04T12:38:14.318305Z","iopub.execute_input":"2023-07-04T12:38:14.319042Z","iopub.status.idle":"2023-07-04T12:38:14.667422Z","shell.execute_reply.started":"2023-07-04T12:38:14.319004Z","shell.execute_reply":"2023-07-04T12:38:14.666364Z"},"trusted":true},"execution_count":null,"outputs":[]}]}