{"cells": [{"cell_type": "markdown", "metadata": {}, "source": ["# Classification multi-classe et stacking\n", "\n", "On cherche \u00e0 pr\u00e9dire la note d'un vin avec un classifieur multi-classe puis \u00e0 am\u00e9liorer le score obtenu avec une m\u00e9thode dite de [stacking](https://www.quora.com/What-is-stacking-in-machine-learning)."]}, {"cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [{"data": {"text/html": ["
run previous cell, wait for 2 seconds
\n", ""], "text/plain": [""]}, "execution_count": 2, "metadata": {}, "output_type": "execute_result"}], "source": ["from jyquickhelper import add_notebook_menu\n", "add_notebook_menu()"]}, {"cell_type": "markdown", "metadata": {}, "source": ["## Le probl\u00e8me\n", "\n", "Il n'est pas \u00e9vident que les scores des diff\u00e9rents mod\u00e8les qu'on apprend sur chacun des classes soient comparables. Si le mod\u00e8le n'est pas assez performant, on peut songer \u00e0 ajouter un dernier mod\u00e8le qui prend la d\u00e9cision finale en fonction du r\u00e9sultat de chaque mod\u00e8le."]}, {"cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [{"data": {"image/png": "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\n", "text/plain": [""]}, "execution_count": 3, "metadata": {"image/png": {"width": 400}}, "output_type": "execute_result"}], "source": ["from pyquickhelper.helpgen import NbImage\n", "NbImage('images/stackmulti.png', width=400)"]}, {"cell_type": "code", "execution_count": 3, "metadata": {}, "outputs": [], "source": ["%matplotlib inline"]}, {"cell_type": "code", "execution_count": 4, "metadata": {"scrolled": true}, "outputs": [], "source": ["from papierstat.datasets import load_wines_dataset\n", "df = load_wines_dataset()\n", "X = df.drop(['quality', 'color'], axis=1)\n", "y = df['quality']"]}, {"cell_type": "code", "execution_count": 5, "metadata": {}, "outputs": [], "source": ["from sklearn.model_selection import train_test_split\n", "X_train, X_test, y_train, y_test = train_test_split(X, y)"]}, {"cell_type": "code", "execution_count": 6, "metadata": {}, "outputs": [{"data": {"text/plain": ["OneVsRestClassifier(estimator=LogisticRegression(C=1.0, class_weight=None,\n", " dual=False, fit_intercept=True,\n", " intercept_scaling=1,\n", " l1_ratio=None, max_iter=1500,\n", " multi_class='auto',\n", " n_jobs=None, penalty='l2',\n", " random_state=None,\n", " solver='lbfgs', tol=0.0001,\n", " verbose=0, warm_start=False),\n", " n_jobs=None)"]}, "execution_count": 7, "metadata": {}, "output_type": "execute_result"}], "source": ["from sklearn.linear_model import LogisticRegression\n", "from sklearn.multiclass import OneVsRestClassifier\n", "clr = OneVsRestClassifier(LogisticRegression(max_iter=1500))\n", "clr.fit(X_train, y_train)"]}, {"cell_type": "code", "execution_count": 7, "metadata": {}, "outputs": [{"data": {"text/plain": ["53.907692307692315"]}, "execution_count": 8, "metadata": {}, "output_type": "execute_result"}], "source": ["import numpy\n", "numpy.mean(clr.predict(X_test).ravel() == y_test.ravel()) * 100"]}, {"cell_type": "markdown", "metadata": {}, "source": ["On regarde la matrice de confusion."]}, {"cell_type": "code", "execution_count": 8, "metadata": {}, "outputs": [{"data": {"text/html": ["
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
3456789
30021010
4003915100
500314201200
600170537900
700172332500
800247600
90002100
\n", "
"], "text/plain": [" 3 4 5 6 7 8 9\n", "3 0 0 2 1 0 1 0\n", "4 0 0 39 15 1 0 0\n", "5 0 0 314 201 2 0 0\n", "6 0 0 170 537 9 0 0\n", "7 0 0 17 233 25 0 0\n", "8 0 0 2 47 6 0 0\n", "9 0 0 0 2 1 0 0"]}, "execution_count": 9, "metadata": {}, "output_type": "execute_result"}], "source": ["from sklearn.metrics import confusion_matrix\n", "import pandas\n", "df = pandas.DataFrame(confusion_matrix(y_test, clr.predict(X_test)))\n", "try:\n", " df.columns = [str(_) for _ in clr.classes_][:df.shape[1]]\n", " df.index = [str(_) for _ in clr.classes_][:df.shape[0]]\n", "except ValueError:\n", " # Il peut arriver qu'une classe ne soit pas repr\u00e9senter\n", " # lors de l'apprentissage\n", " print(\"erreur\", df.shape, clr.classes_)\n", "df"]}, {"cell_type": "markdown", "metadata": {}, "source": ["On cale d'abord une random forest sur les donn\u00e9es brutes."]}, {"cell_type": "code", "execution_count": 9, "metadata": {}, "outputs": [{"data": {"text/plain": ["67.44615384615385"]}, "execution_count": 10, "metadata": {}, "output_type": "execute_result"}], "source": ["from sklearn.ensemble import RandomForestClassifier\n", "rfc = RandomForestClassifier()\n", "rfc.fit(X_train, y_train)\n", "numpy.mean(rfc.predict(X_test).ravel() == y_test.ravel()) * 100"]}, {"cell_type": "markdown", "metadata": {}, "source": ["On cale une random forest avec les sorties de la r\u00e9gression logistique."]}, {"cell_type": "code", "execution_count": 10, "metadata": {"scrolled": false}, "outputs": [{"data": {"text/plain": ["RandomForestClassifier(bootstrap=True, ccp_alpha=0.0, class_weight=None,\n", " criterion='gini', max_depth=None, max_features='auto',\n", " max_leaf_nodes=None, max_samples=None,\n", " min_impurity_decrease=0.0, min_impurity_split=None,\n", " min_samples_leaf=1, min_samples_split=2,\n", " min_weight_fraction_leaf=0.0, n_estimators=100,\n", " n_jobs=None, oob_score=False, random_state=None,\n", " verbose=0, warm_start=False)"]}, "execution_count": 11, "metadata": {}, "output_type": "execute_result"}], "source": ["rf_train = clr.decision_function(X_train)\n", "\n", "rfc_y = RandomForestClassifier()\n", "rfc_y.fit(rf_train, y_train)"]}, {"cell_type": "markdown", "metadata": {}, "source": ["On calcule le taux d'erreur."]}, {"cell_type": "code", "execution_count": 11, "metadata": {}, "outputs": [{"data": {"text/plain": ["64.8"]}, "execution_count": 12, "metadata": {}, "output_type": "execute_result"}], "source": ["rf_test = clr.decision_function(X_test)\n", "numpy.mean(rfc_y.predict(rf_test).ravel() == y_test.ravel()) * 100"]}, {"cell_type": "markdown", "metadata": {}, "source": ["C'est presque \u00e9quivalent \u00e0 une random forest cal\u00e9e sur les donn\u00e9es brutes. On trace les courbes ROC pour la classe 4."]}, {"cell_type": "code", "execution_count": 12, "metadata": {}, "outputs": [{"data": {"text/plain": ["(0.7485466126230457, 0.6752634626519977, 0.6984597568037059)"]}, "execution_count": 13, "metadata": {}, "output_type": "execute_result"}], "source": ["from sklearn.metrics import roc_curve, roc_auc_score\n", "fpr_lr, tpr_lr, th_lr = roc_curve(y_test == 4, clr.decision_function(X_test)[:, 2])\n", "fpr_rfc, tpr_rfc, th_rfc = roc_curve(y_test == 4, rfc.predict_proba(X_test)[:, 2])\n", "fpr_rfc_y, tpr_rfc_y, th_rfc_y = roc_curve(y_test == 4, rfc_y.predict_proba(rf_test)[:, 2])\n", "auc_lr = roc_auc_score(y_test == 4, clr.decision_function(X_test)[:, 2])\n", "auc_rfc = roc_auc_score(y_test == 4, rfc.predict_proba(X_test)[:, 2])\n", "auc_rfc_y = roc_auc_score(y_test == 4, rfc_y.predict_proba(rf_test)[:, 2])\n", "auc_lr, auc_rfc, auc_rfc_y"]}, {"cell_type": "code", "execution_count": 13, "metadata": {}, "outputs": [{"data": {"image/png": "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\n", "text/plain": ["
"]}, "metadata": {"needs_background": "light"}, "output_type": "display_data"}], "source": ["import matplotlib.pyplot as plt\n", "fig, ax = plt.subplots(1, 1, figsize=(4,4))\n", "ax.plot([0, 1], [0, 1], 'k--')\n", "ax.plot(fpr_lr, tpr_lr, label=\"OneVsRest + LR\")\n", "ax.plot(fpr_rfc, tpr_rfc, label=\"RF\")\n", "ax.plot(fpr_rfc_y, tpr_rfc_y, label=\"OneVsRest + LR + RF\")\n", "ax.set_title('Courbe ROC - comparaison de deux\\nmod\u00e8les pour la classe 4')\n", "ax.legend();"]}, {"cell_type": "markdown", "metadata": {}, "source": ["La courbe ROC ne montre rien de probant. Il faudrait v\u00e9rifier avec une cross-validation qu'il serait pratique de faire avec un [pipeline](http://scikit-learn.org/stable/modules/pipeline.html) mais ceux-ci n'acceptent qu'un seul pr\u00e9dicteur final."]}, {"cell_type": "code", "execution_count": 14, "metadata": {}, "outputs": [{"name": "stdout", "output_type": "stream", "text": ["ERREUR :\n", "All intermediate steps should be transformers and implement fit and transform or be the string 'passthrough' 'OneVsRestClassifier(estimator=LogisticRegression(C=1.0, class_weight=None,\n", " dual=False, fit_intercept=True,\n", " intercept_scaling=1,\n", " l1_ratio=None, max_iter=1500,\n", " multi_class='auto',\n", " n_jobs=None, penalty='l2',\n", " random_state=None,\n", " solver='lbfgs', tol=0.0001,\n", " verbose=0, warm_start=False),\n", " n_jobs=None)' (type ) doesn't\n"]}], "source": ["from sklearn.pipeline import make_pipeline\n", "try:\n", " pipe = make_pipeline(OneVsRestClassifier(LogisticRegression(max_iter=1500)),\n", " RandomForestClassifier())\n", "except Exception as e:\n", " print('ERREUR :')\n", " print(e)"]}, {"cell_type": "markdown", "metadata": {}, "source": ["On construit une ROC sur toutes les classes."]}, {"cell_type": "code", "execution_count": 15, "metadata": {}, "outputs": [{"data": {"text/plain": ["(0.5510406569489914, 0.753562533633215, 0.7354245943989535)"]}, "execution_count": 16, "metadata": {}, "output_type": "execute_result"}], "source": ["fpr_lr, tpr_lr, th_lr = roc_curve(y_test == clr.predict(X_test), \n", " clr.predict_proba(X_test).max(axis=1), drop_intermediate=False)\n", "fpr_rfc, tpr_rfc, th_rfc = roc_curve(y_test == rfc.predict(X_test), \n", " rfc.predict_proba(X_test).max(axis=1), drop_intermediate=False)\n", "fpr_rfc_y, tpr_rfc_y, th_rfc_y = roc_curve(y_test == rfc_y.predict(rf_test), \n", " rfc_y.predict_proba(rf_test).max(axis=1), drop_intermediate=False)\n", "auc_lr = roc_auc_score(y_test == clr.predict(X_test), \n", " clr.decision_function(X_test).max(axis=1))\n", "auc_rfc = roc_auc_score(y_test == rfc.predict(X_test), \n", " rfc.predict_proba(X_test).max(axis=1))\n", "auc_rfc_y = roc_auc_score(y_test == rfc_y.predict(rf_test), \n", " rfc_y.predict_proba(rf_test).max(axis=1))\n", "auc_lr, auc_rfc, auc_rfc_y"]}, {"cell_type": "code", "execution_count": 16, "metadata": {}, "outputs": [{"data": {"image/png": "iVBORw0KGgoAAAANSUhEUgAAAQQAAAEXCAYAAABLSjo/AAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADh0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uMy4xLjEsIGh0dHA6Ly9tYXRwbG90bGliLm9yZy8QZhcZAAAgAElEQVR4nOydd1gVxxqH36EJCmIBGwjYe0OisVdiiSXGmERjjNH0GDXtxpLEkpioKWqMJc2YG6+9d+y9Yu+KigpWRBCkc+b+sevxgJQDHISD8z4PD2d3dme/bb+d9n0jpJQoFAoFgE1eG6BQKPIPShAUCoURJQgKhcKIEgSFQmFECYJCoTCiBEGhUBh5qgVBCDFbCPFtXtuhyBpCiBFCiD/z2IZtQoi3LJRXsBCivSXyyin5ThCEEH2EEIFCiGghxA0hxDohRPO8tisz9AckTrc7TAixVAhRNtU2NYUQK4UQkUKIKCHEViFE01TbOAghRgshLgghHugPyywhhM+TPJ/8jJTyOymlRV5GRUrylSAIIT4BJgPfAaUBL2A60D0XjmVr6TyBQVJKZ6Ay4Az8aHK8SsBu4ARQASgHLAM2CCGamOSxGOgG9AFcgXrAIaBdLtib7xBC2OW1DU81Usp88Yf28EcDvTLYphCaYFzX/yYDhfS0/sCuVNtLoLL+ezYwA1gLPADa6+tmAhuBKGA74G2yf3U9LRw4B7ycgW3bgLdMlj8ATpks/wusTWO/GcAO/Xd7IBYob8Hr6gT8BFwBIoFdgJOe1g04BUTo9tcw2S8Y+Bw4rl+vv9BEep1+rTYBxfVtffRr/Y5+X24An5rk1QjYqx/nBvAr4JDqPn0IXAAu6+umANeA+2iC2MJk+9HAHP23IzAHuKvnfxAoraeVA1bq9y8IeDtVHguB/+rncwrwy+A6+gNn9Wv4q/6smN7vAcAZ4B4QYPocpZHX6/r9uAuM1K91ez3NBhgGXNTTFwIl9LTWQEiqvEz3XQv8ZJK2AJiVpeclL0Ug1Yl1BJIAuwy2GQvsA0oB7sAe4BtpviBEAs30i+6or4sCWqKJzZSHeQBF9AfyTcAO8AXCgFqZCQJQEu2FWWGSfhN4M4392gDJQGFgPLDdwtd1mm6bB2ALNNXPtSrai+4P2AP/0V8aB5MHbR+aCHgAt4HDQAN9/y3AqFSCME+/bnWAOyYPakPgWf06+qC9OENT3aeNQAkeiVVf/TraAZ/q188xDUF4F1ilXz9b/VhF9bTtaCVMR6C+blM7kzzigM76ft8D+9K5hm5owvSSfq0+RntWH97vF/RrV0O390tgTzp51UT78D185n7W83p4rYbq191TT/8NmGemIJTR71Nb4DXgEuBirYLwGnAzk20uAp1NljsAwVkQhP+mSp8NzDdZdkZ7OcsDrwA7U23/G/pLkI4gxKCJjgSOAl4m6UlAxzT2q65v7wH8YWqPBa6pDVqJo14aaV8BC1NtGwq0NnnQXjNJXwLMMFn+CFiu//bRz6G6SfpE4K907BoKLEt1n9pmci73Hp4HKQVhANqHoW6q7cvr99LFZN33wGyTPDaZpNUEYtM5dj9MxAIQQAiPBGEdMDDVtYwhjVIC8HWqZ64IkMCjl/oMumjpy2WBRDShaU0GgqAvv4j2IQsDmmf1mclPbQh3AbdM6pDl0IpaD7mirzOXaxmtk1JGoxUvywHeQGMhRMTDPzTRKpNB/oOllK5AXaA4mso/JAzt5qamLGBAe+DvprNNmgghXtMbMaOFEOvS2MQN7et4MY20FNdSSmlAuxYeJtvcMvkdm8ayc6o8Ta+v8d4IIaoKIVYLIW4KIe6jtRG5ZbAvQohPhRBn9AbYCLQqZep9QKuKBQDzhRDXhRAThRD2+rHDpZRRqWwyPb+bJr9jAMd0nr9ypHxOZCp7vYEpJs9JOJpoePA4qfN6gHbfTfNaZpLXGTRhK51GXmmxGq3Ec05KucvMfYzkJ0HYi1aEeyGDba6jXbCHeOnrQCv+Fn6YIIRI68VNy7WzvMk+zmjF1utoN227lLKYyZ+zlPL9zE5ESnkC+BaYJoQQ+upNQK80Nn8Z2CuljNG3aSSE8Exju7SO8z/dJmcpZac0NglDu6aV0khLcS11O8ujlRKyS3mT36b3ZgZa/buKlLIoMALthTHFeG+EEC2AL9CuTXEpZTG0klfqfZBSJkopx0gpa6JVh7qgfdGvAyWEEC6pbMrO+d0g5XMiSHmu14B3Uz0rTlLKPWbkVRitamSaV6dUeTlKKUN5/Bm3Ras6mzIOTUTKCiF6Z/VE840gSCkj0YpT04QQLwghCgsh7IUQnYQQE/XN5gFfCiHchRBu+vZz9LRjQC0hRH0hhCNakdAcOgshmgshHIBvgP1SymtoSltVCPG6boe9EOIZIUQNM/P9B62to5u+PAZoKoQYJ4QoIYRwEUJ8hPbwfqFfg01odellQoiGQgg7fbv3hBADzDyuEf2rPwv4WQhRTghhK4RoIoQohNZY9bwQop3+Rf0UiEcrfmeXr/T7Vgut7WWBvt4FrQ4eLYSoDmQmqi5oVaw7gJ0Q4mugaFobCiHaCCHq6C/HfbTidbJ+D/cA3wshHIUQdYGBwP+ycV5r0J6tF/USxGBSlhRnAsP180YI4SqESEv8QetF6mLyzI0l5Xs4ExgnhPDW83IXQjzsZTuPVop5Xr9nX6K1Mzy8Fi3Rrns//W+qECKtUkq65BtBAJBS/gx8gnaid9DUchCwXN/kWyAQreX7BFoj17f6vufRLu4mtNZqc4tLc4FRaMW8hmjVAvSi5nPAq2hfm5vABExuQCbnkgD8glZXR0p5AWiO1o0YjPal6Al0kFLuNtn1JbTW4gVoX8WTgJ9+XtnhM7RrdVA/xwmAjZTyHFrD3VS0kkRXoKtud3bZjta4thn4UUq5wcSGPmgNuH/wSCjSIwCtXn4erZgfR9rVPdBezMVoYnBGt+HhR6I3WvvGdbQu3lFSyo1ZPSkpZRha6W48WvG+CloX8sP0ZWjXdb5eJToJpFViQ0p5Cq1HZS7aM3APrT3iIVPQekY2CCGi0BoYG+v7RqL1Xv2JVtJ58HBfIURRtB6TQVLKUL268Bfwt0kpNVOE3hChUGQbfdDUZcBeSpmUt9YockK+KiEoFIq8RQmCQqEwoqoMCoXCiCohKBQKI0oQ0kCkcosWQvgJIQ4LIUqmsW2+cV19mtA9QudkvqXFjieFEJWf1PHyCiUIZiClDEQbqvuP3v9bYLH0i6YE07pQrqZmoo8V6JLXdlgSIYSd6iZUmGK1JQT9y/O5EOK40AKJ/CWEKC20gCpRQohNQojiJtt3E0Kc0seIbzMdcSiEaKBXCaKEEAvQxv+bHquLEOKovu9eIUT9dGyyEUIME0JcFELcFUIsFEKU0NMchRBz9PURQoiDQog0x6fr5zZcCHFaCHFPCPG3PvryYfrbQoggIUS40AKuPPQZ8NGLtnYm2xoj+wgh+gshdgshJgkhwkk1mlMI0RFtWPErQvOPOKavL6cfJ1w/7tsm+6SuXrUWQjwcLPMv2nDhVXp+/9HXPyuE2KNfh2NCiNYm+/cXQlzS78VlIcRraV2jNK5ZjvMU2kjOEfr9ixJCHBJClE9ju+eFEEeEEPeFENeEEKNN0tK9zxnZIYQYIDTfjXtCiADxaKSi0O/XbaH5dRwXQtQ255pki6x6Q+WXP7Lmnpuuq6/+dwXNpdUebaRgIvCtvq8v2qjJJmhOIwOAqzxyxQ3GPNfVdN100zm3k2hj3kugjYp7aE9btJGFvvoxpvIonoIPmk+AnUle23jkldcfbUjwR2ilQ6c0jj0a3ZPQZF1GbsSzH9qmL7fGxCOPx73xPNBG+3VG+yD568vuaJ5/94Fq8pGnX3ru5kY7LZjn52ijOquh+U3UA0rqaaaes63RXLxt0BzZbgEvZHSfM7KDDNyn0Tx6DwHFdJtqAGVz7b3K6xc7h4Jgrntuuq6+aH7p19G7YPX0PTx6AWcA41Id+zwp3YTNcV1N0003g3N7z2S5M3BR//0XMNEkzVk/hg/mCcLVTI49GhNBIHM34tlkTRC+AP5NdcwA4A39pYlAG9L9mFilZ6cF8zwHdE8nzSgIaaRNBibpv9Nzx07XDjJwn0b7AJxHiydhk9vvldVWGXTMdc/NyNW3HBAq9TuhY+pi7Q0MEEKcffiH5nxTKg17MnJdTc9NNz3SdCVO41yi0b6G5jqxpOcTkB7muBFnBW+gl0jpVt4c7av3AC0OxXvADSHEGqE5Qz2pPMuTtqt4CoQQjYUWD/OOECJSz/uha3aa9zkTO9J1n5ZSbkGL0DQNuCWE+F1ofgu5grULgrlk5Op7A/DQ1z3Ey+T3NWC6lLK6yV9ZKeXCNI6TruuqTN9NNz3ScyVOfS5F0NxnHzq7gImLLI/Hb8hsJFrq9MzciFO45JpxvGtoX3PTa1RESjkeQEoZIKX0RytdnUVzhsoMS+V5jbRdxVMzF80BqbzU4l/MRHfNzug+Z2BHhu7TUspfpJQNgVpo1d/PzbAxWzwtgpCRq+9etHr1YKG5G7+IFgPwIX8A7wnNbdhGCFFEb1RySX0QMnBdFem46WZg84dCCE+hNUqO4JGH4FzgTaG5eRdCCzayX0oZLKW8g/ai9tUbyAZg3gNuyi3ARwhhAyAzdyM+iuZCXkJoMSiGppFfRZPlOUBXIUQH3UZHoTVEegqtUbibLnLxaKHGMrpGls7zT+AbIUQVvTGvrkhj7AlaCTFcShknhGiE5skJpH+fM7EjXfdpobncN9af2wdonp/mXJPskdt1ktz64/G66RxgtMnyW6QMkdUDOI3mUrwdk4YlNPfiI2juuQv0P9N6cUc09+GHQUIXodepeTxA5idoddEotOLnd3pab339A7SX5BfSiR+p5zlctzcCLbZCYZP09/S8w9HiNniapHVC8zyMQAuuagwGShph5tI4dkk01/F7wGF9nad+nHD9uKbtG4769bqP5pb+MSnbELqjNcJGAJ/p6xrrdoWjNVCuQSt1lNXXR/Io8GvNdOwcTcq2DkvkaYvWoHdZv38HH15bUjYqvoRWbYrSr8uvPGrPSPM+Z2YHWuDVE/p1vIYeHBUt2vZxNAEJQxNi59x6r5QvQz5ECBGM9hJnNwaCQpEtnpYqg0KhMAMlCAqFwoiqMigUCiOqhKBQKIzkmXOTm5ub9PHxyavDKxRPLYcOHQqTUqYO3w7koSD4+PgQGBiYV4dXKJ5ahBBX0ktTVQaFQmFECYJCoTCiBEGhUBhRgqBQKIwoQVAoFEYyFQQhxCw9fNPJdNKFEOIXoYXWOi6E8LW8mQqF4klgTglhNpq3X3p0Qpv8sgrwDlqEIYVCYYVkOg5BSrlDaJN5pkd34L9SGwO9TwhRTAhRVkp5w0I2KhSK1CQ8gFun4dp+ZGwE80LOEySS+Lrf3Bxla4mBSR6kDMsVoq97TBCEEO+glSLw8vJKnaxQKNJCSoi4AqGH4MZxoi5tYU/kBeYXdeGcgwNJAmJtbPCIN5CQnICDrUO2D2UJQUhr7vk0PaaklL8DvwP4+fkpryqFIj3uXYHz6+HqXri6D6K07+umIs78x70EiaXdcZUuxNyrQqx0wpBQivfbvJojMQDLCEIIKeP/efIo/p9CoTCX8EsQtBlOryD6yi72OTkS6lySG2U9CfWpyunECG7H38PFtiyRl7oSFeMN2GIXFsSmMa/g45E6nGXWsYQgrAQGCSHmo4WxilTtBwpFJkgJkdcg5CBc2QsXN0P4JU46OLDQvSzrK/gQK7XQiYVlFOXsXKjl2piiN0pz5FQlkA543DlA/PF1bAhYT4kSJSxiVqaCIISYhxZr301oM/KMQpvQBCnlTGAt2rwBQWix5N+0iGUKRUFCSggJhCu7tP8hByFanzXAvjBJ3s35pUJd/g4/jJOdI50rdKZbpW5ULl4ZF3sXEpINVPtyPQBFHe34umstutRqR3z8J7i6ulrMTHN6GXpnki6BDy1mkUJRkEiKh5NLYd90uHlcW1eiElRsA55+JHv6cUwkMv3E7+y/sZ+Xq77Mxw0/xtnB2ZjFsWsRdJ+227hsv3okbQdvwNHREUdHx9RHzBFqsleFIjeIvgOBs+Dgn/DgNrhXhy6ToUY3DIWLc+DmAQKCA9iycyjhceE42joytulYelTpYcwiLjGZPn/s4/DVCADKOyaw+9tXqNSqBYUKFcoVs5UgKBSWZtt42PkzJMdDZX9o8gFUbMO9+AhWBK1g0flFXI26SmG7wrT0bEk7r3Y092huLBU8iE9ixdHrjFh2wphlM9dI5o54jQ4dOrBs2TKcnJxyxXQlCAqFJTk2H7Z9DzVfgDYjkW5VOHTrEIt3DWdD8AYSDYn4lvLlg/of0N67PYVsH//S9/1rP0f0UgHAV9XCeGtAf7p06cKiRYssXk0wRQmCQmEpbp2CVUPBuzlhnSeyMngNy3Z9SvD9YJztnelVtRe9qvaicvHK6WaxJyjMKAb7hrejdNFChIaG8tFHH/Hjjz/i4JCzcQaZkWdRl/38/KQKoaYoMMRFkvx7a/YQy9Iabdh2Yx9JMgnfUr70rNoTf29/nOzSL+YbDJKKI9Yal3v6etKyUDBdunTB1tbWoqYKIQ5JKf3SSlMlBIUiu8Teg9BDhF3ZyYLgtSwrEsctO3tKhJ+mb82+9KjSg4quFTPPB5ix/dGk0/97qxHr//srL3wzlj///JOBAwfm1hk8hhIEhcIckpPg9mlt/EDoIQg5iAw7zzLnIvxYojjRtjY0LVqVLxoOorVna+xt7TPN8uzN++y9eBcp4YeAcwAcGNGOn78bzYQJExgwYAD9+/fP5RNLiRIEhSI9QgLhzCrt//XDkBijrS/sRohHPca4F2df3A0autdnVLOxVHCtYFa2MQlJ/G/fVcatPZNife1yRRk/egSTJk3ivffeY9q0adjYPNkYRkoQFApTkhPh9ArYNwNCA8HGHsrWBd9+4PkM8WXqsOjOAX45MhWbZBu+evYrXqr6EjbCvBf3dlQcjcZtNi6//qw3Q9tXwd7OhlvXgqlf/zcGDx7M5MmTESItv8HcRQmCQgEQEw6HZsOBPyDqujaasPOPUO9VpIMzJ8NOsjxoOes2/UxUQhTNPZozqskoyhQxz6HodlQcf+8OZsa2R20FO//ThvIlCmvTsAtB0SpVOHLkCFWqVMkTMQAlCAoFBO+GBa9pjYQVW0PXyVDZn7D4cFZfWMLyoOVcjLxIIdtCtPduzwuVX6BxmcZmv7T3HiQwfu1Zlh4JBeC1xl6M6FyDIoXsSE5OZuDAgTRp0oR3332XqlWr5t55moESBMXTzfFFsOIDKO4Db6wmzq0yO0J2sHLrYHaF7iJZJlPPvR6jmoyig08HXBxcspR9skHS4JuNALgUsiPwq/YUstO6EZOSkujXrx/z5s2jcuX0xyY8SZQgKJ5OpISdP8GWb0jybsaB1kNZGzSfzVs2E50YTSmnUvSv1Z/ulbub3ViYmhuRsTT5fotxeecXbYxikJiYSO/evVmyZAnjx4/niy++sMhp5RQlCIqnj+RE5KqhnDizkLVVG7HeNoa7Oz7F2d4Zf29/OlfszDOln8HWJnsDggJO3WTVseusPq6FBSlZxIG9w9vhYKc1PBoMBnr16sWKFSv4+eef+fjjjy12ajlFCYLiqeLG1V2s2DKMVUlhXC1XBofkcFqVa0XnCp1p4dkiTd8CczEYJNO2BvHTxvMAeJcsTDEne5Z/2CxFe4ONjQ3NmjXD39+fDz/MX5EDlCAoCjxxSXFsOr+MFUdnsj/hLlIInilWibfqvUU773YUdSia42OkHno85dX6dK/vkWKbmJgYLly4QL169fj8889zfMzcQAmCokAipeR42HGWn1/C+ouriZaJeCQm8b5rNbq2+gbPUnUserzYxGTj76UfNMXXq3iK9OjoaLp06cLx48e5dOkSxYoVs+jxLYUSBEWB4k7MHVZeXMmKoOVcvh+Mo5T4R8fwQrFa+HX6AZtS1XPluF+t0CY2G9G5+mNicP/+fTp37sy+ffv4999/860YgBIERQFi45WNjNgxjDhDAg0SkhkTGcFzzhVxfn46VGiZa8f9acM5lh7Wxhi0rlYqRdq9e/fo2LEjhw8fZsGCBfTs2TPX7LAEShAUVo9MjGf2jpH8HBJAvbh4vg2LwKdie2j1hhaxKBf9AZYfCWXqliDt94fNqFo65TiFH3/8kSNHjrBkyRK6deuWa3ZYCiUICutESrh9hsTj8/nu4iIWO9nRIV4yruqbFOr9BhQtl8uHl+y7FM7QBUcB+KZ7LeqXf7wqMHr0aLp160bjxo1z1R5LoQRBYT1EXIPL2+HSdri8nagHt/mstDt7nBx5y6MdH7X5ARsz3I4tgf+kHQTdjgaga71yvN7Ex5h28+ZNBg0axPTp0ylVqpTViAEoQVDkZ2LCIXgnXNqmiUC47hhUxJ3r3s/yoSGU4IR7jG0yKkW04txm/cmbRjGY+3ZjmlQsaUwLDQ2lbdu2hIaGEhQURKlSpdLLJl+iBEGR/zi3DrZPgOtHAQkOzuDTHJ55i/vl/Zh9ey9zzvwPW2HL9PYzaFKuSa6bJKXk4p1oFh0K4bftl4DHuxevXLlC27ZtuXPnDgEBATRt2jTX7bI0ShAU+YcHd2H9F3BiEbhVgzYjoEIr8PAlViYx7+w8/tr5MfcT7tPJpxMf+X5EeZfymeebA+ISk1lw8BqjVp5Ksb6US6EUYnDp0iXatGlDZGQkGzdutKpqgilKEBR5j5Rwaims/Q/ERULrEdD8Y7BzINGQyLILy/jt2G/cjr1NC48WDPYdTPUSuTOewJSEJAPVv1pvXLa1EfzUqx7d65d7zPW5cOHCeHp6smzZMnx9fXPdttxCCYIib7l/A9Z8CufWQDlf6D4NStfEIA2sv7SWaUencTXqKvXd6zOh5QT8yqQZLNjiJCQZqPrlOuPywZHtcXd53M8hODgYT09PypQpw65du/IssImlUIKgyBukhCNzIGCkNsOR/zfw7AcYbGzYFLyBGcdmEBQRRJXiVfi17a+09Gz5RF42g0Eyfv1Zft9xybju+OjnKOr4eO/FiRMnaNeuHa+88gpTp061ejEAJQiKvCAkENYPh5AD4NUUuv+KLFGRLde2MP3odM7fO09F14r80OoHnvN+zux4hTnl9b/2s/NCmHG5gVcxFrzTxOi2bMqRI0fw9/fH0dGRjz766InY9yRQgqB4ckSGwKYxcGIhOJeGbr8i6/Vhx/VdTNsznDPhZ/Au6s34FuPp6NMx2/EIssPHC44axeDNZj4MaVeFYoXTniXpwIEDdOjQgaJFi7JlyxYqVar0xOzMbZQgKHKfhAewewrs/gWkAVp8hmw2hD13TzBt/eucCDuBp7Mn3zb7lucrPo+dzZN7LJcdCWHN8RtsOnMbgJWDmlHXM33no/j4eF588UWKFy/O1q1b8fb2flKmPhHMuvJCiI7AFMAW+FNKOT5VuhfwD1BM32aYlHLtYxkpni4MBq00sGk0RN2AWi8S3foL1oYfZ/HGtzgTfoZyRcoxpukYulbqir3Nkxll+JAzN+7z8YJjxuW/+z+ToRgAFCpUiEWLFlG+fHk8PT1z28QnTqZzOwohbIHzgD8QAhwEekspT5ts8ztwREo5QwhRE1grpfTJKF81t2MBJ/YeLHkLgjYhyzXgRJN3WBJ1jnWX1xGbFEvV4lV5tfqrvFDpBbNmObI0J0Mj6TJ1FwA/9apHz4YZv9ybN2/mzJkzDBo06EmYl6vkdG7HRkCQlPKSntl8oDtw2mQbCTwMO+MKXM++uQqr5+ZJWPAa96NusLpJP5bEX+f84e9xsnOic4XO9KzSk9putfOkVT4sOp4/dl4yjjb09SpGl3plM9xn/fr19OjRg6pVq/L2229TqFD2w6zld8wRBA/gmslyCJB6GNZoYIMQ4iOgCNA+rYyEEO8A7wB4eXll1VaFNXByCddWD+a34sUIKFGeuJvbqFGiBl89+xWdK3TG2cE5T8yKjEmk3c/bCYuON6777fWGdKiV8UQrq1at4qWXXqJWrVps3LixQIsBmCcIacl46npGb2C2lPInIUQT4F8hRG0ppSHFTlL+DvwOWpUhOwYr8inJSURuHMFv5xcwr0wJ7O0c6VqpKz2r9qRWyVp5bR2rjl83isHXXWpSr7wrDb1LZLjP0qVLeeWVV2jQoAEBAQEUL148w+0LAuYIQghgOmDck8erBAOBjgBSyr1CCEfADbhtCSMV+ZjkJBKPL2T+gR+YaR9PlGtRelTqziDfIbgXds9r6wBtspQvl2shzo585U/xIml3J6bmxo0bNGrUiLVr1+Lq6pqbJuYbzBGEg0AVIUQFIBR4FeiTapurQDtgthCiBuAI3LGkoYp8RnIi8tgCNu37gUkO8VxztKdJ0Wp82mo81UpUy1PTrkfE8p/Fx0lINuBga8OuIG18gRBQrHDmDZhhYWG4ubnx4Ycf8u6772Jn9/T0zmd6plLKJCHEICAArUtxlpTylBBiLBAopVwJfAr8IYT4GK060V9m1n2hsE6SEog78g/rDv7CPLsEzhRxoJKTB9ObjKK5Z4s8H767JyiMPn/uNy77ehXD16sYyRIWvPNspvbNmjWLoUOHsmPHDurXr/9UiQGYOQ5BH1OwNtW6r01+nwaaWdY0Rb4iMY7Q/dNYcPJvljoYiCxiS2UnL8bUf49ulbs/0cFEqbkZGcevWy+w5cxtrkfGAdClbll+7ZM1r8MZM2bwwQcf0LFjR6pVy9tSTl7xdMmfIsvIW2fYFziNuaFb2e4gsHEUtHXzpXfDwfiVeSbPSwRSSppP2EKSQSuQujjaMaZbLV70zdqgoSlTpjB06FC6du3KokWLCnxvQnooQVA8TsQ1bhz5h5VBy1kporlqb0/xQva8Vb4dLzf6jDLOGffbP0kqDH9UcA0a1wk726w7Qq1Zs4ahQ4fy4osvMm/ePBwczGt0LIgoQVBoxIQTc2Ihm0/PZUX8DQ44FkI6CJ4p7MN7NV/nueov5Wjew9zgtT/3GX8f+co/W2IA0KFDB6ZOncq7776Lvf2THzWZn1CC8LRzL5hrOyfwz7UNrC7syAMbGzxc3Hi/Uje61nodT0ZVffsAACAASURBVJf8N14/MdnAyGUn2B10F4C1g1uY3ZX4ECklU6ZM4eWXX6ZcuXIFYkiyJVCC8LRy6xTnt4/jrzv7CSjihI1zETqVa06POm/iW7rhE4tBkB2u3H3AwsAQijraMbNvQ2qWy9pkrVJKhg0bxsSJE4mIiGD06NG5Y6gVogThaePKXo7uHMdf98+wrUhhnFxc6FupB/0avE+pwvk/ZPj1iFjGrNLcaMb1qEPTym5Z2l9Kyccff8yUKVN4//33+frrrzPf6SlCCcLTwO2zJJ1axo7zS/lXRhDo5IirSzE+qNGXPnUG4FrIekbh/b37MjsvhFHIzoYqpbPmF2EwGBg0aBAzZsxgyJAhTJo0Kc97SfIbShAKKrfPwKnlhJ1ZxpKEGyx2ceamox2l7dz4vM5bvFSjN4XtC+e1lVlm0aEQAM592ynL+0ZFRbFz507+85//MH78eCUGaaAEoSCRGAfH5yP3zyTw/iUWuLiwuUhhkooU41n3Bgyr9QatyrfK00FE2SU47AH+k7aTmCxxyGJvQlJSEgaDAVdXV/bs2YOzs7MSg3SwvidD8TgP7sLBP+HgH9yIC+czTy+OFylNUXsXeld5gZervoyPq09eW5ltgm5H0f7nHQC4FLLjt9cbmr1vYmIi/fr1Iy4ujiVLluDi4pL5Tk8xShCsmbAg2DcNjs6FpDj2V2rG5zb3SBCSr/0+pUvFLjjZOeW1lTkiPinZKAav+JVnwkt1zd43ISGB3r17s3TpUiZOnIhNLk4LX1BQgmBtSAlX9sDeX7U5EG3tkXVe5r9lffj53Bx8ivgwuc1kKrhWyGtLLUKHSTuMv7MiBvHx8fTq1YtVq1YxefJkhgwZkhvmFTiUIFgTl3fCplEQegicSkDLz4nx7cvoY9NYd/a/tPdqz7fNv6WIfZG8ttQi3I9LJPhuDKANS84K/fv3Z9WqVUyfPp33338/N8wrkChBsAYiQ2DDl3BqGbh6wfM/Qb0+3Ey8z6DNgzh/7zxDfIcwsPbAAtNYlphsYOj8owC837pSloclDx06lOeee44333wzN8wrsChByM8kxsGeqbDzJ0Bqk6A2Gwz2Tpy5e4ZBmwfxIOkB09pNo4Vni7y2NsdIKTkZep++f+0nMjbRuP6NJj5m7R8VFcXKlSt57bXXaNy4sdXOwJyXKEHIj0gJ59Zq051FXIGa3eG5b6GYFph2+7XtfL7jc1wLufLfTv+lavGqeWxwzkg2SFpM2GKMZfCQD1pXwr9macq4OmaaR2RkJJ06deLAgQP4+fk9tfEMcooShPxGbASsHqpVD9yrQ78VULG1MXnumblMODiB6iWq82vbX/NN3MLsEJOQRFhUAi1/2Gpc93zdsrzU0JM21cwfRn3v3j06dOjAkSNHWLBggRKDHKAEIT9xdb82ucn9UGj7FTQbAvokJsmGZH4M/JE5Z+bQunxrJrSYYJUjDZMNksWHrnEp7IFxboSHnB7bgcIOWXskw8LC8Pf35/Tp0yxdupSuXbta0tynDiUI+QFDMuz6GbZ+D64eMCAAyj9jTD548yA/Bv7I6bun6VujL5/5ffZEJ0K1FB/OPcya4zdSrPOvWZp21UvRs6En9tmIZ7B161bOnTvHihUr6Nixo6VMfWpRgpDX3DgOaz7Vpkav3RO6TAJHzdnoUsQlJh2axLaQbZQpUoYJLSbQuWLnPDY464xfd5bFh0KM8yJUL+PC76/74ebikOUSwUMMBgM2Njb06tWL5s2bU7Zs/oniZM0oQcgrYiNg63dw8A9tTEGP36HuyyAEd2PvMuPYDBafX4yTnRNDfYfyWo3XcLTLvHEtv/HCtN0cvRZhXN47vC1lXXM2ejIkJITnn3+eyZMn06ZNGyUGFkQJwpNGSji+ADZ8BTFh4DcQ2o4Ep+LEJsUy5/Qc/jr5F3FJcbxc7WXeq/ceJRwznmEoP3LpTjT+k3aQrAc/tYQQAAQHB9O2bVvu3r371AZCzU2UIDxJwi/DikFwZRd4+MFri6BcfQCO3TnGFzu+IDQ6lLbl2zK04VCrHX4speQ5XQxcnexZ8WEzi4jBxYsXadu2Lffv32fTpk0888wzme+kyBJKEJ4EUsLhf2D9CLCxha5ToEE/sLHBIA38c+offjn8C6WLlGZWh1k8U8a6H/Q5+66QZJDY2QiOjXrOInlev36dVq1aERcXx5YtW2jQoIFF8lWkRAlCbhN1E1Z+BBc2QIWW0H06FNOmyoyIi2D4ruHsCt2Fv7c/o5uOpqhD1uID5jeGzD/CiqPa1J9LP2hqsXzLlClDr169GDBgAHXq1LFYvoqUKEHITU6vhFVDIDEGOk6ARu+A7oKbmJzI4K2DORl2ki8bf8nL1V4uEH4IDyMh//xyPep6FstxfidOnKBo0aJ4e3szadKkHOenyBglCLnFicXaIKNy9bUeBPeUw4u/O/AdR24f4YeWP9CxQsHoP5dSEhYdz6vPlM/yzElpcfjwYfz9/alTpw7btm3LuYGKTFGCkBtc3ALL3gPvptB3Kdin7C5ceG4hi88vZmDtgVYvBonJBhYGXuP2/XjmHrgKwIOE5Bzne+DAATp06ICrqyuzZs3KcX4K81CCYGlCD8H8vuBeDV6d+5gYHLhxgO/3f08LjxZ81OCjPDLSMkTGJlJvzIbH1k/ombM6/u7du+nUqRPu7u5s2bIFb2/vHOWnMB8lCJbk6n6Y3xuKuEHfJeD0qA5tkAZmn5rN1MNT8XTxZHzL8VY5/Bg0f4T/7b/C1ytOGdftHd6W0i6OCEGO2kKklIwcOZKyZcuyZcsWPDw8LGGywkzMEgQhREdgCmAL/CmlHJ/GNi8DowEJHJNS9rGgnfmbe1dg02g4tRSKesDry8CljDH5TswdRuwawb4b+2jv1d6qexMiYhKoP3ajcblWuaIseb8pjvaWETchBEuWLCExMZEyZcpkvoPComQqCEIIW2Aa4A+EAAeFECullKdNtqkCDAeaSSnvCSHy/xRAliDuvuaUtHc6CBto9QU0HQyFtAlEpJQEXAngu33fEZsUy6gmo+hZpadV9iZIKdl2/g5D5h0xrjs4sj3uLpYZLbhu3Tr++OMP5s2bR8mSJS2SpyLrmFNCaAQESSkvAQgh5gPdgdMm27wNTJNS3gOQUt62tKH5CkMyHP4vbB0HD+5A3Veh3deap6LOqbBTTDw4kcO3D1OjRA3GtxhPxWIV89DonPHJwmMsOxIKgKO9DafHdMTGxjLCtnLlSnr16kXt2rWJiYlRQ5LzEHMEwQO4ZrIcAqSOTVUVQAixG61aMVpKuT51RkKId4B3ALy8vLJjb95z8wSsGgqhgeDVBPosBA9fY/LtmNtMOTyFlRdXUsKxBKOajKJH5R5W2V4Qm5DM2hM3WH/qJhtP3wJg7tuNaehd3GJisHjxYnr37o2vry8BAQEUK5bzsQuK7GOOIKR152Ua+VQBWgOewE4hRG0pZUSKnaT8HfgdwM/PL3Ue+ZuEB7BtPOydBk7F4cU/oE4vMCn+b7qyiZG7RpJoSGRA7QG8XedtnB2yNv9gfqLjlB1c0aMeA0x5tT5NK2VtctWMWLhwIX369KFx48asW7eOokWts12lIGGOIIQA5U2WPYHraWyzT0qZCFwWQpxDE4iDFrEyr7mwCdZ8DBFXwbcftB8DhR95IEop+fPEn/xy5BfqutdlfIvxlHcpn0GG+Zug21EMmnvEKAZ7h7fF3blQliMfZ0bVqlXp2rUr//77L87O1iucBQlzBOEgUEUIUQEIBV4FUvcgLAd6A7OFEG5oVYhLWDsGg+aHcHQOuFWF/mvBp1mKTeKT4xm1ZxRrLq3h+YrPM6bpGArZWm8d2GCQxpmSAOYMbGwRT0VTDh06RMOGDalfvz7Lli2zaN6KnJGp5Espk4BBQABwBlgopTwlhBgrhOimbxYA3BVCnAa2Ap9LKe/mltFPjD1TNDFoNhTe2/WYGNyNvcvAgIGsubSGjxp8xPfNv7dqMbgZGUfFEWsBqFbahcvfd6Z5FctVEQCmTZuGn58f8+bNs2i+CgshpcyTv4YNG8p8zZW9Uo4uLuXCN6Q0GB5LDo0Klc8vfV76/esnAy4HPHn7cgHvL1ZL7y9Wy6bfb5ZhUXEWz//nn3+WgOzevbuMi7N8/grzAAJlOu+lGqmYFjHhsHig5qbcdUqKhkOAixEXeWfjO8QmxfLHc39Qv1T9PDLUcvy7N9j4e9cXbSw+VmL8+PEMHz6cl156iblz52Jvb2/R/BWWQU2HmxZrPoHoW9BrtjHg6UP2XN9D//X9MUgDf3f4u0CIAcDPG88DsGZwc4uLwYkTJxgxYgS9e/dm3rx5SgzyMaqEkJrzAdokKW2+hHKPovLEJ8cz+dBk5pyZQyXXSkxtO5XyRa23J8GUczejuBeTiHfJwtQq55r5DlmkTp06bN26lebNm2Nra33jMZ4mVAnBlIQHsOYzbcakZo+mDz8Xfo5XV7/KnDNz6FO9D/O7zC8wYrDv0l06TNZ6Fd5qbrkYjlJKhg8fzrp16wBo1aqVEgMrQJUQTDn4J0RehTfXg50DBmng39P/MuXwFIo6FGVG+xk092ie11ZalFd/3wdAl7pled3MSVUzQ0rJkCFDmDp1KgkJCXTqlLWp3BV5hxIEU26egGLe4N0EgG/2fcPi84tpU74No5uOtspw6BkRGhELQNXSzvzaxzeTrc3DYDDwwQcf8Ntvv/HJJ5/w448/WiRfxZNBCYIp94KhuA8AG69sZPH5xfSv1Z9PGn5ilR6KmdFs/BYABlqoqpCcnMzbb7/N33//zbBhw/juu+8K5HUryKg2BFPuBUNxb249uMXoPaOpXbI2g30HF8iHusOkR6MRLRH/ELRYBvb29owaNUqJgZWiSggPiY+GB3cwFPNm5G7NQen7Ft9jb1Pwusj2XAzj3K0oQPNTyM4kq6YkJiZy+/ZtPDw8mDlzphICK0aVEB4ScQWAfxNvsP/Gfr545gt8XH3y1qZcos8f+wHNlTmnfgoJCQm88sorNGvWjKioKCUGVo4qITzk3FpOOTgwOXQz7bza8WKVF/Paolxh4vqzxt9NKuYsMlFcXBwvvfQSa9asYcqUKbi4uOTUPEUeowQB4NZponb8wGdeXrgXLsmYpmMK3Jduw6mbvPPvIePy5Ffq5+gcY2NjeeGFF9iwYQMzZ87k3XfftYSZijxGCUJyInL5e4xxL8kNkpjdciKuhSw/Wi+v2HfpLl8sOW6MbVDJvQi/vd6QyqVy9jUfOXIkGzdu5K+//mLAgAGWMFWRD1CCsO17FkcHEeBWkiENPiowvgkAh6/eMw48quPhymcdqtGqqrtF8h41ahRt2rSha9euFslPkT94uhsVA//m7P5fmODmTtNyTRlQu2B86a7ejcFn2BpenL4HgJJFHFj1UfMci0FkZCSffvopsbGxuLq6KjEogDy9JYSza7i/7lM+9vLBtXBxvmv+HTbC+vXxekQsLX/Yalz+tU8Dnq9TNsf5hoeH06FDB44dO0b37t1p2bJljvNU5D+eTkG4tB3D4gGM9KjATZHM361+oqRTwZgL4PlfdgJaqeDQV/4WyTMsLAx/f39Onz7N0qVLlRgUYJ4uQbgXDJvGwKmlzCrrwzbbBIY9M6zAtBv8GHCOezGJABYTg1u3btGuXTsuXrzIqlWreO655yySryJ/8nQIQuw92PkT7P8NhC2b/fowNXwPnbw70ad6wZhxLinZwK9bgwAtyImlCA8P58GDB6xZs4a2bdtaLF9F/qTgC0L0HfijLUReg/qvsad2Rz7fO4rabrUZ3XR0gRhvIKWks15VeLGBh0WCnNy7d49ixYpRo0YNzp07h4ODQ47zVOR/rL8VLSOSEmBhP3hwGwas50jTtxi6/xsquFZgervpFLYvnNcWWoT7sUmcvxUNwJddauY4v+DgYBo2bMi3334LoMTgKaJglxDWD4Ore+DFP7njVokPV3SndOHS/Ob/W4EZfBSflMw/e4MB+KJjdUoUydnLGxQURNu2bYmOjlaBTZ5CCq4gHJoNgX9pszHX7cXPO4cTlxTH1LZTcXOy7FwDeUXQ7Sh6TN9DVFwSAJ3r5Gz69LNnz9KuXTsSEhLYsmUL9esXjMZWhfkUTEGIjYB1w6BiG2g/msCbgay+tJp36r5TIDwYk5IN3H2QYJxhqayrI/97qzHeJYtkO8+YmBjat29PcnIyW7dupXbt2pYyV2FFFExBOLUMkmKh3VckYmDc/nGUK1KOt+q8ldeW5ZgFB6/yxZITxuUiDrbsGdY2x42jhQsXZsqUKdSqVYvq1avn1EyFlVIwBeHoXC1ycjlfll9YTFBEEFPaTMHJzrJzFD5pQu7FGMWggVcxejfyoqevZ47E4NChQ4SGhtKtWzd69uxpKVMVVkrBE4QzqyDkAPh/A0KwM2QnXi5etCnfJq8tyzHzDlwF4N1WFRneqUaO89u3bx8dO3akdOnSdOrUSU2goihg3Y43jsPSd8DDDxq9g5SSI7eP4Fva1+rHGxgMkmlbLwJYRAx27dqFv78/bm5ubNy4UYmBAihIghB9B+b3Acdi8Or/wN6Ry5GXiYiPwLeUZUKM5xUnQyONszIXdsj5ZCfbtm2jQ4cOeHh4sH37dry8vHKcp6JgUHCqDCs+hAdhMGAduGjdb4dvHwbAt7R1C8LkTdq8iw29i/PfAY1ynN/atWvx8fFh8+bNlCmTs65KRcGiYJQQ7l+HCxug2eAU8zEG3gqkpGNJvFys9wsYEZPApjO3AfjfW40pUij7Gh4fHw/AhAkT2LNnjxIDxWOYJQhCiI5CiHNCiCAhxLAMtntJCCGFEH6WM9EMTiwGJNR9xbhKSsn+G/tpVLaRVbYfSCl5999A6o/dCMCQdlVwtM9+dWH58uVUr16dixcvIoTA1bVgjNRUWJZMBUEIYQtMAzoBNYHeQojHBswLIVyAwcB+SxuZKScWQjlfKFnJuOpS5CXCYsNoXKbxEzcnp8QnJfPMuE0EnLoFwCt+5RnYIvuzKy1atIhevXpRpkwZSpYsGHEfFLmDOeXPRkCQlPISgBBiPtAdOJ1qu2+AicBnFrUwM+6c0+Zk7Dg+xer9NzRdalzWugThr12X+Wb1o0sb+GV73JwLZTu/uXPn8vrrr9O0aVPWrFlD0aJFLWGmooBiTpXBA7hmshyirzMihGgAlJdSrs4oIyHEO0KIQCFE4J07d7JsbJoEa26/VOucYvX+G/vxcPbA08Uy05Q9CQ5fvWcUg4/bV2X3sLY5EoM1a9bQt29fWrVqxbp165QYKDLFHEFIqwIujYlC2ACTgE8zy0hK+buU0k9K6efubpnov9w6DYVcodijhsNkQzIHbx20utLBwwjJn/hXZUj7KngUy9nIypYtW/LZZ5+xevVqnJ2dLWGiooBjjiCEAOVNlj2B6ybLLkBtYJsQIhh4Flj5xBoWb52C0jXBpOHw/L3zRCVE8UyZZ56ICTklIiaBZ7/bTEKSAYCP2lbOUX6LFi0iOjoaFxcXJk6cSOHCBSPugyL3MUcQDgJVhBAVhBAOwKvAyoeJUspIKaWblNJHSukD7AO6SSkDc8ViU6SE22egVMo2zsBb2qH9Sj/Zzo7sMnnTBW7ejwNg5aBmOeoV+emnn3j55Zf56aefLGWe4iki00ZFKWWSEGIQEADYArOklKeEEGOBQCnlyoxzyEWu7oX4SChbL8XqwJuBeDp7UqaIdfSz29poAnBhXKcczcT8/fffM2LECHr16sWIESMsZZ7iKcKsUS5SyrXA2lTrvk5n29Y5N8sMpNQiKDuXgTq9jKsTDYkcun3IqpyZVh67TiE7m2yLgZSSsWPHMnr0aF577TVmz56NnV3BGYSqeHJY70jFkEC4tg9afgYOj+rIs0/OJjI+En9vy4Qhz20+WXCUO1HxxOvtB9nh7t27/Pbbb/Tv359//vlHiYEi21jvk3Nd81Og+vPGVRcjLjLj2Aye836Olp75fzKRHtN3c+RqBAA7/5P1Eo2UWmePm5sbBw4coFy5ctjYWK/GK/Ie6316bh6HwiXBRZumLNmQzNe7v6aIfRGGNx6ex8Zlzs8bzxvFYN7bz1K+RNZ6AqSUDBkyhE8++QQpJZ6enkoMFDnGep+gmyehdG1jd+OcM3M4HnacYY2G5fsgqonJBn7ZfAGA5R82o0mlrA0nNhgMvPfee0ydOlWJgMKiWOfTlJykdTeWqWNc9c+pf2harimdK3TOYMe850F8EmNXaaMRu9UrR/3yxbK0f3JyMgMHDuT3339n+PDh/Pjjj1bpvKXIn1hnG0LEFUiOh1Ja5KDYpFjuxN7h1eqv5uuXY9iS48w/+GgUeC+/rA+rfvvtt5k9ezajR4/m66+/ztfnq7A+rFMQwrTiNm5VAbgRfQMAD2eP9PbIF6w5odk5pF0VBraoQFHHrIct69q1K1WrVmXYsHS90BWKbGOlgnBO++9WBYDQ6FAgfwrCxTvR7L14ly+XnwTA16sYH/tXzVIe8fHx7Nu3j1atWtGjR4/cMFOhAKxWEM5DkVLgVByA69Gaa0U553J5adVjBAaH89LMvcZlWxvBlFcbZLDH48TFxdGzZ082bNjA+fPnqVAh+3ERFIrMsE5BuHvRWDoACIkOwcHGIV/1LtyNjjeKwUsNPfm8QzVKF3XMUh4xMTG88MILbNq0iZkzZyoxUOQ61ikI90PBqwkA8cnxrL20lvql6mMj8r7T5Pb9OHpM30NoRCwAXeqW5cde9TLZ63Gio6Pp2rUr27dvZ9asWfTv39/ClioUj2N9giAlRN00RlZeemEpt2Nv812L7/LYMG2wUKPvNhuX+zXxZky3WtnKa+7cuezcuZM5c+bQp08fS5moUGSI9QlC7D1ITgCXsiQkJ/DniT/xLeVLozI5D0+eU66GxwDgZG/LqTEdsLHJfpfg22+/TaNGjdQMzIonSt6XsbNK+CXtv6snm69u5nbMbd6t926e9scnGyQjl52g1Q/bABjbvVa2xCA8PJzOnTtz+vRphBBKDBRPHOsrITyMoVj+Wc6d+x92NnZ5WjqIS0ym+lfrjcutqrrTvX7Wuz/v3LlD+/btOXfuHNeuXaNmzccCWysUuY71CcLlHeBeA5zduRh5EZ+iPtjZ5M1pSCl5btIO4/KhL9tTMhtBUW/evEm7du24fPkyq1atwt/fOly3FQUP6xKEpAS4ug8avA7A5cjLVC2etUE+liI0IpZm47cYl0+N6ZCtWZVu3rxJq1atCA0NZe3atbRu3dqCVioUWcO62hBCD0FiDFRoQXxyPNeirlHRtWKemNLll53G3wdGtsv2FGtFixalRo0aBAQEKDFQ5DnWVUK4vB0Q4N2M4MhgDNJApWKVMt3N0iQkGbgXk4iDnQ3nv+2UrTyCg4MpXrw4rq6uLF++3MIWKhTZw7pKCJe2aZO5Fi7B5cjLAE+8hDB9WxB+32rzLXatm72h0hcuXKBFixb07dvXkqYpFDnGegQhPgpCDkLF1gCcDDuJvY09Pq4+T9SMievPcT8uCVcn+2zNn3D27FlatWpFXFwc3377bS5YqFBkH+upMgTvBkOSURAO3jpIPfd6FLLN/lRnWSUsWptO/c1mPozqmvURiCdPnqRdu3YIIdi2bRu1amVvFKNCkVtYTwkh9BAIGyjfiKiEKM6Gn32iMzPFJCTh9+0mALyyGP8QtC7KN954Azs7O7Zv367EQJEvsZ4Swr3LUNQT7J0IuXsGgzRQrXi1J3LouMRkan4dYFzu18Qny3kIIViwYAEAlSvnbKo2hSK3sJ4SQvhlKKG5/96NuwtASaesBSfNLg8nYQW49F1n40xL5rB3714+++wzpJRUrlxZiYEiX2M9gnDvkSCEx4UDUMKxRK4eMtkg+XffFY5e08KlnxnbMUs+Cjt27OC5555jxYoVhIeH55aZCoXFsI4qQ1wkxNyF4rogxOa+IEgpqTTi0ex1P79cDycHW7P337JlC127dsXLy4vNmzdTsuSTKc0oFDnBOgTh7kXtv15CiEnS3IyL2BfJtUMOnn/U+HvLp62o6O5s9r4bNmyge/fuVK5cmU2bNlG6dOncMFGhsDjWIQjBu7T/Hg1TrM5Nl+fAYK0Ucvabjjjam18yAEhKSqJu3bqsWbMGN7f8E9ZNocgM62hDCNoIpWqCqzaPgUTm6uGOXovgRmQcQJbEICQkBIDOnTuzd+9eJQYKq8OsEoIQoiMwBbAF/pRSjk+V/gnwFpAE3AEGSCmvWMTC+Gi4sheefc+46sr9K5RyKmWR7NPixem7AZjxmq/Z+yxYsIB+/fqxbNkyOnfubLEp1hITEwkJCSEuLs4i+SmeHhwdHfH09MTe3vz5PzIVBCGELTAN8AdCgINCiJVSytMmmx0B/KSUMUKI94GJwCtZsj49gneBIREqtTOuOn7nOPVKZT1wqTnciIzFIMHBzoaOtcuYtc+cOXN44403aNasGS1atLCoPSEhIbi4uODj46NmaVKYjZSSu3fvEhISkqVo3eZ8xhoBQVLKS1LKBGA+0D3VwbdKKWP0xX1A1ucoS4+Lm8HOyRhlOSw2jNDoUOq5544g/L07GIBxL9Q26wWcNWsW/fr1o3Xr1qxbtw4XFxeL2hMXF0fJkiWVGCiyhBCCkiVLZrlkaY4geADXTJZD9HXpMRBYl1aCEOIdIUSgECLwzp075ll4cQv4NAd7bU6Dw7cOA1C/lOXjDZ4MjeT3HVrMxl5+5TPd/tChQwwcOBB/f39Wr15NkSK50+uhxECRHbLz3JgjCGnlmmarnhCiL+AH/JBWupTydymln5TSz93dPfMjR92Eu0FQqY1x1YGbByhsV5iaJS0fc/DF6XsAaF3NDNuAhg0b8u+//7JixQqcnJwsbo9C8aQxRxBCANPPpSdwPfVGQoj2wEigm5Qy3iLWJTzQ/hd59IIeuHkA39K+2NtkfaLUzCjqZEf1Mi7MfjPjoK1TQh2WkwAAE4JJREFUp07l2LFjAPTt2xdHx6zNyGRthISE0L17d6pUqUKlSpUYMmQICQkJ2cpr9OjRDB8+PMW6o0ePUqNGjXT36d+/PxUqVKB+/frUq1ePzZs3p7ttRmzbto09e/Zka9/U+Pj4EBYWlmLd7NmzcXd3p379+lSvXp1JkyZZ5FhPEnME4SBQRQhRQQjhALwKrDTdQAjRAPgNTQxuW95MjbPhZ7kceZkWHpZtuFt+JJRuv+7ifmwSDbyKZbjtuHHjGDx4MDNnzrSoDfkVKSUvvvgiL7zwAhcuXOD8+fNER0czcuTIbOXXu3dvo5PXQ+bPn5/pZDQ//PADR48eZfLkybz33nsZbpse5gpC//792bZtW7aO8corr3D06FF2797NuHHjuHbtWuY75SMy7WWQUiYJIQYBAWjdjrOklKeEEGOBQCnlSrQqgjOwSK+3XJVSdrO0scuDlmNvY8/zFZ+3WJ7rT95g6IJHoxJbVU27O1NKyejRoxk7dix9+/Zl6tSpFrPBXMasOsXp6/ctmmfNckUzjO2wZcsWHB0defPNNwGwtbVl0qRJVKhQgTFjxrBw4UJWrlxJTEwMFy9epEePHkycOBHQRmyOGjWK+Ph4KlWqxN9//021atUoVqwY+/fvp3HjxgAsXLiQgIAAkpOTGThwIIGBgQghGDBgAB9//HEKe5o0aUJoaKhx+dChQ3zyySdER0fj5ubG7NmzKVu2LL/88gszZ87Ezs6OmjVrMn78eGb+v71zj4qq6vv4ZwsChiiX1HxFARG8kIiXEqznUTBvaWrZBd7qQevJ9DWWoSb11qrnTVeFXbV4u9irZq5H8bJQs5RM8JIXNLwgeMtrSpSCoiCaA7PfP84wchlgwGE4o/uz1qx15pw9+3zPnpnvOWefvX+/L77AycmJJUuW8Omnn9r8iVBFfHx86NKlC3l5eXTsWHd/lF6wahyClPIH4Icq696ssPyQjXVVo8xYxg8nf2BQx0G0dm1tkzq/2XGat9bmAPA/o0OIHeBvsZyUktdee43ExEQmTJjA/PnzcXKq3+hFRyUnJ4e+fSuPEG3VqhWdOnXi+PHjgHbJv2/fPlxdXenatStxcXG0aNGC2bNn89NPP+Hu7k5iYiIfffQRb775JjExMSxbtoz+/fuza9cufHx8CAoKIjMzk9zcXLKzswEoLCyspmfDhg2MHTsW0MZoxMXFsWbNGtq0aUNycjKvv/46CxYs4L333uPUqVO4urpSWFiIp6cnkyZNomXLlsyYMaORWw1+++03rl+/TmhoaKPvy5Y4xtBl4HjhcS79dYnIjpF1F7aCA2cLzWbw9T/6Mbh7zQOdSktLOXDgAJMmTSIpKclmg47qS0OiNN0qUkqLvdUV1w8ePJjWrTWT7tGjB2fOnKGwsJBDhw7xwAMPAHDjxg0iIrRHx9HR0QwYMIAPP/yQZcuWERMTA0Dnzp05efIkcXFxjBw5kqFDh5r398orrzBz5kzOnz/Prl3adPSjR4+SnZ1tzmNRVlZG+/btAQgNDeXpp59m7NixZgOpjdTUVBISEgDtz/zzzz/TsmVLXF1dycjIsLq9kpOTSU9P5+jRo8yfP9/h+pccxhD2ntceN/ZpZ/3owZr4PiuPKf/W6pv498481MPy5COj0cjVq1fx8PBg9erVuLi43HGPAENCQli1alWldVeuXOHs2bMEBgaSmZmJq+vNMHZOTk6UlpYipWTIkCEsXbq0Wp0dO3bE39+fLVu2sGrVKnbu3AmAl5cXBw4cIDU1laSkJJYvX86CBQsArQ/hscceY968ecTGxpKZmYmUkpCQEPPnK/L999+zdetW1q5dy6xZs8jJyan1OIcNG8awYcMArQ9h/PjxDQqL/9RTT/HZZ5+xc+dORo4cyYgRI7jnHusGuOkBx5jLAOz5Yw9t72rLf7g3LNJxOZeu3jCbwXMPBPDfD1vu3TYajbz44otERkZSUlKCq6vrHWcGoJ39S0pKWLx4MaCdhadPn8748eO5666aQ8mFh4ezfft2821FSUkJx44dM2+PiYkhPj6ewMBAfH21cWz5+fkYjUbGjRvHrFmz2Lt3b6U6mzVrxtSpUzEajaSmptK1a1cuXLhgNgSDwUBOTg5Go5GzZ88SGRnJnDlzKCwspLi4GA8PD4qKimzaPjURERHBs88+y9y5c+2yP1vhEIZwpfQ6W89tJapj1C39KTPPXKT3LC2E+kPd2/HmI5bHMpSVlfHcc8/x9ddfM2LEiDt6jIEQgpSUFFasWEFQUBDBwcG4ubnxzjvv1Pq5Nm3asGjRImJiYggNDSU8PJwjR46Ytz/xxBPk5OQQHR1tXpebm8ugQYMICwtj/PjxvPvuuxb1vPHGG8yZMwcXFxdWrlxJQkICvXr1IiwsjB07dlBWVsYzzzxDz5496d27N/Hx8Xh6evLII4+QkpJCWFgY27Ztq1Z3fQkNDcXX1xdfX1+mTZtWbXtCQgILFy60mwnZBCllk7z69u0r6yT/uJRvtZLJm2bKexfdK7Pzs+v+TA38Xlgi/RLWSb+EdfLxz7fLsjKjxXIGg0HGxMRIQL799tsN3p+tOHToUFNLUDgwln4/aE8HLf4vHaIPYcOlHLp4dqGHd8NGJ76x+iBLdv0GaJOWVkwaUGPZGTNmsHTpUhITE5k5c2aD9qdQOCq6NwQjcKgkj1FBjzboduHi1RtmM5g6OIiX6kiuEh8fT0hICC+88EJD5CoUDo3u+xBynZ25arxBd++ah7bWRnnko+lDgokfEkxzp+qHfO3aNebOnYvRaMTPz0+ZgeKORfeGcMRFm7PQzbtbvT8rpWTit5kA9O9sOchpSUkJo0ePJj4+nu3btzdcqEJxG6D7W4b9bq40F05WZ3k2GiW7ThUwecleLl8zANDS1Zn7A6pHaC4uLmbUqFFs27aNRYsWNepQVoXCEdC9IWxr0YL7Wvrh5mzdiK/vD+YRt3QfAM0ExA7wJ35IcLVyV65cYcSIEWRkZLBkyRLzaDmF4k5G14bwx7ULnHJpzpOtrMt2lJ172WwGnzwVxsM92+PibPmuKCcnh+zsbJKTkxk3bpzNNN+OODk50bNnT0pLSwkICODbb7/F09OT06dP0717d7p2vZlSb/fu3bi4uDShWsWtoGtDuGLQ4iG0c2lVZ9n3U4+QlK7lb7g/wJuxvS0HdTIYDDRv3pyIiAhOnTqFt3fjZn+6HWjRogX792szQmNjY0lKSjJPfw4MDDRvUzg+ujaE+lBuBosm3MegrpYnKp0/f56hQ4cydepUJkyY4HhmsP5V+OOgbeu8pyeMeK/uciYiIiLIysqyrQaFbtD9UwZrKP6rFICAu91rNIO8vDwiIyM5duyYQ81P1xNlZWVs2rSJ0aNvhro4ceIEYWFhhIWFMWXKlCZUp7AFDn+FcPSPIoZ9shWA0b0sT3zKzc0lKiqK3Nxc1q9fz8CBA+0p0XbU40xuS65du0ZYWBinT5+mb9++5unGoG4Zbjcc+gqh6LrBbAad27gTZ2EUYlFREQMHDiQvL4/U1FTHNYMmpLwP4cyZM9y4cYOkpKSmlqRoJHRtCLWlbDMaJVNNCVnDO3uTNn0QzhZGIXp4eDB58mQ2btxoDtahaBitW7dm3rx5fPDBBxgMhqaWo2gEdG0IBVe02HmW0r4vyThD2hEtnuv7j1dP2vLrr7+yZ88eAKZPn26O36e4NXr37k2vXr1YtmxZU0tRNAK67kM4d14Ldd6hQ/Ww6JdLtDPUT9MG0tG7cqCOw4cPExUVRatWrcjJycHZWdeHqXuKi4srvf/uu+/My+XxDxW3B7q+Qvij6CzNpKRNLWHT/H0qm8HBgwfN/QQpKSnKDBSKeqBrQyiTRpwBJ+fqSVn2/nap2rp9+/YRGRmJi4sLW7ZsoUcP22d3UihuZxzu9HndUMZj/7uDQ3lafoJmFWIkzJ07F3d3d9LS0ggMtG4ylEKhuInDGULUB5v5/fJ1XJybkTwxnGbNhDkk+Jdffkl+fj4dOtSWi1ahUNSErm8ZqrLjRD6/X9bSW2e8NpjenbzYunUrDz74IAUFBbi6uiozUChuAYcxBKNR8p/ztYQZyRPD8XJ3YdOmTQwfPpyLFy82OPmoQqG4icMYQmaFTsT+nX3YsGEDo0aNIjAwkM2bN5sz9ihsj8r+XB17Zn/29/enZ8+ehIaGMnDgQM6cOWPe5uTkZJ5LUj68/FZwGENYs18bpLT8xQh+/PFHxowZQ7du3UhPT6ddO8uZlxS3jlTZn+tFfbM/W7uv9PR0srKyGDRoELNnzzavLx9WXv7y9/dvkO5yHKJTMeNkgTlycnC7llx1CeHRRx/l888/x8vLq4nV2Y/E3YkcuXik7oL1oJt3NxLuT6hxu8r+3DAaK/tzREQE8+bNs1l9VXEIQ3hxiRYo9R8hbni4OuHZoYMaOmsnVPbnhtFY2Z8rHj/cnIkKEBAQQEpKyi3V7xCGUFhiQCB555+jcP/9X+YsvXcatZ3JG4vyR7q1rVfZn29iTfbnhuwrMjKSP//8k7Zt21q8ZbAZNaV0qvgChgNHgePAqxa2uwLJpu0ZgH9ddVqTyu2jlY/JPgtCpF/COuns4SOjoqJkcXFxQzJaOSxNncpt48aN8m9/+1uldZcvX5be3t7y6tWrcuHChXLKlCnmbSNHjpTp6ely7dq1Mjo6usZ6H3zwQZmWliZ9fX3l2bNnzeuLiorkypUr5ahRo+SECROklFLGxsbKFStWyLKyMvnxxx/LPn36SCmlzMrKkuHh4RbrLy0tlWlpafLll1+WwcHB0mAwyLfeeku+//77dR5zbGysTE9Pr7WMn5+fvHDhQqV1Fdtix44d0svLS+bl5dlsXyUlJfLJJ5+U8fHx5m3u7u61fra+qdzq7FQUQjgBScAIoAcQI4SoOib4eeCSlLIL8DGQaAuzKrlRZl4e/MB9rFu3Dnd3d1tUrbASlf25YTRG9ucWLVrwySefsHjxYi5evGizeitizVOG+4HjUsqTUsobwDJgTJUyY4BvTMsrgcHCBrnT84uuAdAmfx9rVq++o7MwNxUq+3PNNEX25/bt2xMTE9NoQWqEdgVRSwEhHgeGSyn/aXr/LNBfSvlShTLZpjLnTO9PmMrkV6lrIjARoFOnTn0rPk+1xKcr4tmXv4Mvnt92x4b2Pnz4cK3P6BWK2rD0+xFCZEop+1kqb02noqUzfVUXsaYMUsqvgK8A+vXrV7sTAXFP2GZgh0KhsA5rbhnOARUfpPoCv9dURgjhDLQGGucmR6FQNBrWGMIeIEgIESCEcAGigbVVyqwFYk3LjwNpsq57EYXVqKZUNISG/G7qNAQpZSnwEpAKHAaWSylzhBBvCyHKA/T/H+AjhDgOTANerbcShUXc3NwoKChQpqCoF1JKCgoKLI6DqI06OxUbi379+slffvmlSfbtSBgMBs6dO8f169ebWorCwXBzc8PX15fmzStHHLvVTkVFE9K8eXMCAgKaWobiDsFhZjsqFIrGRxmCQqEwowxBoVCYabJORSHEBaD2oYoadwP5dZZqWvSuUe/6QGm0Bdbq85NStrG0ockMwVqEEL/U1COqF/SuUe/6QGm0BbbQp24ZFAqFGWUICoXCjCMYwldNLcAK9K5R7/pAabQFt6xP930ICoXCfjjCFYJCobATyhAUCoUZ3RiCEGK4EOKoEOK4EKLabEkhhKsQItm0PUMI4a8zfdOEEIeEEFlCiE1CCD976rNGY4VyjwshpBDC7o/QrNEohHjS1JY5Qoh/60mfEKKTECJdCLHP9F0/bGd9C4QQ501RyixtF0KIeSb9WUKIPvXaQU3RV+35ApyAE0BnwAU4APSoUua/gC9My9FAss70RQJ3mZYn21OftRpN5TyArcAuoJ/eNAJBwD7Ay/S+rc70fQVMNi33AE7buQ3/DvQBsmvY/jCwHi2KWTiQUZ/69XKF0GSBXG2lT0qZLqUsMb3dhRZZyp5Y04YAs4A5QFPMp7ZG4wtAkpTyEoCU8rzO9EmglWm5NdWjhzUqUsqt1B6NbAywWGrsAjyFEFYnPtWLIXQAKibBO2daZ7GM1IK2XAZ87KLOOn0VeR7Npe1JnRqFEL2BjlLKdfYUVgFr2jEYCBZCbBdC7BJCDLebOuv0/Qt4RghxDvgBiLOPNKup72+1EnqJh2CzQK6NhNX7FkI8A/QDBjaqIgu7trDOrFEI0QwtZ8Z4ewmygDXt6Ix22zAI7SprmxDiXill9bxutscafTHAIinlh0KICOBbkz5j48uzilv6n+jlCkHvgVyt0YcQ4iHgdWC0lPIvO2krpy6NHsC9wGYhxGm0+8u1du5YtPZ7XiOlNEgpT6FlDAvSkb7ngeUAUsqdgBvapCK9YNVvtUbs2SFSS0eJM3ASCOBmZ05IlTJTqNypuFxn+nqjdUgF6bUNq5TfjP07Fa1px+HAN6blu9Euf310pG89MN603N30ZxN2bkd/au5UHEnlTsXd9arbngdSx0E+DBwz/aleN617G+1sC5oTr0DLH7kb6KwzfT8BfwL7Ta+1emvDKmXtbghWtqMAPgIOAQeBaJ3p6wFsN5nFfmConfUtBfIAA9rVwPPAJGBShfZLMuk/WN/vWA1dVigUZvTSh6BQKHSAMgSFQmFGGYJCoTCjDEGhUJhRhqBQKMwoQ1AoFGaUISgUCjP/D7KcZvFHm9/UAAAAAElFTkSuQmCC\n", "text/plain": ["
"]}, "metadata": {"needs_background": "light"}, "output_type": "display_data"}], "source": ["import matplotlib.pyplot as plt\n", "fig, ax = plt.subplots(1, 1, figsize=(4,4))\n", "ax.plot([0, 1], [0, 1], 'k--')\n", "ax.plot(fpr_lr, tpr_lr, label=\"OneVsRest + LR\")\n", "ax.plot(fpr_rfc, tpr_rfc, label=\"RF\")\n", "ax.plot(fpr_rfc_y, tpr_rfc_y, label=\"OneVsRest + LR + RF\")\n", "ax.set_title('Courbe ROC - comparaison de deux\\nmod\u00e8les pour toutes les classes')\n", "ax.legend();"]}, {"cell_type": "markdown", "metadata": {}, "source": ["Sur ce mod\u00e8le, le score produit par le classifieur final para\u00eet plus partinent que le score obtenu en prenant le score maximum sur toutes les classes. On tente une derni\u00e8re approche o\u00f9 le mod\u00e8le final doit valider ou non la r\u00e9ponse : c'est un classifieur binaire. Avec celui-ci, tous les classifieurs estim\u00e9s sont binaires."]}, {"cell_type": "code", "execution_count": 17, "metadata": {}, "outputs": [{"data": {"text/plain": ["RandomForestClassifier(bootstrap=True, ccp_alpha=0.0, class_weight=None,\n", " criterion='gini', max_depth=None, max_features='auto',\n", " max_leaf_nodes=None, max_samples=None,\n", " min_impurity_decrease=0.0, min_impurity_split=None,\n", " min_samples_leaf=1, min_samples_split=2,\n", " min_weight_fraction_leaf=0.0, n_estimators=100,\n", " n_jobs=None, oob_score=False, random_state=None,\n", " verbose=0, warm_start=False)"]}, "execution_count": 18, "metadata": {}, "output_type": "execute_result"}], "source": ["rf_train_bin = clr.decision_function(X_train)\n", "y_train_bin = clr.predict(X_train) == y_train\n", "rfc = RandomForestClassifier()\n", "rfc.fit(rf_train_bin, y_train_bin)"]}, {"cell_type": "markdown", "metadata": {}, "source": ["On regarde les premi\u00e8res r\u00e9ponses."]}, {"cell_type": "code", "execution_count": 18, "metadata": {}, "outputs": [{"data": {"text/plain": ["array([[0.32, 0.68],\n", " [0.5 , 0.5 ],\n", " [0.89, 0.11]])"]}, "execution_count": 19, "metadata": {}, "output_type": "execute_result"}], "source": ["rf_test_bin = clr.decision_function(X_test)\n", "rfc.predict_proba(rf_test_bin)[:3]"]}, {"cell_type": "code", "execution_count": 19, "metadata": {}, "outputs": [], "source": ["y_test_bin = clr.predict(X_test) == y_test"]}, {"cell_type": "code", "execution_count": 20, "metadata": {}, "outputs": [{"data": {"text/plain": ["(0.5510406569489914, 0.7668718108162481)"]}, "execution_count": 21, "metadata": {}, "output_type": "execute_result"}], "source": ["fpr_rfc_bin, tpr_rfc_bin, th_rfc_bin = roc_curve(y_test_bin, rfc.predict_proba(rf_test_bin)[:, 1])\n", "auc_rfc_bin = roc_auc_score(y_test_bin, rfc.predict_proba(rf_test_bin)[:, 1])\n", "auc_lr, auc_rfc_bin"]}, {"cell_type": "code", "execution_count": 21, "metadata": {}, "outputs": [{"data": {"image/png": "iVBORw0KGgoAAAANSUhEUgAAAQQAAAEXCAYAAABLSjo/AAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADh0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uMy4xLjEsIGh0dHA6Ly9tYXRwbG90bGliLm9yZy8QZhcZAAAgAElEQVR4nOydd3gUxRvHP5NGKEnoJQkhSO8tghSlhiYdARFRRFFUBMRGExBRAakiIKKAP1EEFAQEpIVepHcINZCEkkoKIX1+f8zmOMIluSSXcrCf58mT293Z2fe2fG9mdt73FVJKdHR0dABs8toAHR2d/IMuCDo6OgZ0QdDR0TGgC4KOjo4BXRB0dHQM6IKgo6Nj4KkWBCHEMiHElLy2QydzCCHGCiF+ymMbdgkh3rJQXX5CiHaWqCu75DtBEEK8IoQ4KoSIFkLcFkJsFkK0yGu7MkK7QWI1u0OEEGuEEOVSlakphFgvhIgQQkQJIXYKIZqlKuMghJgkhLgshLiv3SxLhBCeufl98jNSyq+llBZ5GHUeJV8JghBiFDAH+BooA3gAC4DuOXAsW0vXCQyTUhYBKgNFgBlGx6sE7AfOABUBV2AtsFUI0dSojj+BbsArgAtQDzgGtM0Be/MdQgi7vLbhqUZKmS/+UDd/NNAnnTIFUIJxS/ubAxTQtg0C9qUqL4HK2udlwEJgE3AfaKet+wHYBkQBu4EKRvtX17aFAb5A33Rs2wW8ZbT8HnDOaPlXYJOJ/RYCe7TP7YAHQHkLnteCwEzgBhAB7AMKatu6AeeAe5r9NYz28wM+AU5r5+tnlEhv1s7VdqCYVtZTO9dva9flNvCRUV2NgYPacW4D3wMOqa7T+8Bl4Lq2bi7gD0SiBPF5o/KTgOXaZ0dgORCq1X8EKKNtcwXWa9fvCjAkVR2rgP9p3+cc4JXOefQGLmrn8HvtXjG+3oOBC0A4sMX4PjJR10DteoQC47Rz3U7bZgOMBq5q21cBxbVtrYCAVHUZ77sJmGm0bSWwJFP3S16KQKov1hFIBOzSKTMZOASUBkoBB4AvpfmCEAE01066o7YuCngBJTZzU+oACms35BuAHdAQCAFqZSQIQAnUA7POaPsd4A0T+7UGkoBCwFRgt4XP63zNNjfAFmimfdeqqAfdG7AHPtUeGgejG+0QSgTcgCDgONBA298HmJhKEFZo560OEGx0ozYCntPOoyfqwRmZ6jptA4rzUKxe1c6jHfCRdv4cTQjCO8AG7fzZasdy1rbtRrUwHYH6mk1tjeqIBTpr+30DHErjHJZECdNL2rn6EHWvplzvHtq5q6HZOx44kEZdNVE/fCn33CytrpRzNVI77+7a9kXACjMFoax2ndoAA4BrgJO1CsIA4E4GZa4CnY2WOwB+mRCE/6Xavgz4w2i5COrhLA/0A/amKr8I7SFIQxBiUKIjgZOAh9H2RKCjif2qa+XdgMXG9ljgnNqgWhz1TGz7HFiVqmwg0MroRhtgtP0vYKHR8gfA39pnT+07VDfaPh34OQ27RgJrU12nNhl8l/CU78GjgjAY9cNQN1X58tq1dDJa9w2wzKiO7UbbagIP0jj2axiJBSCAAB4KwmbgzVTnMgYTrQRgQqp7rjAQz8OH+gKaaGnL5YAElNC0Ih1B0JZ7oX7IQoAWmb1n8tMYQihQMoM+pCuqqZXCDW2dufint05KGY1qXroCFYAmQoh7KX8o0SqbTv3DpZQuQF2gGErlUwhBXdzUlAOSUTd8aBplTCKEGKANYkYLITabKFIS9et41cS2R86llDIZdS7cjMrcNfr8wMRykVR1Gp9fw7URQlQVQvwjhLgjhIhEjRGVTGdfhBAfCSEuaAOw91BdytT7gOqKbQH+EELcEkJMF0LYa8cOk1JGpbLJ+PvdMfocAzimcf+58uh9IlPZWwGYa3SfhKFEw43HSV3XfdR1N65rrVFdF1DCVsZEXab4B9Xi8ZVS7jNzHwP5SRAOoppwPdIpcwt1wlLw0NaBav4WStkghDD14Jpy7SxvtE8RVLP1Fuqi7ZZSFjX6KyKlfDejLyKlPANMAeYLIYS2ejvQx0TxvsBBKWWMVqaxEMLdRDlTx/lNs6mIlLKTiSIhqHNaycS2R86lZmd5VCshq5Q3+mx8bRai+t9VpJTOwFjUA2OM4doIIZ4HPkOdm2JSyqKollfqfZBSJkgpv5BS1kR1h7qgftFvAcWFEE6pbMrK97vNo/eJ4NHv6g+8k+peKSilPGBGXYVQXSPjujqlqstRShnI4/e4LarrbMxXKBEpJ4Ton9kvmm8EQUoZgWpOzRdC9BBCFBJC2AshOgkhpmvFVgDjhRClhBAltfLLtW2ngFpCiPpCCEdUk9AcOgshWgghHIAvgf+klP4opa0qhBio2WEvhHhWCFHDzHp/QY11dNOWvwCaCSG+EkIUF0I4CSE+QN28n2nnYDuqL71WCNFICGGnlRsqhBhs5nENaL/6S4BZQghXIYStEKKpEKIAarDqRSFEW+0X9SMgDtX8ziqfa9etFmrsZaW23gnVB48WQlQHMhJVJ1QXKxiwE0JMAJxNFRRCtBZC1NEejkhU8zpJu4YHgG+EEI5CiLrAm8BvWfheG1H3Vi+tBTGcR1uKPwBjtO+NEMJFCGFK/EG9RepidM9N5tHn8AfgKyFEBa2uUkKIlLdsl1CtmBe1azYeNc6Qci5eQJ3317S/eUIIU62UNMk3ggAgpZwFjEJ90WCUWg4D/taKTAGOoka+z6AGuaZo+15CndztqNFqc5tLvwMTUc28RqhuAVpTsz3wMurX5g4wDaMLkMF3iQe+Q/XVkVJeBlqgXiP6oX4pegMdpJT7jXZ9CTVavBL1q3gW8NK+V1b4GHWujmjfcRpgI6X0RQ3czUO1JLoCXTW7s8pu1ODaDmCGlHKrkQ2voAZwF/NQKNJiC6pffgnVzI/FdHcP1IP5J0oMLmg2pPxI9EeNb9xCveKdKKXcltkvJaUMQbXupqKa91VQr5BTtq9Fndc/tC7RWcBUiw0p5TnUG5XfUfdAOGo8IoW5qDcjW4UQUagBxibavhGot1c/oVo691P2FUI4o96YDJNSBmrdhZ+BpUat1AwR2kCEjk6W0SZNXQfspZSJeWuNTnbIVy0EHR2dvEUXBB0dHQN6l0FHR8eA3kLQ0dExoAuCCUQqt2ghhJcQ4rgQooSJsvnGdfVpQvMIXZ5xSYsdTwohKufW8fIKXRDMQEp5FDVV9xft/e8Ti6UfNF0wrQvd1dRMtLkCXfLaDksihLDTXxPqGGO1LQTtl+cTIcRpoQKJ/CyEKCNUQJUoIcR2IUQxo/LdhBDntDniu4xnHAohGmhdgighxErU/H/jY3URQpzU9j0ohKifhk02QojRQoirQohQIcQqIURxbZujEGK5tv6eEOKIEMLk/HTtu40RQpwXQoQLIZZqsy9Ttg8RQlwRQoQJFXAlxWfAU2va2hmVNUT2EUIMEkLsF0LMFkKEkWo2pxCiI2pacT+h/CNOaetdteOEaccdYrRP6u5VKyFEymSZX1HThTdo9X2qrX9OCHFAOw+nhBCtjPYfJIS4pl2L60KIAabOkYlzlu06hZrJOVa7flFCiGNCiPImyr0ohDghhIgUQvgLISYZbUvzOqdnhxBisFC+G+FCiC3i4UxFoV2vIKH8Ok4LIWqbc06yRGa9ofLLH5lzz03T1Vf7u4FyabVHzRRMAKZo+zZEzZpsinIaGQzc5KErrh/mua6m6aabxnc7i5rzXhw1Ky7FnjaomYUNtWPM42E8BU+UT4CdUV27eOiVNwg1JfgDVOuwoIljT0LzJDRal54b8bIU27TlVhh55PG4N54barZfZ9QPkre2XArl+RcJVJMPPf3Scjc32GnBOj9BzeqshvKbqAeU0LYZe862Qrl426Ac2e4CPdK7zunZQTru0yiP3mNAUc2mGkC5HHuu8vrBzqYgmOuem6arL8ov/RbaK1ht+wEePoALga9SHfsSj7oJm+O6atJNN53vNtRouTNwVfv8MzDdaFsR7RiemCcINzM49iSMBIGM3YiXkTlB+Az4NdUxtwCvaw/NPdSU7sfEKi07LVinL9A9jW0GQTCxbQ4wW/ucljt2mnaQjvs06gfgEiqehE1OP1dW22XQMNc9Nz1XX1cgUGpXQsPYxboCMFgIcTHlD+V8U9qEPem5rqblppsWJl2JTXyXaNSvoblOLGn5BKSFOW7EmaEC0Ec86lbeAvWrdx8Vh2IocFsIsVEoZ6jcqrM8pl3FH0EI0USoeJjBQogIre4U12yT1zkDO9J0n5ZS+qAiNM0H7gohfhTKbyFHsHZBMJf0XH1vA27auhQ8jD77AwuklNWN/spJKVeZOE6arqsybTfdtEjLlTj1dymMcp9NcXYBIxdZHo/fkNFMtNTbM3IjfsQl14zj+aN+zY3PUWEp5VQAKeUWKaU3qnV1EeUMlRGWqtMf067iqfkd5YBUXqr4Fz+guWand53TsSNd92kp5XdSykZALVT39xMzbMwST4sgpOfqexDVrx4ulLtxL1QMwBQWA0OFchu2EUIU1gaVnFIfhHRcV0Uabrrp2Py+EMJdqEHJsTz0EPwdeEMoN+8CqGAj/0kp/aSUwagH9VVtgGww5t3gxtwFPIUQNgAyYzfikygX8uJCxaAYaaK+Z4yWlwNdhRAdNBsdhRqIdBdqULibJnJxqFBj6Z0jS9f5E/ClEKKKNphXV5iYe4JqIYZJKWOFEI1RnpxA2tc5AzvSdJ8WyuW+iXbf3kd5fppzTrJGTvdJcuqPx/umy4FJRstv8WiIrJ7AeZRL8W6MBpZQ7sUnUO65K7U/435xR5T7cEqQ0NVofWoeD5A5CtUXjUI1P7/WtvXX1t9HPSTfkUb8SK3OMZq991CxFQoZbR+q1R2GitvgbrStE8rz8B4quKohGCgmwsyZOHYJlOt4OHBcW+euHSdMO67x+Iajdr4iUW7pH/LoGEJ31CDsPeBjbV0Tza4w1ADlRlSro5y2PoKHgV9rpmHnJB4d67BEnbaoAb3r2vU7knJueXRQ8SVUtylKOy/f83A8w+R1zsgOVODVM9p59EcLjoqKtn0aJSAhKCEuklPPle7LkA8RQvihHuKsxkDQ0ckST0uXQUdHxwx0QdDR0TGgdxl0dHQM6C0EHR0dA3nm3FSyZEnp6emZV4fX0XlqOXbsWIiUMnX4diAPBcHT05OjR4/m1eF1dJ5ahBA30tqmdxl0dHQM6IKgo6NjQBcEHR0dA7og6OjoGNAFQUdHx0CGgiCEWKKFbzqbxnYhhPhOqNBap4UQDS1vpo6OTm5gTgthGcrbLy06oZJfVgHeRkUY0tHRsUIynIcgpdwjVDLPtOgO/E+qOdCHhBBFhRDlpJS3LWSjjs5TR1xSHIduHeJs6FlMuhckJcD9YIgMhMQ4giNjsBVFmPDa79k6riUmJrnxaFiuAG3dY4IghHgb1YrAw8Mj9WYdHashJiGG8Lhw4pPizSofnxRPRFwE4XHhhMWGERQTRHhs+CNlJJJr964RnRBNYHQgDxIfACAQhhIP/z0uEqUSsu+XZAlBMJV73qRlUsofgR8BvLy8dK8qnXxPRFwEewP3si9wH/5R/oQ+CCUsNszwsGYVO2FHUcei2KTqtZctUpaKLhXxKlqN1km2PBvij73/YYjSfl9t7MCtEUGlm7MtpARzfIsRTFEAvuldNVs2gWUEIYBH4/+58zD+n46OVZCQnMDp4NNcCr/E7fu3uRN9h4DoAM6HnidJJlHcsThVilWhfun6lHAsQTHHYhR3LI6jrWPGlQN2NnYUcyxG0QJFDfvaiFRDeGHX4MoOOL8O/Paqdc7u4NkCPJ4D92ehVHW+3XGd+TsfxoK1C7nC9i/64emWOpxl5rGEIKwHhgkh/kCFsYrQxw90rAEpJYduH2Kl70oO3jpITGIMAPY29pQtXBbXwq4Mrj2YVuVbUbtk7ccf4OwdHO7dhIAjcOMgXN2hBAGgeCVoPQ7q9IHiFQ27+IfFMHXlOTaeUY+XW/Bh4k5vZuuWfylevLhFzMpQEIQQK1Cx9ksKlZFnIiqhCVLKH4BNqLwBV1Cx5N+wiGU6OjlATEIMAdEBnAs5x28XfsM33JcSjiV48ZkXae7anLql6lKiYAnLPvygBCDgKNzYp/4HHIFoLWuAfSHwfB6eew8qtYESj8fFjUtM4vnpOwFwdrRjQtdadKnVlri4Ubi4uFjMTHPeMvTPYLsE3reYRTo6mSA+KZ6Dtw6yO2C34RdeSklCcgIPEh/wIPEBsYmxPEh8QGR8JCEPQgz7VnKpxORmk3nxmRdxsHXIGQMT4+DsGji0AO6cVuuKV4JnWoO7F5RvDKVrgm3aKTpO+d+j+/z9hmX7f8bRZvhWHB0dcXQ0r8tiLnqyVx2rQ0rJ/lv72XRtEzv9dxKdEE0R+yIUczSk8sTexp6CdgUpaFeQYo7FcLVzxcnBCfci7pR3Kk8F5wpUK17N8i2BFKKD4egSOPIT3A+CUtWhyxyo0Q0Km4rs/jixCUm8svgQx2/eA6C8Yzz7p/SjUsvnKVCgQI6YrQuCjlUhpWT+yfksOr0IJwcn2lVoR/sK7Xmu3HPYp/Mrm6vsmgp7Z0FSHFT2hqbvqRaBMPVC7nHuxyWy7uQtxq49Y1jX3CWC38cOoEOHDqxdu5aCBQvmiOm6IOhYDUnJScw6Nov/nf8fvar0YnyT8flHBFI49Qfs+gZq9lADg6Uy/yrw1Z//44TWKgD4vFoIbw0eRJcuXVi9erXFuwnG6IKgYxUkJCfw8a6P8fH34ZXqr/BZ489yrrmfVe6egw0joUIL6P0z2Gb+8TpwJcQgBofGtKWMcwECAwP54IMPmDFjBg4OOTTWoZFnUZe9vLykHkJNxxyklIzfP571V9czuvFoBtQYkNcmPU5sBPzYGuLvwzt7wKlMpnZPTpY8M3aTYbl3Q3deKOBHly5dsLW1taipQohjUkovU9vymcTq6DzOnONzWH91Pe/Vfy9/icGDcLiyXY0Z/NIVwv2gz9JMiwHAwt0PJxr99lZjCp1dQ48ePVi2bJnl7DUDvcugk69Zfn45S84uoW/VvgytOzTvDElKhKDzav5A4DH1P+SStlGoV4fd50OFZmZXefFOJAevhiIlfLvFF4DDY9sy6+tJTJs2jcGDBzNo0CDLf5d00AVBJ19yKfwS847PY1fALtp6tGVsk7EIM0fpLUbAUbiwQf2/dRwS1DwHCpVU04jr9lP/XRuAo7PZ1cbEJ/LboZt8tenCI+truzozddJYZs+ezdChQ5k/fz42NrnbiNcFQSdfERAVwIKTC/jn2j8UsS/CiIYjeK3ma9jaWLYfnSZJCcqX4NBCCDwKNvZQri40fE09/G6NoJin2a8QUxMUFUvjr3YYlgc+V4GR7apgb2fDXX8/6tdfxPDhw5kzZ07uCyC6IOjkE0IfhLL4zGJW+q7EVtgyqPYg3qz9Ji4FLDctN11iwuDYMji8GKJuqdmEnWdAvZehgFO2qw+KimXpfj8W7no4VrD309aUL15IpWEXAucqVThx4gRVqlTJEzEAXRB08pi4pDiWnl3K0rNLiUuKo0flHrxb713KFM78wFyW8dsPKweoQcJnWkHXOWpCkYWa6+H345m66SJrTgQCMKCJB2M716BwATuSkpJ48803adq0Ke+88w5Vq2bfhTk76IKgk2fsCdjDN/99Q0B0AG092jK84XCecXkmd404vRrWvae6Aa//A2VrW7T6pGRJgy+3AeBUwI6jn7ejgJ3q/iQmJvLaa6+xYsUKKleubNHjZhVdEHRyHb8IP2Ydm8VO/514OnuyuP1iniv3XO4aISXsnQk+X6qJRC8vh4LFMt4vE9yOeEDTb3wMy3s/a20Qg4SEBPr3789ff/3F1KlT+eyzzyx67KyiC4JOrhEZH8mCkwtYeXElDrYOjGg4gtdrvp7704+TEuCfD+HEr1CnL3T/Huws5yy05dwdNpy6xT+nVdyCEoUdODimLQ52qguSnJxMnz59WLduHbNmzeLDDz+02LGziy4IOrnCzps7+fLQl4TGhtK7Sm/eq/8eJQuWzH1Dgn1h40cqItELnyh/AwsN4CUnS+bvvMLMbWp+QoUShSha0J6/32/+yCChjY0NzZs3x9vbm/ffz1+RA3RB0MlRwmLDmPrfVDb7baZqsarMazuPWiVq5b4h0cHK6ejYMnAoDN0XQAPLzXpMPfV47sv16V7f7ZEyMTExXL58mXr16vHJJ59Y7NiWRBcEnRxjb8Bexu8fT2R8JO/Xf583a7+Z+92DhAcqOMne2WpikddgaDUaClu2dfIgIcnwec17zWjo8eh4RHR0NF26dOH06dNcu3aNokWLWvT4lkIXBB2Lk5CcwLzj81h6bilVilXhp/Y/UaVYldw1IjEezq1Vg4YR/lC1E3hPzpI7sjl8vk4lNhvbufpjYhAZGUnnzp05dOgQv/76a74VA9AFQcfCxCXFMXLnSPYF7qNv1b588uwnONrlnP/+Y4Rdg+P/gxPLVSKTsnWhxwKo+EKOHXLmVl/WHFdzDFpVK/3ItvDwcDp27Mjx48dZuXIlvXv3zjE7LIEuCDoWw1gMJjSdQJ+qfXLnwInx4LsJji2Fa7tA2ELVjtDodYtOMDLF3ycCmedzRX1+vzlVyzw6q3HGjBmcOHGCv/76i27duuWYHZZCFwQdixCfFG8Qg0lNJ9G7ag7/EkoJQRfgzKqHrQGX8uqtQYNXwdk1hw8vOXQtjJErTwLwZfda1C//eFdg0qRJdOvWjSZNmuSoPZZCFwQdi7D07FL2Be5jYtOJOScG9/zh+m64tlv9j75r1BoYBJXbQi45QXnP3sOVoGgAutZzZWBTT8O2O3fuMGzYMBYsWEDp0qWtRgxAFwQdCxAYHcjiM4tpX6E9L1V9yXIVx4Sp+QLXdikRCNMcgwqXgoot4ZmWqkvgXM5yxzSDf8/eMYjB70Oa0PSZh1GUAwMDadOmDYGBgVy5coXSpUunVU2+RBcEnWwhpWTa4WnYCBs+edZC79Z9N8PuaXDrJCDBoYhKZ/bsW0oESte02GQic5FScjU4mtXHAli0W2VYSv168caNG7Rp04bg4GC2bNlCs2bmB0vJL+iCoJMlkmUy229s58fTP+Ib7svIhiMpWzibuQXvh8K/n8GZ1VCyGrQeq1oCbg3TTWSSk8QmJLHyiD8T1597ZH1ppwKPiMG1a9do3bo1ERERbNu2zaq6CcbogqCTKZKSk9jit4UfT//I1YireDp78lWLr+jyTJesVyolnFsDmz5VwUpbjYUWH4JdzkYYzoj4xGSqf/6vYdnWRjCzTz2613d9LF5BoUKFcHd3Z+3atTRs2DC3TbUYuiDomE1AVAAf7f6I86HnqeRSiekvTKd9hfbZi2YUeVv5FvhuBNeGKi5hmZqWMzqLxCcmU3X8ZsPykXHtKOX0uAOUn58f7u7ulC1bln379uVZYBNLoQuCjlns9t/NmH1jQMLU56fSqWKn7OVFkFK9LtwyTmU48v5SJTvNQi4DS5KcLJn670V+3HPNsO70pPY4Oz7eZTlz5gxt27alX79+zJs3z+rFAHRB0MmApOQkvj/5PT+d+YkaxWsws9VMyjuVz16lAUfh3zEQcBg8min3YxMZj3ObgT//x97LD5PBNvAoysq3mxrclo05ceIE3t7eODo68sEHH+SmmTmKLgg66bLo9CJ+OvMTvav0ZkyTMRSwzUbcgIgA2P6FmkxUpAx0+x7qD8jRmYTm8uHKkwYxeKO5JyPaVqFoIdNjGIcPH6ZDhw44Ozvj4+NDpUp5L2aWQhcEnTQ5cucIi04volulbkxqNinrFcXfh/1zYf93IJPh+Y+hxUiLBC/NLmtPBLDx9G22XwgCYP2w5tR1T9v5KC4ujl69elGsWDF27txJhQoVcsvUXMEsQRBCdATmArbAT1LKqam2ewC/AEW1MqOllJseq0jHarh7/y6j94zGw8mDcU3GZa2S5GTVGtg+CaJuQ61e4P0FFPWwqK1Z5cLtSD5cecqwvHTQs+mKAUCBAgVYvXo15cuXx93dPadNzHUyFAQhhC0wH/AGAoAjQoj1UsrzRsXGA6uklAuFEDWBTYBnDtirk8NExUex9OxSll9YjpSSBe0WUMi+UOYrehAOf72lUp25NoQ+y8Ajl+MmpsPZwAi6zNsHwMw+9ejdKP2He8eOHVy4cIFhw4bRtGnT3DAxTzCnhdAYuCKlvAYghPgD6A4YC4IEUlLXuAC3LGmkTs6TLJP56/JfzD0+l4i4CDp6dmRYg2FUcM5Ck/jOWRXWPPIWvDgTGg3OF+MEACHRcSzee80w27ChR1G61Et/6vO///5Lz549qVq1KkOGDKFAAcvFX8xvmCMIboC/0XIAkHoa1iRgqxDiA6Aw0M5URUKIt4G3ATw88kezUQduRt5k0sFJHLlzhMZlG/Ox18fUKFEja5Wd/QvWDQNHFxi0Cco/a1ljs0hETAJtZ+0mJDrOsG7RwEZ0qJX+7MoNGzbw0ksvUatWLbZt2/ZEiwGYJwimXq6mziHfH1gmpZwphGgK/CqEqC2lTH5kJyl/BH4ElQ4+KwbrWJbI+Ehe//d14hLj+KLZF/Ss3DNr79OTEmHHJDgwDzyaQp9fspQFOafYcPqWQQwmdKlJvfIuNKpQPN191qxZQ79+/WjQoAFbtmyhWDHLhmnPj5gjCAGA8Ytndx7vErwJdASQUh4UQjgCJYEgSxipk3MsOLmA0AehrHhxBbVKZiH4aVKiahXsnaGyIT87BDp8nefTjo1JSpaM/1uFODvxuTfFCptn2+3bt2ncuDGbNm3CxSWXUsrlMeYIwhGgihCiIhAIvAy8kqrMTaAtsEwIUQNwBIItaaiO5TkXco4VF1fQt1rfzItBUgKcXqWEIOwalK4F/ZZDja45Y2wmuHXvAZ/+eZr4pGQcbG3Yd0XNLxACihbK2EkqJCSEkiVL8v777/POO+9gZ/f0vJ3PcKRHSpkIDAO2ABdQbxPOCSEmCyFSYkJ9BAwRQpwCVgCDpJR6lyAf88+1f3hjyxuUdCzJBw0yMdMuMV6FMp/XUKVAcygC/X6DofvyhRgcuBJCs6k+7LsSwuHrYcTEJ9LQo5S/zEgAACAASURBVCj1yhflwuSOGXaHlixZwjPPPMPJkyoS0tMkBmDmPARtTsGmVOsmGH0+DzS3rGk6OUFcUhzTD09n1aVVNCzdkG9bfmtehuWEWJXpaN8ciAxQadE7z4Aq7XM9NkFq7kTE8v3Oy/hcCOJWRCwAXeqW4/tXMud1uHDhQt577z06duxItWrVcsLUfM/TJX9POUExQYzwGcHZ0LO8UfsNhjcYjp1NBrdA0EUVn+Dkb2pyUfkm0O07qNQmz4UAVOCSFtN8SExWDVInRzu+6FaLXg0zN2lo7ty5jBw5kq5du7J69eon/m1CWuiC8JRwLvQcw3cMJyohijmt5tC2Qtu0C9/zVwOFZ/6Eu2dA2CgB6LlIhTPPB0KQQsUxDxuuV77qhJ1t5uc7bNy4kZEjR9KrVy9WrFiBg0P+GRDNbXRBeArY4reF8fvGU8yxGL92+pVqxU00h2PCVGKTM3/CzQNqnfuz0Gk61OoJRfJfbMABPx0yfD7xuXeWxACgQ4cOzJs3j3feeQd7+7yJzJRf0AXhCSZZJvPDqR9YeGoh9UvVZ3br2Y8nWA33U3MHTiyHxFgVuqzNeKj9EhSvmCd2Z0RCUjLj1p5h/5VQADYNf97sV4kpSCmZO3cuffv2xdXVlWHDhuWEqVaHLghPKPdi7zF632j2B+6nW6VuTGw6EQdbo4fm7jnYNxvOrlGhy+v1h2ffVJmO8lGXwBQ3Qu+z6mgAzo52/PBqI2q6Ome8kxFSSkaPHs306dO5d+8ekyZNyhlDrRBdEJ5AzgSf4aPdHxHyIITPn/ucPlX7PHzdduOgEoLLW9Qrw6bvwXPv53oo86xy694Dvtig3Gi+6lmHZpUzl7RVSsmHH37I3Llzeffdd5kwYULGOz1F6ILwBBGfFM/PZ39m8enFlCpYil87/aomHAVdhPPr4PzfEHQeCpWA1uOh8VtQ0Lqm4y7df529l0MoYGdDlTJFMrVvcnIyw4YNY+HChYwYMYLZs2c/EWHPLIkuCE8IB28d5Kv/vuJG5A06enZkfKW+uJxZD+cHQ/BFQCgfgxdnQr1XwCELLs35gNXHAgDwndIp0/tGRUWxd+9ePv30U6ZOnaqLgQl0QbBygmOC+fbIt2z224xHkfIsqtCbZue2wM4fAQEVmkGnb9UsQivpFpjCL+Q+3rN3k5Akccjk24TExESSk5NxcXHhwIEDFClSRBeDNNAFwYrZE7CHz/Z8RlxSHO+61OHNy4cpcGY/lK2jZhHW6ApO2Uyekg+4EhRFu1l7AHAqYMeigY3M3jchIYHXXnuN2NhY/vrrL5yc8j5sW35GFwQr5VL4JT7Z9REe2DEj8A4VYq+qacRNh+W7yUPZIS4xySAG/bzKM+2lumbvGx8fT//+/VmzZg3Tp0/HJp8EacnP6IJgbUhJ2OUtDD84lsKJsXx/N5QytfooIShdPa+tszgdZu8xfM6MGMTFxdGnTx82bNjAnDlzGDFiRE6Y98ShC4I1cX0vCdsnMCopgBDHAix17UiZfqPz5SxCSxAZm4BfaAygpiVnhkGDBrFhwwYWLFjAu+++mxPmPZHogmANRATA1vEcubqJ6aXKcNHBkalNJ1Onas+8tizHSEhKZuQfygX53VaVMj0teeTIkbRv35433ngjJ8x7YtEFIT+TEAsH5uF/YDYzixZmR7kyuBYux6xnP8G7gndeW2dxpJScDYzk1Z//I+JBgmH96009zdo/KiqK9evXM2DAAJo0aWK1GZjzEl0Q8iNSgu8m7v87mkUikl9dS2JvW4Dhdd9mYM2BONo55rWFFiUpWfL8NB9DLIMU3mtVCe+aZSjrkvH3jYiIoFOnThw+fBgvL6+nNp5BdtEFIb/x4B78MxLOrWVM+YrssnOhe+XuDG8wnFKFSuW1dRYlJj6RkKh4Xvh2p2Hdi3XL8VIjd1pXM39cJDw8nA4dOnDixAlWrlypi0E20AUhP3HzP5XcJDKQo02HsPPOFj5o8AFv1307ry2zGEnJkj+P+XMt5L4hN0IK5yd3oJBD5m7JkJAQvL29OX/+PGvWrKFr17wP42bN6IKQH0hOgn2zYOc34OJG8hubmXl6DqULlWZgzYF5bZ3FeP/342w8ffuRdd41y9C2eml6N3LHPgvxDHbu3Imvry/r1q2jY8eOljL1qUUXhLzm9mnY+JFKjV67N3SZzZbbBzgbepYvm39JQbuCeW1htpm6+SJ/Hgsw5EWoXtaJHwd6UdLJIdMtghSSk5OxsbGhT58+tGjRgnLlrHdadn5CF4S84sE92Pk1HFkMBYtDzx+hbl/ikxOYe3wuVYtVpesz1t/87TF/Pyf97xmWD45pQzmX7IlcQEAAL774InPmzKF169a6GFgQXRByGynh9ErY+jnEhIDXm9BmnMEN+X/n/0dgdCCL2i3C1sY2j43NOteCo/GevYckLfipJYQAwM/PjzZt2hAaGvrUBkLNSXRByE3Crqu8hzf2gZsXDFgNrvUNmw/fPsz3J77Hu4I3zdya5aGh2UNKSXtNDFwK2rPu/eYWEYOrV6/Spk0bIiMj2b59O88+mz/yRj5J6IKQG0gJx3+Bf8eqcGVd50KD1x7JiHwr+hYf7/6YCs4V+LL5l3lobPZZfugGickSOxvBqYntLVLnrVu3aNmyJbGxsfj4+NCgQQOL1KvzKLog5DRRd2D9B3B5q/JC7L4AipZ/pMiDxAeM3DmSxORE5raeS2H7wnlkbPYZ8ccJ1p1UqT/XvGe5Vk7ZsmXp06cPgwcPpk6dOharV+dRdEHISc6vhw0jICEGOk6Dxm8/0ioAJQZj947lYthFvm/7PZ4unnljq4VIiYQ8q2896roXzXZ9Z86cwdnZmQoVKjB79uxs16eTProg5BRn/lSTjFzrqzcIpao+VsQvwo9Ru0dxJfwKH3t9zAvuL+SBoZZDSklIdBwvP1s+05mTTHH8+HG8vb2pU6cOu3btyr6BOhmiC0JOcNUH1g5V4cteXQP2j8/F3+q3lQkHJmBvY8/Cdgtp7madqTETkpJZddSfoMg4fj98E4D78UnZrvfw4cN06NABFxcXlixZku36dMxDFwRLE3gM/ngVSlWDl383KQbH7h7jo90fUbdUXWa2nEnZwtYZ5iziQQL1vtj62PppvbPXx9+/fz+dOnWiVKlS+Pj4UKFChWzVp2M+uiBYkpv/wR/9oXBJePUvKPh4Hzo+KZ4vDn6Ba2FXFnsvppC99UU/TkqW/PbfDSasO2dYd3BMG8o4OSIE2QpgKqVk3LhxlCtXDh8fH9zc3Cxhso6ZmCUIQoiOwFzAFvhJSjnVRJm+wCRAAqeklK9Y0M78TfgN2D4Jzq0BZzcYuDbN4KY/nfmJ6xHXWdhuoVWKwb2YeOpP3mZYruXqzF/vNsPR3jKTqIQQ/PXXXyQkJFC2rHW2nKyZDAVBCGELzAe8gQDgiBBivZTyvFGZKsAYoLmUMlwI8WTG9EpNbKRySjq4QGVIbvkZNBsOBUwnELl67yqLzyymc8XOtHBrkcvGZg8pJbsuBTNixQnDuiPj2lHKyTKzBTdv3szixYtZsWIFJUqUsEidOpnHnBZCY+CKlPIagBDiD6A7cN6ozBBgvpQyHEBKGWRpQ/MVyUlw/H+w8yu4Hwx1X4a2E8Al7ebtvdh7jNw5kiL2Rfj02U9z0VjLMGrVKdaeCATA0d6G8190xMbGMpGd169fT58+fahduzYxMTH6lOQ8xBxBcAP8jZYDgNSxqaoCCCH2o7oVk6SU/6auSAjxNvA2gIeHR1bszXvunIENIyHwqMqE9MoqcGuY7i5xSXEM3zmcW9G3WNx+MSUKWscv4IP4JDaduc2/5+6w7fxdAH4f0oRGFYpZTAz+/PNP+vfvT8OGDdmyZQtFi2Z/7oJO1jFHEExdeWminipAK8Ad2CuEqC2lvPfITlL+CPwI4OXllbqO/E38fdg1FQ7OV45IvRZDnT4Z5j9IlsmM3TuWE0EnmNFyBg3LpC8e+YmOc/dwQ4t6DDD35fo0q5S55KrpsWrVKl555RWaNGnC5s2bcXbOXBZnHctjjiAEAMZzbd2BWybKHJJSJgDXhRC+KIE4YhEr85rL22Hjh3DvJjR8Ddp9AYWKm7XrnGNz2HpjKx81+ogOnh1y2FDLcCUoimG/nzCIwcExbShVpECmIx9nRNWqVenatSu//vorRYpkLnGrTs5gzhU+AlQRQlQUQjgALwPrU5X5G2gNIIQoiepCXMPaSU6Gv9+H33qDnSMM2gTd5pktBn9c/IOl55bycrWXeb3W6zlsrGVITpa0m7WHi3eiAFj+ZhPKuRS0qBgcO3YMgPr167N27VpdDPIRGV5lKWUiMAzYAlwAVkkpzwkhJgshumnFtgChQojzwE7gEyllaE4ZnWscmAsnl0PzkTB0H3iaP5vwdPBpph2eRkv3loxuPNoqkoveiYjlmbGbAKhWxonr33SmRRXLdREA5s+fj5eXFytWrLBovTqWQUiZN115Ly8vefTo0Tw5tlncPARLO0PNbvDS0kzlSoyMj6Tvhr5IKVndbTXODtbRN/YcvREAt6IFWT+sOSWKWHa0f/bs2YwaNYru3buzcuVK/W1CHiGEOCal9DK1TZ+paIqYMPjzTeWm3HVupsRASsnkg5O5c/8Oyzousxox+PWgn+Hzvs9aW7xFM3XqVMaMGcNLL73E77//jr29vUXr17EMejpcU2wcBdF3oc8ycHTJ1K6rfFexxW8LwxoMo37p+hnvkE+Yte0SABuHt7C4GJw5c4axY8fSv39/VqxYoYtBPkZvIaTm0hY4txZajwdX86PyhMWGMe3wNDZd30Qz12YMrj04B420LL53ogiPSaBCiULUcs2cAJpDnTp12LlzJy1atMDW1nrjRD4N6C0EY+Lvw8aPoVR1aG5e+nApJeuurKPb393YemMrQ+sNZV6bedgI6zi1h66F0mGOSrn+VouKFqtXSsmYMWPYvHkzAC1bttTFwArQWwjGHPkJIm7CG/+CnUOGxYNighi3bxyHbh+ifqn6TGw6kcrFKueCoZbj5R8PAdClbjkGmplUNSOklIwYMYJ58+YRHx9Pp06ZS+Wuk3fogmDMnTNQtAJUaJph0ZiEGN7f8T43Im8wrsk4+lbrazWtghQC7z0AoGqZInz/imVmUCYnJ/Pee++xaNEiRo0axYwZMyxSr07uoAuCMeF+UMwzw2JSSj7f/zm+Yb583/Z7qw191nyqDwBvWqirkJSUxJAhQ1i6dCmjR4/m66+/tor5FzoPsa6ftJwm3A+KZRyd54fTP7D1xlZGNRpltWLQYfYew2dLxD8EFcvA3t6eiRMn6mJgpegthBTiopUrcwYthAOBB1hwcgHdKnWzmunIqTlwNQTfu2pq8sExbbKUZNWYhIQEgoKCcHNz44cfftCFwIrRWwgp3Luh/mcgCD+c/gG3Im5MaDrBam/8Vxb/ByhX5uxmVIqPj6dfv340b96cqKgoqz0nOgpdEFLwVXP4KVElzSKng09zIugEr9Z4lQK21jntdvq/Fw2fmz6TvbgMsbGx9OrVi7Vr1zJq1CicnJyya55OHqN3GQDunofd06FmdyibdsTgX879gpO9Ez2r9MxF4yzD1nN3ePvXY4blOf3qZ+vX/MGDB/To0YOtW7fyww8/8M4771jCTJ08RheEpAT4+10o4AwvzkrTb+Fk0Em239zOoFqDrCrV2qFroXz212lDbINKpQqzaGAjKpfO3q/5uHHj2LZtGz///DODB1vPrEyd9NEFYdc3cPsk9P2fCp9ugvsJ9xm7byzlCpdjSJ0huWxg1jl+M9ww8aiOmwsfd6hGy6qlLFL3xIkTad26NV27drVIfTr5g6dbEI4uhb0zVRSkmt1NFpFSMu3wNAKjA1naYSlFHPJ/MI+boTG88O1Ow3KJwg5s+CD7UZ4jIiKYPHkyU6ZMwcXFRReDJ5CnVxAublRejZW9VVchDZaeW8raK2sZUmeIVcRDvHXvwSNi8P0rDXixTrls1xsWFkaHDh04deoU3bt354UXrHP+hU76PJ2CcG03/DkYytWHvr+ArWl33PVX1zP72Gw6eXZiWINhuWxk1njxu72AahUc+9zbInWGhITg7e3N+fPnWbNmjS4GTzBPlyCE+8H2L1SGpeKVYMBqcDA9QLg3YC8T9k+gSbkmTGkxxSr8FGZs8SU8JgHAYmJw9+5d2rZty9WrV9mwYQPt27e3SL06+ZOnQxAehKuxgv8WgbCFFz6F5sOhgOmRdv9Ifz7a/RFVi1VlTqs5ONhm7PmY1yQmJfP9ziuACnJiKcLCwrh//z4bN26kTZs2FqtXJ3/y5AtCdDAsbgMR/lB/ALQZB86u6e6y8NRCpJR81+Y7qxhElFLSWesq9GrgZpEgJ+Hh4RQtWpQaNWrg6+uLg0P+F0Wd7JP/28HZITEeVr0G94Ng8L/QY36GYnD13lX+ufYP/av3t5o07ZEPErl0NxqA8V1qZrs+Pz8/GjVqxJQpUwB0MXiKeLJbCP+OhpsHoNdP4PGcWbvMPzmfgnYFeaP2GzlsnGWIS0zil4N+AHzWsTrFC2fv4b1y5Qpt2rQhOjpaD2zyFPLkCsKxZXD0Z5WNuW4fs3Y5FXyKbTe2MbTeUIo5FstZ+yzAlaAoei44QFRsIgCd62SvRXPx4kXatm1LfHw8Pj4+1K9vPUFidSzDkykID+7B5tHwTGtoN8msXaSUzDw6kxKOJXijVv5uHSQmJRN6P552s1RMg3Iujvz2VhMqlMj6lOqYmBjatWtHUlISO3fupHbt2pYyV8eKeDIF4dxaSHwAbT8Hm4wDe96KvsWSs0s4EXSCiU0nUsi+UC4YmTVWHrnJZ3+dMSwXdrDlwOg22XY7LlSoEHPnzqVWrVpUr149u2bqWClPpiCc/F1FTnZNf2ahb5gvP535iW03tgHQs3JPelTukRsWZomA8BiDGDTwKEr/xh70buieLTE4duwYgYGBdOvWjd69e1vKVB0r5ckThAsbIOAweH+ZbsalkAchDNw8EFthy8CaAxlQY0C+f6uw4vBNAN5p+QxjOtXIdn2HDh2iY8eOlClThk6dOukJVHSeMEG4fRrWvA1uXtD47XSLLjm7hPikeNb1WEcF54zjKOY1ycmS+TuvAlhEDPbt20enTp0oU6YM27Zt08VAB3iS5iFEB8Mfr4BjUXj5N7B3TLNocEwwq3xX0eWZLlYhBmcDIwxZmQs5ZD/Zya5du+jQoQNubm7s3r0bDw+PbNep82Tw5LQQ1r0P90Ng8GZwSr/pP+f4HJJkEm/XTb8VkV+Ys13lXWxUoRj/G9w42/Vt2rQJT09PduzYQdmy+bubpJO7PBkthMhbcHmr8k/IIB/jiaATrL+6ntdrvo6Hc/7/ZbwXE8/2C0EA/PZWEwoXyLqGx8XFATBt2jQOHDigi4HOY5glCEKIjkIIXyHEFSHE6HTKvSSEkEIIk7nnc4wzfwIS6vZLt1hiciJfHfqKsoXL5vvWgZSSd349Sv3J6g3IiLZVcLTPenfh77//pnr16ly9ehUhBC4ulk/qqmP9ZCgIQghbYD7QCagJ9BdCPDZhXgjhBAwH/rO0kRlyZpV6xViiUrrFNlzdgG+4L594fZKv5xrEJSbx7Ffb2XLuLgD9vMrz5vNZz660evVq+vTpQ9myZSlRInuRlnWebMxpfzYGrkgprwEIIf4AugPnU5X7EpgOfGxRCzMi2FflZOw4NcOiPjd9KO9UHu8KlokVkBP8vO86X/7z8NQeHd+OkkWyHvL9999/Z+DAgTRr1oyNGzfi7OxsCTN1nlDM6TK4Af5GywHaOgNCiAZAeSnlP+lVJIR4WwhxVAhxNDg4ONPGmsRPuf1SrXO6xRKSEzhy9whNyzXNt8lEjt8MN4jBh+2qsn90m2yJwcaNG3n11Vdp2bIlmzdv1sVAJ0PMEQRTT480bBTCBpgNfJRRRVLKH6WUXlJKr1KlLBP9l7vnoYALFE1/gPBcyDnuJ9znOVfzvB7zgpQIyaO8qzKiXRXcimYvq9ILL7zAxx9/zD///EORIvk/roNO3mOOIAQA5Y2W3YFbRstOQG1glxDCD3gOWJ9rA4t3z0GZmunOSgTYemMrAkHjstl/bWdp7sXE89zXO4hPTAbggzaVs1Xf6tWriY6OxsnJienTp1OoUP4dL9HJX5gjCEeAKkKIikIIB+BlYH3KRillhJSypJTSU0rpCRwCukkpj+aIxcZICUEXoHT6QUH2BOxh+fnldK3UFZcC+W90fc72y9yJjAVg/bDm2erSzJw5k759+zJz5kxLmafzFJHhoKKUMlEIMQzYAtgCS6SU54QQk4GjUsr16deQg9w8CHERUK5emkX8Ivz4bM9nVC9enfHPjc9F48zH1kYJwOWvOmUrE/M333zD2LFj6dOnD2PHjrWUeTpPEWbNcpFSbgI2pVo3IY2yrbJvlhlIqSIoFykLddIOgDLhwATsbOyY03oOBe2y1yfPKdafukUBO5ssi4GUksmTJzNp0iQGDBjAsmXLsLN7ciah6uQe1jtTMeAo+B+CFz4GB9N95DPBZzgRdIKh9YbiWiT9WIp5xaiVJwmOiiNOGz/ICqGhoSxatIhBgwbxyy+/6GKgk2Ws9865dVz9r/5imkV+Of8Lhe0L072S6TRteU3PBfs5cfMeAHs/bZ3p/aVUL3tKlizJ4cOHcXV1xcbGejVeJ++x3rvnzmkoVAKcTKcp2+q3lS1+WxhQY0C+DKU+a9slgxisGPIc5Ytn7k2AlJIRI0YwatQopJS4u7vrYqCTbaz3DrpzFsrUNvm6MTA6kEkHJlGnZB2G1h2aB8alT0JSMt/tuAzA3+83p2mlzE0nTk5OZujQocybN08XAR2LYp13U1Kiet1Yts5jmxKSE/hsz2dIJNNemIZ9Gnkb84r7cYlM3qBmI3ar50r98kUztX9SUhJvvvkmP/74I2PGjGHGjBn5dualjvVhnWMI925AUhyUfjxy0MKTCzkVfIpvX/iW8k7lTeycd4z+6zR/HHk4C7yPl3um6xgyZAjLli1j0qRJTJgwQRcDHYtinYIQoprblKz6yOrL4ZdZcnYJ3St1p2PFjnlgWPpsPHMbUK7Mbz5fEWfHzLdeunbtStWqVRk9Ok0vdB2dLGOlguCr/pesYlglpeTr/76miEMRPvLK0K0i17gaHM3Bq6GM//ssAA09ivKhd9UM9nqUuLg4Dh06RMuWLenZs2dOmKmjA1itIFyCwqWh4MPsSj43fTh69yifP/d5vsm6dNQvjJd+OGhYtrURzH05/YhOqYmNjaV3795s3bqVS5cuUbFi1uMi6OhkhHUKQujVR1oHSclJzDsxD09nT3pV6ZWHhj0kNDrOIAYvNXLnkw7VKOOcduBXU8TExNCjRw+2b9/ODz/8oIuBTo5jnYIQGQgeTQ2LG69v5GrEVWa0nIGdTd5+paDIWHouOEDgvQcAdKlbjhl90va1SIvo6Gi6du3K7t27WbJkCYMGDbKwpTo6j2N9giAlRN0xRFaOjo9mwckF1CheI88jIUkpafz1DsPya00r8EW3Wlmq6/fff2fv3r0sX76cV155xVIm6uiki/UJwoNwSIoHp3IkJCcwatco7t6/y5TmU7AReTut4mZYDAAF7W0590UHbGyy/kpwyJAhNG7cWM/ArJOrWN/EpLBrAEhnNyYfnMzB2weZ0HQCXmVzN9CzMUnJknFrz9Dy210ATO5eK0tiEBYWRufOnTl//jxCCF0MdHId62shaDEUzxQpyt9H/uatOm/Rs0revYqLTUii+uf/GpZbVi1F9/pu6exhmuDgYNq1a4evry/+/v7UrJl+0BcdnZzA+gTh+h4oVYNLsSp5Se8qeZexWEpJ+9l7DMvHxrejRBaCot65c4e2bdty/fp1NmzYgLd3/o0KrfNkY12CkBgPNw9Bg4Fci7hGAdsClCts2tsxpwm894DmU30My+e+6JClrEp37tyhZcuWBAYGsmnTJlq1amVBK3V0Mod1jSEEHoOEGKj4PNfuXcPT2RNbm+wnP80KXb7ba/h8eFzbLKdYc3Z2pkaNGmzZskUXA508x7paCNd3A4IHbo04dmxyno0dxCcmEx6TgIOdDZemdMpSHX5+fhQrVgwXFxf+/vtvC1uoo5M1rKuFcG0XuDbgQPgFYpNiaevRNtdNWLDrCl5TVL7FrnWzFpbt8uXLPP/887z66quWNE1HJ9tYjyDERUHAEXimFTtu7sDZwZmGZRrmuhnT//UlMjYRl4L2WcqfcPHiRVq2bElsbCxTpkzJAQt1dLKO9QiC335ITiTB83l2B+ymVflW2NvkbvCTkGiVTv2N5p6cmtgez5KFM7X/2bNnadmyJcnJyezatYt69TI/pVlHJyexnjGEwGMgbDhWwJbI+EjaeLTJ1cPHxCfiNWU7AB6ZjH8I6hXl66+/jp2dHT4+PlSrVs3SJuroZBvrEYTw6+Dszo7AfTjaOtLMtVmuHTo2IYmaE7YYll9r6pnpOoQQrFy5EoDKlbOXqk1HJ6ewni5D2HWSi3vi4+9Dc7fmuZp0JSUJK8C1rzsbMi2Zw8GDB/n444+RUlK5cmVdDHTyNdYjCOHXOedckqCYoFzrLiQlS349dIOT/ipc+oXJHTPlo7Bnzx7at2/PunXrCAsLyykzdXQshnV0GWIjICaU/zRrW7q3zPFDSimpNPZh9rpZfetR0MH8SVA+Pj507doVDw8PduzYQYkSmQu1rqOTF1iHIIReBeC2rQ1FCxTNlQzOw/84afjs81FLnillfrKXrVu30r17dypXrsz27dspU6ZMTpioo2NxrEMQ/PYBEGQrKFModx6uo36qiX/xy4442mduenRiYiJ169Zl48aNlCxZMifM09HJEaxjDOHKNihdk1tx4ZQtXDbHD3fS/x63I2IBMiUGAQEBAHTu3JmDBw/qYqBjdZjVQhBCdATmArbAT1LKqam2b1N5UAAAFi1JREFUjwLeAhKBYGCwlPKGRSyMi4YbB+G5odwO9aFh6ZyZnZiQkEBAQACxsbGEhD9gcbdylCjswIULF8za//79+4SEhBAUFETBgvkz7bzO04WjoyPu7u7Y25s/gS9DQRBC2ALzAW8gADgihFgvpTxvVOwE4CWljBFCvAtMB/plyvq08NsHyQnEej5P1O11lCmcM12GgIAAnJyccHX3IOFuFEIIars6m5UZKTQ0lOvXr+Pp6UmVKlWwtc0bD0wdnRSklISGhhIQEJCpaN3mdBkaA1eklNeklPHAH8Aj+dWllDullDHa4iEg8znK0uLqDrArSEQZlbYtpwYUY2NjKVGiBGEx8QC4FS1olhiEhIRw/fp1nJycdDHQyTcIIShRogSxsbGZ2s8cQXAD/I2WA7R1afEmsNnUBiHE20KIo0KIo8HBweZZeNUHPFsQkay+mItDzr1hiE1IIjhK+SsUL+yQYfn79+/j5+eHs7OzLgY6+Y6s5P00RxBM1SrTMOBVwAv41tR2KeWPUkovKaVXqVKlMj5y1B0IvQKVWhMRFwHkXAsB4ErwfQCczMy5WLhwYSpWrEjlypX1tOw6TwTm3MUBgHEaZXfgVupCQoh2wDigm5QyziLWxasHlMKl8A1T+Rw9nDwsUrUpbIXA0d6Wihl4Md69e5eYGNVDKlGihMXEICAggO7du1OlShUqVarEiBEjiI+Pz1JdkyZNYsyYMY+sO3nyJDVqPJ4xO4VBgwZRsWJF6tevT7169dixY0eaZdNj165dHDhwIEv7psbT05OQkJBH1i1btoxSpUpRv359qlevzuzZsy1yLB3zBOEIUEUIUVEI4QC8DKw3LiCEaAAsQolBkOXNhP/u/Ed5p/KUK2L5GIp/nwgkKCqWJCkplMFsxNu3b+Pv74/ZXR4zkVLSq1cvevToweXLl7l06RLR0dGMGzcuS/X179/f4EyVwh9//JFh0pdvv/2WkydPMmfOHIYOHZqlY5srCIMGDWLXrl1ZOka/fv04efIk+/fv56uvvsLf3z/jnXQyJMO3DFLKRCHEMGAL6rXjEinlOSHEZOColHI9qotQBFit9VtuSim7WcrIJJnMsTvHaO/Z3lJVGvj37G1GrjzJ4m7lkFLi5GjPFxvOcf5W5GNl4+PjiIuLx97eHkfHBEw0lNKkpqszE7umncXJx8cHR0dH3njjDQBsbW2ZPXs2FStW5IsvvmDVqlWsX7+emJgYrl69Ss+ePZk+fTqgZkZOnDiRuLg4KlWqxNKlS/l/e2cfVVWV9/HPBgQRTZTMUDTAd1DCwVExJzHfzXwpK3mmzLTHocdYLmRmbJ5c1oyuMht9zLJhtBczZ0ZMh7HVG2aimS8oCMpLkhgiEmmICIQmcvfzx7keebkXLni5nEv7sxZrnXvOPnt/z+be39nnd/bvtwcMGIC3tzfJycmMGDECgO3bt5OYmEh1dTULFiwgJSUFIQTz588nJiamlp7w8HAKCwv1z6mpqSxZsoSKigruvPNONm/ejK+vL+vXrycuLg43NzeCgoJYtWoVcXFxuLq6snXrVt544w1+85vf2NxPTcXHx4e+fftSVFREr169Gj9B0SA2zUOQUn4KfFpn3/Ia2+PtrKsWedeKKa8qJ6x7mF3rff/QWV78KAsA7w7tCPHztlr2559/5vr1m8agaYu22kJWVhZhYbWv74477qB3797k5uYC2pA/LS0NDw8PBgwYQHR0NJ6enqxcuZI9e/bg5eXFq6++ytq1a1m+fDmRkZFs27aNESNGcOTIEXx8fOjXrx+pqakUFhaSmaktUV9aWlpPz+eff87MmTMBbY5GdHQ0u3btolu3bsTHx/PCCy/w7rvvsmrVKvLy8vDw8KC0tBRvb2+ioqLo2LEjv//97+3eT3U5d+4c165dIyQkpMXb+iXgFFOXc65eAGBg14F2q/NEQaluDN6eO4yO4lY0Yt07uclkIjc3Fw8PD3r37t0s721jSCkt1ltz/7hx4+jcWXOqBgUFkZ+fT2lpKdnZ2dx3330AXL9+nfBwbSHcOXPmMGrUKNasWcO2bduIjIwEIDAwkO+++47o6GgefPBBJk68NfL6wx/+wB//+EcuXrzIkSNa2HdOTg6ZmZn6ehHV1dX4+mqPbiEhIfz2t79l5syZugFpiMTERJYuXQpoP+avv/6ajh074uHhQXJyss39FR8fT1JSEjk5OWzatKlFjPQvEadwjedcvUA7l3b4d/a3S32fnCxixoaDACy8P5DxQZYnO0kpqa6uxsXFhb59+7aYMQAIDg4mJSWl1r6ysjIKCgro06cPAB4etxaBcXV15caNG0gpmTBhAunp6aSnp5Odnc0777wDQK9evfD392f//v3s3LmTxx57DIAuXbpw4sQJIiIi2LBhA88884xe72uvvUZubi4rV67kqaee0vshODhYbyMjI4Pdu3cD8Mknn7Bo0SJSU1MJCwvjxo0bDV7npEmT9HqmT5/O22+/TXp6epOMAWg+hKysLA4cOEBsbCw//PBDk85XWMYpDMLxnwoY1HWQXXIoXv7pOov+eRyA+fcF8L9TLXvdpZTk5+eTk5OjG4WWMgag3f0rKyvZsmULoN2FY2NjmTdvHh06WE/ZNnLkSA4ePKg/VlRWVvLtt9/qxyMjI4mJiaFPnz74+WnzxYqLizGZTDzyyCOsWLGC48eP16rTxcWFxYsXYzKZSExMZMCAAfz4448cPnwY0B4hsrKyMJlMFBQUMHbsWFavXk1paSkVFRV06tSJ8vJyu/aPNcLDw3nyySd5/fXXHdJeW8fwBuGKiyDjp0LCe4Tfdl2p+SUMXaGlUB8/qDvLH7K8fqKUkrNnz1JcXEznzp0dMsdACEFCQgIffvgh/fr1o3///rRv356XX365wfO6devG5s2biYyMJCQkhJEjR3Lq1Cn9+KOPPkpWVhZz5szR9xUWFhIREUFoaCjz5s3jlVdesahn2bJlrF69Gnd3d3bs2MHSpUu59957CQ0N5dChQ1RXV/PEE08wZMgQhg4dSkxMDN7e3jz00EMkJCQQGhrKgQMH6tXdVEJCQvDz88PPz48lS5bUO7506VLee+89hxmhtoyQ0uIcoxZn2LBhsu4QuR6XzvDFO/expHs3tkzZwtC7hja7vaIrVwl/RVt67df+XYhfGF4r+9E333zDoEGDkFKSl5dHSUkJPXr0oEeP5q29oFAYgZvf65oIIVKllBaXSze8U/F7N01iX+/m5yJc9p8Mth45B4C7mwsfRllP0FpQUEBJSQl+fn7cfXfLh1orFEbC8AbhJsLiDOrGKfnpum4MFo/rx3ONLK7SvXt3PD09sWlqtULRxnAag9BcbmY+ip3Qn+hx/SyWuXr1KmVlZUgp8fDwUMZA8YvF8E7F20FKycIPUgEYEWg5yWllZSXTp0/n8uXLVFRUOFKeQmE42pxBMJkkh84Uc++fdxPwJ21yZUcPN4YHdK1XtqKigqlTp7J37158fHzo1KmTo+UqFIaizT0yfJJRRPS/0gBwEfDUKH9iJvSvV66srIwpU6aQnJzM1q1b6djR9qzKCkVbpU2NEDILr+jGYN3joZxaMYUXHwrmDgv5DbKyssjMzCQ+Pl6f0tvaqPDn+jgy/Nnf358hQ4YQEhLCmDFjyM+/lRbU1dWV0NBQ/e/s2bN2adNotBmD8FriKaa9oaVrHx7QlZlDe+LuVv/yqqqqAG2GW15eHo888ohDdVpDhT83jaaGP9vaVlJSEidPniQiIoKVK1fq+z09PfUp1+np6fj7+zdLt9Ex/CNDtflto4to2HZtSNIWc9n89K+JGHCXxTIXL15k4sSJLF68mKeffpquXev7FQD47Hn4IaPZmi1y9xCYssrqYRX+3DxaKvw5PDyc9evX260+Z8HwBuFHV1c6uLg3uLhrxc9aQE3AnV5WjUFRURHjx48nLy/PkHHzKvy5ebRU+HPN6wft1XRoaCgAAQEBJCQk2LU9o2B4g/C9mxu+7tbToef8UM6kdV8BMP1ey9OMCwsLeeCBBygsLOSzzz5jzJhG1oZs4E7eUqjwZ/uHPzenrbFjx3LhwgXuuusui48MbR3D+xCK3NzwdbecuKT8WpVuDAK7eRFtYRZieXk5Y8aMoaioiMTExMaNQSuhwp/tH/7cnLaSkpLIz88nODiY5cuXWy3XVnECg+BKDwup100myWLzgqwjA7uyNzYCN9f6l9OpUyeeffZZvvjiC/0uakRU+HPzaInwZ09PT9atW8eWLVsoKSlp/IQ2hKENQsmVc5S6utLbs34Ck63J+ew9peVzfW32vfWOnz59mmPHjgEQGxurO9aMigp/tk5rhD/7+voSGRnJhg0b7FanUyClbJW/sLAw2RgH9/1ZDt48WB7JSah3bP2eb+U9Sz+Wpy+U1zuWnZ0t7777btm/f39ZVVXVaDs3z1Eo2hqWvtdoyZEt/i4NPUI4e/k0AH16Wg9X9vepPZzOyMjQ/QQJCQm4uRneb6pQGAZDG4SL1ZW4SYlPh/rRh8fPXa63Ly0tjbFjx+Lu7s7+/fsJCrKcEUmhUFjG0LdPiWaxar6Ou1ZVzcNvHSK7SFs3waXGsddffx0vLy/27t2re+YVCoXtGNogWOKBv+7j+yvXcHdzIX7hSFxchP6u/u9//zvFxcX07NnQWrQKhcIahn5kqMuhM8V8f0VbBTr5T+MY2rsLX331FaNHj+bSpUt4eHgoY6BQ3AZOYxBMJsl/bdImlMQvHEkXL3e+/PJLJk+eTElJSbOjAhUKxS2cxiCk1nAijgj04fPPP2fatGn06dOHffv26VNpnRkV/lwfZwl/3rdvH9OmTbNY79SpUy3Gi9hCXFycPlnNETiNQdiVrkXebf9dOLt372bGjBkMHDiQpKQkune3vPKSMyFV+HOTcKbw508//RRvb+vrhjZEVFQUc+fOrbe/sSnizcUpnIrJ313SMyf3796Rn9yDmTVrFn/729/o0qWL3dt79eirnCo51XjBJjCw60CWDl9q9bgKf24eRgp/LisrY9asWeTk5HD//ffz1ltv4eLigr+/PykpKVRUVDBlyhRGjx7NoUOH6NmzJ7t27cLT05NNmzaxceNGrl+/Tt++ffnggw/o0KEDL730kh45GhERwahRozh48CDTp09n7ty5REVFce6c9ttYt27dbU/Pd4oRwu+2aolS5wa3p5OHKz179mTbtm0tYgxaC1vDn+Pj48nIyCA+Pp6CggKKi4v18Ofjx48zbNgw1q5dC6CHPwO1wp/T09P18OeMjAzdCNXEUvjzjh07SE1NZf78+frIZdWqVaSlpXHy5Eni4uLw9/cnKiqKmJgY0tPTW9QYgOPDn0NDQ5k1a5bFc44ePcqaNWvIyMjgzJkz/Pvf/65X5vTp0yxatIisrCy8vb3ZuXMnAA8//DDHjh3jxIkTDBo0SA9Qq0tpaSn79+8nNjaWxYsXExMTw7Fjx9i5c2etILXm4hQjhNLKKgSSl5+Zhtf3L+khrS1FQ3fyluLmq9OG9qvw51sYMfx5+PDhBAYGApox/vrrr5k9e3atMjd9NABhYWG6LyIzM5Nly5bpAWKTJk2y2Mbjjz+ub+/Zs4fs7Gz9c1lZGeXl5beVLNimEYIQYrIQIkcIkSuEeN7CcQ8hRLz5eLIQwr/ZiupiXmnu/FvzGDN6FM8995zdqjYSKvzZ+cOf6xp0Swbe0v8QNB/Hm2++SUZGBi+++CLXrl2z2IaXl5e+bTKZOHz4sH6NhYWFt505vFGDIIRwBTYAU4AgIFIIUXdO8ALgspSyL/B/wKu3pcpM5fVqfXvcfb/m448/rtUhbQkV/tw8jBT+fPToUfLy8jCZTMTHxzN69Gibzy0vL8fX15eqqir+8Y9/2HTOxIkTefPNN/XP9kjgYssIYTiQK6X8Tkp5HdgGzKhTZgbwvnl7BzBO2GHt9OLyqwB0K05j13/+g6en9TRqzo4Kf7aOs4Q/h4eH8/zzzzN48GACAgKs+hossWLFCkaMGMGECRMYOHCgTeesX7+elJQUQkJCCAoKIi4uzub2rNHo6s9CiNnAZCnlM+bPTwIjpJTP1SiTaS5z3vz5jLlMcZ26FgILAXr37h1W8z2vJd74MIa04kPELTiAu7t7ky+uKVhaJVehcHZaYvVnS3f6ulbEljJIKTcCG0FbDr6xhqMftc+EE4VCYRu2PDKcB2q+4PUDvrdWRgjhBnQGflm5pxSKNoAtBuEY0E8IESCEcAfmAB/VKfMR8JR5ezawVzb2LGJAnFCyQmGV5nyfGzUIUsobwHNAIvANsF1KmSWE+IsQYrq52DuAjxAiF1gC1Hs1aXTat2/PpUuXlFFQtAmklFy6dMni/IyGaNSp2FIMGzZM1n3v3ppUVVVx/vx5q+9/FQpno3379vj5+dGuXe21TW/XqfiLoF27dgQEBLS2DIWiVXGKWAaFQuEYlEFQKBQ6yiAoFAqdVnMqCiF+BBqeqqhxJ1DcaKnWxegaja4PlEZ7YKu+e6SU9dc2oBUNgq0IIVKseUSNgtE1Gl0fKI32wB761CODQqHQUQZBoVDoOINB2NjaAmzA6BqNrg+URntw2/oM70NQKBSOwxlGCAqFwkEog6BQKHQMYxBaNZGrffQtEUJkCyFOCiG+FELc40h9tmisUW62EEIKIRz+Cs0WjUKIx8x9mSWE+KeR9AkhegshkoQQaeb/9VQH63tXCHHRnKXM0nEhhFhv1n9SCPGrJjUgpWz1P8AVOAMEAu7ACSCoTpn/AeLM23OAeIPpGwt0MG8/60h9tmo0l+sEfAUcAYYZTSPQD0gDupg/32UwfRuBZ83bQcBZB/fh/cCvgEwrx6cCn6FlMRsJJDelfqOMEFotkau99Ekpk6SUleaPR9AySzkSW/oQYAWwGmiNOG9bNP43sEFKeRlASnnRYPokcId5uzP1s4e1KFLKr2g4G9kMYIvUOAJ4CyFsXvjUKAahJ1Bzcb7z5n0Wy0gtacsVwMch6mzTV5MFaFbakTSqUQgxFOglpfzYkcJqYEs/9gf6CyEOCiGOCCEmO0ydbfpeAp4QQpwHPgWiHSPNZpr6Xa2FUfIh2C2Rawthc9tCiCeAYcCYFlVkoWkL+3SNQggXtDUz5jlKkAVs6Uc3tMeGCLRR1gEhxGApZfOWT24atuiLBDZLKdcIIcKBD8z6TC0vzyZu63dilBGC0RO52qIPIcR44AVgupTyZwdpu0ljGjsBg4F9QoizaM+XHznYsWjr/3mXlLJKSpkH5KAZCKPoWwBsB5BSHgbaowUVGQWbvqtWcaRDpAFHiRvwHRDALWdOcJ0yi6jtVNxuMH1D0RxS/Yzah3XK78PxTkVb+nEy8L55+0604a+PgfR9Bswzbw8y/9iEg/vRH+tOxQep7VQ82qS6HXkhjVzkVOBb84/qBfO+v6DdbUGzxB8CucBRINBg+vYAF4B0899HRuvDOmUdbhBs7EcBrAWygQxgjsH0BQEHzcYiHZjoYH3/AoqAKrTRwAIgCoiq0X8bzPozmvo/VlOXFQqFjlF8CAqFwgAog6BQKHSUQVAoFDrKICgUCh1lEBQKhY4yCAqFQkcZBIVCofP/yEhCHcMAOzMAAAAASUVORK5CYII=\n", "text/plain": ["
"]}, "metadata": {"needs_background": "light"}, "output_type": "display_data"}], "source": ["import matplotlib.pyplot as plt\n", "fig, ax = plt.subplots(1, 1, figsize=(4,4))\n", "ax.plot([0, 1], [0, 1], 'k--')\n", "ax.plot(fpr_lr, tpr_lr, label=\"OneVsRest + LR\")\n", "ax.plot(fpr_rfc, tpr_rfc, label=\"OneVsRest + LR + RF\")\n", "ax.plot(fpr_rfc_bin, tpr_rfc_bin, label=\"OneVsRest + LR + RF binaire\")\n", "ax.set_title('Courbe ROC - comparaison de deux\\nmod\u00e8les pour toutes les classes')\n", "ax.legend();"]}, {"cell_type": "markdown", "metadata": {}, "source": ["Un peu mieux mais il faudrait encore valider avec une validation crois\u00e9e et plusieurs jeux de donn\u00e9es, y compris artificiels. Il reste n\u00e9anmoins l'id\u00e9e."]}, {"cell_type": "markdown", "metadata": {}, "source": ["## Automatisation avec une impl\u00e9mentation\n", "\n", "Comme c'est fastidieux de faire tout cela, on impl\u00e9mente une classe qui convertit un mod\u00e8le de machine learning en un *transform* qu'on peut ins\u00e9rer dans un pipeline."]}, {"cell_type": "code", "execution_count": 22, "metadata": {}, "outputs": [{"data": {"text/plain": ["Pipeline(memory=None,\n", " steps=[('skbasetransformstacking',\n", " SkBaseTransformStacking([OneVsRestClassifier(estimator=LogisticRegress\n", " ion(C=1.0, class_weight=None,\n", " dual=False, fit_intercept=True,\n", " intercept_scaling=1,\n", " l1_ratio=None, max_iter=1500,\n", " multi_class='auto',\n", " n_jobs=None, penalty='l2',\n", " random_state=None,\n", " solver='lbfgs', tol=0.0001,\n", " verbose=0, warm_start=False), n_j...\n", " RandomForestClassifier(bootstrap=True, ccp_alpha=0.0,\n", " class_weight=None, criterion='gini',\n", " max_depth=None, max_features='auto',\n", " max_leaf_nodes=None, max_samples=None,\n", " min_impurity_decrease=0.0,\n", " min_impurity_split=None,\n", " min_samples_leaf=1, min_samples_split=2,\n", " min_weight_fraction_leaf=0.0,\n", " n_estimators=100, n_jobs=None,\n", " oob_score=False, random_state=None,\n", " verbose=0, warm_start=False))],\n", " verbose=False)"]}, "execution_count": 23, "metadata": {}, "output_type": "execute_result"}], "source": ["from mlinsights.sklapi import SkBaseTransformStacking\n", "model = make_pipeline(\n", " SkBaseTransformStacking(\n", " [OneVsRestClassifier(LogisticRegression(max_iter=1500))], \n", " 'decision_function'), \n", " RandomForestClassifier())\n", "model.fit(X_train, y_train)"]}, {"cell_type": "code", "execution_count": 23, "metadata": {}, "outputs": [{"data": {"text/plain": ["0.7330188804547779"]}, "execution_count": 24, "metadata": {}, "output_type": "execute_result"}], "source": ["fpr_pipe, tpr_pipe, th_pipe = roc_curve(y_test == model.predict(X_test), \n", " model.predict_proba(X_test).max(axis=1),\n", " drop_intermediate=False)\n", "auc_pipe = roc_auc_score(y_test == model.predict(X_test),\n", " model.predict_proba(X_test).max(axis=1))\n", "auc_pipe"]}, {"cell_type": "markdown", "metadata": {}, "source": ["On n'oublie pas de m\u00e9langer les donn\u00e9es avant de faire tourner la validation crois\u00e9e."]}, {"cell_type": "code", "execution_count": 24, "metadata": {}, "outputs": [], "source": ["df = load_wines_dataset(shuffle=True)\n", "X = df.drop(['quality', 'color'], axis=1)\n", "y = df['quality']"]}, {"cell_type": "markdown", "metadata": {}, "source": ["On retrouve les m\u00eames r\u00e9sultats mais on peut maintenant faire une validation crois\u00e9e."]}, {"cell_type": "code", "execution_count": 25, "metadata": {"scrolled": false}, "outputs": [{"data": {"text/plain": ["array([0.66923077, 0.66153846, 0.67513472, 0.66897614, 0.65588915])"]}, "execution_count": 26, "metadata": {}, "output_type": "execute_result"}], "source": ["from sklearn.model_selection import cross_val_score\n", "from sklearn.model_selection import cross_validate\n", "cross_val_score(model, X, y, cv=5)"]}, {"cell_type": "markdown", "metadata": {}, "source": ["## scikit-learn 0.22 - stacking\n", "\n", "A partir de la version 0.22, *scikit-learn* a introduit le mod\u00e8le [StackingClassifier](https://scikit-learn.org/dev/modules/generated/sklearn.ensemble.StackingClassifier.html#sklearn.ensemble.StackingClassifier) avec un design un peu diff\u00e9rent"]}, {"cell_type": "code", "execution_count": 26, "metadata": {}, "outputs": [{"name": "stderr", "output_type": "stream", "text": ["C:\\xavierdupre\\__home_\\github_fork\\scikit-learn\\sklearn\\model_selection\\_split.py:667: UserWarning: The least populated class in y has only 2 members, which is less than n_splits=5.\n", " % (min_groups, self.n_splits)), UserWarning)\n", "C:\\xavierdupre\\__home_\\github_fork\\scikit-learn\\sklearn\\model_selection\\_split.py:667: UserWarning: The least populated class in y has only 2 members, which is less than n_splits=5.\n", " % (min_groups, self.n_splits)), UserWarning)\n", "C:\\xavierdupre\\__home_\\github_fork\\scikit-learn\\sklearn\\linear_model\\_logistic.py:939: ConvergenceWarning: lbfgs failed to converge (status=1):\n", "STOP: TOTAL NO. of ITERATIONS REACHED LIMIT.\n", "\n", "Increase the number of iterations (max_iter) or scale the data as shown in:\n", " https://scikit-learn.org/stable/modules/preprocessing.html.\n", "Please also refer to the documentation for alternative solver options:\n", " https://scikit-learn.org/stable/modules/linear_model.html#logistic-regression\n", " extra_warning_msg=_LOGISTIC_SOLVER_CONVERGENCE_MSG)\n"]}, {"data": {"text/plain": ["StackingClassifier(cv=None,\n", " estimators=[('ovrlr',\n", " OneVsRestClassifier(estimator=LogisticRegression(C=1.0,\n", " class_weight=None,\n", " dual=False,\n", " fit_intercept=True,\n", " intercept_scaling=1,\n", " l1_ratio=None,\n", " max_iter=1500,\n", " multi_class='auto',\n", " n_jobs=None,\n", " penalty='l2',\n", " random_state=None,\n", " solver='lbfgs',\n", " tol=0.0001,\n", " verbose=0,\n", " warm_start=False),\n", " n_jobs=None)),\n", " ('rf',\n", " RandomForestCla...\n", " max_depth=None,\n", " max_features='auto',\n", " max_leaf_nodes=None,\n", " max_samples=None,\n", " min_impurity_decrease=0.0,\n", " min_impurity_split=None,\n", " min_samples_leaf=1,\n", " min_samples_split=2,\n", " min_weight_fraction_leaf=0.0,\n", " n_estimators=100,\n", " n_jobs=None,\n", " oob_score=False,\n", " random_state=None,\n", " verbose=0,\n", " warm_start=False))],\n", " final_estimator=None, n_jobs=None, passthrough=False,\n", " stack_method='auto', verbose=0)"]}, "execution_count": 27, "metadata": {}, "output_type": "execute_result"}], "source": ["try:\n", " from sklearn.ensemble import StackingClassifier\n", " skl = True\n", "except ImportError:\n", " # scikit-learn pas assez r\u00e9cent\n", " skl = False\n", "if skl:\n", " model = StackingClassifier([\n", " ('ovrlr', OneVsRestClassifier(LogisticRegression(max_iter=1500))),\n", " ('rf', RandomForestClassifier())\n", " ])\n", " model.fit(X_train, y_train)\n", "else:\n", " model = None\n", "model"]}, {"cell_type": "code", "execution_count": 27, "metadata": {}, "outputs": [{"data": {"text/plain": ["0.7301920159931777"]}, "execution_count": 28, "metadata": {}, "output_type": "execute_result"}], "source": ["if model is not None:\n", " fpr_pipe, tpr_pipe, th_pipe = roc_curve(y_test == model.predict(X_test),\n", " model.predict_proba(X_test).max(axis=1),\n", " drop_intermediate=False)\n", " auc_pipe = roc_auc_score(y_test == model.predict(X_test),\n", " model.predict_proba(X_test).max(axis=1))\n", "else:\n", " auc_pipe = None\n", "auc_pipe"]}, {"cell_type": "code", "execution_count": 28, "metadata": {}, "outputs": [], "source": []}], "metadata": {"kernelspec": {"display_name": "Python 3", "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.7.2"}}, "nbformat": 4, "nbformat_minor": 2}