Skip to content

Instantly share code, notes, and snippets.

@sshojiro
Created December 5, 2019 14:22
Show Gist options
  • Save sshojiro/f99c873d503ca866d223880ff8755bec to your computer and use it in GitHub Desktop.
Save sshojiro/f99c873d503ca866d223880ff8755bec to your computer and use it in GitHub Desktop.
GPR.ipynb
Display the source blob
Display the rendered blob
Raw
{
"nbformat": 4,
"nbformat_minor": 0,
"metadata": {
"colab": {
"name": "GPR.ipynb",
"provenance": [],
"collapsed_sections": [],
"include_colab_link": true
},
"kernelspec": {
"name": "python3",
"display_name": "Python 3"
}
},
"cells": [
{
"cell_type": "markdown",
"metadata": {
"id": "view-in-github",
"colab_type": "text"
},
"source": [
"<a href=\"https://colab.research.google.com/gist/sshojiro/f99c873d503ca866d223880ff8755bec/gpr.ipynb\" target=\"_parent\"><img src=\"https://colab.research.google.com/assets/colab-badge.svg\" alt=\"Open In Colab\"/></a>"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "WxFF67B5avmg",
"colab_type": "text"
},
"source": [
"# GPR for Cheminformatics"
]
},
{
"cell_type": "code",
"metadata": {
"id": "1FNjr6ngZlBf",
"colab_type": "code",
"outputId": "f200e726-1d28-49ea-b921-8765d83fbf35",
"colab": {
"base_uri": "https://localhost:8080/",
"height": 397
}
},
"source": [
"!git clone https://github.com/HIPS/neural-fingerprint.git\n",
"import pandas as pd\n",
"df = pd.read_csv('./neural-fingerprint/data/2015-05-24-delaney/delaney-processed.csv')\n",
"\n",
"!curl -Lo rdkit_installer.py https://git.io/fxiPZ\n",
"import rdkit_installer\n",
"%time rdkit_installer.install()\n",
"import rdkit"
],
"execution_count": 1,
"outputs": [
{
"output_type": "stream",
"text": [
"Cloning into 'neural-fingerprint'...\n",
"remote: Enumerating objects: 1760, done.\u001b[K\n",
"remote: Total 1760 (delta 0), reused 0 (delta 0), pack-reused 1760\u001b[K\n",
"Receiving objects: 100% (1760/1760), 51.21 MiB | 24.78 MiB/s, done.\n",
"Resolving deltas: 100% (1141/1141), done.\n",
" % Total % Received % Xferd Average Speed Time Time Time Current\n",
" Dload Upload Total Spent Left Speed\n",
" 0 0 0 0 0 0 0 0 --:--:-- --:--:-- --:--:-- 0\n",
"100 2415 100 2415 0 0 3018 0 --:--:-- --:--:-- --:--:-- 3018\n"
],
"name": "stdout"
},
{
"output_type": "stream",
"text": [
"add /root/miniconda/lib/python3.6/site-packages to PYTHONPATH\n",
"python version: 3.6.9\n",
"fetching installer from https://repo.continuum.io/miniconda/Miniconda3-latest-Linux-x86_64.sh\n",
"done\n",
"installing miniconda to /root/miniconda\n",
"done\n",
"installing rdkit\n",
"done\n",
"rdkit-2017.09.1 installation finished!\n"
],
"name": "stderr"
},
{
"output_type": "stream",
"text": [
"CPU times: user 313 ms, sys: 182 ms, total: 495 ms\n",
"Wall time: 50.7 s\n"
],
"name": "stdout"
}
]
},
{
"cell_type": "code",
"metadata": {
"id": "jc1Df44UZtGr",
"colab_type": "code",
"colab": {
"base_uri": "https://localhost:8080/",
"height": 109
},
"outputId": "4437d6f2-7d9e-470d-ff61-470aa8e02134"
},
"source": [
"import numpy as np\n",
"\n",
"from sklearn import metrics\n",
"from sklearn.model_selection import GridSearchCV, train_test_split\n",
"from sklearn.cross_decomposition import PLSRegression\n",
"\n",
"import matplotlib as mpl\n",
"import matplotlib.pyplot as plt\n",
"\n",
"from rdkit.Chem import PandasTools, rdMolDescriptors, Descriptors\n",
"from rdkit.Chem.Draw import IPythonConsole\n",
"from rdkit.Chem import Draw"
],
"execution_count": 2,
"outputs": [
{
"output_type": "stream",
"text": [
"Traceback (most recent call last):\n",
" File \"/root/miniconda/lib/python3.6/site-packages/rdkit/Chem/PandasTools.py\", line 130, in <module>\n",
" if 'display.width' in pd.core.config._registered_options:\n",
"AttributeError: module 'pandas.core' has no attribute 'config'\n"
],
"name": "stderr"
}
]
},
{
"cell_type": "code",
"metadata": {
"id": "X2jkrzpxV-tm",
"colab_type": "code",
"colab": {}
},
"source": [
"from rdkit import Chem"
],
"execution_count": 0,
"outputs": []
},
{
"cell_type": "code",
"metadata": {
"id": "9CyFeVHBZ1Ko",
"colab_type": "code",
"colab": {}
},
"source": [
"df['ROMol'] = [Chem.MolFromSmiles(m)for m in df.smiles]"
],
"execution_count": 0,
"outputs": []
},
{
"cell_type": "code",
"metadata": {
"id": "5eeltFljWV9Q",
"colab_type": "code",
"colab": {
"base_uri": "https://localhost:8080/",
"height": 35
},
"outputId": "f15f25bc-b5a8-4db2-ea08-5d1c0e5cdf66"
},
"source": [
"X = np.matrix([np.array(list(map(lambda f:f(m), dict(Descriptors.descList).values())))\n",
" for m in df.ROMol] )\n",
"X.shape"
],
"execution_count": 20,
"outputs": [
{
"output_type": "execute_result",
"data": {
"text/plain": [
"(1128, 200)"
]
},
"metadata": {
"tags": []
},
"execution_count": 20
}
]
},
{
"cell_type": "code",
"metadata": {
"id": "PyxMCYK0crO8",
"colab_type": "code",
"colab": {}
},
"source": [
"TARGET = [df.columns[8]]\n",
"A = pd.DataFrame(X)\n",
"A = pd.concat((A,df[TARGET]),axis=1)"
],
"execution_count": 0,
"outputs": []
},
{
"cell_type": "code",
"metadata": {
"id": "q6qUw6MEVhqf",
"colab_type": "code",
"colab": {}
},
"source": [
"from sklearn.gaussian_process import GaussianProcessRegressor\n",
"from sklearn.gaussian_process.kernels import RBF, WhiteKernel\n",
"from sklearn.pipeline import make_pipeline\n",
"from sklearn.preprocessing import StandardScaler"
],
"execution_count": 0,
"outputs": []
},
{
"cell_type": "code",
"metadata": {
"id": "FQazpptZVswh",
"colab_type": "code",
"colab": {}
},
"source": [
"train, test = train_test_split(A, test_size=0.33, random_state = 42)"
],
"execution_count": 0,
"outputs": []
},
{
"cell_type": "code",
"metadata": {
"id": "IU6hTdwrX9hK",
"colab_type": "code",
"colab": {}
},
"source": [
"methods = A.columns[:-1]"
],
"execution_count": 0,
"outputs": []
},
{
"cell_type": "code",
"metadata": {
"id": "aJ9rsLd0XWG_",
"colab_type": "code",
"colab": {
"base_uri": "https://localhost:8080/",
"height": 235
},
"outputId": "dbc72f9d-3b1e-4bd9-cb5f-646771a3b88c"
},
"source": [
"kernel = 1. * RBF(length_scale=100.,\n",
" length_scale_bounds=(1e-2, 1e4)) \\\n",
" + WhiteKernel(noise_level=1, \n",
" noise_level_bounds=(1e-10, 1e+1))\n",
"model = make_pipeline(StandardScaler(),GaussianProcessRegressor(kernel=kernel,\n",
" alpha=0.))\n",
"model.fit(train.iloc[:,:-1],train[TARGET])"
],
"execution_count": 36,
"outputs": [
{
"output_type": "execute_result",
"data": {
"text/plain": [
"Pipeline(memory=None,\n",
" steps=[('standardscaler',\n",
" StandardScaler(copy=True, with_mean=True, with_std=True)),\n",
" ('gaussianprocessregressor',\n",
" GaussianProcessRegressor(alpha=0.0, copy_X_train=True,\n",
" kernel=1**2 * RBF(length_scale=100) + WhiteKernel(noise_level=1),\n",
" n_restarts_optimizer=0,\n",
" normalize_y=False,\n",
" optimizer='fmin_l_bfgs_b',\n",
" random_state=None))],\n",
" verbose=False)"
]
},
"metadata": {
"tags": []
},
"execution_count": 36
}
]
},
{
"cell_type": "code",
"metadata": {
"id": "wG6HipsueCbf",
"colab_type": "code",
"outputId": "bb5784c5-f05b-4d46-b1d3-86a549858fcc",
"colab": {
"base_uri": "https://localhost:8080/",
"height": 361
}
},
"source": [
"with mpl.style.context('seaborn'):\n",
" fig = plt.figure()\n",
" ax = fig.gca()\n",
" plt.plot(train[TARGET], model.predict(train[methods]), 'o')\n",
" plt.plot(test[TARGET], model.predict(test[methods]), 'o')\n",
" xlim = ax.get_xlim()\n",
" ax.set_ylim(xlim)\n",
" plt.plot(xlim,xlim, '-k')\n",
" plt.axis('square')\n",
" plt.xlabel('Measured log solubility')\n",
" plt.ylabel('Estimated log solubility')\n",
" plt.legend({'train', 'test'})"
],
"execution_count": 32,
"outputs": [
{
"output_type": "display_data",
"data": {
"image/png": "iVBORw0KGgoAAAANSUhEUgAAAWMAAAFYCAYAAACGf52PAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAADh0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uMy4xLjIsIGh0\ndHA6Ly9tYXRwbG90bGliLm9yZy8li6FKAAAgAElEQVR4nOydeXxU9dX/P3dmMpNlErKQTDYSSIBg\nQJaHJUW2CoTFyCIC7i0UBas+SkWpqLVVai1gbau/VvOwSBWVRYUqQSFGQECMBGUNIAEnC0mGbJCF\nbDP3/v4Y7mSWe2fLLDfJeb9evmTu3Ln3TJZPvnO+53wOw3EcB4IgCMKvyPwdAEEQBEFiTBAEIQlI\njAmCICQAiTFBEIQEIDEmCIKQACTGBEEQEkDh7wA8QVVVg8euFRERjLq6Gx67nieQYkyANOOSYkyA\nNOOSYkyANOPyVEzR0aGiz9HK2AqFQu7vEGyQYkyANOOSYkyANOOSYkyANOPyRUwkxgRBEBKAxJgg\nCEICkBgTBEFIABJjgiAICUBiTBAEIQFIjAmCICQAiTFBEIQEIDH2Ig0NDfj00x0uv+6ZZ55EQ4Pn\nGlkIgpA+3aIDzxPkF+qQc1SL8pobiI8KRtbYvshI13Tqmo2NDdi5cwfmzVtgcVyv10OhEP/Sv/76\nm526L0EQXQ8SYxiFOPuzs6bHZVVNpsedEeR33nkLV65cwaJF90OhUECpVCI0NBTFxcXYuvVTrFq1\nAjqdDm1tbViw4F7MmTMPADB//ixs2PA+mptv4JlnnsSYMaNx7NhxREdH469//RtUqsDOvWGCICQH\npSkA5BzVihwv7tR1H330f5GQkIDNmz/EY489iZ9+Oo+nnnoGW7d+CgBYteolbNq0BRs3voePP96K\n69ev2VyjrKwUDzzwALZs2Q61OhQHDnzdqZgIgugcLMti165PUFlZ4dHrkhgDKK8WNgCpqGny6H1u\nuWUw4uMTTI937NiKX//6PixduhhXr+pQWlpq85q4uHjccsstAIC0tEGoqCj3aEwEQTgPy7JYseJJ\nLF26GB9++L5Hry3JNEVFRQVWrlyJmpoaMAyDhQsX4te//rXX7hffOxhlVbbCGxcV4tH7BAUFmf79\nww8FKCj4HtnZ7yIwMBBPPLEUbW2tNq8JCAgw/Vsmk8NgsD2HIAjvwwvxBx+8h2HDRuA3v3nEo9eX\n5MpYLpfjueeew549e7Bt2zZ8+OGHKCoq8tr9ssb2FTme3KnrBgcH48YN4VV3U1MjQkPDEBgYiOJi\nLQoLz3TqXgRBeA9rId6xYxfCwyM8eg9JroxjYmIQExMDAFCr1UhJSYFOp0P//v29cj9+ky7naDEq\napoQFxWCrLHJna6m6NUrHLfeOgwPPbQQKlUgIiMjO+6ZcRt27foUDzwwH0lJyUhPH9KpexEE4R1Y\nlsXSpUu9KsQAwHAcx3n8qh6krKwMDz74IHbv3g21Wi14jifN5aOjQz16PU8gxZgAacYlxZgAacYl\nxZgAacXl6RWxPXN5SYtxU1MTHnroITz66KOYNm2a6Hl6vUGShtRE1+FIyTHsLNyLsvoKJIbF4a70\n6RiXNLrH3J+whV8Rb9y4ESNHjkRubi4iIjy/IuaRrBi3t7fj0Ucfxfjx47F48WK759LK2D9IMS53\nYirQncC7Zz+0Ob548P0YpRnu9bh8cX9XY/InUojLekW8f38e9PrOZ3W73NgljuPwwgsvICUlxaEQ\nE0Rn2asVrt3eV7y/R9yfsEQoNeHNFTGPJMX4+PHj+O9//4vvvvsOc+bMwZw5c3Dw4EF/h0V0Uypv\nXBU8XtGk6xH3JzrwRdWEGJKsphg1ahQuXLjg7zCIHkJscAzKmyptjseFdK6apqvcnzDiTyEGJLoy\nJghfMr3vZMHj05Jv7xH3J/wvxACJsVdx10ITALZv/xAtLS0ejogQYpRmOBYPvh8J6jjIGBkS1HFe\n3zyT0v17OlIQYkCiaQp/UKA7gb3ar1F54ypig2Mwve/kTv8yiFloOsP27R9h2rQ7EBhIDm2+YJRm\nuF/Fz9/376lIRYgBEmMAtqVF5U2Vpsed+QUxt9AcPToDERER+Prrr9De3oaJE2/HkiXL0NzcjJde\neg5Xr14FyxqwaNHDqK2tRXV1FZ58chl69QrH1q22ZU8EQXQOKQkxQGIMwH5pUWfE+NFH/xeXL1/C\n5s0f4vvvv8P+/XlYv/4/4DgOzz33NE6c+AHXrtWhd+9orFv3TwBAY2Mj1Go1tm37AG++mY3w8HC3\n708QhDBSE2KAxBiAb0qLvv/+Oxw79h0WL34AANDcfANlZSUYOnQE/t//+wf+/e83MW7cBAwbNsJj\n9yQIwhYpCjFAYgzAN6VFHMfhwQcXYe7cu22e27RpC44ePYL169/GyJGjsXixZ635CKIrYxqJVn0D\n8b07NxJNqkIMUDUFAO+VFplbaGZkjEVOzmemx1VVV1FXZ8wNq1SBmD79Dtx330P46afzZq/1rLk9\nQXQ1+JFoZVVNYDnONBItv9D1T61SFmKAVsYAOjbp9hXvR2WTDrEhGkxLvr3Tu9vmFpq/+MU4ZGbO\nwKOPGtu7g4KC8dJLq1FWVop///ufYBgZFAoFnnnmOQDA7Nl3YcWK/0Xv3tG0gUf0WOyNRHNmdcyv\nqq9UNeLiN9k4X/ClJIUYkLBRkCuQUZB/kGJcUowJkGZcUowpv1CHvcdKUVLZgPjewbhS1QQhgZLL\nGKxfaf+T6we5PyHveBk4jsWp3H+j9MxX6KVJxTsbtmFKxkCX4vLU16rLGQURBNHz4FMS2op6U0pC\nbKXYS610eC0hIc64+2UcPGM7+FcKUJqCIAhJIJaSEKK2vhX5hTrIoyqw88I+XGuvAdusRljjLZg3\ndAJyjmoFhVgZqPb4oGFPQWJMEIQkEJvSLsanpw6jMSbf+IABZMENaAz+HhsOt8JQqxEUYsDzg4Y9\nBYkxQRCSQGxKuxj16kLBPKs89hJObPtUUIgBy0HDniyb6yyUMyYIQhKITWmPDFUJHpcFNdoc41gO\nP2zZjeLTuYJCPGVkoklsPVk25wloZUwQhCTgRXLvsVKU6hpMU9oBIPuzszbns80hkAV3CDLHcji+\n/iC0B84jOmEg3nznQxw8c0104ntny+Y8DYkxQRCSISNdgzsn9RcsI8s5WmwS1hst7bhengpl/5MA\nOoT45/3n0Ss+CW++8yGmZAzElAzxe4nlqP21wUdiTBCE5MlI11isVh9esx8sF4e2ImOO+Ictu6E9\nYBTilX/ajINn6vDRgf1288BiOWp/bfBRzpggiC5HfO9gAIC+RoNj/zhhFGJNKmY89DqOnq+3yQM/\n868jNrlgsRy1+QafLyExJgiiy5E1tq9gHbEqULjDrbah1WZzLiNdg2WzByMxWg25jEFitBrLZg/2\nWzUFpSkIgpAs1qVnaUkRuFBSh7KqBpz+qkOIZyx6DQ/OHIH1nxfavZ715px1+sOfkBgThIt4Y0QX\nYQtfesZTVtVkbJEWWBE3tSuxY38RWAdWO1eqG/HSxnwbcZdCnTGJMUG4gLdGdBG2CJWeibU4A8ZU\nhCM4DqZNO17cefj8MgAqbSMIqeOtEV09AVc/UViXntkTYk9CdcYE0QXwxYiu7og7nyjMS898JcSA\n/+qMqZqCIFwgNjhG8LgnR3R1R+x9ohCDLz3zpRADVGdMEF0Cb43o6u64+omCr6IAWJz56m27Qizm\nXeEu/qozpjQFQbiA+YiuiiYd4jw0oqu7Izb0V8bI8L/7n7PIIX/zYxmyPzvr1Ip4yshEPJA5EPmF\nOmzJvYCmZr1T8chlDOKiQpCWFI4LJeL+Fb6ExJggXGSUZjiJr4tM7zvZImfMo2eN4mmeQ96Tp3c6\nNZF3vAwXSuqQlhThtBAnRqvxypIxnXg33kGyYvzNN9/g1VdfBcuyWLBgAZYuXervkIibSLHO1lMx\nOXMdR+dYPz8gIgU/Hy9GWX2FxflS/Dp6Gv49OrvBufHY52gpH+tSjti6RI1HHlkBRfwlMEFN4JpD\noC9PhaE2zm9pCEdIciCpwWDA9OnT8e6770Kj0WD+/Pl444030L9/f8HzaSCp77DeFedZPPj+TglJ\nZ4RJLKYIVTjm9r+j09cxf2+OzhF73ppJibfhYNm3du/lbbz9c/Xm0Y9woflHl17D6oHv/1rU6c06\neWSFydHNnAm9snDvyEkuX6/HDiQ9deoUkpOT0adPHyiVSmRlZSEvL8/fYRFwb1fcEbyAlTdVguVY\n00fWAt2JTsVU13rNI9cxf2+OzhF73poj5d87vFdXZuvxgy4LMcdyOL7xgFGI45M6VTWhiL8kePyy\n4Qe3rucLJJmm0Ol0iI2NNT3WaDQ4deqU6PkREcFQKOQeu7+9v17+Qioxie2KVzbp3I4x7/hBweNf\nlx3EzCET3I7JU9cxf2+OznEUCw+fK7V3L1/gyr2++bEMO/IuokTXgCRNKBZMGYCJIxIFn7sacwhw\nocjBZAy//zwiUqIx8fkpQGUDDLXuiTETJFwr3Jmvr7e/L5IUY1epq3NtkKE9pJQS4JFSTGK74rEh\nGrdjLKuvEDxeWl/h1DXFYvLUdczfm6NzHMXCo5ApBAW5M19HV3Hl58raJ0JbUY91W46jvr4FAGye\nC0xsAONkHObG8EYhvhNKtQps/GUYauOcfj8hQQpEqANRUdMEmSEQnKLZ5pwwZZhbX98em6bQaDSo\nrOz4gdbpdNBoqKheCnijzrazjRRiMXnqOubvzdE5jmLhGRcvvJsv1XpleyOKBD0kmp1rnBATYgBg\nAm1n3Nnjwcw0vLJkDNavvB1BSuF1Zlu7waVr+hJJroxvvfVWaLValJaWQqPRICcnB3/729/8HRYB\nyzrbyiYdYj1QZytW9uSsMPH33lW0B3Wt1zp9HXs1xI7OEXq+f3g/aBuKUVpfYXF+Sq++kqxXFtpM\ntTeiSKgEQG82Eskc07kcA4AVFWIAYMAgcPRei0oIIRgAS618iG8YGiG0NG8yuCbwvkSS1RQAcPDg\nQfzlL3+BwWDA3Xffjd/+9rei51I1hX/wZFwFuhMeEaafms/j49NfSE7gpPg9FIpJrBpEfXUMqrSR\nNscTo9UAOFNpmXk5GfQKMAHtgve2tyIWo61omKggb3rO8hPJb3e/YjGslIe9EYq37/yD3fsI4Ys0\nhSRXxgAwadIkTJrkegkK0TXxVCPFuKTRGBg0yAMR9UzEqkEC4n8GBMTYfHqzTTmZm0LMsQwYme0a\nUSGSQ5ZHVuDV/DdMK/lUxUjRlXlYY7pgTFJAsmJMEITvEasGqWuvBsMACpkMepZF7+Q6KOIvYYtu\nH2KDYxCWkIDWCOFyMnOshXj8M3dDIQsFxzaCa1FDX56CgFThyimhHDL/B6D8ZvFEeVMlypEDYBja\nioZBEX8ZTGDHteeNH+/018LXkBgTBGFCrBqEbVaD44B2Awt5ZAUaY04CN4tBypsqgYRKMA4SnkIr\n4oAQALj58V9uXElzzSFgBFIMXIttmZtYPbEi/jJaz4yzWEkzjH9M452FxJggeihHSo5hx6k9Fht1\noh4S5Smmf4sJIDgZwLDCTzmRI2ZULVD2Pwl9ZZJgvtc8BtNrROqJhVbREQ5y0v6GxJggujlC1REA\nBM3eFw++H4sH3499xftR3qiD4UYI9OUplitMEQHsjBCbIwurE0wxCOWLXVlFO1347CdIjIluhdBq\nTwrVFP5CbMJGhKqX4Pn7ivfj+TG/g6EmDtlfnxU8R0wAhVbG7lRNMIGNMNTG2YhvZJgKIwZE40LJ\nNejYi1D10cKgFP7DILSKvt7YZve+/kaSTR8E4Q4FuhP459FNbntcdEfEfTuuCx7n3dXEmjwAYw2x\nIB4QYuN1OKiGHIY80rIzM1gVgAcyB2L2nUooUk/CoLwOoCNRzbHG0jWxEjh/TfBwFhJjotvgDROj\nro6oV4bIZhvfrSjW5AEAhto4tBUNA3sjFBzLmASQa+5IDbgtxDButMmCG6Hsf9JCkPnZdGLfZ64l\n1GbTzhypWmfyUJqC6DbQsFBbRKsj2gIhU7XYHOe7Fc2HgQohlEaQqesgC24UFWKOA8DJwMiEc8tC\nmNcW8ytbse+n9aZdgFwGluP8PsHDWUiMiW6DmPD01GGh+YU61P+cBMTYfk30pWkAYNokU7SH4Vf/\nk2XKr2eN7Wth/gPc7K7rcwGM0ijiXJsK+tJBJrGUhdXa95pgAA7OCzFgKbD8ylbWFgqDst7mXOtN\nu99k3SJ5ATaHxJjoNnTW46I70eGyFgl5vXhlAv9/eWQF3mN2Y7PyI8SFaDC972TLSRltSshUrRb3\nYFStUPY/ibaim9dRNbqdmhCDF9gpIxNNwtpS2g8BqbbddfryFNNsu66wEraGxJjoNozSDEdYWKAk\nvSl8jfkGnHlKIUAug8FguTrlu9h4PzN+41NpNliHsRJicwJSToNjWRx/5wi0hzwnxEBHVcSFkg4D\nqFhZf1QUweYPTJx8AF5ZKb3Zds5CYkx0K7qyNwU/nr68+gbiewcja2xft1d3YhtwetYoxBaGPlxn\nC3ANOL3/LeeEWKQxhGNvHudkAFhwLaEWK3h+8w7gUyhNNjnrrNnS3qBzBIkxQUgAa/P2sqom02Nz\nQXZWsMU24CLUKjQFFkPWz+xjvqM+ZjuY54jDkzX4xX3PQhFQBsB2cxAADFcToYgtsTnefvlWu0by\ncVEhFs0rcbdFQl+eitqSyC6blrCGxJggJIA983ZeZJwVbEB4Aw4AahtaoUou8kjM1pt1E1bdgQB5\nJRiZsIE7Z5AZN/luVlXwK2BV3UDc1m8E8mrLRO8VlVyDd892lChe01cDMdVYdrvvBrh6G6ozJggJ\nYM+8nceeYFuTka6BOihA8HzRdmYXEKqaUIWqIAtuFPUwZuSs8XkGYGQsGJkxJ1x/JRr7f7iCyFAV\n5IxwyuSSXniQ6Pvntnebph5aGROEH+E/eqtG6cAKTLQw7xpzRrDNaWzuEEWbHLGHUhOd3azj64hZ\njkNtg/gmoT6gXtBaQs/q8e7ZD7FjfxHmDZ3QpVMVtDImCD/B+0aUN1UCDCfYdWbeNRbfO1jwOo7a\nfPlqCeOqlHOp6cIaTwox4PycO0V7mN3n69XnkP3ZWeQXdt0GHxJjgvATYm29ivjLSIxWY5nVXLes\nsX0Fz3fU5itqeekinhZiAODaVVANOYzA0XsF/Sh4bou2bwrPi7pQyqarQGkKgvATYu3bsuAGozBF\nKQF0iDEvzDlHi1FR02RTRWBdaaEOCkBjc7vXcsSeqCM2b8lmbn4yMDWR3CQyTIV7R47D9zvPoyXs\nEoTSynxziFjKpitAYkwQfkKsfRvoaLwAYFEtkJGuEcyLClVa8IhaXjqJw5l1fHUEwwoKpfEaMhiu\nJkIWVmdq1AgMYtHG2Iqn9ay7641tKNCdQGuvS6KWxHxziNSd2exBYkwQXia/UIe9xwpQUtlgURss\n1r5tzr7i/XZLt7YeP4hvqw5BH9AA1RDhkfZiwzmdwakJHQzQdulW4wahqOizaC+xHAYqG71X8Ezr\nPHJcVIi4Uxsrs6hRlrozmz1IjAnCi9ivDTaK7L7i/bjSKJwrtec4t/X4QRy6ngMojUMs+I/5HHcS\n4IwrUV4AxSYu28OV1IQi/rJd0Wdkxo1E8z8UbHOI4Hgla8OfrLHJeL/yE7EowdXFITFa3eUbP0iM\nCcKLOGrmGKUZjlGa4Xg1/w2XHecO6w4BgbbHGQYAw0IRWwImsAny8BqX43Y1R8xP59BX1gl22AG2\n6Qcx8Y64MRhVZoY/AGBotTUqAoBIZW/8+feTXX17koTEmCC8iLO1we44zrEq4dpbc2S9xIWY08vB\nKGy75dzZrOPajc+3l6RDrikRzB1bpx96tffFvYMHY1/xfgtjp5lDJqCqqsF03hPvfgRZsnAN8ty0\nTLtxdSVIjAnCi4h5RFhvNBlq4gSHcF4wBGOUmN7YmcbMI7ahBgCQe0aIAWNVBJ+G4JrVTg0JXXB7\nf4zSaOzmxPMLdTBEXxSswWVbA7tNKzTgRJ1xZaXwbi9BEI5xtjY456gWhto4tJ4Zh5aC6abxQXnH\ny0QbGRgHQuwqnS1fU8RfBiA+I4+veIgMVdnUUIuRc1QrWprHBIh37HVFHK6M58+fjxEjRuD+++/H\n2LFjfRETQXQbeMHZe6wUpboGUYcxezPnzM2CePILdWCb1YIbYM7CtQWCuVnnKyTEASGu1RHzaQjj\njLwOv+FIZW/MTcvEqMmur2LLq28gQCNcmidrC3X5elLGoRh//fXX2LNnD/7xj39g9erVeOCBBzBn\nzhyo1WpHLyUIAkZBvnNSf4s8qDX2Zs4JNTLkHNVCb3C/ZA0wjl6Sqesgiy7GDxtEZta5gHkagje0\nd3YFLEZ872BUiGz0jddMcPu6UsRhmkKpVGLu3LnYtm0b/vznP2P9+vWYOHEiVq9ejZoa13dpHbFm\nzRrMmDEDs2bNwuOPP476ettZVwTR3RBLZwDCjQzl1TdMU5o51nlXA/Nx9jJ1HeQxwkIMOMg3C8Cn\nIXhUAfJOl5plje0rOI16IHs77h05qVPXlhpOfRevXLmCv/3tb1ixYgXGjh2LDRs2ICoqCkuWLPF4\nQOPGjcPu3bvx+eefo2/fvsjOzvb4PQhCamSkazBlZKLgc1eqG/HSxnyL3HG4WgngZtuwCw5s/Dh7\nAJDHFHusxZnjjB4Y5h4Tre0Gm3x3fqEOL23Mx8Nr9tu8JyEy0jVYNnsw4uQDoC8cj97Fd2NRylI8\nNXWmW3FKGYdpimXLluHixYu499578emnnyIiIgIA8D//8z/Ys2ePxwMaP77DEGT48OH48ssvPX4P\ngpAiD2QORP+EXsg5Woyyqo4cKcfZN5J3pd2ZCTKmSuSxRZ51X2NgisHcYyLnqNotc3xzxFrAuxsO\nxfiuu+5CZmYm5HK5zXO7d+/2SlA8n3zyCWbO7H5/AQlCDF50hKZ0AB2beXWNHZUELrU7czLIwq/g\nhw9yoPWw6Y81ivjLqCiMNz12ZpqJpzEf1RQbHIPpfSdLthzOoRh/8cUXmDFjhsWxp556Cv/85z/d\nvumiRYtQXV1tc3z58uWYOnUqAODtt9+GXC7H7NmzHV4vIiIYCoXtHwt3iY6W3i6tFGMCpBmXFGMC\nnI9r77EC0ecqapoQHR0KhVyGdr2xtM2ieiGowW6ul+NuDg/tpBCbNvfsGAQxgY3oowk1ve/yGvEG\nGOuvjbNfq29+LMOOvIso0TUgSROKBVMGYOIIY7rnSMkxi0Ya3nwpLCwQ45JGO3V9d2JyF4diXFJi\n29p4+fLlTt108+bNdp//9NNPceDAAWzevBmME7sIdXXiZUGuEh0danfX2x9IMSZAmnFJMSbANi57\nK7aSSvH4I5NqsfSTP0A+ogYym8kg9nPHHMuJbtaJv0bY06L90jDTfVVDDos2eaTGh5ned3yUeAOM\n+dfG2e+hddpDW1GPdVuOo76+BRnpGuw4JZxG/fj0Fy5PEPfUz5U9QRcV4+3bt2Pbtm3QarWYP3++\n6XhDQwP69evX6aDE+Oabb7BhwwZs2bIFQUFBXrsPQfgLfsIHD79i23z2I8SFaBCVnIQqbaTFa+SR\nFVD0OY9GVSug78jRKvuftOsHweOMDabguofhwLaqADBgAlpNnYHOeEzoy1NwQX7N9FhsSKq7TmuO\n0h5iftH2zJf8iagYjxs3DsnJyVi9ejVWrlxpOq5Wq5GWlua1gFavXo22tjYsXrwYADBs2DC88sor\nXrsfQfgaUTtIcEazoJhKyOs7Vp782CQx5DHiU5UB520whWAYgLlp0NNWNMzGnhOwbfIwF+wKWcdK\n2JE5vqs48v0Q84u2Z77kT0TFOCEhAQkJCV7fpLMmNzfXp/cjCF8jtmIzx9zhTNHngv2T7bRFe2N4\nqBB8k4c11jXS5pURxlTNB9iy37XNNWeHuLpjvuRPRMV43bp1ePbZZ/Hkk08K5m07s4FHED0ZexM+\neMwdzhhli50zxVe1/hoeas6NlnY8vGa/hak+IJ6qAYCZ0eKddRavY2Aa4mo+qolPe/DCbu0K1+Wq\nKUaOHAkAuP12af4VIQgpY71Bt2DoHaZNI2cmfFg7nLmKt4aHOkIuM/5l6KVWora+FbUNxhSHdU2x\nWKpmX/F+zBwiLsb2hrjGyQfYpD14v+iugKgYT55sNGy+6667fBYMQXQHhFZ9/zy6CYsH328hDvuK\n96O8sRKcQBUE31osj6xwuS3ZQoj7eXZ4qPW0Dmt6hSjx+uPj8NLGfNTC1lWts5trYq9ThDThlSVj\n7L5W6oiK8dq1a+2+0HxTjyCIDuyt+kZphqNAdwI7L+zDtfYasM0hQEMkEFoHWVAj2DajaAaknoIi\n/hIgb3fp3t6a4swTkHoSAam2Y514rje1AfDe5lpX25RzBVFviuDgYLv/EQQhjNjqrbxRh99v/Rjv\nnv0Q1/TVAMNBFtwImaYE+vIUtF0aCpmqBTJVCxj+OYFRQ2J4W4iBm9UVDMDIjGOdApIKLZ7nN8/i\newtrhPnmmhCONtfcfV1XQHRl/MQTT/gyDqIb05VaUp0hv1CHnKNalFffsNiY4o/rNSGQBds2CBhu\nhKBeXSi4AjIas7voWWmGL4RYCHlMmcXqmN88c1RT7O7mWlfblHMFUTH+4osvMHPmTHzwwQeCzz/w\nwANeC4roPtjbNe+Kv0BiZjdFV64j77ix3lduSBFtgghIPSV4Xd7Axx38JcSAcdqI3Gx4KL955kxN\nsbuba11pU84VRMX44sWLmDlzJs6cOePLeIhuhqP8aVdDrOvrmxPlpn+bN0HIghqREBoL7ckYGGrj\noIi/JNg6bN9PwnflaxwHgGPAtasgkxsAhf2ctUKuwL9WCqcIeorbmqcQFeMnn3wSAPDaa6/5LBii\n61CgO4G84wdRVl9hN/XQ1VpSHSG2MdVu6Gi8kEdWGEU3qAlscwiuV/WBvsbY3uySw5oDvFK+1tzh\nd8wzZWQiApILcbDsW5vzx8V37QoGKeHQKEiv12Pbtm3Iz88HAPziF7/AwoULoVDQYOmeiiuph+62\n+21vPBJg27rMBDeiMfh7U3szv2oOSD3pdMma0HneSk2w9RFG45+gJnA3u9vyjgPLEsZiUiJwpPx7\n6Fk9FDIFxsWPwcKBczt9T/oSBzMAACAASURBVMKIQ0V9+eWXUV5ejrlzjV/0//73vzh//jz5RXRz\n7G26uZJ66GotqY4Q25jiUcRfEjl+2fQ8E9Rksp50B28JMdceYGE4ZG0S/8qSuSS+XsShGB87dgx7\n9uyBTGbcA545cyaysrK8HhjhPxytfF1JPXS33W/rjSkDa1kBITpWPrDBMj3hwqgkc7y5WcexMggt\n1q1N4gnv4FCMw8PD0dbWhsDAQADGtEVkZKSDVxFdGUcrX1dTD11991uolI3v9nppY75F2kJ0BJLo\nBpwMAAeuRQ22PgKysDpTZYV1esKbQqyvTIJcUyr4HBPYaGP4093KFaWAqBjzJW0DBgzAPffcgzvu\nuAMA8OWXX+LWW2/1TXSEX3C08u1uqQd7OJrblpYUYSHGYht04vlhDi0F002PlAOPQSbQL+GKENur\nvuBhWwNt/IllYbWiJvHmnsPdrVxRKoiKsXlJW3p6OrRaLQBg0KBBaG93rUWT6Fo4Wvnyv3Bflx1E\naX1Fl0892MORgfmPP1VZHDdt0KWcBiNznBM2NwQKSCqEPLzG9hxXV8T6ACBA+HeUY2Vov3yroL+E\n2B+SSXETLUrUulu5olQQFWMqaeu5OLPyHaUZjplDJkhyxJEnseexkF+oQ21Dq0UpG1+B4GxO2Lx6\nQagDz63UhKId+sokwekfYkIM2NZHRwT0xty0TBuB7W7lilLBYc6YOvB6Ht1t000IZ3OeYqVscVEh\nyDmqFSxlU/Y/Ca5deHVqnSO2Ny7J3RwxwwBsYwTaiiIEp2/Yw1Abh/VL7f9ud7dyRangUIzN0xWt\nra3Iz8/HsGHDSIy7OV19080eruQ8xUrZ0pLCsf+HKwgYLFzKxoikCcxXpqohh0Vj7OxmXUDqSXDN\napspGJ6gJ+0Z+BKHYmydrrh69SrVGBNdGldynhnpGgvfCZ6842UI1ujABjk//YJtD7AQRrEyOE9U\nTZgPLDWfguEJesInJ3/gchtdTEyMaTOPILoiruY8L5TU2RyTR1aASz4pVrEmiCygHQFJhcaqhaAm\ngGNscsscy6Fg/UFoPVi+Zm92nTUBclFXXQu68ycnf+FSzpjjOJw+fZrqjIkujas5T6FNPIdDQkWw\nyBELCPFxDwsx4NrsuonDqbnDXzj8M3jmzBnTf+fPn0dqairefPNNX8RGEF7BVYNyIaN0R0NCXcWr\nnXUC8/QSo9W4c3w/00o4QC7DlJGJeCBzoEfuSbiOyzljgujqWOc8e8mj0F7eD+8cq0N873yLKcaA\nYz+KzuJtP2J+np456cObcRGfQTmqAkmmahISYn/isANPDKqmIKSKM2VrfM7TssOOs+mw4/+/Y3+R\nadIxAHBtKjAujEQSw5tCLDcEo614IAy1sQCMHdkJ0WqkD2/Goes5pvOog04aONWBRxBSxVp4h8YP\nwpcXD5iedyQ01h12fAPHexV78VWDxiTkdY2WwqsvHeTQl5hjAa490JTS8KXXBNsaiOaTE7Fs9mAb\ng/dX898QfA110PkX6sAjuixC9cLlF2035gBxoTHfnLNu4OCFvKjsunEChtl5ivhLN6diGK0wBT2H\n2wMhUwnnlr2emihNA9DRtm0OddBJE4c5Y47jsG3bNnz7rdHlf/z48ViwYAEYZ52xCcJLiNULC8EL\njbUDW7haaUo/iHkRH9YdAnAbAFvBdseT2CsTOsw6+8w77SpqbGuZqYNOmjgU47Vr1+LcuXOYN28e\nAGDXrl3QarVYuXKl14MjCHuIrfCEiAvRCDqwmSPWhMEqO/w3FH3OC57DcQDXZumEJjR81FsrYjHP\nCWvry/xCHep/TgJibMWYOuj8i0MxPnz4MHbu3GkaszRz5kzMmzePxJjwO2IrPCGmJd+Oz3ZrBZ+T\nyxgYWE7Ui9i8NIxRCm/aMQzAqFrQVjTMJIqKPuctNvk8KcRsewDkAQYYboTY9Zwwt77s+GMUCXn9\nMJNvRaRS2BCI8C1OtduYpyR8lZ7YtGkT0tLSUFtb65P7EV0PsXrhSYm3IUEdBxkjQ4I6DosH349R\nmuGiDmzszYQwWy/SzNQY5XRM/HglIx2/KxZC3C8aE1Z1bkXMyA1AyXDoy1OgiL+EwNF7oRpyGPLI\nCtM5U0YmWuSLzTcrDbVxaD0zDi0F0yG7OImEWAI4XBmPHz8ejzzyCO666y4AxjTF+PHjvRpURUUF\njhw5gvh46gYixBHySJh/60wMDBokeL6YA1vv5Doo4i+hrr1a+EbqDo9hri0QjMimHGDZ7cavoq1X\nxBNW3QlVaOdSE4yMBZf0A5Tmx8y8KH7Zb7RNA4c9O1DC/zgU42effRbbtm1Dbm4uAGDq1Km45557\nvBrUa6+9hmeffRaPPfaYV+9DdH2sPRKio0NFPZaFmjfkkRVojDkJ6MWnY5gLrL40zUFJG2PynwA4\nwdREQIjnqiaEUMRfxgOZtn0A9uxACf/jUIxlMhnuu+8+3Hfffb6IB1999RViYmIwaJDw6kaIiIhg\nKBRyj8UQHR3qsWt5CinGBEgzLrGY7pwUirCwQOzIu4hSXQP6aELRlPQ9Gh35wDMcApIK0V6S3mHA\nnlwImYBNJiNjTf4TruaInRmX5AyyoEbBr8F90wdh3ZbjAsfTJPd9lFo8gPdjcijGf/3rX/H4448j\nKCgIv/rVr1BYWIiXX34Zc+bMcfumixYtQnW17UfC5cuXIzs7G5s2bXLpenV1wh+/3MHeyspfSDEm\nQJpxOYrplsReeOnXo0yPH8/bIToslIdhOgx+2kvSAUBQiM0RSk0EBAcBEC+F89R2TERAb9PXwLqU\nb8rIRFwouYaKmib00YRi+ug+uCWxl6S+j13x58qV64jhUIy//fZbPPfcczhw4AA0Gg3+/ve/Y+nS\npZ0S482bNwsev3DhAsrKykzXrqysxLx587Bjxw5ER0e7fT+CEINtVkMW7NwvmTymDGxjBAJSTts9\nTzw14dwops4yNy0TgPAw1bKqJlNXnhRFryfjtJ/xsWPHkJmZCY1G47WKirS0NBw9etT0ePLkyfj4\n44/JspPwGmGNt6Ax+HvnTmZYJ1qghVMTxjpkpaCfBceKd/EBZpOc240pDr6WGQ0RQLgOMmUrwAAR\nqnDM7X+HKYfuaJgqIS0cinFUVBT++Mc/4tChQ1i6dCn0ej0MBoMvYiMIrzNv6ARsONxqMSuOCWwE\nI3N9FWsvR2ysQxauUW6/fKtxoKlAjTPbGojWk79EgFwGvYE1ra1tOgEB1LVes3hM1RNdC4d1xn/7\n29/Qr18/vPHGG+jVqxcqKyuxePFiX8SGr7/+mlbFhFfJSNfg4fFTEa2bjvYfZiCsMR0qufAmm70P\nhM5u1nHtAWBvhIJjGbA3Qk1NIvryVMHr6kvTsGz2YGQ/+0skRHdUPYi1bu8r3m/6t5APM0DVE1LF\n4co4MjISixYtMj1OTExEYmKiN2MiCJ9hvsEVlVyDxpjvXU7tulQ1oWhH649TbA7zVRrhqaW4gTqw\nzWqENaZj3vjxppSC+UpXrHXb3OxHzIfZvCuPkA4uz8AjiK5IfqHOwpM4MlSFEQOjLQaN1qsLnWtJ\nNcOdFmfVkMNggprANYdYTm++Fo91U8R9ws3rhMVat83NfngRzzlajIqaJsRFhSBrbDLliyUKiTEh\naZwxineEdVUBANQ2tNpMfBZbbYphT4g5FmAElJ2f2gzYTm9mWc7u+zVf6erLUwU3E63NfjLSNSS+\nXQQSY0KyCPkVuzORQqyqwBqx1abguY5WxIYAQGa/FpmHn94si6zAu2e/NB23fr/mK90r1XEwXGbA\nxF6CLKgREQFk9tPVcWk6NE9oaCiGDh2Kvn37eiMmggAg7lfsaCKFdaPDlWr7K17eLJ4J8pAQA4DC\nOSEGOtqt7W3K8e+XVrrdF4difOjQIRw7dgxjx44FAHz33XcYNmwY3njjDTzxxBOYP3++14Mkeibu\nTKT45scyu57F1giViAHGNAMY34xK4i06ndmUI7ovDsWYYRh8/vnnJge1iooKvPzyy9ixYwcWL15M\nYkx4DXcmUuzIu+jSPcRWo50VYk6vABOgdyoGfnqzM5tyRPfF4eZxWVmZhZVlXFwcrly5gujoaMjl\nnjPnIQhrxPyK7U2kKNEJt/cyDKAOCrA9LrIa7eyKmFE4J8QcB1M1hVitMU3g6Bk41YH3zjvvmMYu\n7dy5E5GRkTAYDDQHj+h0tYN1fjdrbF9TTlTIr3ha8u021ze/hlzOgGVtC4UjQlWorRdoRXZi086d\n1IT5rwbHAoAMjMzWJIhrNhrHJEarkTV2KuRRgx2+X6J7wnAcZ7fEXafT4dVXX0V+fj4AICMjA88/\n/zwiIiKg1WqRlpbmk0Dt4UmzEymap0gxJgD4qfk8/nnU1mGPn6zhCKGSMwCC4+VdvYY1kaEqU42x\nOWI5Yx5P5Ig5VgbD1UST85vFc5zRZe2utGk+F12p/lxJMS5JuLZpNBq8+eabgs9JQYgJ/7GzcK/g\ncUfVDjyuGtkIraLFrhEglwHhV6BM/gmsohk3OEDVpgJbp4EsrNai6YJtVUEmaODjmc063uNYr0tC\nQK9r4FT1JttOhgGu6avx7tkPsatoj4XRD9GzcCjGHMdh27Zt+PbbbwEYxzAtWLCAUhQEyuorBI87\nu/vvipGNkB1k9mdnxa2Iw69AkXrS5B7MG/XIzFanfNOF0GdDZ4TYVTP45NR2PD/mRbya/4bgxmRd\n6zW36qiJ7oFDMV67di3OnTtnyhnv2rULWq2WpkMTSAyLQ8n1KzbHnd39d2UMkNgKWCGXod1gm4tV\n9dHCaW9BzmhhaXro5IrYoEsSTD2IcaWxAi8e+QuutV63e569Txae6EgkpInDaorDhw9jw4YNmD17\nNmbPno3s7GwcOnTIF7EREueu9OmCx53d/c8a21fkuK2Rjdgq2sAKT85glfVOxQDALSHWVyahvSQd\nbUXDBFfWYtS1XgPnwIlI7JMF35FY3lQJlmNNHXoFuhPOB0BIFqd8UcxTEpSeIHjGJY3G4sH3I0Ed\nBxkjQ4I6zunNO8DYTbZs9mAkRqshlzFIjFaLbt6J2UHG91ZbXKNvXBiWzR7sUm0u13zTyrJRjYL/\nuynE/cRTE21Fw0zjlwy1ceCa1U7fyxnEYrfXkUh0fRymKcaPH49HHnkEd911FwBjmmL8+PFeD4zo\nGlhPZ3YVZ9t7zU1yOtqXm2AIiII8ahpeWTIGQMeut1w32cLXwh768hToazT4YesnKD1zHr00qbjt\nkfuhVFfZnGvQJXW4rJleL2zaYy+nzIBBuKqXjSE8IP7Jwp2ORKLr4FCMn332WWzduhW5ubkAgKlT\np+Kee+7xemCENBDKUQLwed6SF+xPTx1GY0yH8PGVCIDlphf/702nPxKc2sFxxhUxL8Sncv+N0jNf\noZcmFRl3vwymWg19cCHkMWXGNAZnLE9rL0m3+GPAV2S0FQ2zmBaiL08Rnd4BAPHqWDw/5nco0J1w\nuq7YnY5EouvgsM64K0B1xt7B2jXNHq6kJzqDWCVCgjoOz4/5nc3X6vG83wOMgBizDFoKpoPjWBsh\nVgZ2pB2s65PF6pL5iR08MgaISq5DY0y+4Ptw5+sl9v1w92svxZ91QJpx+bXOeO3atXYvStUU3R+x\nHKUQztYWu4N5fbFqVCWE6tnEPqqHB0Thmr7a5jjXonYoxMtmDwYAi5I6MS8L3gYzMkyFBb/sb1rJ\nF+hSsatojykdYT001BWc7UgkuiaiYhwcLLxhQvQcxHKUQngrb2leXyyPrBAUYkD8o3pM2624JrPd\n4OKYNpw98bwxRxyfhIy5titi81z2ppxzaDewol4WsqBGwc1HPqfuqZVVZ3P0hHQRFeMnnnjCl3EQ\nEsE8RyyDDCyES8es8Vbe0ry+WNRhDcD1y33w8P79SIoNxfTRfZCRrsEHuT/h5HEV5JFm+dx2FZiA\nZvz43l5oTeVrU4DKBhhqO8R4we39Tf/OSNdg/eeFAMS9LBJCY8lnmOgUNOmDMGGdk3RWiAHvOYs5\nM4ST44Da+lawHAdtRb1pJf3NCWNDiqE2zpTPVaYfwg+bbeuI2ZtpBgCYMjLRRlj5BhVnxx0RhKuQ\nGBMmxHLECpkCLMeacpSAMW9Z2aRDrJfzls4M4WQYQNn/JNjWC2CUreCaQ/DpqTq0GyIszuM4Fj98\nkGO2Iu6oI2YCG23yvebwpXX8FGd+pR2ppHFHhGcgMSZMiOWIWY7FW7f/1eKYJ/Og9nBmCCePTNUC\nwOg50RicD3l9R4VDx2adcGcd16JGsEr818Fy0nI8ouUDaNIy4VFEf/qam5vtvjAoKMjjwRD+xdU6\n1iMlx7Dj1B6P1BuLeS5Yi2DAFQXa4o87ZdDDVziYV02ItTjry1NQVttkEn4hkaX5c4Q3ERXjESNG\n2G19PnfunFcCIvzH9L7CXWtC+VBPTW52dC1DTZyFbeaN+kS0RlxwaoozE9RgIcThyRpMfP4OGyFm\nWwMtaoTFLDwJwpuIivH58+cBAP/+97+hVCpxzz33gOM47NixA+3tzk++JboOrtSxuju5WQixa+26\nkIvyb0eaHvO5Y7mDdAUPZ2As6ognvjgJSrXS5jwmwNLLWMjC0xpyTyM8jcOccW5uLnbu3Gl6vGTJ\nEsybNw+PPvqoVwMj/IOzdaye8kko0J0QTI0AQF27bbMGYKyO0FfW2bWv5FgOxzccMHlNZNz9MgLk\nJwDYrqj56cw8Qhae1jF76lMBQfA4dG1raWlBcXGx6XFJSYnDfHJnef/99zFjxgxkZWU57AQk/ENs\ncIzgcVfqjR21W7PNasgjK6AachiBo/dCNeSwsfEDgCysVvR1vA2m9sB5i846sYGf/HRmHiELT3PI\nPY3wBg5Xxr/73e+wcOFCDBkyBABQWFiI1atXey2g7777Dnl5efjss8+gVCpRU1PjtXsR7uNKflkM\nR+3WCjkDmVk6gp/M0VZkp+bYzI84vG8MxtzR0VlnXpamCGlCXIgGKfL/QaE8CBWyJsRFhThVIUHu\naYQ3cCjG06ZNw8iRI3HypPGXYvjw4YiMjPRaQB999BGWLl0KpdKY24uKivLavQj3GaUZjrCwQHx8\n+gu3fRLstVvfEjkQ52p/EnxOEX9ZsObY2hh+wqosBMhPQF+eatqgM9TGIU4+wGS5CQAY2eF/sf7z\nQuQc1VpMqbaG3NMIb+BUnXF9fT1YlsXUqVPR1NSEa9euITw83CsBabVaFBQU4O9//ztUKhVWrlyJ\noUOHeuVeROcYlzQaA4MGuf16MVFLUMfhYt1l0dfJg5sQcnU0GoM7HNHEJ3R0rKZ5QbZOQ4jN1wOE\nS9w88amAIKxxKMY7d+5EdnY22tvbMXXqVOh0OrzyyivYvHmz2zddtGgRqqttN2eWL18Og8GA69ev\nY/v27Th9+jSWL1+OvLw8u2V2ERHBUCjkbsdjjT2bO38hxZiAzsW1YOgd+OfRTTbH5986U/A4T1Kv\nOKy7ZxGOlAzGluO7UXVDhx822h+VxNcc9w4PQlhYoEXce48VCN5n77FS3Dmpv83xmdETEBYWiF2F\ne1FWX4HEsDjMTZ+OcUmj7b5fKX4PpRgTIM24vB2TQzH+z3/+g08++QQPPPAAACAlJUVQSF3BnpB/\n9NFHyMzMBMMwGDp0KGQyGerq6uymRurqhOejuUN39lL1NJ2Na2DQICwefL9NKd3AoEFQMAroOb3g\n6yYnTkJVVQMGBg3Cn24biIzM+Sg+fR7hyRpMWGVbRwwY250BoPpaM9ZtOY76+hbTqrekUvg9lOoa\nRN/fwKBBWDnS8lOBva+FFL+HUowJkGZcfvUz5gkICEBIiGWpj1zuuVWoNVOnTkV+fj5+8Ytf4Oef\nf0Z7ezsiIiIcv5DokoiV0o1LGIODZd/aHL8lcqDpfJZlsWLFkyg+bawjHpPlfPmaeWOHK1OqCcJb\nOCxtCw8Px88//2xKE/z3v/9FbGys1wK6++67UVpaijvvvBNPP/00/vrXv9IQ1B7IwoFzMSnxNihk\nxvWCQqbApMTb8MTwh5FfqMMf1h/FmKnz8cEH76H/wCFYuXo9QkLCRMvXIG83lcUBlo0drkypJghv\n4XBlvGrVKqxYsQI///wzJk+ejMDAQLzzzjteC0ipVOL111/32vWJrsPCgXOxcOBcU6XDvvwb+F59\nBDX1zRaddSlTn8PQgX3wyFwNzpVdxxt7AEWfCybjIMBoImS+kWe+6rX0v3C+xI0gPIlDMU5JScGO\nHTug1WrBcRz69evn1TQF0T3hBbWCLUJA3GUgqBGK9lDcFj0B946cZPd15pUO1+SXcbbgHZSeOY3w\nZA3GPvhbyJvVprTDxBGJqK+fig9KtDCgxeZ6/Eae9aqXTIAIf+MwTfHUU09BLpcjNTUV/fv3h1wu\nx1NPPeWL2AgJUqA7gVfz38D/7n8Oz3z5ZxToTjh8DS+oFYYiKFNPggluAMNwMCjrceh6DrYePyj6\nWvNJH7LwKzi9/y1oD51GREo0Jv3hDqhvLYI8ssIi7ZCRrgGnEt5sERuPRBD+xuHKuKTEtv//8mXx\nGlCi+2Ldvlxy/Qreve7Yk4EXVLGxSd9ePYx7Ibw6vsIby3MsTuW+A+0h2/I1RfxlRMsHWLxOtIbZ\najwSGf4QUkFUjLdv345t27ZBq9Vi/vz5puMNDQ3o16+fT4IjpIW7Tm386CSxFmZ9QL3g8Q9yfwIH\nc2P404J1xExgo03aQawx4/rlPshX65CRriHDH0JSiIrxuHHjkJycjNWrV2PlypWm42q1GmlpaT4J\njpAW7ngyFOhOIHjYEegDGgCOARjO5hxFe5jNsfxCHfKOlznlR8y1qAWnMgNGG87atmpwLWroy1NQ\nVRuJbK0xB/1Vg+dsQAmis4iKcUJCAhISErB7925fxkNIGFc9GUwrTyXAAIJCDAC3xYy3eMznmM2F\nuJcmFWMf/C2U6iKb1+srUmyOAUZB/mx3K1oEaohzjhajLoUMfwjp4DBn3NDQgPXr1+PcuXNobe0w\n4X7vvfe8GhghPVz1ZBBLa3CsDABnXK1WpGBfjQH7cr9GZKgKIwZG48CPV2yEOOPulyFvVqOtKMQ0\nDJRf7QY1J4nGbD5d2pyKmib0HUKGP4R0cFhN8fzzz0Mmk0Gr1WLhwoWQy+Vk3NNDGaUZjsWD70eC\nOg4yRobkXglYPPh+0Y/04q5sHFoKpkNfngJF3CWTV/H1AC3yjpdBbzDYCLG5DWbrmXFoKZiO1jPj\nYKiNQ3OrcNs0YOyuEyIuKgTT+04WfI4Mfwh/4HBlXFxcjLfeegt5eXm48847MW3aNPzqV7/yRWyE\nBDFvX3bUry+W1uBajKbxSgGv4tafWPy4faegEIthr23ZfLq05fFkjNIYV8DOjJkiCG/jUIx5X+GA\ngABcu3YNvXr1Qm2t+JQFguARS2voy1MEy9w4lsOpXGNDh7NCDNhvW3bUXefsmCkeKoUjvIVDMe7b\nty+uXbuGWbNm4Z577kFoaCgGDx7si9iILg4vUu/9kAN9QL0px2uojUNA6imLc02jkg6dFxViGQOE\nh6oADrje1OZ027KnuuuoFI7wJg7FmPeJWLx4MW699VY0NDRgwoQJXg+M6B6M0gyHITnOJlVgPqnD\nYlRSsgZjsiyFODJMhQW/7O/3rjlPTsQmCGucmvQBAG1tbaYVcXt7OxQKp19KSBBPftx2dC2hVEF6\n3CQcup5jM6HjF/c9C2VQAxTxJyALakJ4QBTuSptmyu/6E5p9R3gTh4r65Zdf4rXXXsPVq8YfRI7j\nwDAMzp075/XgCO/gyY/bzl7LPFXAmwa1tt9qanEO7xuD8c/cBVVEEcwdU6/pqyWTCqDZd4Q3cVja\ntm7dOrz11ls4e/Yszp07h/Pnz5MQd3E8OWre1WvxDR2lVxvw4/ad0B46jV7xSZj0YhYCIxmIWVe7\nE5unoVI4wps4XBlHR0dTXXE3w5Mft129Vs5RrU1Dx8RVM6FUi9cKuxubszibsuGPUSkc4Q0civFD\nDz2Ef/zjH8jMzIRK1eEJ0L+/7aBGomvgyY/brl7rSlWjTUOHqvcRh/fxVirA1ZSNo1I4Kn0j3MWh\nGOt0OmzevBm7du2CTGbMajAMg7y8PK8HR3gHT46ad+Za+YU67NhfZDOhgy9fM6+sEMNbqQBPVkjY\nE/aZ0VSBRNjHoRi///772LdvH2JiYnwRD+EDPPFxO79Qh73HClBS2YCo5DEIiP8Z1w01NtcSM/0x\nryPWl6dadOPxMGAQr471airAkykbe8I+cwiJMWEfh2IcHx9PQtwNcbXzzBzrUUhV2khAGyk4QUMo\nR2wuxInRamSNnQp51GC/5GI9mbKh0jeiMzgU46FDh+Lpp5/GjBkzLHLGkyaJzy0jujc79tvaWALA\njgNFNmIslCMOijfWETNBTVCpNZBHKTv1x6EzeDJlQ6VvRGdwKMZnzpwBYExX8DAMQ2Lcg6ltaBU+\nXt+KlzbmI2tsX2Ska8CyLC5+k20jxOYpCXdrnD21UebJCglPCjvR83AqZ0x0f/hGjPLqG4jvHWwS\nVKHz7FFW1YTsz86CZVn8v9dfxPmCL9FLk4rbHv4tglNPgAkS3qhzZcPM0xtlnlqVU+kb0RlExbi0\ntBR9+vRBUZHwR1Iqbes+WOeAeUEFYCHI1ueJwXEsVqx4EkU/7jUJsfpW4Z8jHlfyqlLeKPNXuoXo\n+oiK8Z///GdkZ2dj6dKlNs9RaVv3gp/ebHu82EKMxc4zR2izLjj1hMPXuZJXpY0yojsiKsbZ2dkA\ngK+/Fl6FEN0He6OJnDmPR6xqQmwqtDmu5FVpo4zojjj0pnjqqaecOkZ0XeyNJnLmPMBWiGf8+jVT\n+RrXLD6JAwAiVOEufbQnjwiiO+JQjEtKSmyOXb582SvBEP4ha2xfkePJTp13+4h4XDq0HqVnvkJ0\nwkC8s2EbHrxjhOl5fXmq3fvP7X+HS/Faz+JLUMfZncVHEF0B0TTF9u3bsW3bNmi1WsyfP990vKGh\nAf369fNJcIRvcDSaP8StnwAAGUdJREFUCOiotmAAKOQyGFgWSbFhyByZgO0bX8X5gi/QPz0NU/4w\nF7tubEIsYjAtcyQKTwShoiYe6quBCIi/jGv6ashlchhYQ6e662ijjOhuiIrxuHHjkJycjNWrV2Pl\nypWm42q1GmlpaV4L6Ny5c/jjH/+I1tZWyOVy/OlPfyLXODdxtlwNsD+ayLqKot3AAgDuvj0VG/7+\nB3zwwXvon56GwU/fhlrmOsAZy83KkYPFd96PUZoxHn9vBNHdEBXjhIQEJCQkYPfu3aZjbW1tuH79\nOuRyudcCWrduHR5//HFMmjQJBw8exLp166jW2Q3yC3XYcPgrKOIvQdm3CVXNIdhwOBXAVIfji6xF\n/EaLrb0lx7F4/LHfovD7PYhOGIBbfjsNSnW7zXk0koggnMNhzvh3v/sdGhoa0NLSglmzZiErKwsb\nN270WkAMw6Cpybj73tDQQL4YbvLpqUNQ9j8JWXAjGIaDLLgRyv4n8empw3Zfx6+Cy6qawHIcyqqa\nbDru+M26wu/3oJcmFSPm/BGq3sJ+xOWNOry0MR8Pr9mPlzbmO2waIYieCsNxHGfvhLlz52LXrl34\n8ssv8e2332LVqlVYuHAhPv/8c68EdOnSJSxZsgQcx4FlWWzduhUJCQl2X6PXG6BQeG+13hWZ/+5K\nyIIbbI6zN0Lx8eK1oq9bvHofqq81iz5vXjURrumPMXf/CcpANVRDDkMmYIPJ3ghF65lxFseefXAk\nJo5IdOHdEET3x2E7tF5vXPEcO3YMkyZNQlBQkMnX2F0WLVqE6upqm+PLly/Hd999h1WrVmH69OnY\ns2cPXnjhBWzevNnu9erq7Ne/ukJ0dCiqqmxFzJ+4E5NMpO1YFtRo91rOCnEvTSoy5v8JASr7Nphs\nfQRUQw6DCWoC1xwCfXkqPtp7Abck9nLp/TiLFL9/gDTjkmJMgDTj8lRM0dGhos85FOPU1FQ8/PDD\nuHz5MlasWIGWlpZOB2RPXH//+9/jhRdeAADMnDkTL774Yqfv1xMJD4jCNb3tH7yIgN5uXc9CiOOT\nMPPlWTCoj4C9KbCG2ji0FQGK+MuQBTUiITQWxZcCoIjtKI1kbqZKdJcAgDb1CMIch2K8Zs0aHD58\nGGlpaQgODoZOp8OKFSu8FlBMTAy+//57ZGRk4LvvvkPfvn29dq/uzF1p0wQdxOamZQqev/X4QXxb\ndQiBoxtMK1hDbRwAWyH+5StTYFAb/yjzuei2IsBQGwdDbZzJ1/jJ2j/DIHAvVaLWU2+TILoNomJc\nXl6O+Ph4BAYGYurUqabjGo1GMMXgKVavXo2//OUv0Ov1UKlUeOWVV7x2r+6MKw5iW48fxKHrOYAS\nYNCxgm0rAvQ1GqeGhyriLyNOPsCiPplVCn+sY1XS+ghKEFJAVIwff/xx7Ny5EwAwf/58fPzxx6bn\nXnzxRdNznmbUqFH49NNPvXLtnoZ1Y0R+oQ4v7c43laylJUXgx5+q0JR8EDKBTmd57CX8sPUTq+Gh\nwtUYipAmvLLEMvUQF6IR9JCIV5OHBEFYI7oTZ15kwW/iCT1HdA2EStbyjpehtqFV0MiHYzn8sGW3\njTE8wwhfX8ikhzwkCMJ5RFfGjNlvHWP1G2j9mJA+9uwvraczcyyH4+sPQnvgvEmIQ0LCIIu3rZbg\n6R/eT3D6xuLB95PZOkE4gagYt7a24tKlS+A4zuLf/HNE18Ke/aV5WRovxD/vP49e8UnImGu0wWQ5\nDsqQJrAiH4oOln2Lg2Xfdtzv5vSNxYPvx/NjfufR90IQ3RFRMW5pacEjjzxiemz+b1oZdz3iewej\nrErYV5gvS5PHXsIPW3YbV8TxSciY+xeTDWZcVAhUIj7C9qB2aIJwDlExJlP57kXW2L52RybpazQ3\nN+tupiZurog7Xp8MeZRSsFzOHjR9gyCcw2GdMdE9ELLJTEsKx48Xq1BzvVlwQgcAJEarzcrVjNd4\n/9x26FlhLwpraPoGQTgHiXEPQsgm874p/TFm6nxBIZbLGJtyNT7l4OwKmSonCMI5SIx7MCxrnOJc\nIiDEgO3YJR5ekL8uO4jS+gpTlQRAY+oJwl1IjHsovBB/8MF76D9wCFKmPmchxIDt2CVzRmmGY+aQ\nCTbmKSS+BOEeJMY9BHPD+LjIQFw+sgG5e3Zg2LAR2LFjFy6Ut9kdu0QQhHchMe4BmI9N4jgWez5a\nh9IzX6H/wCHYsWMXwsMjkBEOEl+C8COdMyYmugR89521H/GEe1cjPDzCr7ERBGGExLgHUF59w9YY\n/u6XUXuDvv0EIRXot7EHEBcZKFhHLFYtQRCE7yEx7uawLIvLRzYI1hHbq5YgCMK30AZeN4YvX8vd\nswP9Bw7BhHtXo/aGjKolCEKCkBh3M/gStitVjbj4TTbOF3xpKl+jzTqCkC4kxt0IvoTNerPuuT+v\nJyEmCIlDOeNuRM5RrWDVxMEz1/wdGkEQDiAx7kZcqWoUrJqoqBH2MSYIQjqQGHcTWJbFxW+yBasm\nqISNIKQPiXE3gK+aOF/wpaD7GpWwEYT0ITHu4pi7rw0bNgLvbNiGlD6xkMsYJEarsWz2YCphI4gu\nAFVTdGGshZgvX5uS4e/ICIJwFVoZd1HEhJggiK4JiXEXhISYILofJMZdDBJiguiekBh3IUiICaL7\n4hcx/uKLL5CVlYVBgwbh9OnTFs9lZ2cjMzMT06dPx6FDh/wRniQhISaI7o1fxHjgwIF46623MHr0\naIvjRUVFyMnJQU5ODjZs2ICXX34ZBoPBHyFKChJiguj++EWMU1NTkZKSYnM8Ly8PWVlZUCqV6NOn\nD5KTk3Hq1Ck/RCgdWJbF0qVLSYgJopsjqZyxTqdDbGys6bFGo4FOp/NjRP6FXxFv3LiRhJggujle\na/pYtGgRqqurbY4vX74cU6dO9ei9IiKCoVDIPXa96OhQj13LXcxXxCNHjkRubi4iIqQnxFL4Wlkj\nxZgAacYlxZgAacbl7Zi8JsabN292+TUajQaVlZWmxzqdDhqN41beurobLt9LjOjoUFRVNXjseu5g\nnSPOzc2FXq/we1zWSOFrZY0UYwKkGZcUYwKkGZenYrIn6JJKU0yePBk5OTloa2tDaWkptFothg4d\n6u+wfIrQZp0UV8QEQXgWv3hT5ObmYvXq1aitrcWyZctwyy23YOPGjRgwYABmzpyJO+64A3K5HC+9\n9BLkcs+lH6QOVU0QRM+F4TiO83cQncWTH2n89RHJnhBL8WMbIM24pBgTIM24pBgTIM24elyaoqdC\nK2KCIEiM/QwJMUEQAImxXyEhJgiCh8TYT5AQEwRhDomxHyAhJgjCGhJjH0NCTBCEECTGPoSEmCAI\nMUiMfQQJMUEQ9iAx9gEkxARBOILE2MuQEBME4Qwkxl6EhJggCGchMfYSJMQEQbgCibEXICEmCMJV\nSIw9DAkxQRDu4Bc/465GfqEOOUe1KK++gfjewcga2xcZ6bYTSEiICYJwFxJjB+QX6pD92VnT47Kq\nJtNjc0EmISYIojNQmsIBOUe1IseLTf8mISYIorOQGDugvFp42GlFTRMAEmKCIDwDibED4nsHCx6P\niwohISYIwmOQGDsga2xfweMzM/qQEBME4TFoA88B/CZdztFiVNQ0IS4qBDMz+mD7xldJiAmC8Bgk\nxk6Qka4xiTKlJgiC8AaUpnABEmKCILwFibGTkBATBOFNSIydgISYIAhvQ2LsABJigiB8AYmxHUiI\nCYLwFSTGIpAQEwThS0iMBSAhJgjC1/hFjL/44gtkZWVh0KBBOH36tOn4kSNHMG/ePMyaNQvz5s3D\n0aNHfR4bCTFBEP7AL00fAwcOxFtvvYU//vGPFscjIiLw9ttvQ6PR4KeffsKSJUtw6NAhn8XFsiyW\nLl1KQkwQhM/xixinpqYKHk9PTzf9e8CAAWhtbUVbWxuUSqXXY6IVMUEQ/kSy7dB79+5Fenq6U0Ic\nEREMhULu9r3MV8QjR45Ebm4uIiKkJcTR0aH+DkEQKcYlxZgAacYlxZgAacbl7Zi8JsaLFi1CdXW1\nzfHly5dj6tSpdl978eJFvP7669i0aZNT96qrE/YcdgbrFXFubi70egWqqhrcvqaniY4OlVQ8PFKM\nS4oxAdKMS4oxAdKMy1Mx2RN0r4nx5s2b3XpdZWUlnnjiCaxZswZJSUmeDcoKodRERESE5H4QegoF\nuhPYq/0alTeuIjY4BtP7TsYozXB/h0UQPkFSaYr6+nosXboUK1aswMiRI716L8oRS4sC3Qm8e/ZD\n0+PypkrTYxJkoifgl9K23NxcTJw4ET/++COWLVuGJUuWAAC2bNmCkpIS/Otf/8KcOXMwZ84c1NTU\neCWGP/zhORJiCbFX+7Xg8X3F+30cCUH4B7+sjDMzM5GZmWlz/LHHHsNjjz3mkxiOHcvHyJGj8dFH\nH5MQS4DKG1cFj1c06XwcCUH4B0mlKXzJnj15kMvlYBjG36EQAGKDY1DeVGlzPC5E44doCML39Nh2\naIVCQUIsIab3nSx4fFry7T6OhCD8Q49dGRPSgt+k21e8HxVNOsSFaDAt+XbavCN6DCTGhGQYpRlO\n4kv0WHpsmoIgCEJKkBgTBEFIABJjgiAICUBiTBAEIQFIjAmCICQAiTFBEIQEIDEmCIKQACTGBEEQ\nEoDEmCAIQgIwHMdx/g6CIAiip0MrY4IgCAlAYkwQBCEBSIwJgiAkAIkxQRCEBCAxJgiCkAAkxgRB\nEBKAxBjAF198gaysLAwaNAinT582HT9y5AjmzZuHWbNmYd68eTh69Kgk4gKA7OxsZGZmYvr06Th0\n6JBP4zLn3LlzWLhwIebMmYN58+bh1KlTfovFnPfffx8zZsxAVlYW1q5d6+9wLNi0aRPS0tJQW1vr\n71CwZs0azJgxA7NmzcLjjz+O+vp6v8XyzTffYPr06cjMzMT//d//+S0OcyoqKvDQQw/hjjvuQFZW\nFv7zn/9472YcwRUVFXGXLl3iHnzwQe7UqVOm42fPnuUqKys5juO4CxcucOPHj5dEXBcvXuRmzZrF\ntba2ciUlJdyUKVM4vV7v09h4Fi9ezB04cIDjOI47cOAA9+CDD/olDnOOHj3K/frXv+ZaW1s5juO4\n6upqP0fUQXl5Ofeb3/yG++Uvf8nV1NT4Oxzu0KFDXHt7O8dxHLd27Vpu7dq1folDr9dzU6ZM4UpK\nSrjW1lZu1qxZ3MWLF/0Sizk6nY47c+YMx3Ec19DQwE2bNs1rcdHKGEBqaipSUlJsjqenp0OjMU4n\nHjBgAFpbW9HW1ub3uPLy8pCVlQWlUok+ffogOTnZbytShmHQ1NQEAGhoaEBMTIxf4jDno48+wtKl\nS6FUKgEAUVFRfo6og9deew3PPvusZIbhjh8/HgqFcfra8OHDUVlpO6HbF5w6dQrJycno06cPlEol\nsrKykJeX55dYzImJicHgwYMBAGq1GikpKdDpdF65F4mxk+zduxfp6emmX3B/otPpEBsba3qs0Wi8\n9gPiiOeffx5r167FpEmTsGbNGjz99NN+icMcrVaLgoICLFiwAA8++KBkUidfffUVYmJiMGjQIH+H\nIsgnn3yCiRMn+uXeUvqZFqOsrAznzp3DsGHDvHL9HjOQdNGiRaiurrY5vnz5ckydOtXuay9evIjX\nX38dmzZtklRcvsJejN999x1WrVqF6dOnY8+ePXjhhRewefNmv8ZkMBhw/fp1bN++HadPn8by5cuR\nl5fnk9Wovbiys7O98jPUmZj4n7G3334bcrkcs2fP9nV4XYKmpiY8+eSTeP7556FWq71yjx4jxu4K\nRGVlJZ544gmsWbMGSUlJng0K7sWl0WgsPk7qdDpTOsUb2Ivx97//PV544QUAwMyZM/H/27v3kCb/\nL4Dj76nx7WY3SgsaRtEkqNTCzLCidW+sqbkyQ8P+iIoINLOchWU3rOifouguGGSlMxszIrILUS20\nP6LArMhYFGIZ1ah8vP3+EJ+f5W1226Dz+u95nvl5zhl6dvYZnm3duvWPxeFuTOfOnWPu3LloNBom\nTpyIj48PHz58YMiQIR6L6+nTp7x+/RqTyQS0/F7FxsZy8eJFhg0b5pGYWlmtVm7evElubq7Htk/+\n9u90T9TX17NhwwaMRiPz5s37Y/eRbYoufPr0idWrV7Nx40YmT57s6XBUer0eu92Ooig4nU6qqqqY\nOHGiR2IJCAjgwYMHANy/f59Ro0Z5JI625syZg8PhAODly5fU19czePBgj8YUHBzMvXv3KC0tpbS0\nlOHDh2O1Wv94Ie7O7du3OXnyJEePHqVPnz4ei2PChAlUVVXhdDpRFAW73Y5er/dYPK2am5vJzMxk\n9OjRJCcn/9F7ydQ24Nq1a+zcuZPa2loGDBjAuHHjOHXqFEeOHOH48eMEBQWpjz19+vRf+0Cos7ig\n5W1lYWEhvr6+WCwWZs6c+Vdi+lFZWRl79uyhoaGB//77j6ysLMaPH++RWFopioLFYqGiooJevXqR\nnp5OZGSkR2P6kV6vp6Cg4K90612ZO3cuiqIwaNAgAEJCQsjOzvZILLdu3WLPnj00NjayZMkS1q5d\n65E42iorK2PFihXodDp8fFp619TU1D/y9ybFWAghvIBsUwghhBeQYiyEEF5AirEQQngBKcZCCOEF\npBgLIYQXkGIsuqTX64mKiqKxsVE9Z7VaCQ4O5uzZsx6MrOcSExO5ceNGu/MOh4PY2FgPRPR/VquV\nDRs2/NLjrl+/Tk5ODvB9TtXV1SQmJqqPO3To0F+dsSLcI8VYdCsgIIA7d+6ox0VFRerwFE9q+wIh\nYPbs2WzevLnd+cDAQPLy8tTjw4cPU19f/zdDE26QYiy6FRMTg9VqBcDpdPLlyxd0Op16XVEUcnJy\niIuLY/HixWzatEmd5Gaz2TCbzURHRxMdHa3OhG5qamL79u0sWLCAxYsXEx8fD7TvUtseOxwOjEYj\nGRkZmEwmbt++jcvlIjMzk7i4OIxGI7t27VKL9PPnzzGbzRgMBlJSUqirq3Mr30uXLmE0GtUZv+/f\nv1fz3LZtG/Pnz2f58uVkZ2d32KV2lltXa7f1Y/f74/Hnz59Zs2YNixYtIikpSR2o01nX/Pr1ayIi\nIgDYsWMHAPHx8ZhMJqqrq4mKivruuVmzZg02m82t50r8PlKMRbemTJlCZWUlHz9+pKioiOjo6O+u\nnzx5En9/fwoKCrh8+TIBAQHqcPCoqCguXLjApUuXOHjwoNq5VVRU4HA4KCkp4fLlyxw7dsytWJ4/\nf87SpUspLi5m1qxZ7N27l/DwcAoKCiguLqa2tpbCwkIA0tPTSUhIwG63s3LlynYD+jtSWVnJgQMH\nOHXqFDabjbFjx7Jz504Azp8/z5s3b7Db7eTm5vL48eMO1+gst67W7ony8nLS09MpKSlhypQp7N69\n2+2fzcrKAiA/P5/i4mICAwMJDw+npKQEaCncjx8/Zv78+T2OS/yaf2ZQkPh5Go2GhQsXYrfbsdvt\n5Ofn8+TJE/V6aWkpLpeLq1evAi0dZOuYSKfTycaNG6mursbPz493795RU1ODVquloaGBzMxMIiIi\nmDVrlluxBAUFERYW9t29Hz16xJkzZwD49u0bgYGBuFwuKisr1cE8oaGh33XznXE4HMycOVOdy9za\nQbZeM5lM+Pn54efnh8FgoLy8vN0aneXW1do9MXnyZHXOtdlsxmg09niNthITE9m7dy8xMTHk5+ez\nZMkSrxgV+6+RYizcEhMTg9lsJjw8vN3QnebmZrKysjqc/5CamsqWLVuYM2cOTU1NhISEUFdXx7Bh\nw7Db7TgcDu7evcuBAwcoKirC19eXtv+h/+PWQt++fdvd+8iRI2i12u/Ou1yuX035p/n7+3eYm7t8\nfX1pampSj93dXvlZkyZNorGxkfLycoqKiigoKPij9xMdk20K4RatVktKSgrr1q1rd02v15Obm8u3\nb9+AlkL44sULoGV/c+TIkUDL8PLWT/Fra2v5+vUr06dPJy0tDX9/f5xOJ1qtFqfTycePH2lubsZu\nt3cZl16v5/jx4+o+cW1tLU6nk/79+6PT6dS9z0ePHlFZWdltnhEREdy6dYuamhoALly4wLRp04CW\n7RqbzUZDQwN1dXVcuXKlwzU6y62rtdsKCgri6dOnKIqCoijqO45WDx8+pKqqSn1Op06d2m1ebfXr\n16/di1ViYiKpqamEhYUxYsSIHq0nfg/pjIXbli1b1uH51atXc/jwYeLi4tBoNGg0GtavX8+YMWPI\nyMhg3bp1DBw4kOnTp6vTwd6+fcu2bdtoaGigsbGRGTNmEBoaio+PD8nJycTGxjJ06FDCw8N59uxZ\npzFZLBb279+PyWRCo9HQq1cvLBYLWq2Wffv2kZGRwYkTJ9DpdEyYMKHbHHU6HWlpaaxatQpoeRFq\nnWIWHx9PRUUFBoOBwYMHd/iVWN3l1tnabYWGhhIZGYnBYFC/GaS1gENLJ5uTk8OrV68YOnQo+/fv\n7zavtlatWkVSUhK9e/cmLy+PAQMGYDAYyM7OJiEhoUdrid9HprYJ0QMul4v+/fujKApr165lwYIF\nmM1mT4f1y8rKyti+fTs2m81rvp/vXyOdsRA9kJycjKIo1NXVMW3aNGJiYjwd0i+zWCzcvXuXnJwc\nKcQeJJ2xEEJ4AfkATwghvIAUYyGE8AJSjIUQwgtIMRZCCC8gxVgIIbyAFGMhhPAC/wNcbMnG+uNw\ngQAAAABJRU5ErkJggg==\n",
"text/plain": [
"<Figure size 576x396 with 1 Axes>"
]
},
"metadata": {
"tags": []
}
}
]
},
{
"cell_type": "code",
"metadata": {
"id": "WFGU1hVSfJTG",
"colab_type": "code",
"outputId": "018bc96a-481d-453b-a765-a54729de2c61",
"colab": {
"base_uri": "https://localhost:8080/",
"height": 53
}
},
"source": [
"print('%.4f %.4f' % (np.sqrt(metrics.mean_squared_error(train[TARGET], model.predict(train[methods]))),\\\n",
" np.sqrt(metrics.mean_squared_error(test[TARGET], model.predict(test[methods])))))\n",
"print('%.4f %.4f' % (metrics.r2_score(train[TARGET], model.predict(train[methods])),\\\n",
" metrics.r2_score(test[TARGET], model.predict(test[methods]))))"
],
"execution_count": 37,
"outputs": [
{
"output_type": "stream",
"text": [
"0.1574 0.6889\n",
"0.9942 0.8956\n"
],
"name": "stdout"
}
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "dDhUgPzra1d3",
"colab_type": "text"
},
"source": [
"\n",
"See [the previous PLS Results](https://nbviewer.jupyter.org/gist/sshojiro/9edc59bab229d0df2904a420c9c7bd29)\n",
"\n",
"||Train|Test|\n",
"|:---|:---|:---|\n",
"|w/o scaler RMSE |0.6615 |1.4443|\n",
"|w/o scaler $R^2$|0.8980| 0.5412|\n",
"|w/ scaler RMSE |0.1574|0.6889|\n",
"|w/ scaler $R^2$|0.9942| 0.8956|\n",
"|PLS w/ fr_ desc. RMSE|1.1154|1.1615|\n",
"|PLS w/ fr_ desc. $R^2$|0.7101|0.7032|\n"
]
}
]
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment