diff --git a/PHM08_PCA_study.ipynb b/PHM08_PCA_study.ipynb new file mode 100644 index 0000000..789e166 --- /dev/null +++ b/PHM08_PCA_study.ipynb @@ -0,0 +1,331 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 1, + "id": "166c106a-79f8-4bec-a115-e97b6933aba5", + "metadata": {}, + "outputs": [], + "source": [ + "import numpy as np\n", + "import math\n", + "import copy\n", + "import fp\n", + "import phm08\n", + "import param_sweep\n", + "\n", + "import matplotlib.pyplot as plt\n", + "from matplotlib.colors import ListedColormap\n", + "from matplotlib import ticker\n", + "import matplotlib as mpl\n", + "\n", + "from sklearn.datasets import make_circles, make_classification, make_moons\n", + "from sklearn.ensemble import AdaBoostClassifier, RandomForestClassifier\n", + "from sklearn.inspection import DecisionBoundaryDisplay\n", + "from sklearn.tree import DecisionTreeClassifier\n", + "from sklearn.model_selection import train_test_split\n", + "from sklearn.decomposition import KernelPCA\n", + "\n", + "from imblearn.ensemble import BalancedRandomForestClassifier\n", + "\n", + "from ipywidgets import IntProgress\n", + "from IPython.display import display" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "id": "d10fae25-21a0-4d23-b9b2-71d57760987c", + "metadata": {}, + "outputs": [], + "source": [ + "# Load Data\n", + "(x_train, y_train, x_test, y_test) = phm08.dataset()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "52021962-a5d6-478c-8b10-001bd20695c9", + "metadata": {}, + "outputs": [], + "source": [ + "# Out of curiosity, what does this look like with two components\n", + "k_pca = KernelPCA(n_components=2, kernel='poly', n_jobs=-1)\n", + "k_pca.fit(x_train)\n", + "x_h = k_pca.transform(x_train)\n", + "fig, ax = plt.subplots()\n", + "ax.scatter(x_h[:,0], x_h[:,1], c=y_train)" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "id": "72774308-6d76-4f27-9276-6434c4d896ad", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Fit PCA\n", + "Transform Training Data\n", + "Train BF\n", + "Transform Test Data\n", + "Score clf\n", + "{'tp': 34, 'tn': 28391, 'fp': 1211, 'fn': 184, 'tnr': 0.9590906019863523, 'tpr': 0.1559633027522936, 'fpr': 0.04090939801364773, 'g_mean': 0.38675953501429927, 'precision': 0.027309236947791166, 'f_measure': 0.04647983595352017, 'score': 0.9532193158953722}\n" + ] + } + ], + "source": [ + "print('Fit PCA')\n", + "k_pca = KernelPCA(n_components=4, kernel='poly')\n", + "k_pca.fit(x_train)\n", + "print('Transform Training Data')\n", + "x_train_h = k_pca.transform(x_train)\n", + "\n", + "print('Train BF')\n", + "bf_clf = BalancedRandomForestClassifier(sampling_strategy='all', replacement=True, bootstrap=False)\n", + "bf_clf.fit(x_train_h, y_train)\n", + "\n", + "print('Transform Test Data')\n", + "x_test_h = k_pca.transform(x_test)\n", + "\n", + "print('Score clf')\n", + "(_, _, metrics) = fp.score_classifier(bf_clf, x_test_h, y_test)\n", + "\n", + "print(metrics)" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "id": "dd38c9e0-9a63-4e98-8f80-4b5fb48833ce", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Found 64 param instances\n" + ] + } + ], + "source": [ + "# Generate Parameter Sweep\n", + "sweep_config = {\n", + " \"k_pca_params\": {\n", + " \"n_jobs\": [-1],\n", + " \"n_components\": [2, 3, 5, 10],\n", + " \"kernel\": ['linear', 'poly', 'sigmoid', 'cosine']\n", + " },\n", + " \"bf_params\": {\n", + " \"n_jobs\": [-1],\n", + " \"replacement\": [True], \n", + " \"bootstrap\": [False],\n", + " \"sampling_strategy\": ['auto'],\n", + " \"n_estimators\": [100],\n", + " \"max_features\": [2],\n", + " \"criterion\": ['entropy', 'gini'],\n", + " \"max_depth\": [100],\n", + " \"class_weight\": ['balanced', 'balanced_subsample']\n", + " }\n", + "}\n", + "\n", + "sweep_parameters = param_sweep.generate(sweep_config)" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "id": "1a5aaaa7-e048-4fdc-b60a-89316bdaaf35", + "metadata": {}, + "outputs": [ + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "527ac65f287e4a2693a28969dd5489f1", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "IntProgress(value=0, max=64)" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "# Run the study\n", + "# !!! May take several hours !!!\n", + "\n", + "# Setup Progress Bar\n", + "n_params = len(sweep_parameters)\n", + "progress_bar = IntProgress(min=0, max=n_params) # instantiate the bar\n", + "display(progress_bar) # display the bar\n", + "\n", + "# Load Data\n", + "(x_train, y_train, x_test, y_test) = phm08.dataset()\n", + "\n", + "# Run each param dict and collect metrics\n", + "metrics = []\n", + "for params in sweep_parameters:\n", + " k_pca = KernelPCA(**params['k_pca_params'])\n", + " k_pca.fit(x_train)\n", + " x_train_h = k_pca.transform(x_train)\n", + " bf_clf = BalancedRandomForestClassifier(**params['bf_params'])\n", + " bf_clf.fit(x_train_h, y_train)\n", + "\n", + " x_test_h = k_pca.transform(x_test)\n", + " (_, _, m) = fp.score_classifier(bf_clf, x_test_h, y_test)\n", + " metrics.append(m)\n", + " progress_bar.value += 1" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "id": "0bca2e63-3202-4d80-9d13-0ae9491c5902", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "*** tnr BEST 3 ***\n", + " i: 0\n", + " p: {'k_pca_params': {'n_jobs': -1, 'n_components': 10, 'kernel': 'cosine'}, 'bf_params': {'n_jobs': -1, 'replacement': True, 'bootstrap': False, 'sampling_strategy': 'auto', 'n_estimators': 100, 'max_features': 2, 'criterion': 'entropy', 'max_depth': 100, 'class_weight': 'balanced'}}\n", + " m: {'tp': 22, 'tn': 29196, 'fp': 406, 'fn': 196, 'tnr': 0.9862847104925343, 'tpr': 0.10091743119266056, 'fpr': 0.013715289507465712, 'g_mean': 0.3154890163024752, 'precision': 0.0514018691588785, 'f_measure': 0.06811145510835913, 'score': 0.9798122065727699}\n", + " i: 1\n", + " p: {'k_pca_params': {'n_jobs': -1, 'n_components': 10, 'kernel': 'cosine'}, 'bf_params': {'n_jobs': -1, 'replacement': True, 'bootstrap': False, 'sampling_strategy': 'auto', 'n_estimators': 100, 'max_features': 2, 'criterion': 'gini', 'max_depth': 100, 'class_weight': 'balanced_subsample'}}\n", + " m: {'tp': 24, 'tn': 29120, 'fp': 482, 'fn': 194, 'tnr': 0.9837173163975407, 'tpr': 0.11009174311926606, 'fpr': 0.016282683602459293, 'g_mean': 0.32908836822168575, 'precision': 0.04743083003952569, 'f_measure': 0.06629834254143646, 'score': 0.9773306505700872}\n", + " i: 2\n", + " p: {'k_pca_params': {'n_jobs': -1, 'n_components': 10, 'kernel': 'linear'}, 'bf_params': {'n_jobs': -1, 'replacement': True, 'bootstrap': False, 'sampling_strategy': 'auto', 'n_estimators': 100, 'max_features': 2, 'criterion': 'entropy', 'max_depth': 100, 'class_weight': 'balanced_subsample'}}\n", + " m: {'tp': 22, 'tn': 29111, 'fp': 491, 'fn': 196, 'tnr': 0.9834132828862915, 'tpr': 0.10091743119266056, 'fpr': 0.016586717113708533, 'g_mean': 0.31502943086261914, 'precision': 0.042884990253411304, 'f_measure': 0.060191518467852256, 'score': 0.9769617706237425}\n", + "*** tpr BEST 3 ***\n", + " i: 0\n", + " p: {'k_pca_params': {'n_jobs': -1, 'n_components': 5, 'kernel': 'poly'}, 'bf_params': {'n_jobs': -1, 'replacement': True, 'bootstrap': False, 'sampling_strategy': 'auto', 'n_estimators': 100, 'max_features': 2, 'criterion': 'entropy', 'max_depth': 100, 'class_weight': 'balanced'}}\n", + " m: {'tp': 52, 'tn': 27881, 'fp': 1721, 'fn': 166, 'tnr': 0.9418620363488953, 'tpr': 0.23853211009174313, 'fpr': 0.05813796365110466, 'g_mean': 0.4739876991501025, 'precision': 0.029328821206993795, 'f_measure': 0.052235057759919636, 'score': 0.9367203219315895}\n", + " i: 1\n", + " p: {'k_pca_params': {'n_jobs': -1, 'n_components': 5, 'kernel': 'poly'}, 'bf_params': {'n_jobs': -1, 'replacement': True, 'bootstrap': False, 'sampling_strategy': 'auto', 'n_estimators': 100, 'max_features': 2, 'criterion': 'entropy', 'max_depth': 100, 'class_weight': 'balanced_subsample'}}\n", + " m: {'tp': 49, 'tn': 27876, 'fp': 1726, 'fn': 169, 'tnr': 0.9416931288426458, 'tpr': 0.22477064220183487, 'fpr': 0.05830687115735423, 'g_mean': 0.4600706134138723, 'precision': 0.0276056338028169, 'f_measure': 0.04917210235825389, 'score': 0.9364520456069751}\n", + " i: 2\n", + " p: {'k_pca_params': {'n_jobs': -1, 'n_components': 3, 'kernel': 'poly'}, 'bf_params': {'n_jobs': -1, 'replacement': True, 'bootstrap': False, 'sampling_strategy': 'auto', 'n_estimators': 100, 'max_features': 2, 'criterion': 'entropy', 'max_depth': 100, 'class_weight': 'balanced'}}\n", + " m: {'tp': 46, 'tn': 27819, 'fp': 1783, 'fn': 172, 'tnr': 0.9397675832714005, 'tpr': 0.21100917431192662, 'fpr': 0.06023241672859942, 'g_mean': 0.4453084119924223, 'precision': 0.025150355385456534, 'f_measure': 0.04494382022471911, 'score': 0.9344399731723675}\n", + "*** g_mean BEST 3 ***\n", + " i: 0\n", + " p: {'k_pca_params': {'n_jobs': -1, 'n_components': 5, 'kernel': 'poly'}, 'bf_params': {'n_jobs': -1, 'replacement': True, 'bootstrap': False, 'sampling_strategy': 'auto', 'n_estimators': 100, 'max_features': 2, 'criterion': 'entropy', 'max_depth': 100, 'class_weight': 'balanced'}}\n", + " m: {'tp': 52, 'tn': 27881, 'fp': 1721, 'fn': 166, 'tnr': 0.9418620363488953, 'tpr': 0.23853211009174313, 'fpr': 0.05813796365110466, 'g_mean': 0.4739876991501025, 'precision': 0.029328821206993795, 'f_measure': 0.052235057759919636, 'score': 0.9367203219315895}\n", + " i: 1\n", + " p: {'k_pca_params': {'n_jobs': -1, 'n_components': 5, 'kernel': 'poly'}, 'bf_params': {'n_jobs': -1, 'replacement': True, 'bootstrap': False, 'sampling_strategy': 'auto', 'n_estimators': 100, 'max_features': 2, 'criterion': 'entropy', 'max_depth': 100, 'class_weight': 'balanced_subsample'}}\n", + " m: {'tp': 49, 'tn': 27876, 'fp': 1726, 'fn': 169, 'tnr': 0.9416931288426458, 'tpr': 0.22477064220183487, 'fpr': 0.05830687115735423, 'g_mean': 0.4600706134138723, 'precision': 0.0276056338028169, 'f_measure': 0.04917210235825389, 'score': 0.9364520456069751}\n", + " i: 2\n", + " p: {'k_pca_params': {'n_jobs': -1, 'n_components': 5, 'kernel': 'poly'}, 'bf_params': {'n_jobs': -1, 'replacement': True, 'bootstrap': False, 'sampling_strategy': 'auto', 'n_estimators': 100, 'max_features': 2, 'criterion': 'gini', 'max_depth': 100, 'class_weight': 'balanced_subsample'}}\n", + " m: {'tp': 46, 'tn': 27865, 'fp': 1737, 'fn': 172, 'tnr': 0.9413215323288967, 'tpr': 0.21100917431192662, 'fpr': 0.0586784676711033, 'g_mean': 0.44567642892434645, 'precision': 0.025799214806505887, 'f_measure': 0.04597701149425287, 'score': 0.9359825620389001}\n", + "*** precision BEST 3 ***\n", + " i: 0\n", + " p: {'k_pca_params': {'n_jobs': -1, 'n_components': 10, 'kernel': 'cosine'}, 'bf_params': {'n_jobs': -1, 'replacement': True, 'bootstrap': False, 'sampling_strategy': 'auto', 'n_estimators': 100, 'max_features': 2, 'criterion': 'entropy', 'max_depth': 100, 'class_weight': 'balanced'}}\n", + " m: {'tp': 22, 'tn': 29196, 'fp': 406, 'fn': 196, 'tnr': 0.9862847104925343, 'tpr': 0.10091743119266056, 'fpr': 0.013715289507465712, 'g_mean': 0.3154890163024752, 'precision': 0.0514018691588785, 'f_measure': 0.06811145510835913, 'score': 0.9798122065727699}\n", + " i: 1\n", + " p: {'k_pca_params': {'n_jobs': -1, 'n_components': 10, 'kernel': 'cosine'}, 'bf_params': {'n_jobs': -1, 'replacement': True, 'bootstrap': False, 'sampling_strategy': 'auto', 'n_estimators': 100, 'max_features': 2, 'criterion': 'gini', 'max_depth': 100, 'class_weight': 'balanced'}}\n", + " m: {'tp': 27, 'tn': 29076, 'fp': 526, 'fn': 191, 'tnr': 0.9822309303425444, 'tpr': 0.12385321100917432, 'fpr': 0.017769069657455578, 'g_mean': 0.34878711942308416, 'precision': 0.048824593128390596, 'f_measure': 0.07003891050583658, 'score': 0.9759557344064387}\n", + " i: 2\n", + " p: {'k_pca_params': {'n_jobs': -1, 'n_components': 10, 'kernel': 'cosine'}, 'bf_params': {'n_jobs': -1, 'replacement': True, 'bootstrap': False, 'sampling_strategy': 'auto', 'n_estimators': 100, 'max_features': 2, 'criterion': 'gini', 'max_depth': 100, 'class_weight': 'balanced_subsample'}}\n", + " m: {'tp': 24, 'tn': 29120, 'fp': 482, 'fn': 194, 'tnr': 0.9837173163975407, 'tpr': 0.11009174311926606, 'fpr': 0.016282683602459293, 'g_mean': 0.32908836822168575, 'precision': 0.04743083003952569, 'f_measure': 0.06629834254143646, 'score': 0.9773306505700872}\n", + "*** f_measure BEST 3 ***\n", + " i: 0\n", + " p: {'k_pca_params': {'n_jobs': -1, 'n_components': 10, 'kernel': 'cosine'}, 'bf_params': {'n_jobs': -1, 'replacement': True, 'bootstrap': False, 'sampling_strategy': 'auto', 'n_estimators': 100, 'max_features': 2, 'criterion': 'gini', 'max_depth': 100, 'class_weight': 'balanced'}}\n", + " m: {'tp': 27, 'tn': 29076, 'fp': 526, 'fn': 191, 'tnr': 0.9822309303425444, 'tpr': 0.12385321100917432, 'fpr': 0.017769069657455578, 'g_mean': 0.34878711942308416, 'precision': 0.048824593128390596, 'f_measure': 0.07003891050583658, 'score': 0.9759557344064387}\n", + " i: 1\n", + " p: {'k_pca_params': {'n_jobs': -1, 'n_components': 10, 'kernel': 'cosine'}, 'bf_params': {'n_jobs': -1, 'replacement': True, 'bootstrap': False, 'sampling_strategy': 'auto', 'n_estimators': 100, 'max_features': 2, 'criterion': 'entropy', 'max_depth': 100, 'class_weight': 'balanced'}}\n", + " m: {'tp': 22, 'tn': 29196, 'fp': 406, 'fn': 196, 'tnr': 0.9862847104925343, 'tpr': 0.10091743119266056, 'fpr': 0.013715289507465712, 'g_mean': 0.3154890163024752, 'precision': 0.0514018691588785, 'f_measure': 0.06811145510835913, 'score': 0.9798122065727699}\n", + " i: 2\n", + " p: {'k_pca_params': {'n_jobs': -1, 'n_components': 10, 'kernel': 'cosine'}, 'bf_params': {'n_jobs': -1, 'replacement': True, 'bootstrap': False, 'sampling_strategy': 'auto', 'n_estimators': 100, 'max_features': 2, 'criterion': 'gini', 'max_depth': 100, 'class_weight': 'balanced_subsample'}}\n", + " m: {'tp': 24, 'tn': 29120, 'fp': 482, 'fn': 194, 'tnr': 0.9837173163975407, 'tpr': 0.11009174311926606, 'fpr': 0.016282683602459293, 'g_mean': 0.32908836822168575, 'precision': 0.04743083003952569, 'f_measure': 0.06629834254143646, 'score': 0.9773306505700872}\n", + "*** score BEST 3 ***\n", + " i: 0\n", + " p: {'k_pca_params': {'n_jobs': -1, 'n_components': 10, 'kernel': 'cosine'}, 'bf_params': {'n_jobs': -1, 'replacement': True, 'bootstrap': False, 'sampling_strategy': 'auto', 'n_estimators': 100, 'max_features': 2, 'criterion': 'entropy', 'max_depth': 100, 'class_weight': 'balanced'}}\n", + " m: {'tp': 22, 'tn': 29196, 'fp': 406, 'fn': 196, 'tnr': 0.9862847104925343, 'tpr': 0.10091743119266056, 'fpr': 0.013715289507465712, 'g_mean': 0.3154890163024752, 'precision': 0.0514018691588785, 'f_measure': 0.06811145510835913, 'score': 0.9798122065727699}\n", + " i: 1\n", + " p: {'k_pca_params': {'n_jobs': -1, 'n_components': 10, 'kernel': 'cosine'}, 'bf_params': {'n_jobs': -1, 'replacement': True, 'bootstrap': False, 'sampling_strategy': 'auto', 'n_estimators': 100, 'max_features': 2, 'criterion': 'gini', 'max_depth': 100, 'class_weight': 'balanced_subsample'}}\n", + " m: {'tp': 24, 'tn': 29120, 'fp': 482, 'fn': 194, 'tnr': 0.9837173163975407, 'tpr': 0.11009174311926606, 'fpr': 0.016282683602459293, 'g_mean': 0.32908836822168575, 'precision': 0.04743083003952569, 'f_measure': 0.06629834254143646, 'score': 0.9773306505700872}\n", + " i: 2\n", + " p: {'k_pca_params': {'n_jobs': -1, 'n_components': 10, 'kernel': 'linear'}, 'bf_params': {'n_jobs': -1, 'replacement': True, 'bootstrap': False, 'sampling_strategy': 'auto', 'n_estimators': 100, 'max_features': 2, 'criterion': 'entropy', 'max_depth': 100, 'class_weight': 'balanced_subsample'}}\n", + " m: {'tp': 22, 'tn': 29111, 'fp': 491, 'fn': 196, 'tnr': 0.9834132828862915, 'tpr': 0.10091743119266056, 'fpr': 0.016586717113708533, 'g_mean': 0.31502943086261914, 'precision': 0.042884990253411304, 'f_measure': 0.060191518467852256, 'score': 0.9769617706237425}\n", + "48\n" + ] + }, + { + "data": { + "image/png": "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Cy64QBdccIFGjx7d5K6ngQgo+UhISNCgQYNUWFjoa7NtW4WFhcrKymrymssuu0zbt2+Xbdu+tm3btqlr165+T8gDAACty29+8xtlZ2erffv2uvPOO3XnnXeqXbt2uvLKK/XSSy857jfgpbZ5eXlavny5nn/+eZWWlmrKlCmqrq72rX4ZP36834TUKVOm6MCBA5o+fbq2bdum1atXa/78+Zo6darjoAEAiDTLhOZozR566CEtWrRIq1at8iUfq1at0sKFCzVv3jzH/QY852PMmDHav3+/5s6dq7KyMg0YMEBr1671TULdvXu3XK6vcpr09HS9/fbbmjFjhvr166fu3btr+vTpuueeexwHDQBAxMXAnI8dO3YoJyenUfvo0aN17733Ou7X0YTTadOmadq0aU2+V1RU1KgtKytLH330kZOPAgCgdYqBfT7S09NVWFioCy64wK/93XffVXp6uuN+ebYLAABo0k9/+lPdeeedKikp0ZAhQyRJH374oZ577jn94he/cNwvyQcAAE7EwLDLlClTlJaWpkcffVQvv/yypOMrVletWqVrr73Wcb8kHwAAOBEDyYckXX/99br++utD2qejp9oCAIC27+OPP9Zf//rXRu1//etf9cknnzjul+QDAAAnTIiOVmzq1KlNPuJk7969QW2ZwbALAABOxMBql82bN+vb3/52o/aBAwdq8+bNjvul8gEAAJrk8XgaPVJFkr744gvFxTmvX5B8AADgQCzscHrVVVf5njTf4ODBg7r33ns1YsQIx/0y7AIAgBMxsNrlkUce0Xe/+1316NFDAwcOlCSVlJQoNTVVL774ouN+ST4AAECTunfvrr///e9asWKF/va3v6ldu3bKzc3VTTfdpPj4eMf9knwAAIBT6tChgyZNmhTSPpnzAQCAA5ZCMOcj0l/iFLZt26b169f7tRUWFmr48OG69NJLNX/+/KD6J/kAAMCJhqW2wR6t0D333KM//OEPvtc7d+5UTk6OEhISlJWVpQULFmjJkiWO+2fYBQAA+Pnkk0909913+16vWLFCvXr10ttvvy1J6tevn5544gn95Cc/cdQ/lQ8AAJxowzucVlRU6Nxzz/W9fv/995WTk+N7fcUVV2jXrl2O+yf5AADAiTacfJx99tn64osvJEm2beuTTz7Rf/zHf/jer62tlTHOgyf5AAAAfq644grNmzdP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A7Nz505TVFRkSkpKwhx5+AR6j1asWGE8Ho9ZsWKF2blzp3n77bdN165dzYwZM8IcefisWbPG3HfffebVV181kszvf//7056/Y8cO0759e5OXl2c2b95snnjiCeN2u83atWvDEzBaVNQmH5deeqmZOnWq77XX6zXdunUzCxYsaPL8H/7wh+b73/++X1tmZqa5/fbbWzTOSAr0Hp2svr7edOzY0Tz//PMtFWLEOblH9fX1ZsiQIeaZZ54xEyZMaPPJR6D36KmnnjLnn3++qa2tDVeIERfoPZo6dar53ve+59eWl5dnLrvsshaNs7VoTvJx9913m4svvtivbcyYMWbkyJEtGBnCJSqHXWpra7VhwwZlZ2f72lwul7Kzs1VcXNzkNcXFxX7nS9LIkSNPeX60c3KPTnbkyBHV1dXp7LPPbqkwI8rpPfrZz36mLl266NZbbw1HmBHl5B698cYbysrK0tSpU5WamqpLLrlE8+fPl9frDVfYYeXkHg0ZMkQbNmzwDc3s2LFDa9as0ahRo8ISczSItX+zY01UPNX2ZBUVFfJ6vUpNTfVrT01N1ZYtW5q8pqysrMnzy8rKWizOSHJyj052zz33qFu3bo3+AWgrnNyjDz74QM8++6xKSkrCEGHkOblHO3bs0Hvvvaebb75Za9as0fbt23XHHXeorq5O+fn54Qg7rJzco7Fjx6qiokKXX365jDGqr6/X5MmTde+994Yj5Khwqn+zKysrdfToUbVr1y5CkSEUorLygZa3cOFCrVy5Ur///e95bPQJVVVVGjdunJYvX66UlJRIh9Nq2batLl266Omnn9agQYM0ZswY3XfffVq2bFmkQ2s1ioqKNH/+fD355JPauHGjXn31Va1evVrz5s2LdGhAWERl5SMlJUVut1vl5eV+7eXl5UpLS2vymrS0tIDOj3ZO7lGDRx55RAsXLtS7776rfv36tWSYERXoPfrss8+0a9cu5eTk+Nps25YkxcXFaevWrerZs2fLBh1mTv6Ounbtqvj4eLndbl9b7969VVZWptraWiUkJLRozOHm5B7NmTNH48aN02233SZJ6tu3r6qrqzVp0iTdd999crn478JT/ZudlJRE1aMNiMq/8ISEBA0aNEiFhYW+Ntu2VVhYqKysrCavycrK8jtfkt55551Tnh/tnNwjSVq0aJHmzZuntWvXavDgweEINWICvUcXXXSRNm3apJKSEt8xevRoDR8+XCUlJUpPTw9n+GHh5O/osssu0/bt232JmSRt27ZNXbt2bXOJh+TsHh05cqRRgtGQrBme9Skp9v7NjjmRnvHq1MqVK43H4zHPPfec2bx5s5k0aZLp1KmTKSsrM8YYM27cODNz5kzf+R9++KGJi4szjzzyiCktLTX5+fkxsdQ2kHu0cOFCk5CQYF555RXzxRdf+I6qqqpIfYUWF+g9OlksrHYJ9B7t3r3bdOzY0UybNs1s3brV/OEPfzBdunQxDz74YKS+QosL9B7l5+ebjh07mt/+9rdmx44d5o9//KPp2bOn+eEPfxipr9DiqqqqzKeffmo+/fRTI8ksXrzYfPrpp+bzzz83xhgzc+ZMM27cON/5DUtt/+d//seUlpaapUuXstS2DYna5MMYY5544gnzzW9+0yQkJJhLL73UfPTRR773hg0bZiZMmOB3/ssvv2x69eplEhISzMUXX2xWr14d5ojDL5B71KNHDyOp0ZGfnx/+wMMo0L+jr4uF5MOYwO/RunXrTGZmpvF4POb88883Dz30kKmvrw9z1OEVyD2qq6sz999/v+nZs6dJTEw06enp5o477jBffvll+AMPk/fff7/Jf18a7suECRPMsGHDGl0zYMAAk5CQYM4//3zz61//Ouxxo2VYxlDjAwAA4ROVcz4AAED0IvkAAABhRfIBAADCiuQDAACEFckHAAAIK5IPAAAQViQfAAAgrEg+AABAWJF8AACAsCL5AAAAYUXyAQAAwur/AyyQzuOAhUzjAAAAAElFTkSuQmCC", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "# Examine the results\n", + "n_best = 3\n", + "f_indices = [i for i in range(0, n_params) if metrics[i]['tpr'] > 0.1 and metrics[i]['tnr'] > 0.5]\n", + "for metric in ['tnr', 'tpr', 'g_mean', 'precision', 'f_measure', 'score']:\n", + " print(f\"*** {metric} BEST {n_best} ***\")\n", + " indices = copy.deepcopy(f_indices)\n", + " indices.sort(key=lambda i: metrics[i][metric], reverse=True)\n", + " for i in range(0, n_best):\n", + " print(f\" i: {i}\")\n", + " print(f\" p: {sweep_parameters[indices[i]]}\")\n", + " print(f\" m: {metrics[indices[i]]}\")\n", + "\n", + "\n", + "indices = [i for i in range(0, n_params) if metrics[i]['tpr'] != 0.0 and metrics[i]['tnr'] != 0.0]\n", + "print(len(indices))\n", + "\n", + "tpr_s = []\n", + "fpr_s = []\n", + "scores = []\n", + "for m in metrics:\n", + " tpr_s.append(m['tpr'])\n", + " scores.append(m['score'])\n", + " fpr_s.append(m['fpr'])\n", + "fig, ax = plt.subplots()\n", + "ax.set_title('TPR over FPR')\n", + "sc = ax.scatter(fpr_s, tpr_s, marker='.', c=scores)\n", + "cb = fig.colorbar(sc)\n", + "cb.set_label('CLF Score')" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "12e43b05-586f-474a-ba8d-5d85fdfd8348", + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.10.12" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/PHM08_basic_paramsweep.ipynb b/PHM08_basic_paramsweep.ipynb index d1240b8..6fc1dd7 100644 --- a/PHM08_basic_paramsweep.ipynb +++ b/PHM08_basic_paramsweep.ipynb @@ -49,6 +49,7 @@ "# Generate Parameter Sweep\n", "sweep_config = {\n", " \"bf_params\": {\n", + " \"n_jobs\": [-1],\n", " \"replacement\": [True], \n", " \"bootstrap\": [False],\n", " \"sampling_strategy\": ['auto', 'all', 'majority', 'not minority', 'not majority', 0.2, 0.5, 0.8],\n", @@ -65,14 +66,14 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 3, "id": "bde61512-fd5c-46d4-aa28-b01afb5e1cb7", "metadata": {}, "outputs": [ { "data": { "application/vnd.jupyter.widget-view+json": { - "model_id": "09085eac47da48959b15fe8773c22413", + "model_id": "b0fae84a315b463090e717070080a62d", "version_major": 2, "version_minor": 0 }, @@ -86,6 +87,7 @@ ], "source": [ "# Run the study\n", + "# !!! May take several hours !!!\n", "\n", "# Setup Progress Bar\n", "n_params = len(sweep_parameters)\n", @@ -108,26 +110,103 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 5, "id": "59262a33-b3b0-432a-a3a7-ef74e22da2df", "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "*** tnr BEST 3 ***\n", + " i: 0\n", + " p: {'bf_params': {'n_jobs': -1, 'replacement': True, 'bootstrap': False, 'sampling_strategy': 0.8, 'n_estimators': 200, 'max_features': 1, 'criterion': 'entropy', 'max_depth': 10, 'class_weight': 'balanced'}}\n", + " m: {'tp': 24, 'tn': 29418, 'fp': 184, 'fn': 194, 'tnr': 0.9937842037700155, 'tpr': 0.11009174311926606, 'fpr': 0.00621579622998446, 'g_mean': 0.33076794777824664, 'precision': 0.11538461538461539, 'f_measure': 0.11267605633802817, 'score': 0.9873239436619718}\n", + " i: 1\n", + " p: {'bf_params': {'n_jobs': -1, 'replacement': True, 'bootstrap': False, 'sampling_strategy': 0.8, 'n_estimators': 200, 'max_features': 1, 'criterion': 'entropy', 'max_depth': 10, 'class_weight': 'balanced_subsample'}}\n", + " m: {'tp': 22, 'tn': 29415, 'fp': 187, 'fn': 196, 'tnr': 0.9936828592662658, 'tpr': 0.10091743119266056, 'fpr': 0.006317140733734207, 'g_mean': 0.31667005159523626, 'precision': 0.10526315789473684, 'f_measure': 0.10304449648711943, 'score': 0.9871562709590879}\n", + " i: 2\n", + " p: {'bf_params': {'n_jobs': -1, 'replacement': True, 'bootstrap': False, 'sampling_strategy': 'majority', 'n_estimators': 100, 'max_features': 2, 'criterion': 'entropy', 'max_depth': 10, 'class_weight': 'balanced_subsample'}}\n", + " m: {'tp': 22, 'tn': 29412, 'fp': 190, 'fn': 196, 'tnr': 0.993581514762516, 'tpr': 0.10091743119266056, 'fpr': 0.006418485237483954, 'g_mean': 0.31665390278716865, 'precision': 0.10377358490566038, 'f_measure': 0.10232558139534885, 'score': 0.9870556673373575}\n", + "*** tpr BEST 3 ***\n", + " i: 0\n", + " p: {'bf_params': {'n_jobs': -1, 'replacement': True, 'bootstrap': False, 'sampling_strategy': 0.5, 'n_estimators': 100, 'max_features': 10, 'criterion': 'gini', 'max_depth': 10, 'class_weight': 'balanced'}}\n", + " m: {'tp': 53, 'tn': 27913, 'fp': 1689, 'fn': 165, 'tnr': 0.9429430443888926, 'tpr': 0.24311926605504589, 'fpr': 0.05705695561110736, 'g_mean': 0.47879810033409503, 'precision': 0.030424799081515498, 'f_measure': 0.05408163265306123, 'score': 0.9378269617706237}\n", + " i: 1\n", + " p: {'bf_params': {'n_jobs': -1, 'replacement': True, 'bootstrap': False, 'sampling_strategy': 0.5, 'n_estimators': 100, 'max_features': 10, 'criterion': 'gini', 'max_depth': 10, 'class_weight': 'balanced_subsample'}}\n", + " m: {'tp': 46, 'tn': 28137, 'fp': 1465, 'fn': 172, 'tnr': 0.9505101006688738, 'tpr': 0.21100917431192662, 'fpr': 0.049489899331126276, 'g_mean': 0.44784634811203416, 'precision': 0.03044341495698213, 'f_measure': 0.05320994794679005, 'score': 0.9451039570757881}\n", + " i: 2\n", + " p: {'bf_params': {'n_jobs': -1, 'replacement': True, 'bootstrap': False, 'sampling_strategy': 0.5, 'n_estimators': 50, 'max_features': 10, 'criterion': 'gini', 'max_depth': 10, 'class_weight': 'balanced_subsample'}}\n", + " m: {'tp': 44, 'tn': 28163, 'fp': 1439, 'fn': 174, 'tnr': 0.9513884197013716, 'tpr': 0.2018348623853211, 'fpr': 0.04861158029862847, 'g_mean': 0.4382046904876926, 'precision': 0.029669588671611596, 'f_measure': 0.05173427395649618, 'score': 0.9459087860496311}\n", + "*** g_mean BEST 3 ***\n", + " i: 0\n", + " p: {'bf_params': {'n_jobs': -1, 'replacement': True, 'bootstrap': False, 'sampling_strategy': 0.5, 'n_estimators': 100, 'max_features': 10, 'criterion': 'gini', 'max_depth': 10, 'class_weight': 'balanced'}}\n", + " m: {'tp': 53, 'tn': 27913, 'fp': 1689, 'fn': 165, 'tnr': 0.9429430443888926, 'tpr': 0.24311926605504589, 'fpr': 0.05705695561110736, 'g_mean': 0.47879810033409503, 'precision': 0.030424799081515498, 'f_measure': 0.05408163265306123, 'score': 0.9378269617706237}\n", + " i: 1\n", + " p: {'bf_params': {'n_jobs': -1, 'replacement': True, 'bootstrap': False, 'sampling_strategy': 0.5, 'n_estimators': 100, 'max_features': 10, 'criterion': 'gini', 'max_depth': 10, 'class_weight': 'balanced_subsample'}}\n", + " m: {'tp': 46, 'tn': 28137, 'fp': 1465, 'fn': 172, 'tnr': 0.9505101006688738, 'tpr': 0.21100917431192662, 'fpr': 0.049489899331126276, 'g_mean': 0.44784634811203416, 'precision': 0.03044341495698213, 'f_measure': 0.05320994794679005, 'score': 0.9451039570757881}\n", + " i: 2\n", + " p: {'bf_params': {'n_jobs': -1, 'replacement': True, 'bootstrap': False, 'sampling_strategy': 0.5, 'n_estimators': 50, 'max_features': 10, 'criterion': 'gini', 'max_depth': 10, 'class_weight': 'balanced_subsample'}}\n", + " m: {'tp': 44, 'tn': 28163, 'fp': 1439, 'fn': 174, 'tnr': 0.9513884197013716, 'tpr': 0.2018348623853211, 'fpr': 0.04861158029862847, 'g_mean': 0.4382046904876926, 'precision': 0.029669588671611596, 'f_measure': 0.05173427395649618, 'score': 0.9459087860496311}\n", + "*** precision BEST 3 ***\n", + " i: 0\n", + " p: {'bf_params': {'n_jobs': -1, 'replacement': True, 'bootstrap': False, 'sampling_strategy': 0.8, 'n_estimators': 200, 'max_features': 1, 'criterion': 'entropy', 'max_depth': 10, 'class_weight': 'balanced'}}\n", + " m: {'tp': 24, 'tn': 29418, 'fp': 184, 'fn': 194, 'tnr': 0.9937842037700155, 'tpr': 0.11009174311926606, 'fpr': 0.00621579622998446, 'g_mean': 0.33076794777824664, 'precision': 0.11538461538461539, 'f_measure': 0.11267605633802817, 'score': 0.9873239436619718}\n", + " i: 1\n", + " p: {'bf_params': {'n_jobs': -1, 'replacement': True, 'bootstrap': False, 'sampling_strategy': 'auto', 'n_estimators': 200, 'max_features': 1, 'criterion': 'entropy', 'max_depth': 10, 'class_weight': 'balanced_subsample'}}\n", + " m: {'tp': 24, 'tn': 29412, 'fp': 190, 'fn': 194, 'tnr': 0.993581514762516, 'tpr': 0.11009174311926606, 'fpr': 0.006418485237483954, 'g_mean': 0.3307342148784824, 'precision': 0.11214953271028037, 'f_measure': 0.1111111111111111, 'score': 0.9871227364185111}\n", + " i: 2\n", + " p: {'bf_params': {'n_jobs': -1, 'replacement': True, 'bootstrap': False, 'sampling_strategy': 'not minority', 'n_estimators': 100, 'max_features': 1, 'criterion': 'entropy', 'max_depth': 10, 'class_weight': 'balanced'}}\n", + " m: {'tp': 24, 'tn': 29404, 'fp': 198, 'fn': 194, 'tnr': 0.9933112627525167, 'tpr': 0.11009174311926606, 'fpr': 0.006688737247483278, 'g_mean': 0.33068923232609776, 'precision': 0.10810810810810811, 'f_measure': 0.10909090909090909, 'score': 0.9868544600938968}\n", + "*** f_measure BEST 3 ***\n", + " i: 0\n", + " p: {'bf_params': {'n_jobs': -1, 'replacement': True, 'bootstrap': False, 'sampling_strategy': 0.8, 'n_estimators': 200, 'max_features': 1, 'criterion': 'entropy', 'max_depth': 10, 'class_weight': 'balanced'}}\n", + " m: {'tp': 24, 'tn': 29418, 'fp': 184, 'fn': 194, 'tnr': 0.9937842037700155, 'tpr': 0.11009174311926606, 'fpr': 0.00621579622998446, 'g_mean': 0.33076794777824664, 'precision': 0.11538461538461539, 'f_measure': 0.11267605633802817, 'score': 0.9873239436619718}\n", + " i: 1\n", + " p: {'bf_params': {'n_jobs': -1, 'replacement': True, 'bootstrap': False, 'sampling_strategy': 'majority', 'n_estimators': 50, 'max_features': 2, 'criterion': 'gini', 'max_depth': 10, 'class_weight': 'balanced'}}\n", + " m: {'tp': 31, 'tn': 29293, 'fp': 309, 'fn': 187, 'tnr': 0.9895615161137761, 'tpr': 0.14220183486238533, 'fpr': 0.010438483886223903, 'g_mean': 0.3751232641420455, 'precision': 0.09117647058823529, 'f_measure': 0.11111111111111112, 'score': 0.9833668678739101}\n", + " i: 2\n", + " p: {'bf_params': {'n_jobs': -1, 'replacement': True, 'bootstrap': False, 'sampling_strategy': 'auto', 'n_estimators': 200, 'max_features': 1, 'criterion': 'entropy', 'max_depth': 10, 'class_weight': 'balanced_subsample'}}\n", + " m: {'tp': 24, 'tn': 29412, 'fp': 190, 'fn': 194, 'tnr': 0.993581514762516, 'tpr': 0.11009174311926606, 'fpr': 0.006418485237483954, 'g_mean': 0.3307342148784824, 'precision': 0.11214953271028037, 'f_measure': 0.1111111111111111, 'score': 0.9871227364185111}\n", + "*** score BEST 3 ***\n", + " i: 0\n", + " p: {'bf_params': {'n_jobs': -1, 'replacement': True, 'bootstrap': False, 'sampling_strategy': 0.8, 'n_estimators': 200, 'max_features': 1, 'criterion': 'entropy', 'max_depth': 10, 'class_weight': 'balanced'}}\n", + " m: {'tp': 24, 'tn': 29418, 'fp': 184, 'fn': 194, 'tnr': 0.9937842037700155, 'tpr': 0.11009174311926606, 'fpr': 0.00621579622998446, 'g_mean': 0.33076794777824664, 'precision': 0.11538461538461539, 'f_measure': 0.11267605633802817, 'score': 0.9873239436619718}\n", + " i: 1\n", + " p: {'bf_params': {'n_jobs': -1, 'replacement': True, 'bootstrap': False, 'sampling_strategy': 0.8, 'n_estimators': 200, 'max_features': 1, 'criterion': 'entropy', 'max_depth': 10, 'class_weight': 'balanced_subsample'}}\n", + " m: {'tp': 22, 'tn': 29415, 'fp': 187, 'fn': 196, 'tnr': 0.9936828592662658, 'tpr': 0.10091743119266056, 'fpr': 0.006317140733734207, 'g_mean': 0.31667005159523626, 'precision': 0.10526315789473684, 'f_measure': 0.10304449648711943, 'score': 0.9871562709590879}\n", + " i: 2\n", + " p: {'bf_params': {'n_jobs': -1, 'replacement': True, 'bootstrap': False, 'sampling_strategy': 'auto', 'n_estimators': 200, 'max_features': 1, 'criterion': 'entropy', 'max_depth': 10, 'class_weight': 'balanced_subsample'}}\n", + " m: {'tp': 24, 'tn': 29412, 'fp': 190, 'fn': 194, 'tnr': 0.993581514762516, 'tpr': 0.11009174311926606, 'fpr': 0.006418485237483954, 'g_mean': 0.3307342148784824, 'precision': 0.11214953271028037, 'f_measure': 0.1111111111111111, 'score': 0.9871227364185111}\n", + "1688\n" + ] + }, + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAjAAAAGzCAYAAAAxPS2EAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjguMywgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/H5lhTAAAACXBIWXMAAA9hAAAPYQGoP6dpAACxrklEQVR4nOzdd3xUVdrA8d+909J7SEgIvSO9iYpYEBQr9q64dllXWdeVXey9YV/ra8NesWNBQRFEuvReQ3pv0+497x+TTDIkgfTG893PrMydc889d1LmyTnnOUdTSimEEEIIIdoRvbUbIIQQQghRXxLACCGEEKLdkQBGCCGEEO2OBDBCCCGEaHckgBFCCCFEuyMBjBBCCCHaHQlghBBCCNHuSAAjhBBCiHZHAhghhBBCtDsSwAghhBCi3ZEARhz2NE2r02PBggXs2rUr4JjFYqFr165MnTqV1atXH7TeiIgIJkyYwDfffNM6N9qMjjvuuFrft02bNgGwYMGCgOM2m42ePXty+eWXs2PHDn9dB77Huq4TExPDKaecwpIlS1rrFoUQbYy1tRsgRGubM2dOwPO3336bH3/8sdrxAQMGUFZWBsBFF13ElClTMAyDjRs38uKLL/Ldd9/xxx9/MGzYMP85J510EpdffjlKKXbv3s2LL77I6aefznfffcfkyZOb/d5aUpcuXXj44YerHU9KSgp4fvPNNzN69Gg8Hg8rV67klVde4ZtvvmHt2rUBZau+x1u2bOF///sfxx9/PMuWLWPw4MHNfj9CiDZOCSEC3HTTTaq2H42dO3cqQD3++OMBx7/88ksFqGuvvdZ/DFA33XRTQLkNGzYoQJ1yyilN3/BmZBiGKisrq/X1CRMmqEGDBh20jl9++UUB6uOPPw44/uyzzypAPfTQQ0qp2t/j7777TgHqhhtuaOBdCCE6EhlCEqIJnHDCCQDs3LnzoOUGDBhAXFwc27dvr1O9mZmZ/O1vfyMhIYGgoCCGDh3KW2+95X/d4/EQExPDtGnTqp1bWFhIUFAQt912m/+Yy+Xi7rvvpnfv3jgcDlJSUrj99ttxuVwB52qaxvTp03n33XcZNGgQDoeDefPm1anN9VXX9278+PEAdX7vhBAdmwwhCdEEKj5UY2NjD1quoKCAvLw8evXqdcg6y8rKOO6449i2bRvTp0+nR48efPzxx1x55ZXk5+fzj3/8A5vNxtSpU/nss894+eWXsdvt/vPnzp2Ly+XiwgsvBMA0Tc444wwWLVrEtddey4ABA1i7di1PPfUUW7ZsYe7cuQHX//nnn/noo4+YPn06cXFxdO/e/aDtNQyD7OzsgGNBQUGEhYUd9Ly6vne7du0CIDo6+qDlhBCHBwlghGiA0tJSsrOzMQyDTZs2ceuttwJw3nnnBZRzOp1kZ2ejlGLPnj3MmjULwzA499xzD3mNV155hY0bN/LOO+9wySWXAHD99dczYcIEZs2axVVXXUV4eDgXXHABr7/+Oj/88AOnnXaa//wPP/yQnj17MmrUKADee+89fvrpJxYuXMgxxxzjL3fEEUdw/fXXs3jxYo466ij/8c2bN7N27VoGDhxYp/dk06ZNxMfHBxy74oorePPNNwOOFRUVkZ2djcfjYdWqVfzjH/9A0zTOOeecgHJV3+OtW7cyY8YMgDq9d0KIw0Brj2EJ0dbUZQ7MgY+IiAj16KOPBpStqZzNZlO33367MgzjkO2YNGmSSkxMrFb2/fffV4D66quvlFJKeTweFRcXpy699FJ/mdzcXGWz2dTMmTP9x8444ww1aNAglZWVFfDYsmWLAtQDDzwQ0Pbjjz/+0G9WuQkTJqju3burH3/8MeCxfv16f5mKOTAHPuLj49Xbb7/tL1fbexwWFqaefPLJOrdJCNGxSQ+MEA1w7bXXct5556HrOlFRUf55Igc688wzmT59Om63m2XLlvHQQw9RWlqKrh96+tnu3bvp06dPtbIDBgzwvw5gtVo555xzeO+993C5XDgcDj777DM8Hg8XXHCB/7ytW7eycePGar0kFTIzMwOe9+jR45BtrCo0NJSJEycestxdd93F+PHjsVgsxMXFMWDAAKzW6r+KKt5jp9PJzz//zLPPPothGPVqkxCi45IARogG6NOnT50+rLt06eIvN2XKFOLi4pg+fTrHH388Z599dpO158ILL+Tll1/mu+++46yzzuKjjz6if//+DB061F/GNE0GDx7M7Nmza6wjJSUl4HlwcHCTta+qwYMH1+m9q/oen3baaVgsFu644w6OP/54/7CYEOLwJVlIQrSg6667jl69ejFr1iyUUgct261bN7Zu3YppmgHHKxaG69atm//YscceS+fOnfnwww/Jzs7m559/Duh9AejVqxe5ubmceOKJTJw4sdqjX79+TXSXzeO///0v4eHhzJo1q7WbIoRoAySAEaIFWa1W/vnPf7Jx40a++OKLg5adMmUK6enpfPjhh/5jXq+X5557jrCwMCZMmOA/rus65557Ll999RVz5szB6/VWC2DOP/98UlNTefXVV6tdq6ysjJKSkkbeXfOKioriuuuu4/vvv6+26rEQ4vAjAYwQLezKK68kLi6ORx999KDlKlKdr7zySm677Taef/55Jk6cyO+//84DDzxAeHh4QPkLLriAkpIS7r77bgYPHuyfK1PhsssuY8qUKVx//fVcdNFFPP/88zzzzDPccMMNdOnShY0bNzb5vTa1f/zjH9jtdh555JHWbooQopVJACNECwsODmb69On88ccfLFiw4KDlFixYwCWXXMJbb73FP//5T3Jzc3njjTf4xz/+Ua38UUcdRUpKCkVFRdV6X8DXSzN37lweeeQR1q5dy2233ca9997LsmXL+Mc//kHfvn2b8jabRVJSEhdffDGffPKJLGgnxGFOU4caiBdCCCGEaGOkB0YIIYQQ7Y4EMEIIIYRodySAEUIIIUS7IwGMEEIIIdodCWCEEEII0e5IACOEEEKIdqdD7IVkmib79+8nPDwcTdNauzlCCCHaMKUURUVFJCUl1Wlj1YZyOp243e4mqctutxMUFNQkdXUUHSKA2b9/f7WN6IQQQoiD2bt3L126dGmWup1OJz26hZGe2TQ7qCcmJrJz504JYqroEAFMxZLqe/fuJSIiopVbI4QQoi0rLCwkJSWl2nYcTcntdpOeabBzRTciwhvXy1NYZNJj5G7cbrcEMFV0iACmYtgoIiJCAhghhBB10hJTDiLC9UYHMKJmDXpXX3jhBbp3705QUBBjx47lzz//rLXsq6++yvjx44mOjiY6OpqJEydWK3/llVeiaVrA4+STT25I04QQQog2w1BmkzxEdfUOYD788ENmzJjB3XffzcqVKxk6dCiTJ08mMzOzxvILFizgoosu4pdffmHJkiWkpKQwadIkUlNTA8qdfPLJpKWl+R/vv/9+w+5ICCGEaCNMVJM8RHX1DmBmz57NNddcw7Rp0xg4cCAvvfQSISEhvP766zWWf/fdd7nxxhsZNmwY/fv357XXXsM0TebPnx9QzuFwkJiY6H9ER0c37I6EEEKINsJsov+J6uoVwLjdblasWMHEiRMrK9B1Jk6cyJIlS+pUR2lpKR6Ph5iYmIDjCxYsoFOnTvTr148bbriBnJycWutwuVwUFhYGPIQQQghx+KhXAJOdnY1hGCQkJAQcT0hIID09vU51/Pvf/yYpKSkgCDr55JN5++23mT9/Po8++igLFy7klFNOwTBqTj97+OGHiYyM9D8khVoIIURbZCjVJA9RXYtmIT3yyCN88MEHLFiwICAV7MILL/T/e/DgwQwZMoRevXqxYMECTjzxxGr1zJw5kxkzZvifV6TECSGEEG1JU8xhkTkwNatXD0xcXBwWi4WMjIyA4xkZGSQmJh703CeeeIJHHnmEH374gSFDhhy0bM+ePYmLi2Pbtm01vu5wOPwp05I6LYQQQhx+6hXA2O12Ro4cGTABt2JC7rhx42o977HHHuP+++9n3rx5jBo16pDX2bdvHzk5OXTu3Lk+zRNCCCHaFBOF0ciH9MDUrN5ZSDNmzODVV1/lrbfeYuPGjdxwww2UlJQwbdo0AC6//HJmzpzpL//oo49y55138vrrr9O9e3fS09NJT0+nuLgYgOLiYv71r3/xxx9/sGvXLubPn8+ZZ55J7969mTx5chPdphBCCNHyJI26+dR7DswFF1xAVlYWd911F+np6QwbNox58+b5J/bu2bMnYHOsF198EbfbzbnnnhtQz913380999yDxWLhr7/+4q233iI/P5+kpCQmTZrE/fffj8PhaOTtCSGEEKIj0pRq/9ObCwsLiYyMpKCgQObDCCFEO1NW7GTLyp3Yg+30HdEDi6V5l95vic+Mimts2ZhAeCO3EigqMuk7IKNe7X3hhRd4/PHHSU9PZ+jQoTz33HOMGTOmxrIej4eHH36Yt956i9TUVPr168ejjz4asCJ+UVERd955J59//jmZmZkMHz6cZ555htGjRzfq3hqjQ+yFJIQQon1K3Z7B7ac+Sk5aPgBDjunHA5/OwB5ka92GNRGz/NHYOuqjYsX8l156ibFjx/L0008zefJkNm/eTKdOnaqVnzVrFu+88w6vvvoq/fv35/vvv2fq1KksXryY4cOHA3D11Vezbt065syZQ1JSEu+88w4TJ05kw4YNJCcnN/IOG0Z6YIQQQrSaf5/+GGt/34Jp+D6mNV3jillnc+E/T222a7ZkD8ymJuqB6V+PHpixY8cyevRonn/+ecCXbJOSksLf//537rjjjmrlk5KS+O9//8tNN93kP3bOOecQHBzMO++8Q1lZGeHh4XzxxRecemrl12XkyJGccsopPPDAA426v4aSHhghhBCtZu+WNH/wAqBrGvu21W1h1PagIpOosXUA1Vaddzgc1eaKVqyYXzWZ5lAr5rtcroC12QCCg4NZtGgRAF6vF8MwDlqmNcge30IIIVpN94Fd0KvMeTFNRfcBrTMk0RwM1TQPgJSUlIBV6B9++OFq12vIivmTJ09m9uzZbN26FdM0+fHHH/nss89IS0sDIDw8nHHjxnH//fezf/9+DMPgnXfeYcmSJf4yrUECGCGEEK3mH89cQaculXvjjZ40mDOvn3iQM9oXs4keAHv37qWgoMD/qNrL0hjPPPMMffr0oX///tjtdqZPn860adMCMornzJmDUork5GQcDgfPPvssF110UUCZliZDSEIIIVpNQtc4XvnzQXau34sj2E63AclomtbazWqT6rLyfENWzI+Pj2fu3Lk4nU5ycnJISkrijjvuoGfPnv4yvXr1YuHChZSUlFBYWEjnzp254IILAsq0NOmBEUII0arsQTb6jexJ94FdOlzwYqJhNPJhUvf3pKEr5gMEBQWRnJyM1+vl008/5cwzz6xWJjQ0lM6dO5OXl8f3339fY5mWIj0wQgghRDMxle/R2DrqY8aMGVxxxRWMGjWKMWPG8PTTT1dbMT85Odk/h2bp0qWkpqYybNgwUlNTueeeezBNk9tvv91f5/fff49Sin79+rFt2zb+9a9/0b9/f3+drUECGCGEEKIDqe+K+U6nk1mzZrFjxw7CwsKYMmUKc+bMISoqyl+mYs7Nvn37iImJ4ZxzzuHBBx/EZmu99XpkHRghhBCHlZZcB2bp+kTCGrkOTHGRydhB6fIZdwDpgRFCCCGaScU8lsbWIaqTSbxCCCGEaHekB0YIIYRoJqbSMFXjelAae35HJQGMEEII0UxkCKn5yBCSEEIIIdod6YERQgghmomBjtHIvgKjidrS0UgAI4QQQjQT1QRzYJTMgamRBDBCCCFEM5E5MM1H5sAIIYQQot2RHhghhBCimRhKx1CNnAPT7tfLbx4SwAghhBDNxETDbORgh4lEMDWRISQhhBBCtDvSAyOEEEI0E5nE23wkgBFCCCGaSdPMgZEhpJrIEJIQQggh2h3pgRFCCCGaiW8SbyM3c5QhpBpJACOEEEI0E7MJthKQLKSayRCSEEIIIdod6YERQgghmolM4m0+EsAIIYQQzcREl4XsmokEMEIIIUQzMZSG0cjdpBt7fkclc2CEEEII0e5ID4wQQgjRTIwmyEIyZAipRhLACCGEEM3EVDpmIyfxmjKJt0YyhCSEEEKIdkd6YIQQQohmIkNIzUcCGCGEEKKZmDQ+i8hsmqZ0ODKEJIQQQoh2R3pghBBCiGbSNAvZSV9DTSSAEUIIIZpJ02wlIAFMTeRdEUIIIUS7Iz0wQgghRDMx0TBp7CRe2UqgJhLACCGEEM1EhpCajwQwQgghRDNpmnVgJICpiQQwQgjRAaz4cwcvP/MD+XmljBjTg7//awqhoY7WbpYQzUYCGCGEaOd27chk1oz3MU2FUooFP66ntNjFfU9c2NpNO+yZSsNs7EJ2jTy/o5IARggh2rk/F29DKV/wAmCaiqWLt+H1GlitllZu3eHNbIIhJFkHpmbyrgghRDsXFGTzBy8VrFYdXZdf8aLjku9uIYRo546fdATxnSLQdQ2Lxfdr/ZKrxqPrMvTQ2kylN8lDVCdDSEII0c6FRwTz/BtX8/lHf1KQV8qwUd2ZcOLA1m6WAAw0jEau49LY8zsqCWCEEKIDiIoOZdp1x7d2M4RoMRLACCGEEM2kKYaAZAipZhLACCGEEM3EoPFDQEbTNKXDkbBOCCGEEO2O9MAIIYQQzUSGkJqPBDBCCCFEM5HNHJuPBDBCCNHOuN1edu3MwuGw0bVbLJomabZtlULDbOQcGCVp1DWSAEYIIdqRjPQCbrvlHdL25wNw1DF9ueu+s2XLAHHYaVC/1AsvvED37t0JCgpi7Nix/Pnnn7WWffXVVxk/fjzR0dFER0czceLEauWVUtx111107tyZ4OBgJk6cyNatWxvSNCGE6NBmP/4tGRkF/udLft/C3M+Wt2KLxMFUDCE19iGqq/e78uGHHzJjxgzuvvtuVq5cydChQ5k8eTKZmZk1ll+wYAEXXXQRv/zyC0uWLCElJYVJkyaRmprqL/PYY4/x7LPP8tJLL7F06VJCQ0OZPHkyTqez4XcmhBAd0I5tGZhG5b5Huq6zc0fNv39F66vYjbqxD1FdvQOY2bNnc8011zBt2jQGDhzISy+9REhICK+//nqN5d99911uvPFGhg0bRv/+/XnttdcwTZP58+cDvt6Xp59+mlmzZnHmmWcyZMgQ3n77bfbv38/cuXMbdXNCCNHRpHSLDdjjyDQVXbrEtmKLhGgd9Qpg3G43K1asYOLEiZUV6DoTJ05kyZIldaqjtLQUj8dDTEwMADt37iQ9PT2gzsjISMaOHVtrnS6Xi8LCwoCHEEIcDm69bQpRUSH+54OHpnDOeWNasUXiYAz0JnmI6uo1iTc7OxvDMEhISAg4npCQwKZNm+pUx7///W+SkpL8AUt6erq/jgPrrHjtQA8//DD33ntvfZouhBAdQkrXWN549wY2bdxPkMNG/4FJ/h2oRdvTFENAMoRUsxbNQnrkkUf44IMPWLBgAUFBQQ2uZ+bMmcyYMcP/vLCwkJSUlKZoohBCNNiXP/7Fe18sw+s1OPWEI7ji3HEBwz1NJTTUwchRPZq8XiHak3qF7XFxcVgsFjIyMgKOZ2RkkJiYeNBzn3jiCR555BF++OEHhgwZ4j9ecV596nQ4HERERAQ8hBCiNf28eDOPvfQD+9LySM8q5P8+XMy7c2vP0BSHBxO9SR71VZ9sYY/Hw3333UevXr0ICgpi6NChzJs3L6CMYRjceeed9OjRg+DgYHr16sX999+PUqqWWptfvd4Vu93OyJEj/RNwAf+E3HHjxtV63mOPPcb999/PvHnzGDVqVMBrPXr0IDExMaDOwsJCli5detA6hRCiLVmwZAsHrif3428bW6cxos0wlNYkj/qob7bwrFmzePnll3nuuefYsGED119/PVOnTmXVqlX+Mo8++igvvvgizz//PBs3buTRRx/lscce47nnnmvU+9MY9Q7rZsyYwauvvspbb73Fxo0bueGGGygpKWHatGkAXH755cycOdNf/tFHH+XOO+/k9ddfp3v37qSnp5Oenk5xcTEAmqZxyy238MADD/Dll1+ydu1aLr/8cpKSkjjrrLOa5i6FEKKZOezWgBVxNQ2CHLZWbJE4XNU3W3jOnDn85z//YcqUKfTs2ZMbbriBKVOm8OSTT/rLLF68mDPPPJNTTz2V7t27c+655zJp0qSD9uw0t3rPgbngggvIysrirrvuIj09nWHDhjFv3jz/JNw9e/ag65Vx0Ysvvojb7ebcc88NqOfuu+/mnnvuAeD222+npKSEa6+9lvz8fI455hjmzZvXqHkyQgjRks47dQQ//b4JDRMAw1Rcfs7YVm6VaG1NOYn3wIxbh8OBw+EIOFaRLVy1I+FQ2cIul6va521wcDCLFi3yPz/qqKN45ZVX2LJlC3379mXNmjUsWrSI2bNnN+reGkNTrTmA1UQKCwuJjIykoKBA5sMIIVrNtl1ZfPnjGryGyUnjBzB8kCQXtEUt8ZlRcY1rF56HPaxxPXHuYg+vTPi42vGqHQEV9u/fT3JyMosXLw6YhnH77bezcOFCli5dWq2eiy++mDVr1jB37lx69erF/PnzOfPMMzEMA5fLBfimi/znP//hsccew2KxYBgGDz74YECg1NJkLyQhhGgivbvHM+OaiYcuKA4bBhpGIzdjrDh/7969AQHXgb0vDfXMM89wzTXX0L9/fzRNo1evXkybNi1gyOmjjz7i3Xff5b333mPQoEGsXr2aW265haSkJK644oomaUd9SQAjhBBCtAN1ybptSLZwfHw8c+fOxel0kpOTQ1JSEnfccQc9e/b0l/nXv/7FHXfcwYUXXgjA4MGD2b17Nw8//HCrBTCy+pEQQgjRTEzVFPsh1f16Dc0WBggKCiI5ORmv18unn37KmWee6X+ttLQ0YH4rgMViwTTNujeuiUkPjBBCCNFMTKVjNnI36fqeP2PGDK644gpGjRrFmDFjePrpp6tlCycnJ/Pwww8DsHTpUlJTUxk2bBipqancc889mKbJ7bff7q/z9NNP58EHH6Rr164MGjSIVatWMXv2bK666qpG3VtjSAAjhBBCdCD1zRZ2Op3MmjWLHTt2EBYWxpQpU5gzZw5RUVH+Ms899xx33nknN954I5mZmSQlJXHddddx1113tfTt+UkWkhBCiMNKS2YhXfbLRdjD7I2qy13sZs7x78tn3AGkB0YIIRrBMEx2p+Zgseh0TYoJWMxOiIaspFtTHaI6CWCEEKKBCorKuOW+j9my07dE+6jBXXn0jqmyAq8QLUCykIQQooGee3MB23Zn+Z+vXLeXtz79oxVbJNqaikm8jX2I6qQHRgghGmjLzgzMKjmuplJs3ZV1kDPE4cakCbYSaORCeB2VhHVCCNFAXZNjsOiVHy66rtGlc1TrNUiIw4gEMEII0UDTLz+O+Nhw//PuXWK56ryjWrFFoq1RaL5emEY8lPTA1EiGkIQQooES4yOYM/tK1m5OxaLrDBmQjN0mv1ZFpabcjVoEkp80IZpIakk+96z6ji0FmfSJiOeeEVPoEhrV2s1CKcVba1bxzl+rAbh86HAuGzJM0n2bSEiwnbHDerR2M0Qb1Ror8R4uJIARogk4DQ+XLZxDWlkBhlJkOou4dOHbfDfpBoKtrZtS++H6tdz36y/+5/cs/Jkgq5XzBw1uxVYJIUTjSFgnRBPYkJfOvtJ8jPKFrQ2l2F9awPr8tFZuGXyxeWO1Y19t2dQKLRHi8NP4jRwbPwTVUUkPjBBNwGGp+UfJobf+j1iQ1YoGVCT76uXHhBDNr2IibmPrENVJD4wQTWBAVCJHxndHR/M/xsZ3Y2B0Yms3jatHjELTNCzlD03T+NvwUa3dLCGEaBT5M0yIJqBrGq8ecxGvb1nCtsJsekXEcVXfI7Forf83wtEp3fjgnAv4ZMM6AM4fNJgRnZNauVVCHB4kC6n5SAAjRAMsytjG8pw9xDvCOLvbcIKtNhwWKzcMGN/aTavRqKRkRiUlt3YzhDjsSADTfCSAEaKe3ti6mMfW/YhV0zGUyWd7VvPesVfVOg9GCCFE02v9/m0h2hG3aTB7/XwAvMpEARvy0/hh/4bWbZgQok2SLKTmI38yClEPLsODV5kBxzSg0O1snQYJIdo0GUJqPtIDI0Q9hNuCGBjVGUv5KrYaoGs6o+O7t2q7hBDicCMBjBD19L8jL2R4TAoWTScuKIxnxpxH34hOrd0sIUQbpKAJNnMUNZEhJCHqKSE4gjnHTkMpddjsJ5RWWESxy0X3mGhsFktrN6fVeb0Ge9PzCQ6ykRgX0drNOWxkp+ZQnF9KUu9E7I7W3aKjrmQIqflIACNEAx0OwYupFLO++4mP1/jWkOkaFcmbF51DSlRkK7es9aRlFvCPBz5hX3o+AKceN4iZ109G1zv+90NrUUrx4ow3+fyZbwGI6xLLI9/PotuALq3cskOTAKb5yBCSEKJWn/613h+8AKQWFPLvr79vxRa1vgdf/J60zAL/828WrOfrX9a2Yos6vkWfLfUHLwC5aXk8dPHTrdcg0SZID4wQolYbM7Kw6jpe05d5ZSjFxoysVm5V69q8MwPDrJyVYLXobN11eL8nzW3bqp1YbBYMjwGAaZjsWrunXQzjSg9M85EeGCFErVKiIjHMyrRxXdPoEnV4z/lI7hQVMFxkmIrOnQ7fIbWW0LlnAobX8D/XdI34rnFtPngBWQemOUkAI4So1cUjhjC6a+UWBKF2Ow9PmdSKLWp9M6+fREiQ3f98aP9kzpk8rPUadBg46fIJjDllhP+5I9jOv9/6eyu2SLQFMoQkhKiVw2rlrYvOZdmefZS4PQxP7kxsaEhrN6tV9euZwIfPXsXazfsJCbYzbEAXrBb5W7A5WawW7v/y36z9bSPFeSX0H9uH2M7Rrd2sOlFKQzWyB6Wx53dUEsCIDs9UJu/v/pVv9y/Hplu5pPsETkocXqdzV+fu4akNP5DjLuao+N7cOmASwVb7oU/sQKy6zrjuXQ9aZkNaJo/8sJD0giKGp3RGmbB6XxoJ4WGM6JLEL5t2oGlwyZHDOH/0EP95q3bt58lvfyOnuJSj+3bjn1PGE2xvW+mxqzft43/v/0ZeUSlHDevBDReOJzoihGNH927tph1WdF1n6IRBrd2MeqtYy6WxdYjqJIARHd4Hu3/lxW2VGQz3rnufYIuDY+IHHvS8XcXZXL3kTbymgYliX8ky8tylPD7y/OZucruSVlDEZW9+RJnHi6kUe/IKfKt3KdiXU8CKHan+svd8MR+H1cqZwweyKyuPq179BK9hYirFvj8KyC8p44lLTm29mznAzn053PzQxxiGwlSKT75fTWGxk7tvnNLaTRPisCf9nqLD+y5tRcBzHY2f0lcf8rxf0jf5gxcAE8WP+9fjNY1DnHl4+W3bLkrcHkxVZb3Q8j8YlUm1VUS/Wr0RgJ83bPcHL+Bbc+b7tVvxGiZtxcLl2zBMFdDGH5dsxjRlbVRRNzKJt/lID4zo8Ox64Le5pmnVjtV23oEfU7qmo7eDzIeWZLfWfWVeTQO7zeo/Tx3wDuu61qbeX7vNUi0Cs+o6baiJoo2TOTDNR3pgRId3cffjAF/Pi67paGicnTLukOednHwE0fYQLJqOXt6lcEWvo9A1+bGp6sR+vUiKDMeia/izixXoGmiWig0vNSyahobG5eN8849OGdqPmNCQ8vN8J047dmSbWtF20lH9CQ91BLTxktNHtYv0XSE6Ok0p1e77QgsLC4mMjKSgoICIiMN7jQpRsyXZG/kxfTVWzcLZKUfRP6JuS5CnlxXwxrZF5LlLGBPXk3O6jpQPrxpkF5fw6qJlZBaXMKxLZ5SCNXvT6BQeyuiuXZi/cRsA54w6glHdK9/7tPwiXl+4nLziUsb27sq5Y45oc+9vWlYh7369jMLiMkYd0Y3Tj2t7bRT10xKfGRXXGPXZLVhDHY2qy1viYvnZT8tn3AEkgBHt3sbCnazK20KYNZiJCWMIsQa1dpM6HMM0+XL9JvbmFWDVdQzTJDY0hKlDBhJsq8waSs0r4JHvf6XI5eKMwQM4e0T7yxppDNNU/Pz7Zvak5tA9JZbjj+onwU4b1JIBzMhPb22SAGbFOU/JZ9wBZA6MaNd+zljG45vfQdd0lFJ8tf83nh7+T0IliGkyplLc9OlX/Lx1Bzoapqn8SZ0frlzLh1deSJDNyt68Ak5+7g3/Mvt/7NzLlsxs7jh5Qus1vgUppXjw2e/4YeEGLBYdwzBZftIebr/x8F7473CnmmASrsyBqZkM5ot27eXtnwO+tV4UitSyLH7M+KOVW9WxrNibys9bd4DCn31TniXNxowsvlq3CYD7vvk5YI8ggLeXrmrh1rae7buy+GHhBgCM8kyqr378i937clqzWUJ0WNIDI9otpRQlRlnAMV3TKPKUtlKLOqa8Mmetr+maRoHT93p+aVm11832P0JdZwVFNb9PhcW1v3+i41NAY38MDp+fovqRHhjRbmmaxrCovuhVvo0NZTI0qm8rtqrjGZqUSLDNWi07SMMXRI7t5puUO7F/9ZVp4w6jbQf69uxEWKjDn62k6xqR4UH07BrXyi0TraliJd7GPkR1EsCIdu1f/S9jaFQfdDRCLUHc0udChkTJEu9NKSE8jFfOP4tOYaGgQZDNigZEBgfx5FmnMDgpEYDrjh3DlCMqg8fokCDeveqCVmp1ywsPC+KJu84lsVMEGpCUEMmTd59LaEjjJnAKIWomWUiizTOUSaYzG4fFTow9qtYyOtpBMz6UUuwvy8Wi6SQERR0yO8RrGuwozqLY46RXeCci7TX3JmSWFVHidZMSGo1Vr/1vggJ3GdnOErqERuGw1H30Ns9ZRo6zlJTwyHqd15QKnU4yi0voHB5OqMOOYZpYarnXUpebvXn5JEZGEBnsm0zt9HhJzSsgPjyUiOAgCsqc5BSVEhHsoKDUSVJ0hH8PpKIyF1mFxXSucuxQylwe0vIK6RQZRrDDRmp2IcF2K/FRYQ26X9NU7M8qwGa1EBsVQlpmIcFBNuKi61afYZhYyjd4dLm9pGcWEB0ZQkR4cIPaI5pWS2YhDfn4NiyNDGKNUhd/nfeEfMYdQObAiDYt153PAxueY2/pfgCOiz+S63tfhuWAxeQOfH6gYk8Z/1r9Jn/l7wLgqLj+PDDkUhyWmj8g95fmM23xa6Q7C3wHFNw28BQu63WUv4ypFPet/pb3d/q2KugRFsvrx1xKUkhktfre3rKc+1f+iKEUkfYgXjv2fEbGH3otmhfW/MHjy39FAfHBobw56VyOiEs45HlN6f2Va7jv+18wlCIiyMGL557B6K41t33F7lRufP8LCspcWDSNWVOOp0+nWKa/8yWFTt+xkwb25se123wTgsv/fAp12Hjq0tPJLijmnk9+wmuYvmNXnM64vt0O2r7f1u3k3//3DWVuD1ZdIy48jIy8IgBOHTuAey6fVGuwVZOCojJueeJzNuxIByDEYaOs1I0GnHn8YG7/20mHXGyvInjZsHk//77vMwqKytA1jZv+djznnTGyzm0R7Z+pNLRGZhHJVgI1kyEk0aa9vO1dUkvT/c8XZP3BT+m/1bue/239jnX5u/3Pl2Rv5q2dP9daftbqTyuDFwANHt/wHevyKzcmnLtnjT94AdhTkssdy+dWq2tDXgb3rvgBo7yzs8jt4trfPsZziD2V/kjbw2PlwQtAjrOUa376nJbsNN2cmc09836ubLvTxY2ffInb661W1u01uOn9LylyugAwlOK+b37mhjlzKXJVHpu3bqsvW6nKbZS6PNz81pfc9dGP/r2QSl0ebnnzK0qc7lrbV1jq5PbXvsbp9gDg9Sp/8ALwzdKNfPLrX/W659nvLmDzrozKtjk9/r2dvvhlLV8vXFuneryGycwHPqeoxDeJ11SK5177mY1b0+rVHiFEzSSAEW3a9pLdmFRu7mfRdHaU7Kl3PesL9vg3ZQRQKDYXptZafkNB4GsVMcOmgsoPn/V5aVi1qhOIFevz0znQ+rz0gCwCE0Weq4zMsuKDtnldToZ/CwPwfQDuLymkyFP7B3pT25iRGdB2BRQ4XaQXVW97RmER+WVOqmZSK6DY7QnMwtDgwDmJCt8wU9WsJQWUuj3syy2gNrsz8nB6vLVmaVh0nU17M2s9vybrt6cdkA6uqPgD2GrR2byzbvXl5ZeQV1BabePHbTvq1x7RvinVNA9RnQQwok1LcMQFZBkppejkiK13PV1CYgOGmSyaTlJwTK3lk4KjazkeVVlnaJS/ZwJ8KcXJNQwfpYRGVTtm1y3EOA6eoZMSFhUQdGlAmM1OmM1+0POaUpeo6vdj03Via8guig0LxWapvrGjtabhlhp+IddUTNc0EiJrn3eSEB1ebWPFgNBDKZJi6zdnICUhCktAYzR/paap6Bxft/oiI4Jx2KuP0id2qv6eio6rYjPHxj5EdRLAiDbtml4XE2ypXFW3R2hXTk06sd71TO97KtH2yg/CzkHRXNVrYq3l7xl6Fo4Ddqw+vcswxsX38j+/uOdohsdUzgUJsdh5YMTp1eoa26krF/ce7n+uaxqPjD2VYOvBJ6ie1K03p/fs739u1XWennBqi+7WPLJLEpeMHOp/rmsaD5x6EqH26kFUiN3GA2dODGjfRaOGcP+ZJwUc6xUXU60HRgP+e9YJXHX8qMpjGvz37BOICq194munqDBuO6fKSr8aOGyVQVS/LvFccsKIutyq362XHk9EWOU1NQ208gBmYO9Ezp08vJYzA9ltVu74xykBwdCpEwczatjB5/QIIepGspBEm1fgLmRj0TYcup0jIvtj0xs297zYU8bKvB3omsbImN4EWw7ek5HlLOKntPVkOYs4Mq43o+O6V8tc8pgGf2TtpMTrZmRsV+KDau4tUEqxMjuVtNJCBkYn0DOibr1ISimWpu8lu6yUIfGJdA2PqtN5TUkpxerUNPYXFjEgIZ6esbX3XAHsyM5lU3oWiRHhDE/pjKZp7MzyHescGc7QlM6s2r2fjMJirJqO1zTpkxBL70Tfeilr96STmltA78TKY4eyNTWb7Wk5dO0URefocFZuTSXIbmV0vxTstvp/vxQUl7Fy4z5sVgu9usSycUcGIUF2Rg1KwWqt3st0MPv257F5ewbxsWEMHpAseyO1AS2ZhTTg/X83SRbSxoselc+4A0gAI9qk1Xnr+XTfN5QZTvqG92JfaSYF3iKGRg3gkq5n4jhE8NFYu4tzeHzDt+wtySXE4qDU68FpeAGNCFswl/Qcy1ldh/nLf7JzNU+snU+x10VySBRPjZ3KwOjOzdrGpvT91q28vHQZTq+XswYO4OrRo1q0p6e5eA2T/33xO58tXIvbY9AzKYZ7pk2md7IsLnc4a8kApt97dzRJALP54kfkM+4AkkYt2pzNRdt5ZNPz+Kbawt6y/ZjKtxplalkGBZ4ibu17VbNdv8BdypWLX6XAU4qhlH8CnWn61pnZV5rHf1fNxa5bmNJlMD+kbuI/K77yn7+zOIcLfnmTH0++icSQtv/L5vfdu7npC1/7FfDor79hKMUNY8e0bsOawLOf/sa7P670P9+4O5NpD3/AZw9c2eA1YoSoj6aYhNv+uxmah8yBEW3O4uzl6GgBkzErnikUv2evwHuIFOTGWJazk1x3iX+CrqZVPpSqTKL5cq8vPfezXaur1eEyvSxI39ZsbWxKX27chK4Fvt+frF3Xau1pSl8uXl/tWKnLw5L1u2soLYRoT6QHRrQ5Fs1y0M3LdO3gK+42lvUQi+L5aNjKF0erbU6OrR6Lp7WmmlYPrimbqD2yWmr+GtR2XIim5uuBadzvK+mBqZn8FIs254ROR2PVLei+zQEAUFX+fVrnEw658m5jjI3vRffQOCzlQVLlWgxaee+L7/glPccCcEWfMdW2Wou0BzExqV+ztbEpXTx0KLqmYdE0/7yXq0ePOsRZ7cOVJ4+udiw+KpTxQ3q2QmvE4UjSqJuP9MCINqdLSGceOOLffJM2H6fhon94b/aWpVPgKWZwZD8mJ45v1usHW+y8dfQ1vLp1AfvL8nFoNtymQZHHBWhEO0I5r9tIRsd1B2BUXFfmTLich9f8QLazhP5RCTww8jQi7e1j35tBCZ346OILeXvlalyGl9P69WNy3z6t3awmccnEEYSHOHjvx1WUOF0M7ZXEredPIFw2WBSi3ZMsJNGuGMrgt6yVZLpy6B3WlRHRAw95zuq87awt2EWsPYKTEoc3OA1bNL9Sl5uvV2yk0OliXJ+uDEpJbNbrrdy8jzVbU4mNCOXkcf2x26zkFpTy4x+bcHsNjh3Ri26dA9PG07ML+eWPLQCccGRfEuLkd05705JZSL3mzMQSEnToEw7CKHWy/bKH5TPuAA36Tf7CCy/w+OOPk56eztChQ3nuuecYM6bmjIX169dz1113sWLFCnbv3s1TTz3FLbfcElDmnnvu4d577w041q9fPzZt2tSQ5okOylQmD214leV569DRMTG5qOupXNj1lFrP+WTvIp7d8gUWTcdQJt/uX8bTI67DqneMOR4dSbHTxSXPfsDOzFw0TeO57xbz6CWncPKw5hmK+2j+ah5/52csuoZhKr74bR33Xn0yV9/3AflFZWjAy58s5oWZ5zK0bzIAO/Zmc+1/38fp8u299PrHS3jlwYvp0aX+q0OLw0NTDAHJEFLN6j2R4MMPP2TGjBncfffdrFy5kqFDhzJ58mQyM2ve36O0tJSePXvyyCOPkJhY+19TgwYNIi0tzf9YtGhRfZsmOri/8jezPM+XHVOxP9L7e76hyFNSY3mP6eWFrb70YEP5yv9VsJPfsjpGhk1H89mf69mZlYfCt++TqRSPfrGgWa7l9Ro8/cFCAP++R39t289jb8+nsLgMVX59wzB5/oPKzUNf+2gxTrfH374yl4f/+3hxs7RRCHFw9Q5gZs+ezTXXXMO0adMYOHAgL730EiEhIbz++us1lh89ejSPP/44F154IQ5H7ePOVquVxMRE/yMuThaaEoEKvTUHKsXe0hqPlxouf+BSQQPyawl4ROvKLynzT5z2Hyt1Nsu1ytwePN7AVHxNg7yisoCMD1Mpcgsrv7/yCgM3ZzRNRW5+zd9/QgC+xZWa4lFPL7zwAt27dycoKIixY8fy559/1lrW4/Fw33330atXL4KCghg6dCjz5s0LKNO9u28l8gMfN910U/0b10TqFcC43W5WrFjBxImVe8jous7EiRNZsmRJoxqydetWkpKS6NmzJ5dccgl79tS+47DL5aKwsDDgITq+fuHdsWlWfxaQjk68I5p4R81L20dYQ+gRmhCQsaShMSSqR4u0V9TPmN4peM0qO4/rGmN7pzTLtcKCHfTpEhewT5GGxjFDewTsiK1rGkcO7l7ZxsHdAjLONGDMUNnbSBxEU2Qg1XMIqb4jJbNmzeLll1/mueeeY8OGDVx//fVMnTqVVatW+cssW7YsYJTkxx9/BOC8885r+HvTSPUKYLKzszEMg4SEhIDjCQkJpKenN7gRY8eO5c0332TevHm8+OKL7Ny5k/Hjx1NUVFRj+YcffpjIyEj/IyWleX7JibYlISiOmQOuIcIWCkBScCfuHnRTrfNZNE3j4aFX0SvMt6R/uDWYu4+4xP9ctC1H9unKf6eeQLDdigaM7JHMQxed3CzX0jSNJ/9xFn26xgMQFuLg/uumcO3ZR3HlGWOwWXV0TeOEMX34+4WVWW+XTR3LmScNwaJrWHSNs04ayqVntv8Vi0XzqVyGoXGP+qjvSMmcOXP4z3/+w5QpU+jZsyc33HADU6ZM4cknn/SXiY+PDxgl+frrr+nVqxcTJkyosc6W0CbSMU45pXIS5pAhQxg7dizdunXjo48+4m9/+1u18jNnzmTGjBn+54WFhRLEdHBe0yDLlUv/iJ68PfYRPKb3kNlESilsmoWHh0wj0haCTbcecgG8bFcRHtMgMSjyoGUznUUYpklicIS/XKnXTZazmITgcIIsB99puq0pcDopcDpJioiocWG7lnLh0UO54KgheE2z2RfT6xwXwZy7L8XjNbBadP/X8YbzjuG6c47GVKragndWi87t15zEP//m2xHd0k4WKxQdw4GjDQ6Ho9rUjIqRkpkzZ/qPHWqkxOVyERQUmCkVHBxc61xUt9vNO++8w4wZM1p1c9J6BTBxcXFYLBYyMjICjmdkZBx0gm59RUVF0bdvX7Ztq3kp9pq+aKLj2lWSyv0b/keuOx8Njcu7n8VZyRMPeo7TcHP32rdZmuPLZBsd05f7hlxBsKXm7xuPaXDn6o/5Id03wXdodFeeGXUZEbbAtVzcpsG/ln3KD/s3AjAqthv/G3chv2fs4F/LvsBleAm12nn2yHMZn9irsbfeIp5f8gdP/74YBSRHRPD6OVPpHdt6WTWaprXoSsC2GnaX1nUNvdryhJUkcBF11ZRZSAf+oX733Xdzzz33BBw72EhJbZm9kydPZvbs2Rx77LH06tWL+fPn89lnn2EYNW/ZMnfuXPLz87nyyisbdkNNpF4/hXa7nZEjRzJ//nz/MdM0mT9/PuPGjWuyRhUXF7N9+3Y6d5au/sOdUoqHN75Mvtv3l4dC8dauz9lQcPB9ht7c8QPLcjb7n6/I3cobO76vtfycHYv4Mb0yO2ld/l6e3PBttXKvbVnEj+XBC8DK3D3cu+obZiz9HJfhBXw9MdOXfEyBu6xuN9mKFu3azVPlwQtAelGRf2NHIUQTqJjD0tgHsHfvXgoKCvyPqr0sjfHMM8/Qp08f+vfvj91uZ/r06UybNg29lkD9//7v/zjllFNISkpqkus3VL3/jJgxYwavvvoqb731Fhs3buSGG26gpKSEadOmAXD55ZcHvKlut5vVq1ezevVq3G43qamprF69OqB35bbbbmPhwoXs2rWLxYsXM3XqVCwWCxdddFET3KJoz0oNJ5muHH/aNPgmW24rrn2SN8CGwt2YVabumyg2FNR+zvqC1IDnhlKszd9brdy6vP0BCQGmUqzK3Yu3SraTAsoMD7uKcg/axrbgr/T0gMwfQym25ebi8npbsVVCiJpEREQEPGoaiWjISEl8fDxz586lpKSE3bt3s2nTJsLCwujZs/qWG7t37+ann37i6quvbpqbaoR6BzAXXHABTzzxBHfddRfDhg1j9erVzJs3z99dtWfPHtLS0vzl9+/fz/Dhwxk+fDhpaWk88cQTDB8+PODm9+3bx0UXXUS/fv04//zziY2N5Y8//iA+Pr4JblG0Z8EWB8GWwLFZhSLeEX3Q8zoHx6JX+fbWNZ3OQTVnK/nKR/n3AQKwaBpJIdWvkRQSGfCBb9E0uoRWL6cBCSHhB21jW5AcEeHfdRt87Y4ODsLeQTZzFKK1tfQk3saMlAQFBZGcnIzX6+XTTz/lzDPPrFbmjTfeoFOnTpx66ql1b1QzadAk3unTpzN9+vQaX1uwYEHA8+7du3Oo3Qo++OCDhjRDHAZ0TefmPpfxxOb/86/pcmTsMMbGDj3oeX/reTKrcreR6coHIMYezjW9p9RevvcEFmVuZk9pDgDhtmBuG1C9/I39J/Bbxjb2lOQBEGUP4d7hp/H5rr94cVPlhLfbB08kMbjtL/l9av9+fLVpE7/s2An4dqZ+/OSTW3VinhAdSgPXcalWRz3MmDGDK664glGjRjFmzBiefvrpaiMlycnJPPzwwwAsXbqU1NRUhg0bRmpqKvfccw+maXL77bcH1GuaJm+88QZXXHEFVmvr5wC1fguEOIQjY4fx7PA72Vq0iyh7BIMj+6IfYjfqTkFRvHHkbf55MKNi+xJmrX1zxWh7KO8fcxNLsrfhVQajY3sSbQ+tVi7GEcpnJ1zP7xnbMZTJkfE9iHaEcOsRx3NC577sLM6hT0Q8g6Lbx/wtq67z8llnsnjPHnJLyxie1JmuUVGt3SwhRCNccMEFZGVlcdddd5Gens6wYcOqjZRUnd/idDqZNWsWO3bsICwsjClTpjBnzhyiDvhd8NNPP7Fnzx6uuuqqRrXP6XRWy3pqCNnMUQBgKoNl2XPYWbyYIEs4Y+KuJClkcLNca0n2IhZk/QzAcfEnMC7uGAC2Fe/g471zKfQWMzxqMGcnn45Vt+Iy3Ly7+0v+KthCrD2Sy7qfRffQ5ENeZ23+Tt7Y8T2FnlKOjh/EZd0n1nsPpExnIY+v+57tRVn0i0zgtkGTiXWEsSk/ndnrfyajrIhxnXpwy6Dj23zq9L2//MzHG9ajFJzSpzd3H3cCj/z6K6v2p9E1MpI7JhxL9+jK4bBNmVk8/ssiMouLObJbCv+ccAxBNt/fPLty8nj0p19JzS9keJfO/GvieMIcDoqdLh7/8TdW700jOSqC2ycfS/fYgw/3NVRGXhFPfPYruzJy6Z8Sz4ypE4gOqzlI3bgrgxc+X0ROYSnjBnXj+jOPwm6Tv98OVy25mWPXV+5Cb+Rmjmapkz3X3teuP+NM0+TBBx/kpZdeIiMjgy1bttCzZ0/uvPNOunfvXuOSKYciP8ECgEWZL/JX3ueAQkNj7p5/cn73l4gLqj6JqzGW5izhjV2v+p/vLNmOrumkhPTkgQ2P41UGCsXe0n0UeYr5W8/LeGbr2/yRs7r8eBob1z7Js8PvJO4g82B2FKdx68qXMJWJiWJ78X6KPWX8vd9ZdW6ry/Aw7fc3SC3Nx1AmO4oz2ZifxnNjLuGSX9+kzPDtibO1MJP0skKeHntuY96aZvXwb7/y1prV/uefbdzIr7t2k1dShqkU23JyWJmWxg9XXkFUcDBphUVcOOdDyjxeTKXYkpVDRlExz049jbzSMi5680MKypwYSrE1K4edufm8ecnZ3PTBVyzbtc9XZ1YOq/em8c3fryA6pPber4Yoc3mY9tRHZOQXYZiKHek5bNmXzbu3X1xt7ZZ9Wflc89iHuD2Gr137sskpKOHev9W+CagQTarddxM03gMPPMBbb73FY489xjXXXOM/fsQRR/D00083KICRxQwEABvzv6Pip0yV/29b0S9Nfp3F2b9VO/Z79m/8mbsCQ5moKm34Nft3nF4XS3JW+Y+bmDgNN3/m/nXQ6/ySsQaF8mciKeDbtNr3AqnJ2vxU9pTk+ufeGEqxvTiLD3Yup9Tr9i85b6KYl7oBp+GpV/0t6fMNG6odyy4t9d+DoRQ5paUs3uPLvJq/dTul5ZsWgi/b6rtNW3F6vCze4RtuMqq8tnTXXjakZbF0597KOk1FbmkZi7cfPGOsIdbs3M/+3EL/RoyGqdicmsWO9JxqZRes3OYPXsCXmv/dH5vwGma1skKI5vH222/zyiuvcMkll2CpkiQwdOjQWtenORTpgREAaJrlgL8SFBpNn4nim7uiUXkxDYtmKd+vKPDPFA3fcu4amj+A8bVMBexvVBOLplebuX+oeTMHstZS3lbDMJTGwRc+a216HSflVuwNVNNCbRq+DQ+r7h9Uld1a8/tVW/nGqG0huZqOWyx6tT+AdV1D5imLltCUC9m1Z6mpqfTu3bvacdM08Xga9sef9MAIAIbHVGzI5fsotmoO+kdOavLrnNDpJCqGqbTyQOaETidxVOxYHJaggNTnUzpPxG6xMynhGP8xHZ1IWzhHxg476HUmdR6Jw2JFrxJWnJ9ybL3aOigqmYGRSf4Pfx2N4TEpXNJrNDGO0IB06gt6jMBuabt/D1w1YkS1Y92jovzvjUXT6BoVyTHdfBsTTurXm5iQkIB7vGj4EBxWK8f06k6XqAj/axpw8oA+9E2IZ/LAPpV16hpdoiI4pnf3Jr+foT060ze5cjNGXdMY1acLPRKqp8qfNKovESGOgEDq/BOGyWq6omW00m7Ubc3AgQP57bfqPfCffPIJw4cPb1CdMolXAL5u9fX5X7O7ZCkOPZwRsRcQ4+jeLNdaX7CWRdkLUcD4uAkMivRNFk4rS+ertHkUeYoZHDmIiQkT0DUdQ5l8tf9n1hdsJdoeyXkpJ9e6A3VVu4rTeX/PAoo8pRwZO4DTk4+sd3pwkcfJy1sWsrM4m97hnbiu77GEWB2klubz0qbfyHYWMyquG1f2OfKQvUKt7dUVy3lz1UpMpThv0GBuGjOGV5YtY016Ol0iIpg+bhxxISH+8qkFhby4eClZxaWM7prMtNEj/B/62cUlvPDbUvYXFDIkKZFrjh6N3WLB7TV4bdEy/kpNJykyghuPG0tcWPVsrqZQWOrkle+Wsjszjz7JcVxz8liC7TVPpN6Xmc/r3y4lr6iMMQO6csEJw9GboWdItA8tOYk35aV70IMbOYm3zMne6+9p159xX3zxBVdccQUzZ87kvvvu495772Xz5s28/fbbfP3115x00kn1rlMCGHFQLqOUjYW/4jJK6BE2gk5BPQJez3btZ3PhCqy6jcGRRxNiPfTibU7DyZ+5SykzShkYMYiUkK6YyuS7tB/ZULSZxKAEzkk+g5CDpD03hb0lOfyWtRG7bmVi4mCiakibPtx5DIPvNm4ho6iYYcmdGd21S4PqySos5of12zCVyYkDe5MUVfefU9NU/PTXVvZlFzAgpRPj+nU7aHmXx8v3yzaTV1zGyD5dOKJH4Oqj6blFLFixFU3TOGFkH+Kjwxp0T6L9kgCmdfz222/cd999rFmzhuLiYkaMGMFdd93FpEkN6+2XAEbUymmU8PbOW8lx70MrH9o5J+VO+oSPBWB3yUZe33EPhvKigHBrNDf2eYwIW+29I2VGGQ9tvJ80537/MNL1PW/iq7Sf2FJcub1EqCWUp4Y9SKi1eYKKtfl7uPHP13CbBqCIdYTz5rgb6RQU2SzXa4+8psnVH3zO4l170DUNUylmnXQcl4+uX3fv7px8LnzxfQqdTgBC7DbevfZC+ibGHfJcpRS3v/UtP6ze4m/DdZPHcuMpR9VY3uXxcs2TH7NuVzq6pqGU4p4rJnH6uEEAbNuXzdUPfUCpyw1AeEgQb8y6iK4JzZPqLdqmFg1gXmyiAOaG9hvAeL1eHnroIa666iq6dGnYH0E1adt93qJVrc77llz3foDyfB7FD+kv+l//Nu2t8uDFN0hb4s1nUdYXB63z16wFpDvTyutUmJi8ueutgOAFoMQo4av985r2hqp4dtN3eEyjPN8K8twlvL3j12a7Xnv089YdLN7lyyCqyOB5ZP6v9d4n6cWf/6DY6fIviV7m9vLMj7/X6dxVO1L5YfWWgDa8/P1ScopKaiw/b9lm1u1K95dXwCMf/OJfDfzFz36nzO3xt6W4zMVrX/5Rr/sRol5kDgxWq5XHHnsMbxPvsSYBjKhVibegfKJtBUWZt6DydU/+AdlBUFzl9ZoUeYsCJuoClBo179qc686rd5vrKtddHLDZo1KKPHdxs12vPcotLa12zGuaFDld9aonp7g0YL8lUymyaglAqrWhuObvjbzajheVVpvbUuby4PYavvoKSzDNKm0xFTkFdWuLEKLhTjzxRBYuXNikdbbdtAnR6rqGDubP3M/8zzV0uoYO8T/vFT6EFbk/o8p3ilaY9AgddNA6+4X3Z176t/7nOjq9wnqxtnBHQDAEMDzq4PsdNcaY2N6klub6gxgTxYiYpl20r70bkZzkH7YBX6ZSSlQkMaEhhzgz0NheKfy+bbf/uabBuN5d63TuEV0TsVsteLwGCl+2UXRYMClxUTW3uU+XgADFomv0S+mEo3zV3TEDu7F+Z7o/xV4DRg2oW1uEaBCl+R6NraOdO+WUU7jjjjtYu3YtI0eOJDQ0cHrAGWecUe86pQdG1KpP+FhOSLgai+bL7EgJGcRpSTP8r0/pPI3+EaMAXyBybPzZjIqZeNA6B0cO4fwuF2Err7N3WB9u7H0jN/W+BkuVdWcmdTqBcXGjm/qW/G7udwoTEgai4Vsz5tIe4zk7ZUyzXa896tspjqfOmkKYww5Az9gYXrngrDqvKVPhyqNHcsGYIb41fTQ4fegAbjrhyDqdmxgdztN/O4PIUN8cgqSYCF68/mx/QHKgIT07c9dlJxFk973eL6UTT1x3uv/1q884kinjBqJpvmBo6nFDuOzkUfW6HyHqo6V3o26rbrzxRjIyMpg9ezaXXHIJZ511lv8xderUBtUpk3gPQy6jEK/pIsQad9C0YlMZFHtzsGnBWHU7Nt1RYzmv6UHTdCzaoRe+cxkuir1FBFmCKfQUEO/ohFW3UuItwel1YtXthNtC673oXG28pkG2q5BIeyjBFnu1192mFx2t3nsktXUewyCjpITY4GCCbZWpxTnlq+/GhYTUOaVcKYXT6w2op6FtUgrs1sD3WilFVmEJdquFqNCaM8+UUjg93lrTpA9kmgq31/AHMtXa4jXQAKu1Y33dRd205CTeLs/f2ySTePdNv1s+4w4gQ0iHEaVMlmTOZlPBXADiHAM4Kfkxgq3VMzDy3Pv5ePed5Hv2Axrj4y9jXPxFNdZr1ev2obIgcz4f7HkHAxNVPrcm1BJKn7BBLM1dCUC3kBRu63cLUfbGZwNtKtzLv9e8Tp67GKtmYUb/szktKbCXxa53vB+BNRnpXP3152SXlmLTdR48/iTO6NufW+d9x7xtWwEY360b/zv1dELt1YO6A2ma1ujgBcBmqR4sFJQ6uemNuaze7ZvYPXXUIO45d2K1ReY0Tatz8AK+lXZrC14AbBK4iJbSFJNw2303Q/OQIaTDyOaCL/3BC0COazOLMx6vsewXex+kwJNe/kzxW9bb7Che3uBr7yrZwXt73i4PXiqVGCWsyv+Tip/QvaWpvLbjzQZfp4LXNPj3mtcpcPsmaHqVweMbP2F70f5G192WeQyDv331ObllvkmuHtPk3/O/5/5fF/B9efAC8PuePTy5uG6ZQM3pwbk/s3ZPuv/558vX8/7iNa3YIiGaWMUcmMY+OoCFCxdy+umn07t3b3r37s0ZZ5xR4+q8dSUBzGEky7kxYH8jhUmmc121cqYyyHTt8E/OBdCxkFa2ucHX3lWys8qzwB9GTas8YmKyrXhHg69TIcddSN6BmUYoNhelNrrutiyjpJicsspNGsEXGi5PTQ0IHE2lWL6/9d+L1bvTAjKULJoWENAIITqGd955h4kTJxISEsLNN9/MzTffTHBwMCeeeCLvvfdeg+rseP3nolah1k5U7YvU0Am1JVQrp2sWQixRlBoF/vImBhG2+AZfO9pe++J2SlXd2lEjxtH4RcUibaFYNQteZQQc7+gL1cUEh2DVdbxm4E7LSeERbM/N9QcLFk2jS0Trvxedo8JJzy8KCLgSo2RlXNFxaMr3aGwd7d2DDz7IY489xq233uo/dvPNNzN79mzuv/9+Lr744nrXKT0wh5Ejoi8g0l65DLtVC+KoTv+ssewpSbeiV+mt6RY6jIGRJzT42oMjhzIyuiKrKPCn0bdyr68Pxq7bmdb9sgZfp0KQxc4/+58dsI7N5MQRjIzu0+i627IQm437jzsxoI/r7P4DeejEiXQKrQwMooKC+fcx41u+gQeYeebxhDgq57akxEVx1XHNl30mRIuThewA2LFjB6effnq142eccQY7d+6s4YxDkx6Yw4jdEsYZXV9jX8kfeJWTpJCRhFhrXs69V/gY/tb7ZVJL1xNsiaRH2Ej0OmQZ1UbXdK7peSPHFK4n351XHq9opIR0JTEoib/y1+E0nAyI6EdsHTZqrItTk8bQPyKFLYX7iA+KZGR0n3pv5tgeXThoCEMTOrM+K4POYeEc1aUrmqbx3WWX8+uuXZhKMb5bN6KDm3evqbronxTP1/+6kj+27sFhs3J0v+6E1GOyrhBtnqwDA0BKSgrz58+nd+/eAcd/+uknUlJSGlSnBDCHGUO5WJ/3ETmuzVi0IEbGXUP/qDP9r3tMJ79nvsmWokW4zBJAx6FHEGKNx216cFhCOCruPHqEDav3tXVN9+88faBRMcNxGS6e2/oaaws24lUG4dZwjoobw4UpZ2CvIQW6qo2Fu3l75zyKvCWMjR3ExV0nYtEt9ArrTK+wzvVua3s3IC6eAXGVQ35zN23kvbW+ybGXDhnWJoKXCnHhoZw2YkBrN0MI0Yz++c9/cvPNN7N69WqOOsq3l9nvv//Om2++yTPPPNOgOiWAOYyYyuCL3X+jyJuGBniUk98zH8euh9Ez4kQAvkt9hG3FSyqn7yqF0ygm252BQgc0dpf8xeU9HqNLSNN+6Dy48Sm2FO1A03zzYvI9+XyT9iPZrlxm9Lu21vN2l2Twz1XPYyhfjtOWor0UeUq5sU/DFkfqaL7avIkZ33/nf758/36sus6UPn1bsVVCHCYkjRqAG264gcTERJ588kk++ugjAAYMGMCHH37ImWeeeYizayZzYA4jBe7dFJcHL+AbxdGAdfkfA+AySthevDgw0bl8yMWiVYQ0Cg2dtfm/NGnbSrylbC3eUXE5qo70LM1didNw1nruwsxVmJj+divguzTZoK/Ch+vXVj+2rvoxIUQzkDkwflOnTmXRokXk5OSQk5PDokWLGhy8gAQwh5max1G1Go8f/CemqVbKrWxDDce0qq/Xfj1N06ottX04zHWpK10L/Apr5ceEEKKlLFu2jKVLl1Y7vnTpUpYvb9gaYxLAHEai7N2ItHX3hyYVgf2QGF/Wj8MSSv+IE8sDGs33anlkYCjft4pWPow0NOqkJm1biDWEwRED/Jesuv/HhPhxOA4yB+bEhJHYdWvALtdTk49t0va1Z5cPHY6Cql9VLh0yrFXbJMRhQ3pgALjpppvYu3dvteOpqancdNNNDapT5sAcRjRN54xur7Iw/X4ySv/CpocwKu5GuoUd5S8zKemfxDi6sLnwN0q9BYCFEEsMIbY4vMrArocwNvYsEoN7NXn7bu//d17b+Q4rc//CZbqJtcdyTPxYzkiafNDzkoLjeG7kLXywez6F3hLGxAzgjORjmrx97dXEnr149fSz+Kh8KOmiwUM4rnuPVm6VEIcJyUICYMOGDYwYMaLa8eHDh7Nhw4YG1SkBzGHGpgczMekh9hUvY1Xeu6zOfY8iTzpDYy8EwKJZ6RtxHDY9DKtmp2/4Mewu/YsCTwaJQX3oGlqZRZTt2s+WolXYdQdHRB5FkCWELNd+NhWuwaEHMSRqLEGWkDq3zapbub7XldCA2Kh7aGfuGHhp/U88TJzYsycn9uzZqDp25OSyaPtuQuw2Th7Q179LdWN5DIMf/9pKdlEpw7snMbhrYpPUK4RoOxwOBxkZGfQ84PdQWloaVmvDQhEJYA5DK7PfYlnO/1ExoJDl2syekqWc3vUp9pWu5eM9MzGUF6UUP6a/jFu50dBQKI7rdCXj4s5nZ/F63th5H4byAoqFmZ8yufM05ux+BlMZKBTzM+fyjz4PEmKVlVXbuyU793D1B5/jNXxTpV/+fRmfXHURkY3cZddjGFz7ymcs27HPN29JKe497yTOHnNE0zRciFYmK/H6TJo0iZkzZ/LFF18QGelbBTw/P5///Oc/nHRSw6YkyByYw4zTyGe5P3jB/9/9ZSvJde7k5/SXMJWBb+cgcCs3+J/Bgsy3KPUW8vX+1zDLgxeAPHcWn+97yR+8AOS6M/kt+9uWuznRbO7/fgGGWZmftje/gLeXrWp0vT+u3cayHfsAUMr3nfPg3F8wDtgKQYh2S+bAAPDEE0+wd+9eunXrxvHHH8/xxx9Pjx49SE9P58knn2xQndIDc5hx+vc3qj6mWuBJpcSbW2UTx5qzk8qMQoq8+f5AxVdSw2WUVTtW5C1o0vaL1pFdUoJZ5ZeormnklJQ2ut6cohL/uj8VXB4vZW4PYUGORtcvhGgbkpOT+euvv3j33XdZs2YNwcHBTJs2jYsuugibrWGrb0sAc5gJt3bGoUfgNIsJDGQ0OgcPJSV0KJsLF6Iw0fyhv1ZeQifEGkmkLYGeoUewrmCJP9gxMUgM6s3esl2YVY71DJUVVjuCsd268NPm7f7NIL2myaiuXRpd77DuSQF/XVp0jR7xMRK8CNEBhYaGcu21tS9KWl8yhHSYseh2Tkt5GodedXKtxvGJ/yXIGs7ExOl0C/XNFNc1nf7hR+PQQwGIsMVzQdf7sOo2zky+jp5hR5SfrXNcp3O5qsd/6Bk20HcuOhMTzmF41NEten+iedx/6kmM7uYLWCy6xk3jx3LqwMav5Ds4JZH7z5+Ew+b7W6pHfAzPXnlGo+sVoq3QqJwH0+BHa99EI2zZsoU///wz4Nj8+fM5/vjjGTNmDA899FCD69aUOnAJsPansLCQyMhICgoKiIiIaO3mtCqXkY+Ght0SedByHsNJkTsVExObFobVaifEEo2m6TiNIlxGGWG2GLymG49ZhlULwlQGeZ40HHoYsY4kNE3DbTqxaFYsWmVnnstwYmLiNp2EW6NqXfTOZbgoM8qIsEWgUBR4Cgm3hmHTW24zv2KPE7fpJdoeKovf1UGp24PNomOz1G1jT9NU5JSUEOpwHHSTRsM0cbq9hAY1TWaTEAfTEp8ZFdfo9siD6EGNm+xuOp3svuO/7fIzburUqQwePJj77rsPgJ07dzJo0CDGjx9P//79ef3117n//vu55ZZb6l23DCF1EF6zjGUZM0krXQhAcuhJjEp4AItW/QNha+H3/JbxKKbyoBR40VHohFsTCbf3YmexL1oOtyaS68lEKQ2bHkGZWQL45isEWaK5oc/zhFqrB0pLcxfy+b63MTGJtXfiul63kxCUHFDmm7Rv+HTfpygUMbY4ig0Pxd4S7Lqd63tOY2zsqKZ+iwKYyuSJDV/x8R7fypDDorvxxIjLiLTXPe37cFSfnaL35uZz/dtz2Zmdh0XTuGXS0fxt/Ogay1p0XYIXITqg5cuXc/vtt/ufv/vuu/Tt25fvv/8egCFDhvDcc881KICRIaQOYmPui6SV/uZ/nlryE5vz/q9auTzXTn5NfwhTefzHrJiAIs+T6Q9eAAo96ejls2HKzOKAesqMPN7bdU+1+ncWb+HTfW/658HkubN5dUfgDPN1Bev4ZN8nKBRKQborj2KvLzhym25e2P4qmc6ser8H9fH53mX+4AVgbf4eHtvwZbNe83Bz6wffsCc3HwBDKZ78fhGLt+1u3UYJ0dIO8yyk7OxsunSpnC/3yy+/cPrpp/ufH3fccezatatBdUsA00FkO1cBVVNPFTnONdXLuTZXyTLy7TdUMXJiqoqF5qu8hkKhoaqsBOk7DtmufdXq31W6LWBvJROTLFcaTqMyY2Vb8Tb/sv++qwUO3RjKZGfJnkPdcqOszd+DpcqQkaEUq3N3Nes1Dydew2TD/kyMKqlLFl1jzd60VmyVEK3gMA9gYmJiSEvz/dybpsny5cs58sgj/a+73W4aOpNFApgOIsSaiEblvAQNC8HWhBrKxVU7VvG9o1X5/8DjqjwjKfC4wxJara4oW3RAKjWAXXdg1yvHgKPt0f4eGt/Vqn/zxtijqh1rSvGOwHFkHY2E4IPPGxJ1Z7XoRIcEB4SmhqnoFCGLGgpxODnuuOO4//772bt3L08//TSmaXLcccf5X9+wYQPdu3dvUN0SwHQQg2L/jk2v/FB2WKIZGH19tXJJwSPpFV656qFSYJRv0GjTFEF6uP81XdMx0NFRgVtDAyY6U7vcWq3+oVFjGRAxzP9cQ+eirtcGTOQ9OvZo+ob5Mlg0DWwHzJ09If5Yeoc1btn7Q7m0x3iSQ2L9zx0WG7cNPP0gZ4j6un/qSVj0yq/7qO7JnD5U0urF4aXRGUhNsJJva3rwwQfZtGkT3bp149///jePPfYYoaGVf/zOmTOHE044oUF1SxZSB+Iy8kgvXYSGTmLIMbVmIimlSC39k3z3HlxGCWVGEeG2BFJCxxBijWNn8R8opUgOGUKacwtuo5TOQf3YXrKKrUXLCLfGcUz8+cQF1bwOiKlMNhSuoshTQPfQPnQOTqlWxmt6WVOwhhJvCX3C+lBqONldupdOjjgGRQxokYygMq+b3zI34jS9jI3tLT0wzWBnVi4rdqcSFRLMhH496py9JERzaskspO4PNE0W0q5Z7TMLCcDr9bJ+/Xri4+NJSkoKeG3NmjV06dKF2NjYWs6unQQwHcy+4p/ZlP8WJZ592PRIwm29KfBkUOpNx2GJomfEFAZFXwpK8eP+u9lXuhyv8gIOFGDRHHQOGUrvsAmsLZiPR7kYEDGBYdGnkuNO5eeMdyn05NA9dDDHdboQaxOmPLtND5/s/ZJNRVuJsUdzYdepJAZ18r+eVpbF27u+YntxKm7TS4IjhilJxzCh08gma0Nbp5Ti3Y1r+HLrRhxWG9cPHc3RXbr5XzdMk1dXLeennduJcgQxffSRDEvsDEBmcTGPLVrEhqxMSt0eooOCOLpbN/5+5JE46rmZ2oo9qby06E9KXG4mDejD5WOHo0saumgnJIDpGCSNugNJLVnAkox/Ab6hIbeZT5F7DwYaBhZcZgGrc17EbRSwv2wn+8tW+suCFy86HuVkZ/GvbCv6DbfypbXuK11HsbeA33O+xWWUojBJLdtCvieDc1Nua7L2P7/1NZbnrUah0NHZULiZJ4beS4QtnEJPCf9a8xQF7mL/FOQsVx7rCrejgOMOkyDm9bUruX/JL4Bv/tDvqbv56IwLGZXoS1N/fMkiXlm5DIVvuf9Fe3fz9YWXkRwewfkffci+ggLM8oWx9hYUsC4zk70FBTxz6ql1bsPG9Ewuf/sTTKUwlWLF3v0Uu1xMnzCu6W9YiPauKSbhtvtuhuYhc2A6kJ2Fn/v/XbG/jKapgHwfgC0Fn7G/bFVAWQAd5Vs1svyYXiVbaXnuNziNYn8Gk0KxruA33KazSdpe4i1lWd4q/wRgE5MibzEr8/4qv/56CjxFmDX8NvgubVGTtKE9mLOh8utWscnDJ5vX+Y+9u3aN/90xlcJrmnyxZRPL96eypzx4qcpUiq83b6bU46GuvvxrEwpf8FLhveV/NeBuhOj4Dvc5MM1JApgOpa5d+A3p6q/tnKYZNqi99vLcqIMMT2hN1Ib2oKZ7DThWw1txYHZZEzSiLoeEEKJZSQDTgfSKOMf/b1WeOGQqLSBhGaBf1Hl0CRnlL1fxh3TV7RuV0lBVvj3Gxp5OiCUCzX9MY2jU8dj1ptl0L8QawpGxo/wfxjo6kbYIRkQPAWBU9ECi7RHo/j6iSqcmjW+SNrQHVx4x3P9vvfx9OK//Ef5jlw+p8rqmYdMtnNVvAKOTk+gZHY1+QKShAWcNGEBIPXaDPWvIQHRNC5jzcumYYfW7ESEOF0prmoeoRibxdjD7S35lc/4citx7sFuiiLD3pcCdTrF3P8GWaHpGTGFA1IUoBT+n3c+ekqV4lQdNC8IErFoQySEj6BU+gbX5P+FVLvpHHMvgqEnkeTJYkPE+Rd4cuoUewTFx5zTpJF6v6eXz1G/ZVLSVWHs053U5g/igynVrMp25vLv7G7YX78NleEgMiuPkpKM5Om5ok7WhrVNK8fHmdXy1fTPBVit/GzySsUmVWV6mUry1ZpVvEm9QEDeOGsOgeN96QDmlpcxevJgNWZmUuNzEBgczrmtXrh8zBns9s4P+Sk3n1d+XUexyM7F/by4eNUT2khLtRktO4u1xz0NNMol35z3/aZefcZdffjkvvPAC4eG+JTrWrFnDwIEDsdXjj6baSADTDpS4t5Fd+gtl3t1Y9Wg8ZhlOIxOLFoahPOQ5t6LwoGkOTHTQrITZetI/+kqiHAffMdhQXjbkf8v+0jVE2VMYFnMuDkvti43tLP6LTNceYu1J9Aob3mwfWqYyWZ77FznufHqHdadPeHf/a27Tw+Lsvyj2ljIksjddQzs3Sxvast/37WZrXg5FbhebsrOIDgrmtrHHEBUU3Kh6t2bnsHTPPiKDHEzq27te2UkZhcUs2LIDq65zQv9eRIc0ri1CNJeWDGB63t00AcyOe9tnAGOxWEhLS6NTJ19GaUREBKtXr6Znz8av9SVZSG1cTukC1mXegIEJyje8Y+JbSE4pDU0Dr9LwKisKDU/5EE+eewt7S77nmMRn6Rx6dI11G8rLp7v/TqZzs//YX3mfc3HPNwi1xlQrPz/jHX7L+tj/fEzMqUxJurZJ7xd8wcuTm1/hz9w1VGxucHWPC5nceQIuw83ta55hW/FeACyazqyBVzMm9oiD1tmRPPLHr7y0usr29OXjfh9vWsfvl11LXEj1FZLrYv627dz0+dcYpm+q9ODEBN6/+HyCbIf+NbE1M5uL/+8jipwuAOLm/87H115M58jwQ5wphOjIDuwjaco+E5kD08Ztzbnbt+y+8uW+apoveIHK7CEvVtDA8M8NqZwnsjzr/lrr3la4ICB4AXCZRSzPfrda2Tx3RkDwAvBn7jdkOHc16L4OZk3+Bv7M9e3jVPGt/vquj3AZbn5I/4PtxZV7MJnK5PmtHzZ5G9qqXQV5gcEL+KcEuQyDOxb80OC67/x+vj94AViXnsHHa9cd9JwKT/ywiFKX2/88r7SM/y38o8FtEaLDOMz3QmpO0gPTxrmNnGp7C/kcOHSjVUmCruQ5YBfpqkq8ObUcr74TdLE3v8ayRZ5cEoK613qNhshzF1Y7ZipfWnWuuxBd0zDKo3gF5HuKmvT6bVlmaclBX88oqf3rfSg5paUB32kWXSez+ODX81+3qNj/NQHfvkeZhXU7V4gOrSnSoNt5ALNhwwbS09MBXw/Mpk2bKC4O/F01ZMiQetcrAUwbFxk0glznnyjNPOCVilVAKneM1lEY5Uf859t71Vp35+BBNR5PDhlW7Vi8owsOPRiX6fRf26rZSAjqUY+7qZs+4d3Ryu8KfNk20fYoou1RDIzswUd7K98LHZ3+4U3fhraqb3QsoTYbpR6v7/054BfbMVVW5a2vEUlJrEzd7w9EvKbJqOSkQ5zlM7Z7F7ZkZPvXhtGAkd3qdq4QomM78cQTA4aOTjvtNMC3PIZSCk3TMAyj3vXKEFIb1z/uccJtgRvgVV1gzjeyZAKqfCG6ym+SYEsnxic+V2vdnUOO4Jj4G6ka8PQJP5HB0WdWKxtkCeXibncSYvFNIAvSQ7mw638It0U38M5qlxKSxN/7XIld960EHOuIYeaAm7BoOqNjBjGtxxlYyjeH7BGaxO0DLm/yNrRVUUHBvHbyVKIqJgVWTBICjk7uyr/HHdvgumeffgr9OsUDYNE1bj/uGCb0qltweMuJR3NCv8pJeVOHDeKqo0Y1uC1CdBiH+RDSzp072bFjBzt37qz2qDi+Y8eOBtUtWUjtgFIKr1mIaRo4vWmgLBiqjGB7ApoKJs+1BlNpWLRggmyRWLQQ3GYhobZklPJiKC9KGVgtIVg0BwoDh6VycqWhvJR4sgmyRGK3HDxzxFQmZUYxwZYwDOXFY7oItoT5s5E8phu36SKkyrGGMpRBqbeMMGtotbo8phen4SbMGtyh03ddhpcSj5toR+B9mkqR7ywjKiiY1KJCooIchNsPnulgKkVuWRmRDketmyoqpSh0uQi22eqdWg1Q7HKjaxoh9qZLrxeiqbVoFtJ/H8LSyCwkw+lkx4PtMwvpUPLz8/n222+5+OKL632uDCG1A5qmUeLZzqr0K1C4Uco3YddQOl4s4F+AzjcHxmNqGOVfWlOBB4v/NaV8C9YlhYzhhM4PYLeEYtGsRNgT69QWXdMJtUbwa+Zn/JD+HgqTxKDuXNb9PyzPW8R3aR9hYpIc3I2re9xOlL3+O4xWsGgWwm01p3TbdCs2vWN/+76+bgUP/rkAr2nSJyqW1yefTdfwKMC3SF1McAgAKRGH3kV7fWYm13wxl/TiYoKsVh6dNInT+/WvVk7TNCIb8cs2zGFv8LlCiMPP7t27ueyyyxoUwMgQUjuglMnqjKtQVGZ56EqVBy+VKsIYm678w0y+1XV1qs6X0VGkla5gadazDWrP5sKVfJ/+jn9fpEznHt7YeR/fpH3gy5gC0sr2Mmd37cNX4uCW7N/DvX/8jNf0vZ87CnK5/qcvGlSXxzC46vPPySzxTap1er3c+t13bM/NbbL2CiFqJnshNR8JYNoBj5mLqcr8zytHEiqzjqoOovjmxVRk6VSZJFHlZIVJepUNHetjT+km9CrBk4lJtisVvcq3k4nJrpKtDapfwIrM/ViqDBkZSrE+JxN3Aya6pRUVkVVaErD5oqkUf5VnBQghRHskAUw7YNUjODA92vfZFhiWazU8qzY7xJ8lohNq7dSg9oRbo/29LxXXcujBB6R7a4TbDj20IWqWEBIWkJYMEGl3YNPr/yMbHRwcEAxV6BRW+4rLQgjR1kkA0w7omp1uEVcDlRsvKsCCAVXChor/mvjmyCgVmLFEebq1iYZFczAm/u8Nas/ImBNIDq5Mz9bRObvLTXQJ7hFw7LwuVzeofgFn9hrA6IQugC8I1TWNh8dPbtCE5XCHg1kTjgs4dlrfvhyVklLzCUKIptNKWUgvvPAC3bt3JygoiLFjx/Lnn3/WWtbj8XDffffRq1cvgoKCGDp0KPPmzatWLjU1lUsvvZTY2FiCg4MZPHgwy5cvP2g7nn322YM+3nvvvfrfXLmOPQuyA+kVcxsRjhGkl8zF6c3CpicQHTwCt1FGtnM5Zd4crHo4yeGnoGEny7kGsKCUTqk3BxNFuK0bQbY4gvRIkkPHEmZLaFBbbLqDa3o9yIbCpZQZJfQIHUSnoC70jxjF2oJllBol9A4bSEJQctO+CYcRu8XC+6eezw+7t5FbVsqYxC70i4lvcH1XDB/O0MRE1mZmkBQewfE9enTo7C0h2oqmmMNS3/M//PBDZsyYwUsvvcTYsWN5+umnmTx5Mps3b/bvSVTVrFmzeOedd3j11Vfp378/33//PVOnTmXx4sUMH+7b4T4vL4+jjz6a448/nu+++474+Hi2bt1KdPTBl9J46qmnDtnerl271u8GyzUojfqFF17g8ccfJz09naFDh/Lcc88xZsyYGsuuX7+eu+66ixUrVrB7926eeuopbrnllkbVeaCOnkbt8mawKft2CpwrMTEwseBVvp4UUykUFoKsiaSEnYUihK2Fn1DmzUbXrFj1cOyWziSGjGBIzFVYdAdKmazN+4TdxYuxW8IYEXsZ8UH9Aq7pNEr4NWsOmc4dxNpTmNDpcjTNwi8Z75Hu3Em8I4UTEi4l1Nq+3++0snxe3PIjaWX5DInuyjW9TyDI0vZSgEs9bp5esZjVmWl0jYji+qFjeGf9GjZkZ9AzKobbxhxz0D2QyjwenvljCavS0kiJiGTG0UeTFC77FInDU0umUfe+4yEsjkamUbucbHuk7mnUY8eOZfTo0Tz//PMAmKZJSkoKf//737njjjuqlU9KSuK///0vN910k//YOeecQ3BwMO+88w4Ad9xxB7///ju//fZbo+6lKdW7B6a+kV1paSk9e/bkvPPO49Zbb22SOg8nhlnCiv1n4TZzqJj2omteTCwYyoKJBngp9aayOf8FPErDo3yprKZy4/GWUurNINu1lkLPXiZ0fohl2a+zKncO4JsLs7dkKed0e41oR7fy8ww+3D2LNOdWFCb7Sjewt3QdEEqacycKk72lm9hTuoHrej2FVW97H/h1UegpY9qSl8h1l2Aok9V5u9lZnMXskZe2dtMCKKW4/scvWJS6G1MpVmSk8uW2jXi9JqaCFen7+TNtH9+edzlB1upfC6UUN339Fb/u9p2/cv9+Fu/dw7zLryDC4WiFOxJCNERhYeA2Kw6HA8cBP8Nut5sVK1Ywc+ZM/zFd15k4cSJLliypsV6Xy0XQAcsnBAcHs2jRIv/zL7/8ksmTJ3PeeeexcOFCkpOTufHGG7nmmmsae1sNVu85MLNnz+aaa65h2rRpDBw4kJdeeomQkBBef/31GsuPHj2axx9/nAsvvLDaG93QOg8nec4/8FQEL/gm72qU70btL1U5FGA9YMBU00DXfFlJe4p/xmUUsj7/c//rChNTGWwt/NF/LNu1h/3Ozf6JugqTHPdef0BTcSzLtZd9ZYGbQbYni7O2kOUqwlAVKeeKhZkbyXU1fD+h5rC/pIhf9+3yZxEZSuE2jYDnO/LzWJ6+v8bzM0tKWLAr8Pz04mIW7d7dMjcgxOGsCefApKSkEBkZ6X88/PDD1S6XnZ2NYRgkJAROEUhISPDvR3SgyZMnM3v2bLZu3Yppmvz444989tlnpKWl+cvs2LGDF198kT59+vD9999zww03cPPNN/PWW28d9PZ//vlnBg4cWC34AigoKGDQoEH8+uuvB62jNvXqgWlIZNccdbpcLlwul/95TW+MaLiaN48UbV0HWFRbiA6nKefA7N27N2AIqbZOgfp65plnuOaaa+jfvz+aptGrVy+mTZsW0IlgmiajRo3ioYceAmD48OGsW7eOl156iSuuuKLWup9++mmuueaaGoe+IiMjue6663jqqac49tj6b4NSrx6YhkR2zVHnww8/HBCFpnTgbIqooLHY9JjKTKPy/fv08sGj8qP+f3kP2JFaKd9qvAqNlNDjcFgiGBhVudeRho6m6fSJmOg/Fu/oRuegPmjl3x4aOjH2ZBIcvQKOxTm6kBzct+lvuoWMi+tDrD3Mv6+Sjsb4+H7EONpWenFSaDhHJ3dFL590a9E0bLoe8LxHZDSjEmueNN0pNJRju3UPKJ8QGsoxDZw4J4RoHREREQGPmgKYuLg4LBYLGRkZAcczMjJITKx5xfX4+Hjmzp1LSUkJu3fvZtOmTYSFhdGzZ+X+Zp07d2bgwIEB5w0YMIA9e/YctM1r1qzh5JNPrvX1SZMmsWLFioPWUZt2mYU0c+ZMZsyY4X9eWFjYYYMYqx7GyKS5bMj6J4WuNaCZmMqCjubfyE9hIcgST0r4VBTBbCv8lDJvDppmwWqJwGFJICFkJENjfGnNY+KuJsgS4ZvEq/sm8UY7uvuvqWsWLuz2IAsz3yLDuYM4RwoTOl2JrlmZn/EOGWU7iQ9K4cSEy7Dp7Xfp+Eh7CG+Ou57/bfmR/WV5DI3uxnV9TmztZlWjaRqvTprKk8sXsSYznZTwSG4YNpZ3169hbVYGvaNj+NfY8QTbap6LpGkaL55+Ok8tWVw+iTeCfx59DBGN3J9FCFEHTbEZYz3Ot9vtjBw5kvnz53PWWWcBvt6T+fPnM3369IOeGxQURHJyMh6Ph08//ZTzzz/f/9rRRx/N5s2BUwa2bNlCt27dDlpnRkYGtlp+NwFYrVaysrIOcVe1nFufwg2J7JqjzpomLrU3pllGkfMHTLOE0KCjsVsDvwmU8pJbNh+PkYPbKMJhSSTU5sGjSrDpsSSEnY7LzKPQtYkC9z68ZjFZZcuxW5PoEnYcvSLOJ9xec1CnaTpDYy5kaMyFtbYvyBLG5M43VTt+WtL1Ac+dRhkbCpdT5Mkn05mKgcHwqGNwmx4Kvfn0CO1LUnDgX/pFniLWFKwBYGjkUMJttWfDbCvazbbiPcQHxTAiamCTp/4mhUTzwLDzD12wlYXY7Nw57oSAY/eODwy2NudksyJtP7HBwZzYoxfWKoveBdts/OfYCS3S1prszc3nj217CQuyM7hLIsu278Ni0ThuQE8igiWQEh1Xa6RRz5gxgyuuuIJRo0YxZswYnn76aUpKSpg2bRoAl19+OcnJyf45NEuXLiU1NZVhw4aRmprKPffcg2ma3H777f46b731Vo466igeeughzj//fP78809eeeUVXnnllYO2JTk5mXXr1tG7d+8aX//rr7/o3Llz/W6wXL0CmMZEdi1ZZ1tnmMXsyjwLl2cjABoOusa/S2jQOABM5WFj5lUUOH8vfw4uZcX072m0nTzXnxhouJSNipHAUmM/yrkCDxrbCj5gfOcXSAipWyp6Q5R4C3l+63/IcfuCTwWYSuOPnN/KtzAADY3Lut3EyJijAchyZfHAhgco9PrmLYVbw5k1YBadgqpnm32btoBXd3zsf35s3Ghu6XuFrF9Sg6+3buYfP3zjn6h7TJeuvH762bXuOt2S/tyxl+ve+By317cNgq5pmIavnYmRYbw//SI6RbStYTsh2rMLLriArKws7rrrLtLT0xk2bBjz5s3zT9XYs2cPepU/cJxOJ7NmzWLHjh2EhYUxZcoU5syZQ1RUlL/M6NGj+fzzz5k5cyb33XcfPXr04Omnn+aSSy45aFumTJnCnXfeycknn1wt06msrIy7776b0047rUH3We91YD788EOuuOIKXn75ZX9k99FHH7Fp0yYSEhKqRXZut5sNGzb4b+SSSy7hkksuISwszB+RHarOQ2lv68BkFz5PZsGj4F8lV8du7UnvzgsByCqey9acyiEyr9Jxq8odpX0USmmUYafqnBcAQ4GBTrC1M6d1+6bZ7uPr/W+zKOsb/waOCjCUhqECPzTtuoNHh7yOrum8vP1l/sz903+Ojs6YmDFc1+u6gHNKvWVctvR2f7kK9w36B4Oj2u+8m+aglGLIq89T7HYHHH/qpCmc1W9AK7Wq0mmz32R3dh5m1SWjy/9t0TXOHTOYu6a2vaE70XG15Dowff/ZNOvAbHmy7uvAtCUZGRmMGDECi8XC9OnT6dfPt+bYpk2beOGFFzAMg5UrV9bps/5A9Z4DU9/Ibv/+/f6V/ACeeOIJnnjiCSZMmMCCBQvqVGdH4zUy8PWaVHw4m+XHfNxGZsDrNUeYmm8/pBperOj7cBnNu9twoSfvgN2PKqiAZ27Thdt0EmQJIdedGxCUmJjkuHOq1V3gKa4WvADkuPOboukdisvwVgtedE0jvaSolVoUKKuwpDJ4qVD+vWuaisyCtpW2LkSTauE5MG1NQkICixcv5oYbbmDmzJn+bElN05g8eTIvvPBCgz/rGzSJd/r06bUO71QEJRW6d+9ep/TOg9XZ0QTbRwJV17ixEOwY5X8W7hgGVT68df+e0gF7TqNUZW9MRcCgVOWZMY5BTd30AN1C+7I6v3KhI18rAoMXHZ04RwJBlhAA+oT3YWvxVn+qtoZG3/DqPSpxjmiibOEUeooxy8vqaPQOk8yZAwVZbfSJiWVHXq5/A0hTKUYkJrVyy3yGdevMkm17MCqiGN9CRpWvd28b7RRCNI9u3brx7bffkpeXx7Zt21BK0adPn0NuQ3AospljK4gIOZPY8OlUfNAH2QeTHFO5X0RE0Bh6RN+NVh5f6ih0zUTDpDIU1zA07YDNGn2fCyY6odYuHJlQfZGjpjQudjLjYicFHNM0DZumoZd/a8XY47m6523+189MOpOR0SP9z0dEj+DMpDM5kE23MmvgjUTZfd2ldt3GLX2vpEtIwyaLd3QvTzmTlAjf7t9WXeeu8cczJqlLK7fK54FzJzOgs2+Ok6ZBl+jKXcrPGDmQK8ePrO1UIdq9ikm8jX10BNHR0YwePZoxY8Y0OniBBu6F1Na0tzkwplkCmhWUganKsOgxaJqGYZaiaTpKKQyjDIMidC0Ij7eEUu8O7FoSHpWJVYsm2N4FU7lxG3kYykKhawNxISPRNB2LbifIEo+maSilcJtF2PUwNK3meFUphcssRseCrlmw6r4ML7dZho4Faw2p0k6jFJtux6JZcRplGMqL1/DiUmXEORIxlJcyo5QwawR6Ddct9Zb6euY0jWBLUI1lAAxlUugpIswaik1vl1n/NVJKUehxEWq1B2QLNYapFDllpUTYHTisbeu9UkqRV1JGkN1GiN1GfqkTi6YRHty+swlF+9SSc2D63dI0c2A2P90+58A0p7b1W66DM8xC9mdfT6lrAaARHX4t8ZF3YapSdmXfTEGZbzl/rwIvOqbSMbAAGkqBpzwLqWJI1VA6XqpM7s2D+KAjGdf5f2iaRpZzHQv330GZkY1ND2N84n0khx4V0KbU0jV8u+9uSoxiVHmvyYCIkyg2ithRvAzQGBF9OicmXoem6RR6cnlv98Oklm1Dx8JJiZdyTPxZvsqsAL6oWtfsB10jpsBTyNNbnyXdmYFNs3Flj8s5Ju6oauUsmk60PbKGGtqv3UV5XP3zJ2wtyMFhsXDvmElc2Gdoo+vVNY34g2zo2Jo0TSMmLMT/PCpEUqfFYeIwnwPTnGQIqQVl5t1JqatiJ09FXtHLFJS8S2reAxSUzfeXs5Q/fMELVYKXKsozjdQBGUhZzj/YkPsMHrOMn1NnUFY+kddjlrAg7Q5KPJn+sk6jkK/3/odSozignrUFP7GjeLn/QivzvmRV3tcAfLx3NmllOwAwMfg+/S22FNVvFUWlFLO3PEOm07d4kUd5eG3H6+wuOfiKjh3FNb98yo5C39fFZRjMXPIdK7NSW7lVQgjRvkgA04JKXYsBo8oRC2WuPylyLYYD5rJo/pE9rcp/Nf+/zICU6gOCmLI/KXLvwW0WVqlXYSo3ua7KlRRzXDvxqLID6sI/ZdjfFjT2la4HYE/JpoDsIB0Lu0s21un+KxR5i8l0ZQbUo1BsK95er3raoxKPmy352f7JtuB7fyWAEaJjkjkwzUcCmBZktSRw4FtuscRjsyRWO35ATMKBfYh6ra8pHJZYgqwxNbYh2Brr/3eIJbr8UoF9nNWXidMItfrKhlojA0qYmIRb6zcZK8QSjFWrPnoZaetYQ0U1CbbaCLYGLqttoogPaptDP0KIRqrvrtO1PUQ1EsC0oE5R96JplQvPWS2diQm/gS7Rs9C1YCpCCfDNganIOtI0sJS/UrlTtELDrHKG77tcx8Gw+FmEWOMZEvO38td81+sVcRqxjsqFzaIdXRkafS6WKr00ACGWUKyaw39emDWGsbG+5fZPT77Otw9T+Wudg3owIqZyI8i6sOpWLu12cXnLfPUcETGIEdHD6lVPe6RrGg+MnRTQ53VkQlemdO/fms0SQoh2R7KQWpjbu4eSsp/RNQdhIVOw6JHlx1MpKJuPoZx4DSeFrpWgW7HrKeQ5l+JVxVgtnbFbErHqEVj0SExlgqbhNAop9aYSbutJ/+gbcVTpfUkvXUGeaxvhtmSSQ4+utgy/Uoq9pctJK91AqVFErKMHfcKPwW062VG8DItmo2/EUQRZKvcrynDuZmfxOoIsoQyKHIdNb1gmyfbiHWwv3k6UPYqR0SOwaK2/7H1LWZuTzvLMfcQFhXJyt77Y9MPn3oVobS2ZhTRgetNkIW18XrKQDiRZSC3Mbu2KPfxKvEYeO7Muw+negsIE7Fgt8cSHT8eptpLvWoRvcMGCzdIPpQyUWUSQfSilRjqmkUlC6CSK3em4jK2EWbvQJ/pvAcELQGLISBJDRpJasoz5+/+DiZc+EaegacGsz/+KYk8WCg2vUnhMD9uKfmdz4QJGxpzD8Jjq+1PsK93CoqwvcJllDIgYw8LMr9hZsoEIWwwTE84j1lH3FRV7hfWkV1jPQxfsgLbmZ/PO5lXku518sHUNd44+gZ/2bOePtD10CgnjluFH0zU8qrWb2Wj78wqZ9n8fsze3EBRYNY1j+nXn8QunEOpovzuZC1FnkoXUbKQHphWYpsmmtKF4jcCl+BUahgIXVipSp8E3YdfAggZ4lIaBlYrvaK/SMdHRsGC3xHBcl8+wWwLnkuwvXc68fbf6rwLgVhZMdMqXYsFj6pgE9gKc0eVeeoWP8z9PK9vJy9tvx1RmedAFXlPHQEdHJ9gSxox+TxJui2qaN6qD+mDrGu5Y8l35M1+PmEXTMbwmoGHRNCLsQfww9Srig9vv3JjCMicTHn4Fl8eg6rxwDegZH80Xt1yBrsvGnKLltWgPzE1N1APzgvTAHEjmwLSCMvcKDDOvyhHfjAgNX2q0P9tI8z18ydK+3/7WA8L5ipV4FQYuI4uM0l+rXW9z/pfl/6o8z1p+nqb50rQtNUxzX5P3VcDzVXk/o5TyBy8AFs33bxOTEqOQ9YXL6vAOHN5e31DxHlV+eBum6X9qKEW+q4zvd29p+cY1od+27MLlNaol0ilgR1YeO7Obd68uIdoEmcTbbGQIqRWogFTqxqn+92v1DRBVDcfq8hNx4HmqLueomq4lqjLr+B61975R8xA30AE6f4U4pMBFKhpeh6hOemBaQYh9DLoWXuWI8v+/JWC/o6qbM/qGlLwHfCtXLHanYcGuR9MpZHy16/WJPJUDA5aqi+RpGhiq+o/IEVGnBDwfGjUB30BXlZ4DpZdfXydID2Fg5Oha71v4XNpvRPm/KjPIdE1DUxXDSRphNgcnde3dKu1rKuP7dsdm0aveJijfL+MuMZH0iK851V8IIepCemBaga7r9En8hd3Zl+J078REoWHFokeTFHEDBc5NZJV9VF5aw6Z3xauKsFjCiHOMo8zIwFQuOoVOosSTSZ5rFcGWRPrH/gOHpfqHQkroOE5Mepj1eR+jlJc+kaeiacGsy/+CEm82ytTxWsBjevEqN5G2BEbFnke/iAkB9XQJ6cOVPe7l16xPcRmlDIg4kkJPMTtKNhBhi+bkzhcTaZMPpUO5ov9INDReWv8HRR43vSJjuWf0ifywexuL0/aQEBLGv0aOJzE0/NCVtWFRIcHMvfkyrnj1Y7KLSgFfsDyyWzLPX34GlibaA0qINk0m8TYbCWBaQalrOcVl84kIOoGkqOOxWrqyJ3cmbmMPZZ5NRIWMxW6Lw2PkoeuR5JUtx+3JRzO9hNv70T/8LrKcizDMUnpEnkiceywuMxelFKbyklbyO26zkPjg4YTZfDsSdw4egWG6MDFIDhlDsDWaPhEnUOzJZl/pSqyanW5hR2LTfZPN3KaTjYW/4TXddA8dRrjNtwBej7Aj6BF2BPvLdrC/bAedg3syJenSaunZonaapnHFgJFcMSBwF+ZwWxA9IqKJDw6lV2RsLWe3Lz3iY/j1P9e1djOEaDVNsZKurMRbMwlgWlhWwWyyCp/0P88sfAFPlewfl3cHGUXv4cJGxcinL4DX8KgStuc9xKa8ZzFwoxQY2CrnpigLdmsPCj27AdA1G+M7zybC3puv91xPsTcdAIceyWldX8RlOvl8z614zDIAou1dObfb85go5uz8JznufQDY9RAu6fYIicG+IY2lOfP4MvUVf5tHRB/P2V2mSxDTCF/v3MTNC7/yzxs5sUsvXjlxqvRSCNHeSQ9Ms5Hfji3I7d0TELxADZs0AmiVmUj+Q+WZSDpg4AQoP1I5IdSL8gcvAKby8mfmA6zOeZMSb1ZlO8wi/sx6noXpz+I1Xf7j+e59rMr9kD9zPiPXvb+yjaaTH9JfBMBplPJ16msBbVuZ9wu7SjbU7U0Q1ZhK8e9F3wVMep2/bzvz2nkWkhBCNCfpgWlBXiO9TuUqEqOrbt7oP6L5uhNrCup9n38q4AynN5sSb1ZA5pPCpNiTTrHXeUCmkUaxJ5syFfhtoTAp9PgCoBJvQcAmjBUKPNl1ujdRXYnHTYnXE3BMRyOttKiVWiSEaFLSg9IspAemBdmtvdG04AOOBn5nKwW6qhqEVF0KwJeJpAICm8pyFi0wYU/DQoxjIPFBAw84rpMQPITOwYPQqnwLKAwSgvuTFNwvILDR0EkO8e2hFGmLI8QSEZCJpKGRHNyrHu+EqCrMZqd7eFT518/HRDEsrnMrtkoI0RRkN+rmIwFMC7JaYkiJ+7+AIMaBFZ2QgHJKU/6NHP3HygMGA4iyHwGArilCLPFUfBnDbJ3pE3EeFcFKuC2FcYkPMiTmEnqGn+ivq3PISEbH38iEhFtICKrcRHBQ5OkcEXU6I6KnMCzqZP/xpOB+TE68yXcPuo3Le/yXEKtvNUiLZuOclL8TH9SlcW/OYUzTNF6deDaJIb6sI4umc/fYExmVIO+pEELURrYSaGFKeTCVE7dnH6ZZhEYIVksyZZ4NlHk2ERl8EkpzgbJgqGIsehSG6Sar9DtCrL2JDT0GmyUcj1mEYZbhsMRjqDI8ZhF2PQrfgI+Bxywh2BKHplXGqE6jAKUMgizRaJqGqQy8phuPKsWqOXBYwnAZJQBomgXDdGPgJbS8fFWGMijy5BFqDW/wZo6HI6UUpV4Pobbq+wAZpklmWQmRdgchVV6vOCfEapOJ0kI0gZbcSuCIax7CYm/kVgJuJ+tela0EDiRzYFqIUgaZeXeRX/IWChO3qpiWWzk0hKaxp+C+8t4WrXzOSxwezYHbyMKqRzLI+jixIROw6eHY9PK/2Almc+EcNua9jsJLQvCRHJnwSEDwAhBUZY+k1bkf8Uf2a5jKQ2LQERybMIO3dtxEgSe9yvYCIZyc9A8GRh5X7X4smoUoe1yzvV8d0c/7tnHr719T4HbSNSyKlyZMZWBM5eaXFl2n8wFrv6zISOXGn74ko7SYuOAQnj/xDI7snNLSTRdCNJCkUTcfGUJqIXnF/0d+yRuAiSdgfosvkEHTMBXleUZaxYt4zRzchm8Crdcs5K/M6ZR5UwPq3ls8jw15r6DwApBZ9icrsx+qtS27i/9gcdaLmMo3cTTDuYH3d99CodcXvFQwVCnfpD5GpnNn49+Aw9ze4nyuW/g5hW5fBtm+kgKumP8RLsNb6zmFbhdXzvuErFJfr1huWRlXzfuUXGdpi7RZCCHaMglgWkipczEVvSqAv5el4lnlscpQW9PAcsB+1Qo3Ra51AXVnlq1Aq7KWjMIks2x5rW3ZX7YG/YDyLtMZsPeO5o+hFKmlkiLdWGuy0/CYhv+raSpFlrOEvcUFtZ6zJTeLIrcbs/wsE99Q0sacrFrPEUK0MbKZY7ORIaQWYi2fbKsFbOQYmG10IKVq/r61WwJXaQ2yxhBYUqtxS4EKwZboA1KhtQNCp8CNBEOtUbXWJeomLji02jENiHEcmJV28HMAYoNDajwuhGh7ZAip+UgPTAuJjfgHFj0KX3Kz8vfF+PtklAron1G+FzH8XyLffzuFTCHSEbgEfZ/IiwmxdqZi31MdK8Pjbqu1LQOjTiPG3q38+r7/jY6Z6p/7UhG8KDS6hQ6nd/iRjbx7MbZTClO6+jK+9PLurRlDxxMTVHsw0j0ymr8dMTLgnIv7D6V/THwzt1YIIdo+6YFpITZrF7on/kJR6dd4jQyKXSsoda/HxIWu7JiaFV2zYNUi0bVgrJYYgu0DiAo+FoWVYvdGgqxdiA85qVomisMSxUld3mVvyY94zTISQ44iwt6j1rbY9RDO6fY/thUtwGUU0SVkJHFBvegdPoEVuZ9R6i0k1tGNpJAB9I84Fl2z1FqXqBtN03j+2DOZt6c/+4oLOCImgaM6dz/kebOOPJ5jkruzJS+bXlExnNhV1tsRol2RrQSajQQwzczjTSUt+yI8nh14q6yxW7HKi6l0DDy+ZwqCrV0ICz6JAucK8sqWUOTajNI0FHbslhhCbb0Itfeudh2bJZyeEWcDvi0ENuS9TWbZKoKtcRwR/TdCbYmB5fVgBkSeEnAsKWQASSH/bYZ3QYCvF2VKt/6HLliFpmkc37Unx3ft2UytEkI0Kwlgmo0EMM3IMAvYm34M4MQL/kEjAAu+cU03Gvjno2gUuNeS61qPWWWSb8X3v4GNrNIfGZP0JcG22lNpl2U+xvaiL/ENAlnYV/Ibp3b9gCBLVHPcphBCiFrIHJjmI3NgmlFp2U+AE7N8QotWPlm2YgCoMjwpX/dFgen/klRdqp/y5GoDQ7lIL/mi1mt6Tac/ePHVbuAy8thXvKDpbkwIIYRoZdID04yUqn2Nj4bSDllvTf2VWsBmjkIIIVqIDCE1G+mBaUahwScC1io9LYF8R3Sqfodr/uEkFVDO99ABnU6hU2q9plUPJiX0BCq+tBo6Nj2U5NDxjboXIYQQ9acp1SQPUZ30wDQjiyWO5E4/kpZ1PpjZVebBlM9p0UBXBmb5onKaBiEkEBp6EoWuZXjMYixaCGh2DDTCLfH0jPo7Yfa+B73uuIS7CclJILNsBcHWeIbF3kSItVOz3qsQQgjRkiSAaSamWYLT9Qsezw5iIm7BbhuM07OBUvdKDKOYYtcqUPlYcBBs7YPHdOJWaWhaGEHWRIJt52DRo7Hq0RiqBKseRUzwMWh1SGm26kEMjL6MmKCBWDQ7YbbkFrhjIYQQ1cgQUrORAKYZGEY2mVmn4/bu8n/velTFvkeU74WkgQZKuSnxrqRiyMejCthf8DhuZS3fWgB/RlJ00NEckfAKumY76PXzXFv5Yd+NuM0iACLtPTi5yyvYLeEHPU8IIUTTkiyk5iNzYJpBYdHTeLx7/EGzoSqDcLOG8gf2qegobFrlpNuKPavznL+TWfzlIa//Z9ZsPGZJZXvcu1mf904970IIIYRou6QHphkYxj6qhyoV+w0FrqKrHbAJkVb+f9oBx3zJ1lacxv5DXr/Ysx91wPVLvOl1br8QQogmIkNIzUZ6YJqB3T484HnVPae1A74TD9ywUZUfq5qLVDnx10u4fcghrx8fNLja7tSxjoH1uAMhhBBNoWIIqbEPUZ0EMM0gPOwGQoJPr9yGUQMLepUF6QIduELL/7d37/FRVnfixz/nmcnM5EIuJJAQRJAAReXmNWIvbDVrEF8L2N/+VGq9sBSrW1stFW+LQltfi9r1VnRFqVRlVdRfWdwVlzamhVWJoFyqVLGAXJUECOSeuT7n98dcMpMMl0nmyeTyffN6THjmzMz5JuOL7+uc8z3HROHT4TJoFRq1MRie+1PyM6ac8v0vHnwXA51tW9aPHDCNb+T+YyejEUIIIXoemUKygFIO8gc+S25gEf5AA1p7SEs7i9bWPbi9fyEt7Qzcvt00tm4hzV5EdkYp/kALjZ7NZDgmkekaS5otF1N7cNgL8AXqSLPlkGbLO633d9lyKT9jKa3+o9gMJ+n2gRZHDH7Th904+eJiIYTod2QKyTKSwCSZ1gGO1z9Ac/PLQABTB0dY/JGpouBWdX6tQClaPVDnWYZP20Apat2vEKgPHikQPlbARGFi54zsGxiVd89JS6m9gSY21DzI1y0bMJSdcXlzODfv5g4nWCfL/pZdrNj7BMd9R8mxD+QHw+/grKzEDiwUQoi+SqqQrCNTSEnW2PQszc0vEp4YUgQ/fOHkRQP+UAk1BBfx2hQYqm3RraGiz0QiNInk40DDSxxoWHHS9//oyKMcaqkCNKb28cmxpexvejd5AUZxB1pY9uW/UuerBaDBf5zf7llMs7/BkvcTQoheRyfpEh1IApNkbs97RH/aVCRXiT5QIPpIxyBb+JHI7ajXoO0XddxdddL3r27dFFOBpLBR0/pxQjGcrmr3QVoDzejIwZEaj+nmq9a9lryfEEIIESYJTJLZjAKid3ZpqzJqS13iaV9eHftY+Nk2HLaTr2dx2fLavYvGeZprZxKVZc9O6L4QQvRHUoFkDUlgkix7wDyUygQU4fO3guXTQcGxl1BKE35cEzwnScfej05dTGzYjQGMyPnnk77/+QV3ojBQoXqndPtgvpF7bVJia6/AWcQ386cCYIQ+ShflfZchruGWvJ8QQvQ6WifnEh3IIt4kS0sroahwHa2t/43ff4hm93rSzBa02YxfB9eKGGgC2AAztMjXhsIIjcLYsBu5ZDsnYKh00mxDQDlx2AcxOONKnKc4lHFIRilXDlvB1y0bsBvpjMi6AofNuhGRmUNvZvSAcdS4DzLYWcy4nIstWzAshBBChEkCk2Raezle9wBu97uAD782g8t5I8cJBHfktWk//tDyXIWJ0iYKJy77WLLTL6E4+3aqm/6T/fUv4DFrMUij2bePbwx84JQJQq6zhFxnSadjqPfWsOHoG7QE6jkzYzwXDvwHlIo/WKeUYlzORYzLuajT7yeEEH2VVCFZRxKYJKs5MhOfb2tkxM8eOhbAD4SPE4BgpRFa4wXQigAGGj8tvk9p8f2VI02raAg0EJzl05j4+brxFUyzlXMGLbas/83+47y4505aA41oNH9r3EC9r4ayolsse08hhOizZB8Yy8gamCQKBKrx+bYCoeqjULZi0HY0QLj+SBNMYsK/AB3Zozf4aMA8hhH51LZVLdU0v2VpDJ83vE9LoCFUyRR8/4+P/Rembr9fsBBCCJE6MgKTRFr7T/xYu7+3HdCY4Hsk2D5Rpg5E+tb2nmYooTnxBnpCCCE6Umbw6upriI5kBCaJbLah2GxnxtwLH8wYHl+JTgxMHT0yEz3OqFCkhzazi00l8pyXWNP5kDEDLsGuHKEqpmBPzs7+DjYlxwQIIUTCZCM7y0gCk0RKKYoG/xG7/VzCZdQmwT15gz/oth1hAuHSaVRwN16CIx92I4+89CsYN+Rtzsj6AQbO8KuT65zMpKJllsaQ6yji+hGPMjxzAgXO4Vw4cAZXFf/M0vcUQgghEiUJTBJp7cXtXo/DPob09JmgRkRWkvgJn2kU/D6AwsBFetp4Bg34CQMz/w+Dsq6laMAcBmZMw25kMabgQf5uxKdcNuILLhuxg/OKfscx9yYONb1Di+/gaffLZ7awr+l/2du4Hm+g+ZTth6SPZtbwf2VuybOUFd1CmuE85XOEEEJ01NVN7DpbxfTMM88wYsQIXC4XpaWlbNq06YRtfT4fv/zlLykpKcHlcjFx4kTWrl0b02bRokUopWKusWNTe+6drIFJEtNs4eiRf8Dv/xxTa8KrYcJTR9B2OpIR/IKpPbh9n9Lq204AFTn/SGtQKouzC18hyzkxdC/AtsN3crilMvQqaZxX+BsGZUw5ab9a/Ed5e/+tNPmrAci0D+aqYc+SlVaYxOiFEELElYyN6BJ8/uuvv868efNYunQppaWlPPnkk5SXl/PFF18weHDHvcQWLFjAf/zHf7Bs2TLGjh3LH/7wB66++mo2bNjAeeedF2l37rnn8u67bWfr2e2pTSFkBCZJmpt/i9//ORBOVGL54izXNdrOdAydhdR2HpKpm9lTe1+kbXXzHyLJC4DGz6dH7ovs3nsim48uo9l/JPL3Fn8tHx9denpBCSGE6JJUjMA8/vjjzJ07l9mzZ3POOeewdOlSMjIyWL58edz2K1as4P7772fatGmMHDmS2267jWnTpvHYY4/FtLPb7RQVFUWugoKCzv5YkkISmCQJ+A9Evo/3WYt7T7cVSKt290Hj8X8Vudfq/4rYKiCNz6zD1N6T9qvR9zU6KqXSBGj0fX3S5wghhOh5GhoaYi6Px9OhjdfrZfPmzZSVlUXuGYZBWVkZVVXxDwP2eDy4XK6Ye+np6bz//vsx93bu3ElxcTEjR47k+uuvZ//+/UmIqvMkgUmSNMfEyPfxSqONOCmMUvEXmQf3jzHIdI6P3Mtxnkvs2I5Bhn0EtlOsTxnkOjtSURTsm8Eg1zknfY4QQogkSWIV0rBhw8jJyYlcixd33NT06NGjBAIBCgtjlwkUFhZSXV0dt4vl5eU8/vjj7Ny5E9M0qaioYNWqVRw6dCjSprS0lBdffJG1a9fy7LPPsmfPHr797W/T2NjY6R9NV8kamCTJyPg+Xs9HtLa+iR3wtXvcDkSPlYQrlMKnUPvDxzyGjhxwpZUwMv/Xkfb56ZcyKvcn7Kp7muAJ04M4r/CpU/brvPx/4phnF1+1BBdwFaWfxwUFczsfqBBCiNOWzKMEDhw4QHZ229l2TmdyCiyeeuop5s6dy9ixY1FKUVJSwuzZs2OmnK688srI9xMmTKC0tJThw4fzxhtvMGfOnKT0I1GSwCSJUgbZOQ/jcP4Qt/sv4Pbi14cIsJoANZj4UCg0OUAaqEIcDCUv6wqyMi/B69+NoTKw2wowlBOn/QyUit04riTvNoZlz8Jn1pFuH4pxGnuz2A0XVwx9jGZ/DQCZ9kI5bFEIIXqh7OzsmAQmnoKCAmw2GzU1NTH3a2pqKCoqivucQYMGsXr1atxuN7W1tRQXF3PvvfcycuTIE75Pbm4uY8aMYdeuXYkHkiSdmkJKpDwL4M0332Ts2LG4XC7Gjx/PO++8E/P4zTff3KE8a+rUqZ3pWkq0tvwPX39VTHX1SI7VXUFL63wC+l8I8DSagxj4sCtIwwSOE9BHCei/0qIrONh4Nzuqp7Dv2D18ceT77Kj5vzR7t3ZIXsIctlwy00acVvISppQiK62IrLQiSV6EEKI7hauQunqdJofDwQUXXEBlZVvRh2maVFZWMnny5JM+1+VyMXToUPx+P7///e+ZMWPGCds2NTWxe/duhgwZctp9S7aEE5hwedbChQvZsmULEydOpLy8nMOHD8dtv2HDBmbNmsWcOXPYunUrM2fOZObMmWzfvj2m3dSpUzl06FDkeu211zoXUTczzePUH/8hELWORQVXq7Ttqxu8ImcfqeCeMDpq+a7fPIJCE9D1fFn7M5o9n3RjFEIIIayQiiqkefPmsWzZMl566SU+//xzbrvtNpqbm5k9ezYAN954I/fd11blunHjRlatWsWXX37Je++9x9SpUzFNk7vvvjvS5q677mL9+vXs3buXDRs2cPXVV2Oz2Zg1a1ZSfk6dkfAUUnR5FsDSpUtZs2YNy5cv59577+3Q/qmnnmLq1KnMnz8fgF/96ldUVFTw9NNPs3RpWzmv0+k84fBWex6PJ2b1dUNDQ6JhJI3X8zFm1A67YdHJS/S98Ab9ul3tkQq1CN9v8FSR6ZxgVbeFEEL0Uddeey1HjhzhwQcfpLq6mkmTJrF27drIwt79+/djGG3jF263mwULFvDll1+SlZXFtGnTWLFiBbm5uZE2Bw8eZNasWdTW1jJo0CC+9a1v8eGHHzJo0KDuDi8ioQQmXJ4VnbmdqjyrqqqKefPmxdwrLy9n9erVMffWrVvH4MGDycvL47LLLuOhhx4iPz8/7msuXryYX/ziF4l03TKG7eQbwmniVSWF70Y/Gv29id3IS1ofhRBCpEj7MtPOvkaCbr/9dm6//fa4j61bty7m71OmTOGzzz476eutXLky8U5YLKEppM6UZ1VXV5+y/dSpU3n55ZeprKzkkUceYf369Vx55ZUEAvG2hIP77ruP+vr6yHXgwIG47bpDWtp4HPZgWXLkh6mDO7ZEpybhz18g8rgZ86hGYWIHFBlp48jPmN4d3RdCCGGhVB0l0B/0iCqk6667LvL9+PHjmTBhAiUlJaxbt47LL7+8Q3un05m08rGuUkqRP7iChrqFNLe8iIEvcvp0OP0K7UsXOQ8JpUNJjAYyKRjwQ9IdZ+P278Fuy6cg43sYhusE7yiEEEKIhBKYzpRnFRUVJdQeYOTIkRQUFLBr1664CUxPonWA1ubf4mldi4ra/cWMaqN0298V4YW8KrJ2psXzNzQtFGbfTpot/rQZQHXzH6lu+h+afPtJs+WR6xxHSe5c7EZmssMSQgiRDKYOXl19DdFBQlNInSnPmjx5ckx7gIqKipOWcx08eJDa2tqUlmedrsa6e2mo/wWmDp4OrXQwK4xOYAhVH5ntDg4wAK2baPX+D4cbX+SLmpkEzPinRR9s/H9sO3wnX7dU0OD7glr3h+yuX87G6h9ian/c5wghhEixJO7EK2IlXEadaHnWHXfcwdq1a3nsscfYsWMHixYt4uOPP44sLmpqamL+/Pl8+OGH7N27l8rKSmbMmMGoUaMoLy9PUpjWMM1GPK2vRj5fiuAeNkQdERBOV4IJjYr8N7q0Org1iw+vfx8NrX+K+15f1i2L1wPqPZ9SJyXXQgjRIymSsAYm1UH0UAmvgUm0POvSSy/l1VdfZcGCBdx///2MHj2a1atXM27cOABsNhuffPIJL730EnV1dRQXF3PFFVfwq1/9qsesczmxtimjeB+wznzozA6HEARpHf8+gHmSx4QQQoi+SGmdwBZ/PVRDQwM5OTnU19efcpvlZNJaU187C7fnf9vuoVEoWrWO3RdGgye0/0t0AXUA0Frhx8Cmcjin+E+k2TrW1e88voTddUujpqaCq2nS7UV8e+hq7EaGRVEKIUTf0h3/ZoTf45uXL8Ju71pRht/v5oPKRd3+b1xP1yOqkHorpRTZA5eh6hbR0vom4EMDAa0xCFYdAaDDm9jpmAMcg1VKCqWGMcAxkjPyHoybvACMyv1nDNL4quktPIF6DMNJjnMc5w68T5IXIYTooZJ5mKOIJQlMF2izieaGX+PzfEwwPVEEonbltRGaZFLBReTB0RdHqK0Th20YRbn3kZPx3VO+l1I2SvJupSTvVusCEkIIIXoJSWA6KRA4xPGayZjaGzn3KFwWjQomL22TcypyDlJAe0MjMB68gb+y7+gN5GZcw5kFj6cgCiGEEJZK0U68/UGnTqMW0HjsNghtWgfBtS/tP2PxPnM2FXxEEZxmUgrqWt6g1fu5hb0VQgiRCkrrpFyiI0lgOsn0740kKCf6aAXvd6xFChdTq6hWXv/BpPZPCCGE6Mskgekku2Ni5PsTlUsHf7ht6Y3WoSt0XxOsQNKAyzHGop4KIYRIGTNJl+hAEphOGpD3DAb5wWkgQpvYncbzwpVHwcMbg4bkPIDTPtyingohhEgVmUKyjizi7SRlZDFwyF/weTZQf/xPYH4BbCXAsVDFUXTSrNE6DfgGTttATGwYKpsM1zkMzPo+jrSCtpZaB3fzFUIIIcQJSQLTBcePXIff915kkkgB9lDyEjx5GoxI4uzDz3bcAUVAg4lBo28N1Y2/RjGAguw5HG75I62+XTjtZzA6/3GyXRekICohhBBJI1VIlpEppE5yt27A73sPICaBUUphRI2gqPBZRyqYLdoIH+oYfo5G00hNw5N4fLsAjcf/FZ8fno0vUNtN0QghhLBEZPFjFy/RgSQwndTa/O8opeJO98ROHwUFkxswVHS6E/yqCH4+jcjevSYB3UST91Mrui6EEKKbdPkgxyTs5NtXSQLTSXZ7Sczf23++4q1iCVYddXy0rRw79r7dyO18B4UQQog+TBKYTsrM/pfI96EZolCCEhzuC/9go6c/g+ckqQ6PaBSGMYAAChValjQwYypZUaXaQggheiGZQrKMLOLtJMNwkF+0k9rqs1HBE48w0WhFaJFuG62D5dMmCpQdpypAq3TstsGk2YeR7pjAwMx/pN69gRbfDlz2EQzKnCHVSEII0cspM3h19TVER5LAJMgMtNBQcxma4M65htaRlSvhtSzh720EExetbCjSMAC77QyGFvwOZ9qoDq9dkDkNmGZ5DEIIIURvJ1NICdA6QEPNpEjyorUmEFq5EkxYghVINoi6BzYdQGs3aDc+/272Vv8dPv+BlMUhhBCim8gUkmUkgUmA37sVTUto112FGZrhia5GCh/QaKiOX9vOPzI53vhCSmIQQgjRjXSSLtGBJDCJ0C0nfTiRNSumbu1qb4QQQoh+S9bAJMDuuAgV2noOwEChVez2/8FHgm3Co34aMHVwJMYM3cvOvKa7uy+EEKKbJeMsIzkLKT4ZgUmAMtLJyq8guLIltM4lnKRoTUBrzNDX8KnTAcAf2vvF1KBwUpS3hAynHBMghBB9nqyBsYyMwCRAaxNvy39ikIef45j40ejIaecajalAkQ5qNHZbGunOKeTlzscfqKXVuxlDZZNmP5P6lj9it+WT4ThfyqWFEEKIBEkCc5q0DtBwaCKaeiA4BmOgCKjwSIyJN9yWVrT5CV4TvL7N1Dc9jxuFqZsxNQSwE94pJjdjOmfmL0EpGQwTQog+J97ZMp15DdGB/Kt5mtwNSyCUvESzheqKfO3uh8uog5qw6cbQhnaK4MRSUF3Lf1Hf+k7yOyyEECLlwmtgunqJjmQE5jQFfJs73FORFCXOh0sF18e0P7qx4ylJNjy+vcnoohBCiJ6m7RC8rr2G6EBGYE6T3XlZh3s69AfiHN6oYz9zJorgUpf2Rf0B0h3nJLWvQgghRF8nCcxpcmbdjLKVdLjvDyUjtnb3o9MUm+1MlO1MAOxolHJF2g3O/jHZ6R2TIyGEEH2AVCFZRqaQTpNSiuzCdXhbN+Bpegav7xAmO4FQ+TQKAw04Ucb5uFylaNxkpP896a5L0dqLx7cbwxiA3cjH49+D3cgjzT4k1aEJIYSwikmcIfpOvIboQBKYOLTWmE1PoVuWo7Ubv/ZhYqI1mJgEwuMroaTYFkpeTMDUHvyBKpqaqzABt2c9RYNXYTNycTnOjryHTBsJIYQQnSdTSHHo1lfQzU+DbsHUfsxQ+qtUWyIc2psucimCZdUKsIeybQPw+T+n5sj3uzkCIYQQPYFUIVlHRmDiMN3/2/Z91IJbrcMLdtuOE4hQKjqfQUW26AWv7y8xxw0IIYToJ5KxhkUSmLhkBCYOZWQTfVxAosLJTfgzp5RDkhchhBAiiSSBicPI+hEoJ6AwwilMKBkJ/8CM8L2ocqPwCI2pY55Cbvb9VndZCCFETyRVSJaRKaQ4lH00tvw1aPdb4N+N3XQT8H8BpKP9f0Xjx0BhquAHK3zatIlGY8PmOA+lm0kzBjIgcw6ZGVemOiQhhBCpIFNIlpEE5gQCza9htvwWCAQ3oTPOxRvYAQQwQmtgbISPBtChtS8KtB2lcnHYS0hP/3sy0yV5EUIIIZJNEpg4/PWLofUFVGgSyI7GG9iGiirGV6E/4bqkYBUSmHjweN7FxKCp5XUCuf9Kdtbs7g9CCCFE6sk+MJaRNTBx6NYXI1VD4cW3Ks4fW+h4gHA7I9Q2mBUGP3F1DU+kJgghhBApJ2XU1pERmLjMDlVDp/vxUUpFFvMCaO1JYr+EEEL0KrIGxjIyAhOPfWIkCWnb+0UTfXijRgcX7UZVIIWvQOSFFJkZM7q370IIIUQ/IAlMHPb8V8F2VltZNCYaZ2QUJpzEmDo4TRRuFyA4caTVAGy2oQzI/CH5ub/q5t4LIYToMUydnEt0IFNIcdkxA8Vodke2eTGUD4cxE29gN5pPg+uyVD5pjsm4MqbjcE3F7/+MgHkYR9o4bLbCFMcghBAi5WQKyTKSwLSjtR9v9Rg0OlJnBGBqTSDwVqQyyQZojmF619DkfRtNLm59LNTaRUH+ctJd301FCEIIIUSfJ1NI7QTqHgKISl2CwhVG0XlwdIKDrgsdPgDgofbYbWgttW9CCNG/JWMXXhmBiUdGYNrzb4x7W2sdSldiP0jheyrqe9BoXY+p67GpPIs7LIQQoseSKSTLyAhMe2mXx72tlIo5mTosciq1ij652sAwBmGoXGv6KIQQQvRzksC0Y8uZB1GTQWHhiqPoiaW2omrQ6szIZolKDaBg4HI5gVoIIfo7qUKyjEwhtaOUgXPITrx1z6FbHwkd0AhK5ZKW8c94fV9helcAAVDnk5bxTZyuchzO8fj9X2GaR7DbR2EYWakORQghRKppM3h19TVEB5LAxOE5dBFQCxA5uFHrOgLND4Wqk3RwtEVvw9uyl5bmZ1Eqi6zse8jI/H4quy6EEEL0CzKF1I6/7nFUKHkJUygMZaBQ2GOOdPShzSMY2o1pHqGh7i487nXd3GMhhBA9VlcrkDq5CPiZZ55hxIgRuFwuSktL2bRp0wnb+nw+fvnLX1JSUoLL5WLixImsXbv2hO0ffvhhlFLceeedCfcrmSSBac/9StyCNY0OJjFKxfzQlGorsQY7Hvefu6GTQggheoUUrIF5/fXXmTdvHgsXLmTLli1MnDiR8vJyDh8+HLf9ggULeO6551iyZAmfffYZt956K1dffTVbt27t0Pajjz7iueeeY8KECZ36cSSTJDDtqZy4J59H7wvT/qPUdnijRhkDrOqZEEKI3iYFIzCPP/44c+fOZfbs2ZxzzjksXbqUjIwMli9fHrf9ihUruP/++5k2bRojR47ktttuY9q0aTz22GMx7Zqamrj++utZtmwZeXmp3yJEEph21MDn4t7XWhPQAUytOyQwJgZgwzDyyci80fI+CiGE6H8aGhpiLo/H06GN1+tl8+bNlJWVRe4ZhkFZWRlVVVVxX9fj8eByuWLupaen8/7778fc+/GPf8xVV10V89qpJIt427GljUZn/xeBhumReyYmptJobcNULgwdQBmFpLm+C7YCTLMBpbJIz7wem21QCnsvhBCiR9EkYSO74Jdhw4bF3F64cCGLFi2KuXf06FECgQCFhbHn8RUWFrJjx464L19eXs7jjz/Od77zHUpKSqisrGTVqlUEAoFIm5UrV7JlyxY++uijrsWSRJLAtKO9Wwk03NX299CZSAYG9ow5OHP/JYW9E0II0askcSfeAwcOkJ2dHbntdDq79rohTz31FHPnzmXs2LEopSgpKWH27NmRKacDBw5wxx13UFFR0WGkJpVkCimK9nxA4Ng1wJ7IPRX5ozFbf4unbkHqOiiEEKLfys7OjrniJTAFBQXYbDZqampi7tfU1FBUVBT3dQcNGsTq1atpbm5m37597Nixg6ysLEaOHAnA5s2bOXz4MOeffz52ux273c769ev5zW9+g91ujxmp6U6SwETRzc9h6vi/iPAiXrP1te7skhBCiN7MNJNznSaHw8EFF1xAZWVlVBdMKisrmTx58kmf63K5GDp0KH6/n9///vfMmDEDgMsvv5xPP/2Ubdu2Ra4LL7yQ66+/nm3btmGzddy9vjvIFFI03XI6jSzvhhBCiD4iBYc5zps3j5tuuokLL7yQiy++mCeffJLm5mZmz54NwI033sjQoUNZvHgxABs3buSrr75i0qRJfPXVVyxatAjTNLn77rsBGDBgAOPGjYt5j8zMTPLz8zvc706SwERRrmng3RL3sUjtkW1UN/ZICCGESMy1117LkSNHePDBB6murmbSpEmsXbs2srB3//79GEbbBIzb7WbBggV8+eWXZGVlMW3aNFasWEFubm6KIjg9Suuupoap19DQQE5ODvX19TELnBKltYnZuAR/81Ox98PpixqEq/ADlErrWoeFEEKkTLL+zTid9ygr+CfshqNLr+U3vbx7dLml/e2NOrUGJpEtigHefPNN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uOiii/jiiy9i2vztb39j+PDhSY5AWC7Vq4ittHLlSu10OvWLL76oP/vsM33LLbfo3NxcXV1drbXW+oYbbtD33ntvpP0HH3yg7Xa7/rd/+zf9+eef64ULF8Yto87NzdVvvfWW/uSTT/SMGTN6ZBl1suOura3VW7du1WvWrNGAXrlypd66das+dOhQt8cXT7Jj9nq9evr06fqMM87Q27Ztiykz9Xg8KYkxnmTH3dTUpO+77z5dVVWl9+7dqz/++GM9e/Zs7XQ69fbt21MSY3tWfL7b64lVSMmOu7GxUd911126qqpK79mzR7/77rv6/PPP16NHj9ZutzslMbZnxe961apVOi0tTT///PN6586desmSJdpms+n33nuv2+MTXdOnExittV6yZIk+88wztcPh0BdffLH+8MMPI49NmTJF33TTTTHt33jjDT1mzBjtcDj0ueeeq9esWRPzuGma+oEHHtCFhYXa6XTqyy+/XH/xxRfdEUpCkh337373Ow10uBYuXNgN0ZyeZMYcLhePd/35z3/upohOTzLjbm1t1VdffbUuLi7WDodDDxkyRE+fPl1v2rSpu8I5Lcn+fLfXExMYrZMbd0tLi77iiiv0oEGDdFpamh4+fLieO3duJDnoKaz4Xb/wwgt61KhR2uVy6YkTJ+rVq1dbHYawgNJa69SM/QghhBBCdE6fXQMjhBBCiL5LEhghhBBC9DqSwAghhBCi15EERgghhBC9jiQwQgghhOh1JIERQgghRK8jCYwQQggheh1JYIQQQgjR60gCI4QQQoheRxIYIYQQQvQ6ksAIIYQQotf5/7PSikofs4W0AAAAAElFTkSuQmCC", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], "source": [ "# Examine the results\n", "n_best = 3\n", - "num_p = len(parameters)\n", - "f_indices = [i for i in range(0, num_p) if metrics[i]['tpr'] > 0.1 and metrics[i]['tnr'] > 0.5]\n", + "f_indices = [i for i in range(0, n_params) if metrics[i]['tpr'] > 0.1 and metrics[i]['tnr'] > 0.5]\n", "for metric in ['tnr', 'tpr', 'g_mean', 'precision', 'f_measure', 'score']:\n", " print(f\"*** {metric} BEST {n_best} ***\")\n", " indices = copy.deepcopy(f_indices)\n", " indices.sort(key=lambda i: metrics[i][metric], reverse=True)\n", " for i in range(0, n_best):\n", " print(f\" i: {i}\")\n", - " print(f\" p: {parameters[indices[i]]}\")\n", + " print(f\" p: {sweep_parameters[indices[i]]}\")\n", " print(f\" m: {metrics[indices[i]]}\")\n", "\n", "\n", - "indices = [i for i in range(0, num_p) if metrics[i]['tpr'] != 0.0 and metrics[i]['tnr'] != 0.0]\n", + "indices = [i for i in range(0, n_params) if metrics[i]['tpr'] != 0.0 and metrics[i]['tnr'] != 0.0]\n", "print(len(indices))\n", "\n", "tpr_s = []\n", @@ -136,25 +215,57 @@ "for m in metrics:\n", " tpr_s.append(m['tpr'])\n", " scores.append(m['score'])\n", - " fpr = 0\n", - " fp = m['fp']\n", - " tn = m['tn']\n", - " if fp + tn != 0:\n", - " fpr = fp / (fp + tn)\n", - " fpr_s.append(fpr)\n", + " fpr_s.append(m['fpr'])\n", "fig, ax = plt.subplots()\n", "ax.set_title('TPR over FPR')\n", "sc = ax.scatter(fpr_s, tpr_s, marker='.', c=scores)\n", - "fig.colorbar(sc)" + "cb = fig.colorbar(sc)\n", + "cb.set_label('CLF Score')" ] }, { "cell_type": "code", - "execution_count": null, + "execution_count": 10, "id": "f205132e-fc81-45cc-8e1f-fab9a7e52631", "metadata": {}, - "outputs": [], - "source": [] + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + " i: 226\n", + " p: {'bf_params': {'n_jobs': -1, 'replacement': True, 'bootstrap': False, 'sampling_strategy': 'majority', 'n_estimators': 200, 'max_features': 5, 'criterion': 'gini', 'max_depth': 10, 'class_weight': 'balanced'}}\n", + " m: {'tp': 35, 'tn': 29110, 'fp': 492, 'fn': 183, 'tnr': 0.9833795013850416, 'tpr': 0.16055045871559634, 'fpr': 0.01662049861495845, 'g_mean': 0.39734371775439314, 'precision': 0.06641366223908918, 'f_measure': 0.09395973154362416, 'score': 0.977364185110664}\n", + " i: 227\n", + " p: {'bf_params': {'n_jobs': -1, 'replacement': True, 'bootstrap': False, 'sampling_strategy': 'not minority', 'n_estimators': 200, 'max_features': 5, 'criterion': 'gini', 'max_depth': 10, 'class_weight': 'balanced'}}\n", + " m: {'tp': 35, 'tn': 29023, 'fp': 579, 'fn': 183, 'tnr': 0.9804405107762989, 'tpr': 0.16055045871559634, 'fpr': 0.019559489223701102, 'g_mean': 0.39674951007970805, 'precision': 0.057003257328990226, 'f_measure': 0.08413461538461538, 'score': 0.9744466800804829}\n", + " i: 232\n", + " p: {'bf_params': {'n_jobs': -1, 'replacement': True, 'bootstrap': False, 'sampling_strategy': 'auto', 'n_estimators': 100, 'max_features': 5, 'criterion': 'gini', 'max_depth': 10, 'class_weight': 'balanced'}}\n", + " m: {'tp': 35, 'tn': 28962, 'fp': 640, 'fn': 183, 'tnr': 0.978379839200054, 'tpr': 0.16055045871559634, 'fpr': 0.02162016079994595, 'g_mean': 0.39633235041018294, 'precision': 0.05185185185185185, 'f_measure': 0.07838745800671892, 'score': 0.9724010731052984}\n", + " i: 1186\n", + " p: {'bf_params': {'n_jobs': -1, 'replacement': True, 'bootstrap': False, 'sampling_strategy': 'majority', 'n_estimators': 200, 'max_features': 5, 'criterion': 'gini', 'max_depth': 10, 'class_weight': 'balanced_subsample'}}\n", + " m: {'tp': 35, 'tn': 28966, 'fp': 636, 'fn': 183, 'tnr': 0.9785149652050538, 'tpr': 0.16055045871559634, 'fpr': 0.021485034794946286, 'g_mean': 0.39635971859378843, 'precision': 0.05216095380029806, 'f_measure': 0.07874015748031496, 'score': 0.9725352112676057}\n", + " i: 1191\n", + " p: {'bf_params': {'n_jobs': -1, 'replacement': True, 'bootstrap': False, 'sampling_strategy': 0.8, 'n_estimators': 200, 'max_features': 5, 'criterion': 'gini', 'max_depth': 10, 'class_weight': 'balanced_subsample'}}\n", + " m: {'tp': 37, 'tn': 29028, 'fp': 574, 'fn': 181, 'tnr': 0.9806094182825484, 'tpr': 0.16972477064220184, 'fpr': 0.019390581717451522, 'g_mean': 0.4079628765066602, 'precision': 0.060556464811783964, 'f_measure': 0.08926417370325694, 'score': 0.9746814218645204}\n", + " i: 1194\n", + " p: {'bf_params': {'n_jobs': -1, 'replacement': True, 'bootstrap': False, 'sampling_strategy': 'majority', 'n_estimators': 100, 'max_features': 5, 'criterion': 'gini', 'max_depth': 10, 'class_weight': 'balanced_subsample'}}\n", + " m: {'tp': 37, 'tn': 28959, 'fp': 643, 'fn': 181, 'tnr': 0.9782784946963043, 'tpr': 0.16972477064220184, 'fpr': 0.021721505303695696, 'g_mean': 0.40747772103089114, 'precision': 0.054411764705882354, 'f_measure': 0.0824053452115813, 'score': 0.9723675385647217}\n", + " i: 1203\n", + " p: {'bf_params': {'n_jobs': -1, 'replacement': True, 'bootstrap': False, 'sampling_strategy': 'not minority', 'n_estimators': 50, 'max_features': 5, 'criterion': 'gini', 'max_depth': 10, 'class_weight': 'balanced_subsample'}}\n", + " m: {'tp': 36, 'tn': 29072, 'fp': 530, 'fn': 182, 'tnr': 0.9820958043375447, 'tpr': 0.1651376146788991, 'fpr': 0.01790419566245524, 'g_mean': 0.4027169707306323, 'precision': 0.0636042402826855, 'f_measure': 0.09183673469387753, 'score': 0.9761234071093225}\n" + ] + } + ], + "source": [ + "# Look at that sweet spot in the ROC curve,\n", + "# These are about as good as we can get\n", + "indices = [i for i in range(0, n_params) if metrics[i]['tpr'] > 0.16 and metrics[i]['fpr'] < 0.022]\n", + "for i in indices:\n", + " print(f\" i: {i}\")\n", + " print(f\" p: {sweep_parameters[i]}\")\n", + " print(f\" m: {metrics[i]}\")" + ] } ], "metadata": { diff --git a/fp.py b/fp.py index f9fbe6a..6031d63 100644 --- a/fp.py +++ b/fp.py @@ -81,6 +81,10 @@ def score_classifier(clf, x, y): tpr = 0 if true_pos + false_neg != 0: tpr = true_pos / (true_pos + false_neg) + + fpr = 0 + if false_pos + true_neg != 0: + fpr = false_pos / (false_pos + true_neg) g_mean = math.sqrt(tnr * tpr) @@ -99,6 +103,7 @@ def score_classifier(clf, x, y): "fn": false_neg, "tnr": tnr, "tpr": tpr, + "fpr": fpr, "g_mean": g_mean, "precision": precision, "f_measure": f_measure,