{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# Basics with images" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "* Find this notebook at `EpyNN/epynnlive/dummy_image/train.ipynb`.\n", "* Regular python code at `EpyNN/epynnlive/dummy_image/train.py`.\n", "\n", "Run the notebook online with [Google Colab](https://colab.research.google.com/github/Synthaze/EpyNN/blob/main/epynnlive/dummy_image/train.ipynb).\n", "\n", "**Level: Intermediate**" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "In this notebook we will review:\n", "\n", "* Handling numerical data image to proceed with Neural Network regression.\n", "* Training of Feed-Forward (FF) and Convolutional Neural Network (CNN) for binary classification tasks.\n", "* Overfitting of the model to the training data and impact of Dropout regularization.\n", "\n", "**It is assumed that the following *basics* notebooks were already reviewed:**\n", "\n", "* [Basics with Perceptron (P)](../dummy_boolean/train.ipynb)\n", "* [Basics with string sequence](../dummy_string/train.ipynb)\n", "* [Basics with numerical time-series](../dummy_time/train.ipynb)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "**This notebook does not enhance, extend or replace EpyNN's documentation.**\n", "\n", "**Relevant documentation pages for the current notebook:**\n", "\n", "* [Fully Connected (Dense)](https://epynn.net/Dense.html)\n", "* [Convolution (CNN)](https://epynn.net/Convolution.html)\n", "* [Pooling (CNN)](https://epynn.net/Pooling.html)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Environment and data" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Follow [this link](prepare_dataset.ipynb) for details about data preparation." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Briefly, grayscale images were generated by random selection of tones. Each image represents one sample features object. Such random features may have been altered - or not - by setting a fraction of the pixel to the highest tone level in the palette.\n", "\n", "The goal of the neural network training is to build a classifier able to detect if a presumably random image has been altered or not. Said differently, we are going to try detecting deviation or anomaly with respect to the expected distribution of randomly chosen tones within the image." ] }, { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [], "source": [ "# EpyNN/epynnlive/dummy_image/train.ipynb\n", "# Install dependencies\n", "!pip3 install --upgrade-strategy only-if-needed epynn\n", "\n", "# Standard library imports\n", "import random\n", "\n", "# Related third party imports\n", "import matplotlib.pyplot as plt\n", "import numpy as np\n", "\n", "# Local application/library specific imports\n", "import epynn.initialize\n", "from epynn.commons.maths import relu, softmax\n", "from epynn.commons.library import (\n", " configure_directory,\n", " read_model,\n", ")\n", "from epynn.network.models import EpyNN\n", "from epynn.embedding.models import Embedding\n", "from epynn.convolution.models import Convolution\n", "from epynn.pooling.models import Pooling\n", "from epynn.flatten.models import Flatten\n", "from epynn.dropout.models import Dropout\n", "from epynn.dense.models import Dense\n", "from epynnlive.dummy_image.prepare_dataset import prepare_dataset\n", "from epynnlive.dummy_image.settings import se_hPars\n", "\n", "\n", "########################## CONFIGURE ##########################\n", "random.seed(0)\n", "np.random.seed(1)\n", "\n", "np.set_printoptions(threshold=10)\n", "\n", "np.seterr(all='warn')\n", "\n", "configure_directory()\n", "\n", "\n", "############################ DATASET ##########################\n", "X_features, Y_label = prepare_dataset(N_SAMPLES=750)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Let's inspect what we retrieved." ] }, { "cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "750\n", "(28, 28, 1)\n" ] } ], "source": [ "print(len(X_features))\n", "print(X_features[0].shape)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "We retrieved sample features describing ``750`` samples.\n", "\n", "For each sample, we retrieved features as a three-dimensional array of shape ``(width, height, depth)``.\n", "\n", "In the context, remember that the ``depth`` dimension represents the number of channels which encode the image. While the depth of any RGB image would be equal to 3, the depth of a grayscale image is equal to one.\n", "\n", "Let's recall how this looks." ] }, { "cell_type": "code", "execution_count": 3, "metadata": {}, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "fig, (ax0, ax1) = plt.subplots(1, 2)\n", "\n", "ax0.imshow(X_features[Y_label.index(0)], cmap='gray')\n", "ax0.set_title('label: 0')\n", "\n", "ax1.imshow(X_features[Y_label.index(1)], cmap='gray')\n", "ax1.set_title('label: 1')\n", "\n", "plt.show()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The first image is associated with a ``label: 0`` (non-random image) while the second is associated with ``label: 1`` (random image).\n", "\n", "In terms of pixel tones distribution for the zero (black) tone." ] }, { "cell_type": "code", "execution_count": 4, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "96\n", "59\n" ] } ], "source": [ "print(np.count_nonzero(X_features[Y_label.index(0)] == 0)) # Manipulated image\n", "print(np.count_nonzero(X_features[Y_label.index(1)] == 0)) # Random image" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Indeed there are 12 more white pixels in the image with ``label: 0`` compared to the image with ``label: 1``. Since we expected 10% of the image pixels to be altered with the highest tone - which renders to white in matplotlib - we can then be somewhat confident and go ahead.\n", "\n", "Note that double-checking the data is important: nobody wants to waste a day of work at trying to fit inconsistent data." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Feed-Forward (FF)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "We will first engage in designing a Feed-Forward network." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Embedding" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "We first instantiate the embedding layer which is on top of the network." ] }, { "cell_type": "code", "execution_count": 5, "metadata": {}, "outputs": [], "source": [ "embedding = Embedding(X_data=X_features,\n", " Y_data=Y_label,\n", " X_scale=True,\n", " Y_encode=True,\n", " batch_size=32,\n", " relative_size=(2, 1, 0))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Note that we set ``X_scale=True`` in order to normalize the whole input array of sample features within \\[0, 1\\]. Although the neural network may theoretically achieve this normalization by itself, it may be slowing down training and convergence. In general, it is thus recommended to apply normalization within \\[0, 1\\] or, alternatively, \\[-1, 1\\].\n", "\n", "We have also set a ``batch_size=32`` which represents the number of samples from which gradients are computed and parameters updated. There are ``N_SAMPLES/batch_size`` parameters update per training epoch." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Flatten-(Dense)n with Dropout" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "We start with a Feed-Forward network which requires the use of a *Flatten* layer before the first *Dense* layer in order to reshape image data of shape ``(HEIGHT, WIDTH, DEPTH)`` into ``(HEIGHT * WIDTH * DEPTH)`` or simply ``(N_FEATURES)``." ] }, { "cell_type": "code", "execution_count": 6, "metadata": {}, "outputs": [], "source": [ "name = 'Flatten_Dropout-02_Dense-64-relu_Dropout-05_Dense-2-softmax'\n", "\n", "se_hPars['learning_rate'] = 0.01\n", "\n", "flatten = Flatten()\n", "\n", "dropout1 = Dropout(drop_prob=0.2)\n", "\n", "hidden_dense = Dense(64, relu)\n", "\n", "dropout2 = Dropout(drop_prob=0.5)\n", "\n", "dense = Dense(2, softmax)\n", "\n", "layers = [embedding, flatten, dropout1, hidden_dense, dropout2, dense]\n", "\n", "model = EpyNN(layers=layers, name=name)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "We have set up a first *dropout1* between the *flatten* and *hidden_dense* layer as well as a second one between *hidden_dense* and *dense* to anticipate overfitting problems." ] }, { "cell_type": "code", "execution_count": 7, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "\u001b[1m--- EpyNN Check OK! --- \u001b[0m\r" ] } ], "source": [ "model.initialize(loss='MSE', seed=1, se_hPars=se_hPars.copy(), end='\\r')" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Let's train the network for 100 epochs." ] }, { "cell_type": "code", "execution_count": 8, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "\u001b[1m\u001b[37mEpoch 99 - Batch 14/14 - Accuracy: 0.781 Cost: 0.1455 - TIME: 12.33s RATE: 8.11e+00e/s TTC: 0s \u001b[0m\n", "\n", "+-------+----------+----------+----------+-------+--------+-------+------------------------------------------------------------------------+\n", "| \u001b[1m\u001b[37mepoch\u001b[0m | \u001b[1m\u001b[37mlrate\u001b[0m | \u001b[1m\u001b[37mlrate\u001b[0m | \u001b[1m\u001b[32maccuracy\u001b[0m | | \u001b[1m\u001b[31mMSE\u001b[0m | | \u001b[37mExperiment\u001b[0m |\n", "| | \u001b[37mDense\u001b[0m | \u001b[37mDense\u001b[0m | \u001b[1m\u001b[32mdtrain\u001b[0m | \u001b[1m\u001b[32mdval\u001b[0m | \u001b[1m\u001b[31mdtrain\u001b[0m | \u001b[1m\u001b[31mdval\u001b[0m | |\n", "+-------+----------+----------+----------+-------+--------+-------+------------------------------------------------------------------------+\n", "| \u001b[1m\u001b[37m0\u001b[0m | \u001b[1m\u001b[37m1.00e-02\u001b[0m | \u001b[1m\u001b[37m1.00e-02\u001b[0m | \u001b[1m\u001b[32m0.506\u001b[0m | \u001b[1m\u001b[32m0.540\u001b[0m | \u001b[1m\u001b[31m0.273\u001b[0m | \u001b[1m\u001b[31m0.266\u001b[0m | \u001b[37m1635012582_Flatten_Dropout-02_Dense-64-relu_Dropout-05_Dense-2-softmax\u001b[0m |\n", "| \u001b[1m\u001b[37m10\u001b[0m | \u001b[1m\u001b[37m1.00e-02\u001b[0m | \u001b[1m\u001b[37m1.00e-02\u001b[0m | \u001b[1m\u001b[32m0.624\u001b[0m | \u001b[1m\u001b[32m0.496\u001b[0m | \u001b[1m\u001b[31m0.232\u001b[0m | \u001b[1m\u001b[31m0.254\u001b[0m | \u001b[37m1635012582_Flatten_Dropout-02_Dense-64-relu_Dropout-05_Dense-2-softmax\u001b[0m |\n", "| \u001b[1m\u001b[37m20\u001b[0m | \u001b[1m\u001b[37m1.00e-02\u001b[0m | \u001b[1m\u001b[37m1.00e-02\u001b[0m | \u001b[1m\u001b[32m0.684\u001b[0m | \u001b[1m\u001b[32m0.512\u001b[0m | \u001b[1m\u001b[31m0.193\u001b[0m | \u001b[1m\u001b[31m0.269\u001b[0m | \u001b[37m1635012582_Flatten_Dropout-02_Dense-64-relu_Dropout-05_Dense-2-softmax\u001b[0m |\n", "| \u001b[1m\u001b[37m30\u001b[0m | \u001b[1m\u001b[37m1.00e-02\u001b[0m | \u001b[1m\u001b[37m1.00e-02\u001b[0m | \u001b[1m\u001b[32m0.742\u001b[0m | \u001b[1m\u001b[32m0.452\u001b[0m | \u001b[1m\u001b[31m0.179\u001b[0m | \u001b[1m\u001b[31m0.300\u001b[0m | \u001b[37m1635012582_Flatten_Dropout-02_Dense-64-relu_Dropout-05_Dense-2-softmax\u001b[0m |\n", "| \u001b[1m\u001b[37m40\u001b[0m | \u001b[1m\u001b[37m1.00e-02\u001b[0m | \u001b[1m\u001b[37m1.00e-02\u001b[0m | \u001b[1m\u001b[32m0.762\u001b[0m | \u001b[1m\u001b[32m0.508\u001b[0m | \u001b[1m\u001b[31m0.154\u001b[0m | \u001b[1m\u001b[31m0.314\u001b[0m | \u001b[37m1635012582_Flatten_Dropout-02_Dense-64-relu_Dropout-05_Dense-2-softmax\u001b[0m |\n", "| \u001b[1m\u001b[37m50\u001b[0m | \u001b[1m\u001b[37m1.00e-02\u001b[0m | \u001b[1m\u001b[37m1.00e-02\u001b[0m | \u001b[1m\u001b[32m0.826\u001b[0m | \u001b[1m\u001b[32m0.512\u001b[0m | \u001b[1m\u001b[31m0.140\u001b[0m | \u001b[1m\u001b[31m0.275\u001b[0m | \u001b[37m1635012582_Flatten_Dropout-02_Dense-64-relu_Dropout-05_Dense-2-softmax\u001b[0m |\n", "| \u001b[1m\u001b[37m60\u001b[0m | \u001b[1m\u001b[37m1.00e-02\u001b[0m | \u001b[1m\u001b[37m1.00e-02\u001b[0m | \u001b[1m\u001b[32m0.668\u001b[0m | \u001b[1m\u001b[32m0.468\u001b[0m | \u001b[1m\u001b[31m0.219\u001b[0m | \u001b[1m\u001b[31m0.353\u001b[0m | \u001b[37m1635012582_Flatten_Dropout-02_Dense-64-relu_Dropout-05_Dense-2-softmax\u001b[0m |\n", "| \u001b[1m\u001b[37m70\u001b[0m | \u001b[1m\u001b[37m1.00e-02\u001b[0m | \u001b[1m\u001b[37m1.00e-02\u001b[0m | \u001b[1m\u001b[32m0.834\u001b[0m | \u001b[1m\u001b[32m0.476\u001b[0m | \u001b[1m\u001b[31m0.112\u001b[0m | \u001b[1m\u001b[31m0.337\u001b[0m | \u001b[37m1635012582_Flatten_Dropout-02_Dense-64-relu_Dropout-05_Dense-2-softmax\u001b[0m |\n", "| \u001b[1m\u001b[37m80\u001b[0m | \u001b[1m\u001b[37m1.00e-02\u001b[0m | \u001b[1m\u001b[37m1.00e-02\u001b[0m | \u001b[1m\u001b[32m0.880\u001b[0m | \u001b[1m\u001b[32m0.452\u001b[0m | \u001b[1m\u001b[31m0.091\u001b[0m | \u001b[1m\u001b[31m0.359\u001b[0m | \u001b[37m1635012582_Flatten_Dropout-02_Dense-64-relu_Dropout-05_Dense-2-softmax\u001b[0m |\n", "| \u001b[1m\u001b[37m90\u001b[0m | \u001b[1m\u001b[37m1.00e-02\u001b[0m | \u001b[1m\u001b[37m1.00e-02\u001b[0m | \u001b[1m\u001b[32m0.886\u001b[0m | \u001b[1m\u001b[32m0.516\u001b[0m | \u001b[1m\u001b[31m0.092\u001b[0m | \u001b[1m\u001b[31m0.295\u001b[0m | \u001b[37m1635012582_Flatten_Dropout-02_Dense-64-relu_Dropout-05_Dense-2-softmax\u001b[0m |\n", "| \u001b[1m\u001b[37m99\u001b[0m | \u001b[1m\u001b[37m1.00e-02\u001b[0m | \u001b[1m\u001b[37m1.00e-02\u001b[0m | \u001b[1m\u001b[32m0.862\u001b[0m | \u001b[1m\u001b[32m0.512\u001b[0m | \u001b[1m\u001b[31m0.109\u001b[0m | \u001b[1m\u001b[31m0.390\u001b[0m | \u001b[37m1635012582_Flatten_Dropout-02_Dense-64-relu_Dropout-05_Dense-2-softmax\u001b[0m |\n", "+-------+----------+----------+----------+-------+--------+-------+------------------------------------------------------------------------+\n" ] } ], "source": [ "model.train(epochs=100, init_logs=False)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "We can already observe that the model could reproduce the training data well, in contrast to the validation data." ] }, { "cell_type": "code", "execution_count": 9, "metadata": {}, "outputs": [ { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAeYAAAEWCAYAAACzATTWAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjQuMywgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/MnkTPAAAACXBIWXMAAAsTAAALEwEAmpwYAACnh0lEQVR4nOyddXhUR9fAf7ObbNwNSALBghNcChQolEK9tJR6qb7V96t7+9aVulNXaEsNKKV4oQUKQYtrgAhxt7X5/pjdzW6yMdgI4f6eZ59kr8ydvXt3zhyZc4SUEg0NDQ0NDY3Wga6lO6ChoaGhoaFRhSaYNTQ0NDQ0WhGaYNbQ0NDQ0GhFaIJZQ0NDQ0OjFaEJZg0NDQ0NjVaEJpg1NDQ0NDRaEZpgbmGEEAlCCCmE8GrpvmhoNBdCiJVCiBtbuh8apx5CiB5CiC1CiGIhxH9buj/uaJBgFkLcIYRIFkJUCiE+r7bPXwjxnhAiRwhRKIRY5bTvbiHEQSFEkRAiXQjxurMAEkKkCCHKhRAlttfiam3fLYQ4Zjv/UyGEj9O+Z4QQ/wohzEKIJ6udd44Q4i8hRIHt/I+FEEFO+z8XQhidrlsihNA77b9UCLHL9sXtFEJc6LTvWiHERlufUoUQLzdEqLr5rCVCiA71nVetjXFCiNRq254UQnzdmHaOB9tAWmG7J0W2e/CQ83fSmrBNdrrVc0y4EOJnIUSpEOKwEOIKp311PkN1tHnS3CchRJQQ4lvb7zZfCPGNm2PChRDZQoi/WqKPdXEy3WvwyDM5TghhrTaGXNuA69rHnmLb87xGCHGLEKJVKWbHO7YeBw8AK6SUQVLKt2z3Z2ITXOe4aegXkw48C3zqZt8sIBzoZft7t9O+ecAgKWUw0BdIAqrPUM6TUgbaXpPsG4UQZwEPAROATkAX4Cmn8/ajbvBvbvoUYutvB1u/YoFXqh3zstN1A6WUFtt1Y4GvgXuAYOB+4FshRLTtPH/gLiASGG7r331u+uCO86pdM72B57UW7pBSBgHtgXuBy4CFQgjh7uAm+lF5kncBIxADXAm8L4ToY9vXkGeoNhp1n1qQn4BjQEcgGpjp5piXgF2NabSZv/dT6ZkESK82hnzRwHbPs92nTsCLwIPAJ57suAc4kbG1MXQCdjRBu55DStngF2qg+tzpfU+gCAhuwLkRwFLgPadtKcDEWo7/Fnje6f0E4Jib474Gnqzn2lOBf53efw48W8uxw4GsatuygZG1HH8PML8Bn9/tZwUSAAl42d5fhxoIi4GDwH9s2wOAcsAKlNheV6B+xCbb+622Y0NQP7oMIM32velt+2YAf6EG4XzgEDClAf1fCdxYbVtHoAw41/b+SWCu7TspAm5ECbZ5QB5qMnWT0/n247+zfd5NQJLT/l626xagfkjn19Yf++ey/b/Kdk9LbfdlupvPE2C7d4lO274CXmzIM3SC90mHmnQeAHKB74Hwas/DtcARIAd41KmtYUCy7f5mAq857RsBrLHdr63AuDr6OQn1TOrrOOY0YC3qmfyrAc/3g8A2oBLwqqs/zvfJ9hx8XdtvQnsm1TMJjANS63sGGzL22J4jK9DX9t4HNSYcsT1XHwB+ztdFTXyyUOPKdU5tnQ3stN2vNOA+p33nAlts92sN0L8R/a5zbKXu38L5tu+nwPa99LJtXw5YgArb9zDbdh/Kbe8foOr5uw44ihonbwGGop7vAuAdp2t1tbWbi/q9fgOEOu3LQymooJ69bOr4bUopT9jHPAw4DDwllCn7XyHExc4HCCGuEEIU2TqcBHxYrY1vbKayxUKIJKftfVA/ZjtbgRghRMRx9PN0as6QbhNC5NlMJ859TgZ2CSHOF0LobWbsStQX0tC2T4Qs1MMcjHowXhdCDJJSlgJTcJ0xfws8D3xne2+/f58DZqAbMBA1CDv784YDe1Az05eBT45Hm5NSHkHdrzFOmy9ADWyhqAd0DupH3QG4BHheCHFGteN/QFlbvgV+EUJ4CyG8gfnAYpQ2dyfqWenRgH6dbvs3yXZfvnNzWCJgllLuddq2FfXcueO4v2c39+lO4EJgLOq+5KM0JWdGAz1QE9InhBC9bNvfBN6UygrVFSXU7Zae31CTsHCUpvGjECKqlm6NQD0DXwghcoUQG4QQY+07hXLtvAPcgRqkGsLlwDmo7z6mkf3xCKfAMxkthMgUQhwSyjUYUN+1a+nPetQ9sN+nF23XH4AaN2KBJ5xOaYea8McCNwDvCiHCbPs+QSkQQSjL6HIAIcRAlJX1PyjF7ENgXiNcDfX95mr7LSSiBO5dQBSwEJgvhDBIKc8AVqMsLYFSystRkxG7NfNlp/aHA92B6cAbwKPARNT3canT70UAL1BlXYtHTfCQUh5ATVi/FkL4A58BX0gpV9b1wU9UMMehvohCW6fuQP3Q7YMIUspvbTcuETULy3Q6/0rU7KQTsAL4QwgRatsXaGvXjv3/ev18zgghzkRpH84P2VuoGx4NPA58LoQYZeuvBfgS9YOstP39j00wVm/7emAI7k2A7vjF5uMpEEL84u4AKeVvUsoDUvEnahAY4+5YdwghYlAz2LuklKVSyizgdZSJz85hKeVHts/6BcoMGNPQa1QjHTWA2VkrpfxFSmlFCf5RwINSygop5RbgY+Aap+M3SinnSilNwGuAL0pojEA9Ay9KKY1SyuXAAtTg7wkCUTNtZwpx83zV8gw1Fuf7dAtKC06VUlaifsSXVDOzPiWlLJdSbkUNzvZJlwnoJoSIlFKWSCnX2bZfBSyUUi6UUlqllEtQAursWvoTh5qwrUANuq8CvwohIm37/wv8I6Xc2IjP+JaU8qiUsvw4+uNJ2uozuRslONsDZwCDbf07XtKBcNuk/GbgbillnpSyGDXhdx4zTMDTUkqTlHIhSrvs4bSvtxAiWEqZL6XcZNt+M/ChlPIfKaVFKrN7Jeo+1kkDx9bafgvTgd+klEts3+FMwA9lAWoMz9iekcUoS8dsKWWWlDINJdwHAkgp99uuVSmlzEZ9J45JrpTyI5Rl5h/Ud/dofRc+UcFcjro5z9oe1D9RP/RJ1Q+UUu5DzX7ec9r2t23wKZNSvoAyEdiFUAlKa7Rj/7+4oZ0TQoxACdZLnGehUspNUspcKaXZ9pB9gzJVYgsCeBllvjGgbvDHQogB1dq+EDVLmiKlzGlgly6UUobaXhfW0ucpQoh1Nm2+ADWQRbo7thY6Ad5Ahn0SgJqpRjsdc8z+j5SyzPZvYCOu4UwsylRj56jT/x0A+w/dzmHbOTWOtw2cdk2mA3DUtq22cxuMEOJ3p4CZK6n5fGF7X1ztPLfP0HHgfJ86AT87fT+7UOY158nRMaf/y6j6fm5ATXJ327Tcc53anOY08StAad3thRBjnD67XQMpB1KklJ/YBts5qO9ilFBBif+llgHEzb204/zd19qf+m/VCdMmn0kp5TEp5U7bROcQyux6MceP/T5Fofy7G52+q0W27XZypZRmp/fOz+TFqHHqsBDiTyHESNv2TsC91Z6BeKCDEOJKp8/+u3On3I2ttRxf22+hA+p7ARzf4VEa/z05K5Hlbt4H2voWI4SYI4RIs1mHv6bmmP0RSol92zYZr5MTDYRwZ96ty+zlhTI51IZEmQVACfEkbOYJ2/+ZUsrchnTMZkaZB1wvpVxWz+HO1x0ArJJSJtvebxBC/IMyYWyxtT0ZdaPPkVL+25D+NLDPPsCPqNn7r1JKk02ztvfN3b2tvu0oalYaWe2H5HGEEPGoWftLtfTHPiMPchoIO6L8UHbindrToTQ5e1BcvBBC5zQQdgTswrEUNZjYaVdXX6WUU6r1PQDwEkJ0t00aQT1jO5yOacwzVCtu7tNRW5t/uzk2oZ7PsQ+43HavpgJzhXLvHAW+klLeVMup1Sde24Dzqjdv+zsMJUB32jwcfoCfEOIYEFv9Xro5nwb0x5lGfZd10dafyepNcJzKlRBiKEpQ/YVyM5YDfWzaYKOQUm4ALrCZ+u9AjdnxqGfgOSnlc7Wc6m4VgNuxVUr5TfXj6/gtpAP9nNoUtv7U9tlOtMTi87Y2+kkp82wTi3ecrh+IMoV/AjwphPhRSpnnriE7DV0u5SWE8AX0gF4I4Wszu61C2ecfth0zChgP/GE770Zhi2YWQvQGHgaW2d53FEKMEkIYbO3dj5pl2AerL4EbhBC9hTJvP4byndr75G3rkw71MPsK25InIURf1IzvTinlfDef5xIhRKAQQieEmIQyu82z7d4AjLFryLbBeQy2SYhQvqhvgIul8tN4EgMqCCMbMAshpuBqfcgEIoQQIdW2JdgeTqSUGSjz96tCiGDbZ+wqnPyHJ4pQS+TGAr8C61E+nBpIKY+iAj5esH0//VGzXOflXYOFEFNtz9NdqEnFOpTZpwx4wPZdj0MJkjm287YAU2196WZr15lMVCS/W6RyTfwEPC2ECLA9uxeggm3qfYYaQh336QPgOSFEJ9txUUKICxrY5lVCiCibYCiwbbai7ul5QoizhIqN8BVqeU1cLU39DIQJtURFL4S4BCWA/gZ+R7mYBtheTwCbgQE290dDaEx/tgCn28aEENQ40ShOkWdyvBCik1DEo/zCv9Z7c5ywjQnn2vr8tZTyX9uz9BEqnsU+XscKtTKmvvYMQmmzITazcRHqecTW5i1CiOG2PgcItQzRrTuysWNrHb+F74FzhBATbJOFe1Hf4Zpamqrze2kAQShrR6FQsR73V9v/JpAspbwRFXfxQb0tyoZFxz2JmhE4v5607euDitwsRUXmXeR03me2D12Kigx8BfB1Om+bbV8uSmAPqXbde2znF9na8nHa97mbPs1wuq5z9HIJsMPp3NUo300Ryn93WbXr3oHyCdgjo+912rcCFVjl3PbvDbiHKTQsKvt222cuQP0g5+AUQY4Kpsi17e+ACqr4CxVAtMl2TAjwPsoEV4gaVC+T1SJFndqUQLd6+r8SFclYbHttRpk6fas9J19XOy8O5YfLQ0Uh31LteOcI2M3YohednpE/bZ+h+rMViZqAFKOEyZPOnwvlx82w3adLa/lM4cAvqGfwCHBFtWe31mfoBO+TDvVs77EdcwDbCoTqz4NTm/YI5q9RAYIlKE3qQqfjhtvuVx5qcvcb0LGOvo4B/rW1lQyMqeW4Gs9MQ57vuvpDzQjmd23f1X7gpur3QHsmHeNhGmpycBQVKxPUwLGn3NavQtR4fTtOEfkoP/rzqPGuCOVe+a9t3ziqRYPbv2+UMrEINf4UoRSb0U7HTbZtK7B99h9q6zONHFup+7dwke37KbR9X33c/Z5s7y+w3esCVJBiAjV/g6m4rir4GnjM6ZnYaOvHFtREINWp7TSqVl0Eop7xK+v6zoTtYA2NZkeoxDDdpJRXtXRfNDRAeyY1WgetKvOLhoaGhobGqU5rz4Jz0iCE6Igynbijt1TrK1s1QoiSWnZNkVKubtbOtGK0+9R8aPe6ftrC2KPhimbK1tDQ0NDQaEVopmwNDQ0NDY1WhGbKbiSRkZEyISGhpbuhoaGhcVKxcePGHCllk6ZkbStogrmRJCQkkJycXP+BGhoaGhoOhBCH6z9KAzRTtoaGhoaGRqtCE8waGhoaGhqtCE0wa2hoaGhotCI0H7MHMJlMpKamUlFR0dJd0ThOfH19iYuLw9vbu6W7oqGhcYqjCWYPkJqaSlBQEAkJCahCJhonE1JKcnNzSU1NpXPnzi3dHQ0NjVMczZTtASoqKoiIiNCE8kmKEIKIiAjN4qGhodEq0ASzh9CE8smN9v1paGi0FjTBrKGhodEKaG3pkVNySvlxY2qr69epgCaY2yBPPvkkM2fOBODzzz8nPT290W188MEHfPnll57umoaGhhv+2pdDvycXsyO9sKW7QoXJwutL9jLpjVXc+8NWtqW2fJ9ONTTB3MapSzBbLJZaz7vlllu45pprmqpbJ4TZbG7pLmhoeIxKs4XHf91OSaWZj1YdbNG+7M8q4aw3VvHmsn2c0SMagLUHc1u0T6cimmBuIzz33HMkJiYyevRo9uzZA8DcuXNJTk7myiuvZMCAAZSXl5OQkMCDDz7IoEGD+OGHH/joo48YOnQoSUlJXHzxxZSVlQGuWve4ceN48MEHGTZsGImJiaxeXbPaXklJCRMmTGDQoEH069ePX3/91bHvyy+/pH///iQlJXH11VcDkJmZyUUXXURSUhJJSUmsWbOGlJQU+vbt6zhv5syZPPnkk44+3HXXXQwZMoQ333yT+fPnM3z4cAYOHMjEiRPJzMx09OO6666jX79+9O/fnx9//JFPP/2Uu+66y9HuRx99xN133+25m6+hcQJ8vPoQh3JKGdgxlAXbMjhW6LkgxK/XHebHjamNOv5YYQXf3DicD64eTLfoQNYe0ARzc6Mtl/IwT83fwc70Io+22btDMP87r0+t+zdu3MicOXPYsmULZrOZQYMGMXjwYC655BLeeecdZs6cyZAhQxzHR0REsGnTJgByc3O56aabAHjsscf45JNPuPPOO2tcw2w2s379ehYuXMhTTz3F0qVLXfb7+vry888/ExwcTE5ODiNGjOD8889n586dPPvss6xZs4bIyEjy8vIA+O9//8vYsWP5+eefsVgslJSUkJ+fX+d9MBqNjjzl+fn5rFu3DiEEH3/8MS+//DKvvvoqzzzzDCEhIfz777+O47y9vXnuued45ZVX8Pb25rPPPuPDDz+s77ZraHiEcqOFI3ll9GgXVGNfWkE57yzfz6TeMTx2Tm/GzlzBV+tSuP+sno1q/+kFOxnYMZRLh8Q7tq/am81jv2yne3QgFw+Oa1Bbm47kMyA+lFHdIgEY2SWCHzelYrJY8dZrelxzoQnmNsDq1au56KKL8Pf3B+D888+v8/jp06c7/t++fTuPPfYYBQUFlJSUcNZZZ7k9Z+rUqQAMHjyYlJSUGvullDzyyCOsWrUKnU5HWloamZmZLF++nGnTphEZqX7o4eHhACxfvtzhw9br9YSEhNQrmJ37nZqayvTp08nIyMBoNDrWHy9dupQ5c+Y4jgsLCwPgjDPOYMGCBfTq1QuTyUS/fv3qvJaGhieQUnLXd5tZvjuLtQ9PIDLQx2X/c7/tRCJ5/NzexIf7M6l3DN/+c4Q7xnfHz6Cvt/2CMiM3fJHMxsP5zF5/BAFMGxJPdnEl93y/FYBDOaU1BOuvW9LYeDifpy+oslCVGc3sSC/iP6d3cWwb0SWCr9YdZltqIYM7hZ3g3dBoKJpg9jB1abathYCAAMf/M2bM4JdffiEpKYnPP/+clStXuj3Hx0cNKHq93q2P95tvviE7O5uNGzfi7e1NQkJCo9cFe3l5YbVaHe+rn+/c7zvvvJN77rmH888/n5UrVzpM3rVx44038vzzz9OzZ0+uu+66RvVLQ+N4WbAtgz92KDfL7/9mcPXIBMe+fw7msvDfY9x7ZiLx4WpSff2ozvyxI5OfN6dxxfCOdbadUVjOtZ+uJyWnjDcvG8Dcjak8+OM2Any8mL3+CMUVJm4Z25UP/jzA4dxSukVXaexzN6ayel8Od4zvRnSwLwDbUguxWCVDEqoE8IguaiK97mCuJpibEc020QY4/fTT+eWXXygvL6e4uJj58+c79gUFBVFcXFzrucXFxbRv3x6TycQ333xz3H0oLCwkOjoab29vVqxYweHDqsLbGWecwQ8//EBurvJT2U3ZEyZM4P333wdUEFphYSExMTFkZWWRm5tLZWUlCxYsqPN6sbGxAHzxxReO7WeeeSbvvvuu471dCx8+fDhHjx7l22+/5fLLLz/uz6lx6rBo+zG++ecwaw7kkFlU0ehlQ7kllfxv3g6S4kLoFh3I/K0ZLvs/+zuF8AADNzlpqMM6h9OnQzCf/n2ozusVlBm59MO1pBdU8Pn1Q7lgQCwfXj2YgR3DuO2bTazel8MT5/XmnH7tAdiXWeJy/q4MNSas3Jvt2LbxsPqtDIyvEsARgT70iAlinRYA1qxogrkNMGjQIKZPn05SUhJTpkxh6NChjn0zZszglltucQR/VeeZZ55h+PDhjBo1ip49G+7Xqs6VV15JcnIy/fr148svv3S01adPHx599FHGjh1LUlIS99xzDwBvvvkmK1asoF+/fgwePJidO3fi7e3NE088wbBhwzjzzDPr7M+TTz7JtGnTGDx4sMNMDspPnp+fT9++fUlKSmLFihWOfZdeeimjRo1ymLc1WpaL31/DO8v3NehYKSXLd2eyaHtG/Qc3kkpzzdUJlWYLd87exKM/b+eKj/5h+PPLuPLjf8gqrrLiWK2SX7ek8fqSvfy6JY1tqQWUVFZZk/43bwfFFSZemZbE+UkdWJ+SR3qB+g0eK6xgya5Mpg2Jw9e7ymQthOD6UZ3Zn1XC8t1ZbvsrpeSBuds4VljBF9cP47Su6vn3N3jx6YyhDOkUxiWD47hiWEe6RQciBOzLqhLM2cWV5JRUAvDnnirBvOlwPl2jAggLMLhcb2TXCJJT8jGarWg0D0JbPN44hgwZIu0BSHZ27dpFr169WqhHGg3l3HPP5e6772bChAlu92vfY/NRWG4i6anFJET4s+K+cXVmXjuaV8aT83awbHcWvt46tv3vLAxentEp/t6fw41fJPPKtP6c27+DY/uO9ELOeesvnjyvN92ig9iaWsDby/cR5OvNW5cNJCzAm8d/2c6GlJpxEdFBPsSF+bHpSAH3npnInRO6k5JTyriZK3nk7J7cfHpXXl+yl7eW7+PP+8bTMcLf5Xyj2cqk1//E4KXj9/87Hb3O9d58tTaFx3/dwaNn93LRtmtjzMvLGRAfxtuXDwRUUNg1n66nc2QAOSWVbH78TPQ6wcBnljCpdwwvX5Lkcv6i7ce45euN/HDLSIYmhDf43lZHCLFRSjmk/iM1NI1Zo81TUFBAYmIifn5+tQpljeZlX6YypabklnEgu7TW4xb+m8HE1/5k3cFczu7XjgqT1WNJODYdyeemL5MpN1lYU21J0G6bqXd09yhGd4/k9vHd+PX20QT5enHlx+s4562/2J9VwssX92f3M5NZfPfpfHDVIO4/qwdjukchgYm9orllXFcAEiID6B8XwvytGZgsVuZsOMLYxKgaQhnA4KXjgck92ZtZwtyNR1327coo4pnfdjGuRxQ3jG5YwZXu0UGO+21vA+Dm07tQXGFm05ECDuaUUlBmcutHHtElHCFgnbZsqtnQgr802jyhoaHs3bu3pbuh4cTuY1WCYvnuTLpFB7o97vvko0QG+jD31pHodYKF/x4jOSWfgR0b546QUrLpSD4hfgY6hvtzILuEGZ+uJyrIh0AfL7anuQr7XRlF+HjpSHASnD3aBTHvjtE899tOvHQ67jkz0WH2TYwJIjGm5nIoZ85P6sCzv+3i49WHyCyq5LkLO9V67JS+7RjYMZTXluzlvKQO+Bu8SCso5/ZvNxHi583MaUnodA3L7949OpC/9udgtljx0uvYlVFE+xBfzunfnsd/2c7KPVkkRKrASneCOdTfQM92waw9mMudE7o36JoaJ4amMWtoaDQ7ezOLCfTxome7IJbucu9LBSipMNMpwp/2IX5EB/mSEOHPhpS8Rl9v/aE8Ln5/LRNf+5NeTyziwnf/xt/gxdc3DGdUt0h2ZxS7+FB3HSuiR7sgvKqt3Q308eKFqf155sK+NXyx9XFO//YIATMX7yE21I/xPaNrPVYIwSNn9yKzqJJPVh9i+e5MznlrNdlFlbx9+cAay67qolt0IEazlaP5yr+9K6OYXu2DCfb1ZlCnMFbuyWbT4XxC/LzpEul+gjSySwQbD+e79cdreB5NMGtoaDQ7e44VkxgTyMReMWw8nE9BmdHtcSWVZgJ9qgx7QxLCST6c3+gI6c1HCwB4YWo/bh3blamDYvnmpuHEh/vTNzYEo8XKXpu5V0qphFe74OP7cLXQPsSPoQnhWKySy4fF1/AdV2doQjiTesfw9vL9XP95Mh1C/Jh/52hGdIlo1HW72zT5fZnFVJotHMguoact2cn4HtHszChi2e4sBnUMrVULH9k1gkqzla1HtbzZzYEmmDU0NJoVKSV7Movp0S6YCb2isVglfzot23GmuMJMoG+VYB6aEEZeqbFOv7Q7dqQXERvqx+XDOnLfWT14YWp/ukYp7bBfbAiAw5ydXVxJXqmRXu3rNk0fD1cM60iwrxeXDo2v/2DgwSk98fHWcfmweH667TSHybkx2N0E+7JK2J9Vgtkq6dVeTTrG9YgC1Geua53yqG4RLL93LEMTtBUNzYHmY9bQ0GhWsosrKSgz0SMmkKS4UCIDDSzdlcUFA2JrHFtSaSbIx1kwq6jg5JS8Wv3S7tiRVkifDu414E7h/gT5ePFvWiGXATttwVE923tWYwa4cGAs5yV1qFdbttM1KpAtT0xq8PHuCPTxIjbUj32ZxcTYkonYBXPPdkG0C/blWFEFg+oQzP4GL7pENfx+a5wYmsbcBnEuQNFYZsyYwdy5cz3cIw2NKvbYTMaJ7YLQ6QTje0Tz554sTBbXdbJSSkorXTXmzpEBRAQY3C5Tqo2SSjOHckvpa9OMq6PTCfrGhjg0ZnvyDU+bsu00VsieiFC20y06kH1ZJezKKMLXW0dnm+YthGB8zyi89YKkuNATvo6GZ9AEs0arQivp2LqxWiX7s0ooLDcddxt7bBHZPWy+zwm9oimqMJNcTdhWmq2YrZIAJ41ZCMGQhDCSDzc8AGxXRhFSUqvGDNAvLoRdx4oxWazsylBm7xB/78Z8rFZN9+hA9meVsCO9kB4xQS7C/r5JPZh90wiX+6zRsmiCuY3gruzj7t27GTZsmOOYlJQUR/GGp59+mqFDh9K3b19uvvnmeoNpaisP6a58I7gv9VhdGw8MVKaxlStXMmbMGM4//3x69+4NwIUXXsjgwYPp06cPs2bNcpyzaNEiBg0aRFJSEhMmTMBqtdK9e3eys5WP0mq10q1bN8d7Dc+hsmFtZuJrf5L01GIGP7OEqz/5p9bArdrYc6yYyEAfImyRxWO6R2HQ61i+O9PluOIKNUkLqiYwhiaEczi3jKyihuVi32HThGvTmO37jGYVALb7WFGT+Jdbku4xgVSarSSn5DvM2HYiAn0YcgKJQzQ8jzZF8jS/PwTH/vVsm+36wZQXa91dW9nHnj17YjQaOXToEJ07d+a7775zVGi64447eOKJJwC4+uqrWbBgAeedd16t15g6darb8pDuyjfu2LHDbanHuti0aRPbt293VIn69NNPCQ8Pp7y8nKFDh3LxxRdjtVq56aabWLVqFZ07dyYvLw+dTsdVV13FN998w1133cXSpUtJSkoiKiqqwbdXo35KKs3856tk/t6fy+3juxLs683Gw/ks3pnJjvQiR5lAd/ybWkhiu0B8vFTqyb2ZxY6oYIAAHy+6RQdyKMc1oMue3tLZlA1VfuYNKfmc3a8dX/9zhA2H8nj10iS3pQm3pxcRGWggOqj2JUb2ALCNh/M5kF3KpN7t6rodJx32AhZmq3S59xqtE01jbgM4l30MDg52Kft46aWX8t133wG4COYVK1YwfPhw+vXrx/Lly9mxY0ed19i+fTtjxoyhX79+fPPNN47jly9fzq233gpUlW+srdRjXQwbNswhlAHeeustkpKSGDFiBEePHmXfvn2sW7eO008/3XGcvd3rr7/eUULy008/1apHeZis4goum7WWdQfzeHVaEvef1ZP/jO3KvZN6AJBXWrvGvGh7Bue98xfPLNgJKFP43sySGsk4gv28KCp3dWOU2DTmQB9Xk3LvDsH4eetZuSeLO2dv5vFftjNva3qN7F12dqQX0adDSJ1pP+0BYD9tSsPiFLXcVnAOlGtrn60tomnMnqYOzbYlmD59OtOmTWPq1KkIIejevTsVFRXcdtttJCcnEx8fz5NPPllvicaGloesC+eyjlarFaOxakB3Lum4cuVKli5dytq1a/H392fcuHF19i8+Pp6YmBiWL1/O+vXrT6hK1snMkdwy/u+7zVwxrCPThjRsOU59rDuYy52zN1NcYeLja4a4JMUIC1ACszZTdlpBOQ/M3YZeJ/huw1FuHdcNs8VKuclCj3auEb4hft4czi1z2ebQmKuZsr31OgZ2DOWHjanoBNx7ZiKzVh9k3pZ0xia6WkoqzRb2ZRYzvkfdFhSdTtAnNph1B5V1p62ZskP8vIkJ9iGzqLJJos01PIumMbcB6ir72LVrV/R6Pc8884xDW7YLucjISEpKShoUhV1beUh35RtrK/WYkJDAxo0bAZg3bx4mk/sAosLCQsLCwvD392f37t2sW7cOgBEjRrBq1SoOHTrk0i6oestXXXUV06ZNQ6+vv8B8W2NnehEXf7CGzUcK+Grd4RNuz2qVvLtiP1d8tI4gHy9+uX1UjUxVYf4q81Veac3v0Wyx8n+zN2OV8PUNwxEI3lm+vyrwq1rEc7CvN0XVAsrsgjnIt6b+cG7/DiRE+PPtTSO4c0J3Jvdpx+Idx6gwuWam2ntMrduty79sx27O9vPW0ymi8euFWzuJMUHEhfkR4td2gtraKprG3AZwLvsYHR3tUvYRlNZ8//33OwRaaGgoN910E3379qVdu3Y1jneHvTxkVFQUw4cPd9R4fvPNN7n55pv55JNP0Ov1vP/++4wcOdJR6lGv1zNw4EA+//xzbrrpJi644AKSkpKYPHmyi5bszOTJk/nggw/o1asXPXr0YMSIEQBERUUxa9Yspk6ditVqJTo6miVLlgBw/vnnc911152SZux1B3O56YtkAn29uGRwHHM3ppJVVEG0bc1qYzCarSzYls6sVQfZfayYc/u358WL+9fQWkFprkG+XuS70ZjfWraP5MP5vDF9ACO7RjB9aDyz1x9xBBl2r7YGOdjPu0akd0mleu8uWviK4R25YnhHx/vzkjrww8ZUVu7JZnLfKv/wdlvBi7oisu3YhXdiuyCPLFFqbTx2Tm/HPdVo5UgptVcjXoMHD5bV2blzZ41tGs3Lhg0b5OjRo0+ojZPxeywqN8pej/8uJ7y6Uqbll8md6YWy04ML5Ox/Dje6rUXbM+Tw55bKTg8ukBNfXSl/2nRUWq3WOs85/eXl8s5vN7lsyywqlwkPLZB3f7fZsS29oEx2f3Sh7PTgAjn6pWU12nljyV7Z6cEF0mS2OLZ9ueaQ7PTgAplVVFFv301mixz09GJ529cbXbY/+vM22fd/i+r9HFJKeTC7RHZ6cIF86Met9R6r0XiAZNkKxvCT4dWmTdlCiMlCiD1CiP1CiIfc7O8ohFghhNgshNgmhDi7JfqpcWK8+OKLXHzxxbzwwgst3ZVmZ/W+HMqMFp6/qB8dQv3o2S6I2FC/OgtDuGPF7ixu/2YTEYEGPpsxlMV3n85FA+PqDJgCZc6urjGn5pcjJZzbv71jW/sQP64YpjTcHjE1tddgP6UV25dIARTXYcqujpdex9n92rN0V6bDBA6wPa2I3u2D6/0coALALhoY6zYDmYZGc9JmBbMQQg+8C0wBegOXCyF6VzvsMeB7KeVA4DLgvebtpYYneOihhzh8+DCjR49u6a40O0t3ZRLq782gjqGASsBxRs9o/t6fU8PfWhvrDuZyy9cb6dk+iNk3j2B8z+gGCTKAMH/vGoI5p7gSoEYFpNvGdcXfoGdAfE1/b7Cv8nsWVVSZWksqzHjpBD5eDRumzh/QgUqzlaU71Xpos8XK7mNFDfIvgwoAe336gEYXidDQ8DRtVjADw4D9UsqDUkojMAe4oNoxErBP30OA9Gbsn4bGCWGxSlbuyWZcYpRLecIJvaIpN1lY24DC9msO5HDjF8nEhfnxxXXDHAKyoYQFGMivFvyVU6IEdVS1dcPRwb6svH8cN5/etUY7wbaAJOclU/Z0nA2dJAzuGEaHEF9+2ZLG0bwyft2SToXJSt9YLQpZ4+SiLQd/xQJHnd6nAsOrHfMksFgIcScQAEx015AQ4mbgZoCOHTu6O0RDo9nZcjSfvFIjE3rFuGwf0SUCf4OeZbsz3db8tVoly3ZnMWvVATak5BMf7sc3N45wZOJqDOH+hhrrmHNKlMYcEVCzvegg9wFpwTZztbPGXFxpJsDQ8CFKpxOcm9SBWasOMublFQB46QSDO2pZrTROLtqyYG4IlwOfSylfFUKMBL4SQvSVUrpk05dSzgJmAQwZMqRxhWA1NJqIZbuy8NIJTq+2dtfXW8/obpEs35WFvEDW0DifXrCTz9ekEBvqx+Pn9mb60Hi3UdcNISzAQLnJQrnRgp9BLVPLKakkxM8bQwNN0OCsMbuashviX3bmxjGd8fXW0yHEly5RgXSPDiQswNCoNjQ0Wpq2LJjTAOcsC3G2bc7cAEwGkFKuFUL4ApFA4yJnNE5aLFbZqpbGFFWY+HJNCreM7epinnbHsl1ZDE0Id7sudWKvGBbvzGRXRjG9qy0V2nwknyGdwphz84h6r1Ef4Tahl19mxM/gB6iyjpGBjROGDsHs7GOuNDd6whAd5Ms9ZyY26hwNjdZGW/YxbwC6CyE6CyEMqOCuedWOOQJMABBC9AJ8gZO++oFz2cfPP/+c9PTGu84/+OADR5rLhpCSkoIQgscee8yxLScnB29vb+644w4A9uzZw7hx4xgwYAC9evXi5ptvBlSmr5CQEAYMGOB4LV26tNF9bizlRgs704sormg9aztX7M5i5uK9JB+uu6zh0bwy9mQWM6FXTVM1wLieSotetiuzxr78MhOxYX4nLJTBOclIlTk7p6SyRuBXfThM2U4+5pJqJR81NE4V2uxTL6U0CyHuAP4A9MCnUsodQoinUevp5gH3Ah8JIe5GBYLNsK23azN8/vnn9O3blw4dOtTYZ7FYas2SdcsttzT6Wp07d+a3337j2WefBeCHH36gT58+jv3//e9/ufvuu7ngAhWD9++/VcU+xowZw4IFCxp9zROhqMKERJJbYiSogUFPR/PKiAg04N8I32djsCfZ2J9VUmd08PLdyqhT3b9sJzrIl86RAey21T52Jr/M6BCoJ0qYvz0tZ9XkJqfEWENLr48Agxc6UVNj7hju75F+amicTLRljRkp5UIpZaKUsquU8jnbtidsQhkp5U4p5SgpZZKUcoCUcnHL9vj4cVf2ce7cuSQnJ3PllVcyYMAAysvLSUhI4MEHH2TQoEH88MMPtZZzdNa6x40bx4MPPsiwYcNITExk9erVbvvg7+9Pr169SE5OBlTRjEsvvdSxPyMjg7i4OMd7ewnKlsJeJKG4wozJYq3naMW0D9Zyw+fJWK1NM3+zC7j9WSV1Hrd0VyZdogIcBe/dER5gqJHH2myxUlxhJtRDtYbtpuw8p+vkFFcS1UiNWacTBFVLy3k8PmYNjbaA9tR7mJfWv8TuvN0ebbNneE8eHPZgrftrK/t4ySWX8M477zBz5kyGDBniOD4iIoJNmzYBkJub67acY3XMZjPr169n4cKFPPXUU7Wami+77DLmzJlDTEwMer2eDh06OEzpd999N2eccQannXYakyZN4rrrriM0NBRQFbIGDBjgaOfHH3+ka9eay2o8hcVqpcxoIcSWCrIhNYUrTBaOFVVwrKiC2RuOcOXwTh7vl11jPpBdu2AurjDxz8E8rj2t7uuH+RtIKyh32VZga99jGrPdx2wzZVeYLBRXmhvtYwZbhakKV1N2Y6KyNTTaCm1aYz5VqKvsozvsxSyg9nKO1Zk6dSoAgwcPJiUlpda2J0+ezJIlS5gzZ47LdQCuu+46du3axbRp01i5ciUjRoygslItrRkzZgxbtmxxvJpSKAOUVFqQSCICffA3eLktxFCdzCJV/MPfoOeFhbtrCD1P4GzKro35WzMwWqyc3a99rccAhAd4OwSmHfsExFMac6gtaMvuY7YvlWqsjxlcC1lYrJIyo0XzMWuckmhPvYepS7NtLTgXj2hoOUcfHzXQ6vV6zGaz22MADAYDgwcP5tVXX2Xnzp3Mm+cab9ehQweuv/56rr/+evr27cv27dtP/AMdByUVJnRC4G/QEx5gIDW/DKu5bnP2sUIlmB87pzfP/raTh3/6ly+uG1pjOdLjv2znWFEFs64e3ODkGHbspuyMwopao5K/Sz5KYkwgA+JD62wrLMBAXpkRKauWTOWXeVZj9tLrCPGryv5VW3KRhhDs6+3wMddW8lFD41RA05jbAHWVfQwKCnJUgnJHbeUcT4R7772Xl156ifBw18QOixYtcpR6PHbsGLm5ucTGtkxe4mKb0NMJQYifNzohKHPKsVxcYaJ6HGCmLdXk0IQwHpzck1V7s/lhY6rLMZuO5PPVusMs2ZnJou3HXPZZrZLSytonNeC6jveAG615z7Fith4t4NIh8fUK/XB/A0azMtnbsWvQnhLMoPzMdoFfWzrOhhDs5+WIyq6r5KOGRltHE8xtAOeyj1OmTHEp4zhjxgxuueUWR/BXdezlHEeNGkXPnj090p8+ffpw7bXX1ti+ePFi+vbtS1JSEmeddRavvPIK7dqpEn12H7P91ZAa0cdLpdmC0Wx1mEn1OkGovzflJguvLd7D2W+upt+Ti/lli+uy90ybxhwd7MvVIzoxvHM4T83bwaGcUkBVanth4S4iA33oFh3IS4t2O4LKrFbJnXM2M/jZJby7Yj/GWrTzgnKjoySiO3P2dxuO4q0XTB0UV2Nfdez+X+elTHaN3FOmbHtb+dVN2SeoMZc6NGatdrDGqYc2HW0jPProozz66KM1tl988cVcfPHFjvfV/cO33nort956a43znnzyScf/zubtyMhItz7mhIQEt2bpGTNmMGPGDABee+01XnvttRrHjBs3jsLCwhrbmwp7NHaQk5k0PMCAVcI7K/YzpFM4Br2OHWlFXDSw6rxjRRX4eesJtuVvfn36AKa8uZo7Z2/ix1tPY+WebDak5PPcRX1pH+LL9Z8nM3v9Ea4ZmcBby/fx27YM+sYG88ofe/hpUyrPXdSvxpKownITo7pFciinlP3VAsAqzRZ+3pzKmb1jHNHQdRHhJJjjbcuO8j3sYwalmWfYJi1V6TiPJ/irysdsrzIV4ON+OZ+GRltG05g12iRWq6S4wkSFyYK1mkm6uMKMQa9zSRnpb/AiOsiH5MfO5PtbRtIxwp+j+WUu5x0rqqBdiK/DhNwh1I9XLunP9rQiXli4m5cW7aZrVADTh8Qzvkc0I7qE8+bSfXyffJQ3lu5j6qBY5t8xms+uG4rRYuW6zzbUqABVWG4iMtCHzpEBNTTmpTuzyC8zcemQeBpCmJulTPllJrx0wqO+27AAg4uPOcjXC1/vxgvUED9vSo0WzBarZsrWOKXRBLNGmyS31MihnFL2ZhazI62IPceKSS8op7jCVGvVIoOXzqGJxoX5kZrvavrPKqogJtjVRDupTzuuGdmJz9ekcDC7lIem9MJLr0MIwSNn9yK31MgDc7cxsGMoz1/UDyEE43tEc/u4bpSbLOQ6mZkrTBYqTFZC/LzpFh1Yw8f8XfJROoT4Mqa7a27s2gj3d13KBCoqO9Tf0OigtDqvE1BVyCK7pPFrmO3Ys38VV5gdVg3NlK1xKqIJZo02SYXJgpdOR3y4P1FBPhi8dA5hbZHSxYztjvgw/xqC+VhRBTHBNasjPXJ2L5LiQzk9MYqJTiky+8eFMn1IPPHhfnx41WAXLdJeySnXZvqFqsCvYJtgPpxXRqVZadSp+WWs3pfNJYPjGpzbuzYfc5gHzdigAskqzVbKjRZyihufjtOOc77skkp1L7TlUhqnItpTr9EmqTBb8PXWuUQfW6ySkkozFSYLQW4KPzgTF+ZHYbmJogoTwb7eSCnJLKqknRvB7Out56dbTwOooYm+eHE/zFaJd7W81BG2BBy5JVVC076GOdTPm2BfLyxWSUpOGT3aBTF7/REALh3aMDM2KA1UrxMOMzN4Nh2nnfAA21rmMiM5JZX0aBd0XO3Ya0EXlZspqVQTEm25lMapiKYxa7Q5pJRUmqw1/Jx6nVoaFRPsi64eU25cmAqWSs1TWnNBmQmj2epWY7a37U6TFULUEMoAkbZaxTlOGrM9K1eInzddo6ois41mK99tOMoZPaId/WoIQgjC/A0uyVMKykweDfwCCHUymeeUGD2jMduDvwxa8JfGqYcmmDVaHLPFWiNA60Qw2drzaUQ94OrEh6sShvYAsGO2rF/tQtwL5sYSbteYnczMhU5LmbpGBSKEEsx/7DhGTomRq0Y2PgVo9exfTaMxq/aOFVY4gteOh2A/e4UpZcr289Z7pAKWhsbJhvbUt0GcC1A0lhkzZrhdQzxjxgz8/f1dkpXcddddCCHIyckBVCGNPn360L9/fwYMGMA///wDqOVQPXr0cKxRvuSSSwBlWs4oLGdXRjHZxZU1rumM2WLF3MBCExUmddzxRAbbcWjMNj+zXTBXD/46XgIMeny8dK7+XyeN2c+gJzbUj/3ZJXy97jDx4X6MbWDQlzNh/gZHVLaUUmnMAZ73MQPsswWrHU/WL6gyZReWm7SSjxqnNNqTr9FgunXrxq+//spVV12F1Wpl+fLljsxda9euZcGCBWzatAkfHx9ycnIwGquEzjfffOMopCGlpLDMSHphBSaLFZ0QlFSacV/AUHEkT2muXWwmXjtmixWLVeLjJITtAVMnojGH+XsTYNCTatOY7clFajNlNxYhBJGBPi6m7EInwQzQLTqQv/fnkFdq5KEpPdE1MOjLmfAAg2PZVZnRgtFibTKNeV+WmrR5wpRdXGGuN0BPQ6OtomnMbQR3ZR93797NsGHDHMekpKQ4Si0+/fTTDB06lL59+3LzzTfXSD/pjssuu4zvvvsOUElHRo0ahZeXGjwzMjKIjIx05NSOjIysUQPaapXklVayN7OEw3ll6HWCrlGBhAcYKDdaau2D1SopNVqodJMtK7O4kv3ZJS7nVpiseOl0J2QGFUIQF+bPUZuPObNICdDoIM8IZlABYNWDv4TAURu6W1QgeaVGDHod0wbXn+nLHc5rjO1/PR2VHeLnjRCwL1NNAI6nshQoK4JO2IO/NI1Z49RFe/I9zLHnn6dyl2fLPvr06km7Rx6pdX9tZR979uyJ0Wjk0KFDdO7cme+++85R8emOO+7giSeeAODqq69mwYIFnHfeeXX2IzExkXnz5pGfn8/s2bO56qqr+P333wGYNGkSTz/9NImJiUycOJHp06czduxYx7lXXHklei8fJJLRY89g5sxXbAO6wGixYi2RVJis+LkJ9imzCW2zRboUZACoNFkclYgCbBpWpdmKr/eJzznVWuYqH3NkoMElKcmJEhFgINtZYy4zEuTj5Qgi62ZLzXl2v3aO5VWNJdxf5bG2WqVTOk7Pasx6nSDUz9uhmR+vxiyEUNm/7GvNNY1Z4xRF05jbAHWVfbz00ksdWq6zYF6xYgXDhw+nX79+LF++vNZyj9WZOnUqc+bM4Z9//mHMmDGO7YGBgWzcuJFZs2YRFRXF9OnT+fzzzx37X3vvE75fvJoNGzfx0btvuCS58LeZoctN7gs8lBrVdgmYLK5atf29Pbeyisi2uJi2j5f4cH/S8sttS6UqPKotg1rLXF1jDnHSZockhBPk68X1ozsf9zXCAgxYrJLiCrOTxuxZwWxvs9yWxex4fcxQVfqxuMLsmGhpaJxqaE++h6lLs20Jpk+fzrRp05g6dSpCCLp3705FRQW33XYbycnJxMfH8+STT1JRUdHg9gYPHsy1116LTuc6r9Pr9YwbN45x48bRr18/vvjiC2bMmGETDCaiAg0OM60zBi8dep2gzGghPKDGbpeKTCaL1aG1SikdRSKKK81EowS1RUp8PaDZxoX5UVxpprDcxLHCCo9FZNuxm7LtVoCCchOhflVCs1t0INv+N+mEsnQ5rzGuKvno+WxaYQEGyCkl0Of40nHaCfbzoqhCmbI1H7PGqYqmMbcB6ir72LVrV/R6Pc8884xDW7YL4cjISEpKShpVyalTp04899xz3HbbbS7b9+zZw759+xzvt2zZQqdOnZBSYjRb8dYLomrROIUQ+Bu8XMoT2rFKZaa2mzVNTpHZFqvEKqVDqFutsirwywMas3Nkdlax+6xfJ0JkgA9Gp7zQheUmR+CXnRNNnWnXjvNKjRQ4Clg0jcYMx+9ftmPXmDUfs8apjPbktwGcyz5GR0e7lH0EpeXef//9HDp0CIDQ0FBuuukm+vbtS7t27WocXx//+c9/amwrKSnhzjvvpKCgAC8vL7p168asWbPILTVilZKH/3szz/orQRcZGcnSpUtdzvcz6CkpMmGxSpdEHeVGVYQi1N9ASaUZo5Ngtv8f6udNbqmRUqO5aqmUhzRmgIM5peSUGD22VMqOc/avIF9vCstNdAj18+g17BHT+aVG8ks9X/Kx6jqqzeP1L9sJ9vXmQHYJJRWaj1nj1EV78tsItZV9BLjvvvu47777XLY9++yzPPvsszWOdfYLg21NaYWpxnY79hKQkZGRrFmzxmWf2WJlz7Fivpu3iM6RAXVqf/7eeiRQbrK4DMh2/7I9vaSzj9lki9IO9TeQV6a0LItVnnBEth17qcRNh/MB3KbjPBHsQjO3tJKEyAAKy2pqzCeKQ2MuM5JfZiTQx8ttJrITvk6AXWM+QcHs50VOSSVmq9Q0Zo1TFs2UrVErZouV1PwyckuNjsCexlBmtGCRkuhg33pNsv62aOxyo2sAWGmlBV8vlQHKW69zCGMAo01I+3jp8DfoKalQGrOPByKyQS0DCvL1YqNNMMd42MdsF2I5Nj+zO1P2ieKsMavKUk1TrcleySoy6MRN2XZfuKYxa5yqaIJZo1aOFVVgtYJAUOhUCKGh2IW5XwP8vV62+sjOfmYpJWWVZgJ81PkGvc7Fx2xPTqK31RcuN1moMFk8Ysa2Exfmz86MIsDzGrOzKbvMaMFslYR6WDD7G/QYvHTklRkpKDc1SUQ2VGnmUYEndo+CnT6/Jpg1TlU0wewhGpKg42SizGgmr9RIRKCBAB89BeWmRn/GCpMFH1vEdUPw99ZT7iSYy01K47Yvm/HWixqC2WCrfWwfxK1SHlfgV22fLT7MD4tV7fN08JfDlF1S6ZKO05MIIdRa5lIVld1UGrPDlH3CGnOVMNYEs8apiiaYPYCvry+5ubltRjhLKUkvKMdLryMm2IdQfwNGs7XR5uxyk6VRS2f8DF4YLVaH8C21lf4LMNgFsw6zVWK1CUqj2Yq3TTv2M+gdFaMaqzFLKcnNzcXXt6bgtUdmG7x0Hl9m5OOlJ8jXi9xSo6OAhacFMyihaY/KbiqN2b52OeYE13q7aMyaj1njFEV78j1AXFwcqampZGdnt3RXPEJppZn8MhPhAd7sLfDCKiVZhRWUZnq51bjsdY6Dfb0cvmSrlKQXVBDi50VZVsOETaXZSnZxJeZcAzqdCjyzWmF/sRrslRZvggIfvPU6MgrK8TXoqchWwqagpJJykxVdoW+DtXQ7vr6+xMXVTHtprzIVE+xzwkuX3BEZ6ENuqZGCcuUqCGmiiOm8UiP5pcYmWcMMkBQXwrtXDGJcj8YX2nAm2Gmde5BP0/RVQ6O1owlmD+Dt7U3nzsefnam1ceMXGziQXcrye8c6hNGbXyaz5WgWax+eUEPoffb3IZ6av5OPrhnCmb1UKYoNKXnc9OVaPpsxlGE9oxt03XKjhYuf/AMpJVapTNePnN2L8b3Uvf3nYC43zV7HVzcMY3CnMKY88Qf3n9WD2wd3A2DZrkx+2ZzGO5f38pgQtWvMnvYv24kIMJBbUklRE5myQfl/j+QVUFRhbpI1zKBM5uf0b3/C7ThPTDSNWeNURXvyNWpwMKeUHjFBLsLtvKQOLN6ZyfpDeYzsGuFy/JajBQCs3pfNmb2VYN6ZrgKmencIbvB1/Qx6bhrThayiCib2jmFM90iXTGH2Nb4ZBRWkh6jiErFO634n9IphQq+6alQ1HrvGHN1UgjnQQEpOWY3KUp4kPMBAmq18ZVNpzJ7CWWO2B/1paJxqaIL5FOatZfsI8PHiBqdczGaLlaN5ZUzq3c7l2Im9YvA36Jm/Lb2GYN7qEMw5jm0704uICDAQ3ci8yQ9N6VnrvnYhvggBaQXlRNuSfcSGeTYhR3Xsgr/JNOZAHzYezm+yAhOgBLPNLe8I0mqtBPtVDUmaKVvjVEUL/mqjrNiTRVZx7fmvTRYrs1YdZM76Iy7b0wrKMVkkXSJdk1b7GfSc2TuGhf9mYHaKjC4oM5KSW0ZsqB+Hcko5aqubvCOjkN4dgj3ql/XW64gO8iG9oJz0AvXZYj2cKas6Qb7ePHJ2T6YNOb6yi/URYQvMyiszotcJAtxU1zpRwp2EcVOZsj2FXWPW64RHKoRpaJyMaE9+GyStoJzrPtvA7d9sckQwV2dbagEllWYO5ZRidEracSinFICEyJrVJCb3aUdBmYnNNg0ZqszYt47rCsCqfdmYLFb2Hiuhd/uGm7EbSvsQPzIKK0grUPWcG6uRHw83n96Vnu08/1lACWarhMM5ZYTaymB6GudI7NZuyvY36B3r0pviXmhonAxogrkNsmBrOgAbUvL5cm2K22P+3p8LgNkqScktdWy3C+bObgTzqO6ReOkEK3ZnObZtPVqIEHDhwFg6hPiyem8OB7JLMFqsjfIvN5TYUD+Hxtwu2NcjqTdbEnud5UM5pU3iXwZXjbmplkt5CiEEwb5e2hpmjVOak3tU03DLvK3pJMWHMq5HFC8t2sOR3LIax/y9P8dRVm/PsWLH9hRb6T53VYKCfb0Z1CmMlXuqloVtOZpP9+hAAn28GNM9ir8P5LAttRCAPk0gmNuH+JJeWE5afnmT+5ebA3v2r0O5pS5reD2JszBuqgQjniTYz1sTzBqnNJpgbmMcyC5hR3oR5yd14PmL+qHXCR78cZuLSbvMaGbTkXwuHhyHTsC+zCrBfCi3rM6CE+N6RLEzo4jMogqklGxNLWRAfCgAYxIjKa4wM3v9EXy9dXSODPT45+sQ6keFycrOjKIm9y83B/Z82UaztenyWNs0Zi+dOCkEXrCvt7ZUSuOURhPMbYz5W9MRAs7t354OoX48ek4v1h7MZc6Go45jNqTkY7JIxveMJiEigL2ZJY59h3JK3PqX7YzvodYk/7knm9T8cvJKjSTZBPPobpEIAZuPFNCjXXCjk3w0hA6hKjq6pNLcJgRzhJOZualM2XaBH+pvOCn8tpcMjuOigbEt3Q0NjRZDE8xtCCkl87amM7xzuCOv82VD4xmWEM6ri/dQUqkqN63Zn4O3XjA0IYzuMYHszVIac6XZQlp+uVv/sp2e7YJoF+zLyr1ZjiCwpLhQQA38/W3/N0XgF+BSr7gtmLJD/Q3Y5y9NJZh9vfUEGPStPvDLzrWnJXDViE4t3Q0NjRZDE8xtiJ0ZRRzMLuX8pCptQwjBI+f0IrfUyId/HgDgr/05DOoYhr/Bi8SYIFJySqkwWTiaV4ZVQudI/1qvIYRgbGIUq/flsDElD19vHT3aBTn2n949EmhcYpHG4CyYO7QBjVmvEw5Ts6crSzkTFmA4KfzLGhoabVwwCyEmCyH2CCH2CyEequWYS4UQO4UQO4QQ3zZ3Hz3JvK3peOkEU/q6JgcZEB/Kuf3b89Hqg+w+VsTOjCJGdVMCtHtMEFYJB7NLOZSjgsQSImrXmAHG94yiuMLMT5vS6NshBG+nyOjJfdvh661jROdwD386RUSAAYOtSEVbMGUDRAQoP3NTBX8B9O0QQp8OIU3WvoaGhudosxEWQgg98C5wJpAKbBBCzJNS7nQ6pjvwMDBKSpkvhGhYUudWiMliZcHWDMZ0j3Sb3emBs3ryx45j3PzlRqSEUd1U9q4eMUrb3ZdVTFZRJeB+qZQzo7qpZVPFlWaHf9lOnw4h7Hp6cpP5MoUQdAjxdSQ1aQs4NOYmXMr0wdWDm6xtDQ0Nz9KWNeZhwH4p5UEppRGYA1xQ7ZibgHellPkAUsosTkKsVsn9P2wlraCcy4d1dHtMxwh/rh6RwJG8MgJ9vBy+4M6RAXjpBHszizmYU0qYv3e9AiLI15vBncIAHBHZzjR1gFH7ED/CAwz4NUGWrJbAvmSqqXzMGhoaJxdtWTDHAked3qfatjmTCCQKIf4WQqwTQkxutt7Vg9UqSc2vuf64OlJKnpi3nV+2pHP/WT2Y1KddrcfeeUY3gny9GNk1wmF+NnjpSIgMYM+xElJySuvVlu1M7BWDEDCwY2iDjvck5/Rvz8WD2k7Urn3JlCaYNTQ0oA2bshuIF9AdGAfEAauEEP2klAXOBwkhbgZuBujY0b1G6mnmb0vnru+28PUNwx3+YFCCeNORfIrKVYT1n3uz+XrdEW4Z25Xbx3ers82wAAO/3D6KoGprRBNjAtmRXkSlycpp3SJqOduVa09LYGjncEdZxOakrUXsRjhM2Zpg1tDQaNuCOQ2Id3ofZ9vmTCrwj5TSBBwSQuxFCeoNzgdJKWcBswCGDBniPvm0h1l/KA8p4cEft/HHXacTYEsM8e6K/cxcvNfl2CuGd+TByT0a1G7XqJpJPxJjgvh9+zGkpEbxitoweOncmrE1Gk/nqAAMXrpmyfutoaHR+mnLgnkD0F0I0RklkC8Drqh2zC/A5cBnQohIlGn7YHN2sja2pRYSG+pHWkE5Ly/azVMX9OWPHceYuXgv5yV1cJRq9PHS0bNd0An5dRNjgpC26UZdyUU0moaz+7ZneOeIVl/5SUNDo3los4JZSmkWQtwB/AHogU+llDuEEE8DyVLKebZ9k4QQOwELcL+UMrfleq2oNFvYfayIG0Z3ocJk4fM1KXSLDuSF33eTFBfCK5f0x9fbc4FPiTFVWnRDfcwankOnE0Rp2rKGhoaNNiuYAaSUC4GF1bY94fS/BO6xvVoNuzOKMVkkSXEhjO0RxbLdmTz+6w5ign2Ydc0QjwplgE4RAXjrBSaLrHcNs4aGRjNitcLmr6D7JAhu39K90Wgm2nJU9knLttQCAPrHh+Jv8GLmJUn0bBfErKuHOFJtehJvvY4ukYHEBPs4fNkaGhqtgMN/wfz/wrfTwFha//EabQJNMLdCtqYWEhFgoEOIEsLDu0Sw6K7TayTz8CQXD47l4kFxTdZ+m2HVTDi0qqV7ceqweyFs+rKle9Fy7P0DdF5wbDv8cqvSoDXaPJpgboX8m1pI/7iQZq0EdPPpXXlgcs+aOw7+CUufarZ+tGoOrIDlz8CfL7d0T04dVs+ERY+AxXRi7ZTmwNzrobD6woxWzp7fofNYOPNp2PkrrHqlpXuk0Qxogrkl2Pw1LLzf7a4yo5l9WcX0s2XmanE2fQl/vQbl+S3dk5bFaoUltvCEI2uhvKBFu3NKYDFD5g4wFkNq8om1tXUObP8RlrXAJPPgSph7g/o8jSFnP+QdgMTJcNqd0P8yWPk8HFjeJN3UaD1ogrm5ydkHC+6BDR+DsWZmr+1pRVglJMWFuJ7z0QTIPdCMHbWRvUf9Td/c/NduTfz7AxzbBkNvAqsZ9i9t6R61fXL2grlC/X+iwmjnL+rvtu8gfcuJtdVYtn0P2+dW9aGh7P1d/e0xGYSA896EgCg1sddo02iCuTmxWuDX28FSCdKqtIFq2AO/+jkL5l3zIS0Zfr2jeX1MVosaHAHSNjXfdVsbpgplwm6fBJNfBP8I5fvTaFoytqq/AdEnJpgLUyF1A4z6P/ALhyWP41i43xxkbFN//3q99utm74G3B1d9ZlDPWHQfCLVlG/T2he5nqUnhiZr2NVo1mmBuTtbPgqP/kDnkAQAWLV3Ec7/t5Ot1h5G2H+y21ELah/gSHeQUfX1kHegNcGSN0rSbi/wUNYmAU1tjXv8hFB6FSc+C3ksNjvsWN9402dZI/gxe7wcFR5qm/WPbwMsPBl8L6ZugLO/42tk1X/0deA2MfVAF7zWXxcNUAdm7ILwLZG6HfUvcH7fjF8jdD7/cBmajch0dXgOJZ7kel3gWVBSqMaGxLHkCvr+m8edpNDuaYG4u8g6qIKruk7gn4wzyZCDFKZv4et0RHvtlOy/+vhspJdtSC+jvrC1brXB0HfSfDt0mwtInlcBsDuxm7LDO7gWzqbx5+tGSlOXB6lfVOtLOp6ttiWdBRQGkrm/RrrUYUqoAuAV3QeGR4xMSDSFjK7TrC93OVBamQ382rG8VRa7bdv4KMX0hshsMuV49z0ueUBahpiZrp3J9jHsEguOU1uyOA8vAN1QJ779eh/3LQFqgxxTX47qOV5P0vYsa35ftP8GeRTW1bavFrVtNo+XQBHNzsfB+0HuTf8bLrD2YR1Fob6Z1yGXn02dx9YhOfLjqIC8u2k1KbpmjJCMA2bvVDLnTaXDuGyB0MO+/njfFVZbUDGjK3q3+Jl0GRWlQnFm1b+t38FJC2186tPpVqCxWUbF2up4BOm8VMducFKZ6/ns3lavnq6FYrfD7A7DiOeh3KQh91XPiTGHaifXVaoVj/yr3Qexg8AlpmDl7x8/wchcVQQ9QlKEmDr1tFV+9DDDxf0pgbvn2+PvXUI7ZzNhxg1UA15E1NScy5QUquG3ojdD3EhV5ve595TKJrVZH2ycIEkY3XjAXHFVWH0tllXvKzpq31G955YtKw9docU4awSyEaP4yRp7krBdg6kcsOqrHKiEwYRBk7kRYTDx1fh8uGhjLh3+qNN0uGvORtepvx5EQGg9nPqU0h32LPdu/766Cby5x3Za9W83y7Zqis9a8+SsVmPP9tZB3qGq71aLWXDanD6+pyE9R7oeBV0F0r6rtvsGQMMpzfmarpco6URsH/4TX+8KehXUf11h+ugne6AeH1zbs+H8+UPdk5B1w0YcQ0bVm3wuOqjbXvVd7O1YrZO5UE0J35B+CyiJo11+5D7qcroRtfc9VymqwmuCHGSpYctd8QFYJZoDeF0LsEDW5qEtTzD/svn8lWQ03q2dsVZOKsM4w6Grl466uNaesVtpxtwkw5WXwDVExJd3PAp2bLH+JU5TZO2d/1ba8g2riVhtH/3HtkzP7l6ngspUvwHsjtMDGVkCrF8xCiNNsuax3294nCSHq+MW3UqISocdkFv6bQacIfyK6DVMDSPZudDrBK5f058zeMRi8dPSPDa0678haCGwHYQnq/cCr1Q93x8+e61vWbji4Qs3anQec7N0Q1UNpLUKn/HwAJdlw+G/oN02ZGOdcobTKtI3w8QT4YBQkf1r3NdM21T4oNyVWK6T83bCJw7JnlEY47pGa+xKnQM4eNSCeKGveVgOi80DrjNUKix8DZO0+yuMh/zDsWqCE01cX1m8BKM+HP1+CLuOVv12nU89HdY05LVkJmj9fqinAUv5WFp/XesL7I+HDMe5dM3ZNs32S+tv1DKXx5druUUkWZO2qeV7aJojurQTN7Mth2xyI6qn6aUcImPQMFGfUPnkoL4D3R8HS/9Xc99VFKhCzOiVZNb/DjG3Qvr+6piEAht+itF3nwM8Dy8EQCHFDISACznlVbe91nvu+2f3Odq05Y5vq6+t94IPRsOJ5KD7mes7hNWAIAm//qmA0UHESaZtg0DVwza8qmcnXF8Pad91fW6NZaPWCGXgdOAvIBZBSbgVOb9EeHSf5pUbWHMhlSt/2CPuAY5u9eul1fHDVYJbfO5YQ57q8R9ZBxxHqhw3KFNfzXJURyVzpmY45hKhUAheUMMjeqwY1Q4D6a9eYdy9QAnnU/8G0z5XGNGucWtJVlK60nCVP1B4UlL4ZPhqv1kd7krK8+jW/bd/B52fXH0SXtkktcTntDvc5iu2D458vw4ZP1Ks+rdcdVos6V1phZy2Tre1zlaDyDVXalafY+Ll6rm5cqoTZnCthy+zaj//rdWX2nvRM1fMY1UtNTpyfxYytakJTUaRcAXb2/gGfn6PWE3ccqaxIZXnwySRlZXEmY6sSEnZLRdcz1N99i2HdByqCedZ4V43XXKkEXvdJcOmXag1w2kalIVen02nQ4xz46w2VfKQ6W+eo9dO7f3OdxOUdVH7g6lonwKKH4LPJVT5ci1kd265/1THDbgLvAHVdOweWK6uU3va773Mh/N/Wmv5lO2Gd1Pe1d5GaDMy+HPzCYML/lIBf9YpaN+3MkXUQP0z52p37nr0LTKVqUtBlHNzyl7Iu/PEILPlf27B8nYScDIIZKeXRapuaIWrD8yzZlYnFKjm7XzsVpWkIrNIMAL1OEBfmZLG3+4U6jnRtqPcFUFmozJsnSmUJbJ2tBi9vfzhkG/gLj4C5vErT6DBQCSsp1XrM8C7qR951PEx5SWk9w2+BOzbA9K/VcfP/r+YPW0pY/Lj6f3c9ZtnDa5WfsaGsegW+OLfunMJbbX7FJf9TGqM7pFQTC/9INflwR3hn6DBI3bvf7lGvT86sXeutjf1L1b32DlBBStUxVcCyp5XmOPpupTEWZTTuGu4wVyp3ROJk6DAArp0P8cNh4X3ug6IKjiiBmHQ5tOtXtT2qh5pU5Dp97oytENMbBlypzN75KcoqM/cGde69e+DSL2DkbXD9IiXEPzvb1feasU0JZS9b1a2wBPXMLX4MFj0IwR3U8+kcgJe5XVmhOgxUgu7sV9Rkpl81F42diU+CqUxp9s5IqSareoPSqqsvYQIoSq0ZZJaxFUqzq0zBufuUu8c+CQfwD4ch16nJSX6KEvT5KVUTDzthCVWTH3ckTlZa8OzLoCwXLvsWxtyj7uf4R1SObfvzXZ6vfOodR6q+HPu3atllqq30fNxQ9dfbFy75TAXJ/f2GWt6pBYY1OyeDYD4qhDgNkEIIbyHEfYAbG1brZ+G/GcSF+dEvNkSZAdv1cz/ztmP3C3Uc4bq9yzjwCXY/kDeW7XOVL2/ErWpgTvlLbbdrf1G2NJ0dBkJZjurvodVKkNsHjmE3wSPpMOVFZWYP66R84QeW10yGsH+p0vqi+6jZem0R5sYyNeh8d1XDlyUd/UdFwGa5CUYC5YM7tFq5A4RQxQHcaQT7Fqs+jntIBdvUxvV/wL171euWv5WGN/uyxmUF2/CJclWMvV8NmNWTyKyfpSZnZz4DXcaqbfbvyM7Gz1XEbWOCuHbNV0JkqE2z8glUPlBjiftENsufU3/PeNR1u/35sJuzpVRCtV2SEhBCD4seVvfF2w8un62uZSe6F9ywGAIiVbxCeYGtja2uAg1U5qvQjjDtC7hhiWr7kJMFwb7WPnaQ+jvkerj/AER2d38PohLVUqzkT1USHzspfyk3xRmPAcI10GrP72obuJ5jKq9ya2y1WR3sv+32ThozwIjblGtozTtVAW3VBXN9JE5W7oK0jXDhe2pyZaf/dPV32/fq79ENgFTjSPv+yhKQf6hqn39klasMlF/7nNdg7EOw5Rt4d3j9k2gNj3IyCOZbgNuBWCANGGB7f1JRWGbi7/05nN2vfVUO7PZJyoRX27KNI2uVVh3T13W7lw/0OFuZlE8k0YCUyqQb3UcJ5c5jIGuHMu3ZB9qoRPXXPtgtf1YNCM7BNPY+OTPkBug0Cv54tMqnZbUoTTS8C1zyidpWWwDVjp/UkqT8FNjVgAmIqaLqOpm1aNnbvgckjLlXRVkfXFmzQILFrPoY0Q0Gz6j7ml4GCIpRr3Z94dKv1ID34w01v9P8w/DPh0rrtO/LT1GTgEHXQN+L1bZd86rOKctTuaK7namEcrv+auKT4hQJn7ZRWSbmXqeikb+8oGFWhg2fqICkLk4CoZp7xUHGNuUCGHErhFQrdBLRTQkZ+0SuKF1N4NonQUis0or3LFRR/Zd9U/N8UEGNl3yiJgp/PKq01LIcJdydGfegMvH2uVAF4HUY6GraT9+sIplD4qu26eupljb2IeWq+f5aFScB6jfhGwrDblaapF0wVxQpV0+vc9V7Z996zl5lOQjtqJYkleer++jlBxHVJgYhsZA0XVkstv0AoZ3Ub6IxxA2BhDEw8SnoO9V1X2hHtW/rbPUbP7JGTRpjB9f8jlM3qM9YXTsXAsY/DDMWqvsz53L4drqy4mk0Oa1eMEspc6SUV0opY6SU0VLKq6SUuS3dr8aydFcmJotkSt92VRvb9Vf+ndpSbdr9Qu4Gl94XKMHVkLWdtZGarAbxoTeoH2KCzXWf8pfSOgPbKd8VqMmBzhv2L1EDSXVtpjo6HZz/thJes8YprWn9LGVSm/A/pSlFdKt92ceGTyCyB0Qmwuo6MibZydiqzJhQ018J6vytc5Q5L7wzDL5ODV6LH3M1P2/5Rg24E5+s8vk1lIRRKnBn/1LlS/3+GvV6fxS82V8tM1r0IPxwrZpI2H28g69Vg2nsYJVows6ih5VZ3r5US6dXkx1nLXHDJ8oMfvXPMPJ2JUR/f7DufmbuVIP1kOvU92QnMhH0PnCsmmDePlcN7KPvrtmWt68S8HYh5QjasmmJo+5SZuUL31fPcm10GKjcBlu+htW22IP6nrGE0WpiYg8iTN+s3AuNKf4SFKNMt9m74OdblJtg9wIVie/tp2IJ0jer7QeWKYvM8FvUfcp2Mtxl7lR/z3hcLUna8Yv6LmL6uP/9jrpLuROOrlPacmML1uj0MGMBjL7L/f7+06t87EfWQfsBYPBXMQE6b/V7KctT5va4IbVfJ2EU3LJaBfulbgCLsXH91DguWr1gFkJ8JoT4tPqrpfvVWH7fnkGHEF8GOJdutA88Tn5mB+UFKpClun/ZTtczVJSl3ZyduVNlDarNjFsdq1X5kAyB0P9Sta3DADXIp6yuisi24+WjBhlQGktDBpKIrnD7eqURrntfBcfEDa3SthMnq0mAXVOxk75ZRYAPvVEN1pn/qiUddWH3lYV1Vr7G6mRsUebJpMvUe/vEQe8Nn56l8icbS1VEa/xwFWB3PAyeAeMfVRpT9h718guDSc/BnZtUSs9d89XStE1fKcuHXYvsfYHqZ36KsiRsmwOj71H+WjsJY5RWXpiqBtbtP6rvr+sZSoCPvktpde4ilkFNUP5+QwmWAVe57tN7q++4usZ8ZJ2ymPiFum8zqmeVxpyxFRBVVh7fYOW/rs3P68zYB9VkbMNHtjb61H185zFKUB79R3132burLDuNodsEOOt5JZC/OE+1OeR6tc8egLVvsfpO/MLUbzKyu2uwX9ZO5ZPuM1Xdj62z1e+6tslFZPeqqOvGmrEbQu8LwMtXTf7SNkIn2zjiZVCT4mPbqkz/dv9ybei91Rrsu3eo37RGk9PqBTOwAPjN9loGBAMtsM7mxHjk7F68fEmSaynHqB5qgMzYUvOE3b/h8Au5w9tXJbfftUBpfR+OUdrelm/q74zZCD/dqAai0XdV+VH13uoHfGi1GnTs/kM79kGvuhm7LvzD4bw34KZlyi99zmtVQr3HFDUDtyeDsLPhExWIljRdJbEIjq09Y5Kd1A0Q0lENcpk7amrYW+eoe+0coRveGa5frK71+Tmq3m3JMeXPPZGSm2MfgNv/qXrNWKCiuyO6KnPw1I+Vm6Isp0oAAPQ6X/3d/DXMv0tpN6ff59p2wmj1N+UvNfibK6r8xKCErd5H3cPqWMww7w5llh55m1qaU532/ZWmZ79/pnI1gNf2HIJ6jnP3K7dKxlYldJz9yA3F2xcueBcQDWsjfoTS5FNWq+tKq9K8j4fht6jYg9x9ajmYXQBF91am8d2/KeHcfZLSVqsvE8vapSYVei+lrR79R8VuVPcvO3PG48qF0W3C8fW5LnyDoec5ajywGF0n+O37q/uVul65IRo6mfH283w/NdzS6gWzlPJHp9c3wKVAHbaX1kmXqEBGd4903aj3VtpQdQ1l6xyYd6cyP8UPr73R3hdAeZ5aB5t0uRpE3KXO/Olm+PYy2PiFMpt/e6nStCY+BWOqD/xjlGZpKnXVmEFpg6PuUubCxhI7WEXiOg9U8cOVz9TZnF2eD//OVWukfUPUDH/kHSrK9GgdKTBTkyF+qPL1Vha5LtWymFSbPabU1Poiu6ngo9COyvrQ63zoWMc99wT9p8FVPyptuMv4qu3hnZWGteoVNUG48N2avvuYvkprO7RKCd+4Ya5R0gERyqKxdY7rOnFTOXx/tRL6Yx9U7gR3tE9SLhL7/UvbpFwEtVluQE3grGYV/JSxzXV5UGOJHwrnvlbzuXSHT6B6rg6trnruj+fZBDURO+c1ZaGZ9Izr9sTJsO8PFf2cOFltj+ql7pF9BUDWzqqlXf0vxREgVpc5PioRLvlU+XCbgqTL1WQFXMeR9gPUZ9k5T40ZdQU4arQIrV4wu6E7EN3SnfAY7ZOUwPntXuWb/Pst+Pk/yrdz7fyaA7Mz3c+C0x9QEaoXvKPWZqZvca1AVXxMaUiHVqko5LcHqf8veE9py9U1w85jqv6vrjG3T1LR1ieiTTqj91aBTXv/qOrz1jlqGYyzFjj4WiWMlj3tPlCuKF0tX4kbCjE2IeVszj6wXGmndjN2dYLbw3ULVVDY5Bc989nqo8s4lRpSV+0naNfoT7uzZjpGUMd3GqXKUOYdUOb+6gy9UUXe/vuDel9eAF9NVRHFZ8+0RUvX8h3aA67sk0V75rm6JojRtuck5S/1PdTnG66PIdcra0lDSBijhPKhVcqyEhRz/Nf1Mih3gPNEB5RlCpR2bjc72yetOXvV/S1Kq3I5hNiy5em8lOBrKbqMV5W5IrqrqHc79olT9q66/csaLUY9IYstjxCiGJCoKagEjgH1RLecRAy/RWXS2vJtVdKL3hfA1I/qFsqgBhLn5SsdBqk2cvdXRVPb14ZeO0+ZovYvU6Yru0m0Ou2SlO/aWFxTMDcFPaao4KI1b6rlJ7vmq3SJzoO7IUBp9/P/qzIxTXrWtY3UZPU3bqitz0IFgPU8R23f8bPSvrvWYTL0C4MJT3j0ox0XQ65TQnP4rbUf0/l05YbwC3fvVrBPUDZ8ojS8ry9WAuSST6qiv2sjprdahnRsG/Q+Xz0/UT2VS6I2IroDomoiUJf51tMkjFaR63v/qPq+PU2n0Sr2wtnP7lgmtqcquYqzEJ78gor7qO833JTovWDqh8pc7Uy7vjiG0/r8yxotQqsXzFLKtm1nie4Fl3+rTI2HVivTdL9p7nPk1ofdv5a+yVUwe/kpQWcP7qkLvZfS1tM2ufdBeppuE5RmsfRJJTwTz3Jvxhx8rYogX/O2GgAHXFG1L3WDCrxp108NhOFOAWBmo1qD2etcNZFp7fiFuY9+dsaeu3zgVcovWx0hYOj1sOBulaLRXAFX/qCSwdSHt5/SBjO2KuvE0fXQ96K6zzH4q7Xrdu36REzZjSV+uIoyticWaQq8feGyryHIKQNceGd13axdVeZsZ8Ec06f+31pz4C6wzBCgIvBz9miCuZXSagWzEKJOZ5GUclNz9aVZ8PaDxEkn1kZUDzWzT9tUZbY9slaZqxqz9GfKS+7TFDYFfmHK34pQpvi6+jn5BTWYzP8/paXF2waV1GQ18bBrJzF9qwTzwZUqS1pjAtZaO9G9VKYnu4B2R79LVXYzpHKJNCZauX2SCsjL2qXuXcfT6j8nqqeKJg/pWLd27WkM/kq4HFlzfBHZDaW6gNN7q+V+2XuUYDYEuV+j3VqJHaTWjVdfY63RKmi1ghl4tY59EmiCNQYnOTq9GlTtgTCVxcok2ZBAGmfCElwzATU1XcY17Di9t8r69NEZ8O00uOIHtcQrfbNrdHO7fsokXlmiArp8Qhp+jZOF+sy2PoEqqM03RKWvbAzt+quIb/tSvLoisu1E9VBBfM1pxrbT9QxlNWk/oHmva7csVBaryZKnYi+agzOfVnEM1WMcNFoFrVYwSykbYHfTqEGHgZD8iYpETk1WUZkNGVhPFvzDVTKNry6CL89XAVvmctcglpi+gC2t4+4Fyo/dkr6+lsK5VGVjsPv3N34GQR1UxHp92H2uJxr4dTycdqdaE9ycmjqo+7vzV7WevD5zf2sjMFq9NFolJ8V0SQjRVwhxqRDiGvurpfvUaokdpHyKWbuUf1no2p4fKbyz0gYjusJy29IW58/YzpbcYt17aulPWzJjNwf2qOTSbNfKZnURO1g9a51GNW3f3OHtWxUZ3pxE9QCkMve3ZPS1Rpuj1WrMdoQQ/wPGAb2BhcAU4C/gyzpOO3VxDgA7skZpj77BLdunpiAwGmb8Bt9drfzhzv69kHhlvt69QPn+miKzUlvGN1jlbs47WPf6ZWeieqiCEc2ttbYkzqsWNMGs4UFOBo35EmACcExKeR2QBIS0bJdaMeFdlF/x6AZlym7owHoy4huiloH9Z5WrViec0jn2mOw+clmjbuyR1Y1xg5xKQhkgvKtaWgbH7zbQ0HDDySCYK6SUVsAshAgGsoD4es45dRFCac07fla1Zju1YcFsx12RALs5WzNjHx89z1Xr4lvDkp/WipdBuVMCol0TeGhonCCt1pQthHgXmA2sF0KEAh8BG1F5ste2YNdaPx0GqmVCoPIJn4r0PEclGek2saV7cnLSf5p6adRNv2k1i7BoaJwgrVYwA3uBV4AOQClKSJ8JBEsp3ZRj0nBgzxcclqDSTZ6KdBnX9pZIabQ+xj7Q0j3QaIO0WlO2lPJNKeVI4HQgF/gUWARcJITQVsXXhT3RQlv2L2toaGi0UVqtYLYjpTwspXxJSjkQuBy4EGhg0eFTlOBYldZx2E0t3RMNDQ0NjUbSmk3ZAAghvFBLpC5DRWevBJ5swS61foSAiU+2dC80NDQ0NI6DViuYhRBnojTks4H1wBzgZillaYt2TENDQ0NDowlptYIZeBj4FrhXSpnf0p3R0NDQ0NBoDlqtYJZSaumaNDQ0NDROOVp98JeGhoaGhsapRJsWzEKIyUKIPUKI/UKIh+o47mIhhBRCDKntGA0NjeahYu9eKvfvb+luaGi0GK3WlH2iCCH0wLuopCSpwAYhxDwp5c5qxwUB/wf80/y91NDQqE76Qw+h8/cn4euvW7orGhotQlvWmIcB+6WUB6WURlRUt7vEyc8ALwEVzdk5DQ2NmliNRir37sN0+EhLd0VDo8Voy4I5Fjjq9D7Vts2BEGIQEC+l/K2uhoQQNwshkoUQydnZ2Z7vqYaGBgCV+/aB2Yw5OxtrhTZX1jg1acuCuU6EEDrgNeDe+o6VUs6SUg6RUg6Jiopq+s5paHiYgp9+pmjRHy3djXqp3LXL8b8pLa0Fe6LhjLWyEnNOTkt345ShLQvmNFzLQ8bZttkJAvoCK4UQKcAIYJ4WAKbR1pBGI5nPP0/GI4+0+sG1YqeTYE5NbcGeaDhTtm4d+0aPoWzTppbuyilBWxbMG4DuQojOQggDKqXnPPtOKWWhlDJSSpkgpUwA1gHnSymTW6a7GhpNQ9mmTVhLSrCWlZH9zjst3Z06qdi9G+9OHQEwHtUEc2uhdM0ahMGAb+/eLd2VU4I2K5illGbgDuAPYBfwvZRyhxDiaSHE+S3bOw2N5qNkxUqEwUDIxVMp+GFuq12KJK1WKnfvJnD0GISPj6YxtyJK16zBf8hgdL6+Ld2VU4I2K5gBpJQLpZSJUsquUsrnbNuekFLOc3PsOE1b1mhrSCkpXrkC/xHDib7vPnR+fmTNfLWlu+UW4+HDWMvK8O3dG++4OExpmmBuDZgys6jct5+A005r6a6cMrRpwayhcapjPJSC6fARAseNwyssjMhb/kPJypWUrlvX0l2rgT3wy7dXT7zjYjGmasFfrYHStWsANMHcjLTZBCMaGicLpsxMCn/6iYj//Aeh8+xcuWTFCgCCxo0DIOzqq8n79luy33mHgBEjPHqtE6Vi1y7w9sanWzcMsXGUb9yElBIhRLNcXxqNHL52BuHXX0fwmWc2yzWbmqyZMynfug2fxER8EhPRBQZgSkvHlJqKISGBiOuvq7eN0jVr0IeH49OzZzP0WAM0wayh0eIUzJ1LztvvEDDmdPz69vFo2yUrV+LTowfeHToAoPPxIWzaNLLffAtTZibeMTEevd6JULFzFz7duiEMBrzj41XAWmEh+tDQZrl+6dq1lG/eTMmyTs0imKXZTPmWLfgPaZqFIIXzF5D78ScYOnemYscOrGVljn3CYEBarYReein6wIDa+yglpWvXEjBypMcnjRq1o91pDY0WpmL7DgDKt231aLuWwkLKNm0i0KYt2wk66ywAipcs9ej1TgQpJRW7duHbqxcA3nEqF1BzmrOLfl8EqMjwhpL78cdkv/vucV0v7+uvOXzV1ZT/u/24zq8L49GjHHvySfwGDaLL/HkkJm+g65LFdJ73Kz02JhM/60MwmylL3uBynqWoiKLFi5FSAlC5dx+W7BzNjN3MaIJZQ6OFqdiuBuaKbf96tN2S1X+BxULQ+HEu2326dMGnezeK//BcwhFpsVDw449YjcbjOt+clYUlL88hmA1xcQCYUo/WdZrHsBqNFC9bBjodlQcOIBvwOUr+/JOsma+S8/Y7lG9t3KRKSknB3LmqndWrjqvPtbZtMpF2332g0xH7yssILy+ETochPh7fxER0AQH4DRyI8PGhbK1rrEH2W2+T9t//I++LLwAo/ftvAAJGaYK5OdEEs4ZGC2LKzMKcnQ1CUL5tm0fbLlm5En14OL79+tXYF3TmJMo2bvRYwpGSP1eR8ehjFC9ZclznV+xUtWV8eyk/prdDMDdPZHbp339jLS4m5PzzwWSi8sCBOo835+WR/uhj+HTvhj4ykswXX3JomQ2hYts2jPsPgF5P6eq/TrT7LmS/9x4VW7fR/pmn8Y6NdXuMzscHv0EDKV271rFNWq3q+9PryXr5FUrXrKF0zRoMXbrg3a6dR/uoUTeaYNbQaEEqdihtOWDMaIwHD2IpKnLsM+fmknbPvZgys1zOsVZWkvHUU1QePFhn26Xr1hEwehRCr6+xL+iss8BqpXjpMg98ChUgBFC5Z+9xnV9pMx/bA4z0QUHoQ0IwNpNgLl60CF1ICOHXqWCoit17aj1WSknGE09gLSykw8yZRP3ffynfvLlRFoiCuT8i/PwIu/IKyrduxVJYeMKfAZT7Iu/Tzwg+7zyCJ0+u89iAESOp3LsXc24uABX//os5M5N2jz2KT9eupN59D2XJyZoZuwXQBLOGRgtSsX076HSETZ9e9d5G4S+/UrRwITnVfJgF331Pwew55HzwQa3tmnNysOTk4NfHfTCZT2J3DJ06UbzYM+bsKsFcu0Cri4qdu/Du1BF9YKBjm3dcHKZm8DFbKyspXracoIkT8OnWFeHrS+XuXW6PlWYzeZ9/QcnSZUTdfTe+PXoQOnUqPomJZM18FavRiCkri6xXX+XYc8+71aKtZWUULVxI8OTJSnharZSu9czytYKff0ZWVhJxw/X1Hhtw2kgAx9K5osWLwdub4HPOIe5dlSFOVlRogrkF0ASzhkYzUfTHYtIeeMBlsC7fvh2fbt3wHzpUvXcyZ9vNwgU//eTQHK3l5eTMmgVCUPzH4lo1rcq9SnP16dHD7X4hBEFnnUXpP+sx5+ef0OcyHTuG8eBB8PKiYl/jNWYpJeXbttWYRHjHx2M6WreP2ZyfT/Zbb5N6993HXY2q9O+/sZaUEDx5CkKvx6dHIhW7XAPATJmZZL35JvvPmEDWSy8RcNpphM+4FgCh1xPz0IOYUlM5cvU1HJgwkdyPPib/q68o/aummbpo0R9YS0sJvXgqfv37owsKouSv1cfVd2ek1UrB7Dn4DRqEbwOWNvn27o0uOJjStWtVIpolSwkYMQJ9cDCGjh2Je/NNAk4fQ8CI4SfcN43GoQlmDY1mQFqtZL/2GkXz5lNhCxSSUlKxYye+ffuqwbBLF8q3KsFsysykfMsWwq64HKHTkfPe+wDkfzsbS04OMY88gqyspHD+ArfXq7CZlH0SE2vtU9BZk8BioWT58hP6bKVrlJ8yePJkzOkZLub4hmA8eBBzZib+1dZVG+JiMaWnI63WGueYsrI49tzz7B9/BjnvvUfx74vInTXL9Zj0dDJferlegV30+yL0ISEOAeTbsxcVu3c7JlDSYuHwVVeT+8GH+PTsQdw7bxP/4Qcuy4cCTjuNwAkTqNi9m5BLLqbLbwvw7tCB7LffqaE1F/z0I4aEBPwGD0Z4eREwciSlq/9qlI/aHaVr1mI8fJiwyy9v0PFCr8d/2FDK1q6jcs8eTEeOEHTmxKrPNGI4HWfNQufvf0L90mg8mmDW0GgGytatw3j4MAAFv/4KgPnYMSy5ufja1i779etH+b//OrQXgLCrriL0sukU/vorFTt3kvvRRwSMGkX41Vfh26cPBT/84HZAr9yzB6+oKLzCw2vtk2/v3njHxp5wOcjSNWvQR0QQfO456tr79jn2SSkp/PVXjHVovo7I39NGuWz3jotDmkyYs6p87NJsJu/LLzk45WzyZ88meMoUuvy2gODzziPno48dfndrWRlHb7udvM8+o2S1qzYqpaR4xQpyPviA9IcepnjJEgLPnIjw9gZUAJq1qAhzRgYAZckbMR09SoeXXqTjrFkETaw61pm411+j+99/0/5//8Ona1cibr2Fim3bKPnzT8cxlYcOUZ68kZCLpzoSpwSMGY05M9Plvh0P+bNnow8PVxOuBhIwYiSmtDRyP/0UdDqCJk6s/ySNJkcTzBonHUW//07WzJnHbbpsCfK+/RZ9WBhBZ55J0cLfsRqNlNv8yX59+wLgm9QfS04O5vR0ipcswdC1Kz5duhB5000Ib2+OXHc9loICov7vvwCETptG5Z49VPxbc5lVxd49tZqx7QghCD7vXEr/+qtOwVkX0mp1JKDwtV2vwsnPbNy/n/QHHyLliitqLZ5R8vffGBISMMS5RhB7x6mqrfbI7Io9ezl06aVkPv8CfgMH0vW3BXR44Xl8unYl5sEH0Pn5cezJp5BWKxmPPUblnj0Ib2/KnCKPAcq3bCH11tvIfuNNSteuxa9/f8Kvvtqx337f7OuZixYsQPj7E1RP0hFhMLgk6wi98EK84+LIsWnNxtQ0Um+/A+HjQ8gFFziOCxw9GoDSv/6us32g1uVopvR0SlasIPSSS9AZDPW2YydgpLJSFM2bj/+QIXVO5DSaD00wa5xUSKORY889T+7Hn3D4iitbNJ9y8fLlZL/3HgVz51KyahUmm4ZVHVNGBiXL1aAZeumlWAsLKVmxUiUW8fJyCAK//kmq3T//pGzDBoImKUHgFRVF2BVXYCksJHD8ePz69wcg+NxzEH5+FPzwg8v1pNmMcd/+Os3YdsIuvwL0evK//vq47kHlvn1YcnMJOO00vNq1Qxcc7PBvQ1VQGGYLh6+51mFit2M1Gilbv4GAUa7aMuAQ1MajqZjS0zlyww2Ys7OJfeN14j+ahaFTJ8exXpGRRN9zD2Xr13P0xpsoWvg7UXffTcBpp1H69xqXdkuWLwcvL7qv+Zvuf66k05dfOCYVAL6JiSAEFbt2YTUaKfrjD4ImTkDn59eoeyO8vYm89VYqduwg5/33SbnsMsw5OXT8+CO8o6Mdx3m3b4+hW1dK/1qNNJsp+mMx6Q8+WGOyVHnwEPtGjyHvyy9rXCv/++9BSsKmX9qoPhq6dMErKgqg3omHRvOhCWaNk4qiJUuw5OQQfsP1GI8eJeXiiyn5u35Nw9NIKcl47HFy3nqbjMce5+jN/2H/+DM4eN55ZL78CuU7djiOzf/uO5CS0OnTCThtJF5RUco0vX07Pond0fn4AOCb2B1hMJD7/gdgtRI8qcokGXHTjQSecQbR99/n2KYPDCR4yhQKf1uIpaTUsd2YkoI0mfDtUb9g9o6JJnjKFArm/oilpKTR98Eu9AJGnYYQAp/E7lTurTLJlqxZgyEhgU7ffIPw8uLItddS4SS4yzdtRpaXuxXMXh06gBBU7t3L0VtvQ1ZW0unzzwmePNlt/uzQS6fhl5RE6Zo1BJ89hYibbiTgtJEYDx/GlFY1gStesaJO7VAXEIChUycqd++mdPVqrEVFhJx3XqPvDUDIBefj3bEjOW+9jc5gIGH2t45AP2cCR4+hdEMy+ydNIu3//o/CX+eRds+9SJMJUJaJjMcfx1pURM5772Mtrfq+LUVFFHz3PYHjxtW6brk2hBCO6Gz7RFCj5dEEs0arQhqNdQbB5H87G++OHYm+9146z/0Br5gYUm+/o8k0Z7Vm9X+UrvvHZbs5MxNLXh7RDz1It2VL6fTtN0Q/8AD6yEjyvvqKlEumkfHUU5hzcyn4YS6B48ZhiItF6PUEn38eJatWUb5li0sksr0QvTk7G++4OJeiAV5hYcS/9y4+Xbq49CN02iXIsjKKfl/o2FZfRHZ1wq+5BmtpKYU//ljVxoED5H76GaXr/sFaXl7ruaVr1mDo2tWRc9s3MZHKvXuRUlZpw6edhk+XznT66kvw8iLj8ccdAV2lf/8NXl74DxtWo22dwYBXu3bkffEFlfv3E/v66/h07VprX4ROR4eXXyLixhto/+yzNqGjlvrYlwQZjx7FuP9AjWxo1fHp1ZOKXbspXLAAfXj4cRf8EF5etHviCYImTaLTnNm19j9o0iQwmzHExRP3ztvEvvYqFf/+S/Y7aqlc/rezKd+4kbArr8RSUED+nDmOc3Peex9LQQGRd9x+XH2MvPVWOrzycqvKm36qowlmjVaDOT+fA2efw9EbbnTrP67Ys0cNTpddplIMdupE/IcfgE5H5vPPN0mfjIcOUfD99470iY6+2DJV+SUl4R0bi/+gQURcfx2dPvuMxDV/E37NNRR89z37J56JJTeXsCuqImVDLrgAzGaspaX49unr0q5fkjJTB02a1KCqSn4DBmDo3JmiefOr+rZnL3h5YagmxGtto19f/AYNIu+rr5EWC2XJyaRcdjlZL7/MkRkz2DNsOClXXUXh/AUODQ7U+t+y5GQCRo50bPNJ7IG1pARzejrlm7fYtGElHA2dOhF9zz1UbN1G0cLfASWY/QcMqLWQgiE2FqxWYh55mMDRNbXqGsd36qTqTtsiiQ3duqGPinREjpesWAlA4Pjxdbbj27MXptRUSpYtVxq6m2CvhhI4ehRxb73pYr6ujv+ggfTYmEynL78gaOJEgs8+m5CLp5I7axYFP/9C1muvETBmDDGPPUrAaaeR++lnWMvLqTx4kLyvvyb0kotrXbNeH4aEhOO2CGg0DZpg1mgVSCk59sQTmI4do3TtWlL/7/9q5CvO/3Y2wseH0KkXObZ5t29P1O23UbJ8OcXLV7gcb8rMJH/2bI7ceBMHzpqMKcs1g1ZDKPtHacrVcyFX7NgJOp2Lb9KOPiiImIcfIuGH7/Hp1g2f3r1cTLW+iYn49u6t/u9bTTDbKg0FT6k7a5MdewBXWXKyw8dduWcPPp07NyoIKPzaazGlppL53PMcueFGvCIj6fzrr8R/+AERM2Zgyckl/f772T9hIpkvvEDqnXdyYPKUGgko7H7tij17lX9Zr3fRhkMuvADf3r3JevVVTOnpVOzcSUAdAjfsmquJvv9+wq+8ssGfxRkhhFqOtHYt0mqlZOUKDF27YujYsc7zfHuq71UajQSfe+5xXbuxVF+W1O6RRzB07EjGww8jgPZPPYkQgsjbb8OSm0vBDz+Q+eKL6Hx9ibrrrmbpo0bzoAlmjVZBwfc/ULxkKdH33EO7J5+k9M9VpN17H9JsBsBSXEzh/PkEn3tOjTKA4ddcg6FbVzKfew5rebmKfr37bvaPHcexp57GeOQIxqNHyf+q8QFOpf+sB8B09KgjdSEojdnQpXOdazz9+vSh8w/f0/nHH2uUzAu/9hoMnTvjm9jdZXvQxIl0Wfgbfm7yW9dGyDnngJQOLbRi754GBX65XHfCGXh36ED+t9/ik5hIp2+/wbdHIoFjxxJ97z10Wfgb8R9+gE+3buR9+RWV+/bjP3AgMQ8/RODpYxzt+Ng+T+VeJZj9kpLQBwU59gudjuiHHsSckUHqf/8PwK1/2U7wpEkNymJVFwEjT8OSl0f5pk2Ubkiu14wN4NPTVuUqNha/gQNO6PrHiy4ggA4zZ6ILDibmkYcdpTv9Bw/Gf9gwst54k9JVq4m8/Xa8IiJapI8aTYNWj1mjxancv5/MF15wZFMSOh2ysoLM51/g4Lnn4du3L9JsRpaVqSjiaghvb9o98QRHrrmWIzfepJYP6XRE/Oc/hJx3LoauXUm7627yv/uOyFv+gy6g9vqzzkgpKVu/Hu+OHTEdOUL51m0EnaFMoBU7d+I/vKZf1B3uTNIhF1zgsmTG+djqfuT6MHTqhG///hQuWEDotEswp2fgc1nD/MuO63p5EfPoI5SsXEn0gw/VMC0LnY7AsWMJHDsWabG4zb8NKiDNOzaWsvXrqdi+ncjba/o9A4YNI+jMiRQvWYo+JMRhPWgq7MFNWa/MBJOpRhlMd3hFR+Hbrx/BZ5/dIJdCU+HXry+Ja/5GeLkO1ZG33caRGTMwJCQQfmXN34TGyY2mMWu0KNJkIu1+tQa1/YsvODTL8Guuof3zz2Po1ImyjRspXrQIvyGD8evr3o8WMGwYIRdcQPnGjQRNPouui34n+u678OnWDSEEEddfh7WoiIIff3KcYyksJPu992pNSVm5bx+WvDzCr70GvLwc5mxzTg7mzMwmFyiNIeTcc6nctctRU7ghEdnVCZowgfbPPFOrv9dObULZjk+PHsqMLWWteZaj77sPvL1VNHc97Z0o3jExGLp2pXzrVvQhIfgNGFDvOUIIOv/wPRHXzWjSvjWE6kIZwH/4MGIefojYN15HNMJloXFyoGnMGi1K3jffULlrF7FugmNCp17k8CdbiooQtmVFtdH+maeJvPMORy1fZ/ySkvAbPJi8L74g7IrLkRYLR2+7nfKNG6nYsZO4d96uoRmV2czYgWPHUfjTzw7BXLFLFThoTYI5eMpkMl980VHwonpE9vwD8wkyBDEuflyT98UnsTsly5ejCwzEr797k7yhUyc6ffkF3u3b19j3yoZX8NJ5cffguz3Wp4CRIzEeOEDA2NPdCrqTDSEE4dde29Ld0GgiNI1Zo8UwZWWR8/Y7BJw+pt7kBvrgYMd639oQBoNboWwn4vrrMKWlUbToD9Lvu5/yjRsJnDiBkmXLKPz5lxrHl63/B+/YWAxxsfglJVGxbRvSYlGBX4Bvr171f8hmwisqioARIzBnZaELCcGr2tKXWdtm8dXOr5qlL742/7b/8OF1CkH/gQPd1vldm7GW9RnrPdone2R40BlneLRdDY2mQBPMzciJJqlvaaSULoksTpSsV2YijUbaPfpos/jxAsePx9CpExmPPkrxkiXEPPwQcW++if+QIWQ+/7xLEgpptVK2fgP+w1VhA78BSVjLyqjcv5+KnTvx7tjRJaipNWCPHvZNTKxxP7PLs8ktz3V3msexWxICx4yp50j3FFYUUmj0TH1iO4HjxhH/0UdqvbCGRitHE8zNxJub3uSBVQ+0aB+k1Ur6Y4+R9cYbbiv21Efuh7PYO3w4afc/4JIP+Xgo27CBovnzCb/xBpfUik2J0OkIv+46ZGUl4dddR/i11yL0etq/+AJYraQ/8qjjvlTu2YOlsJAAW4CXX5JKl1m+ZSsVO3e2KjO2naBJZyL8/PCttp61zFRGqamU3IrmEcyGhAQSfviB0GmXNPpcKSUFlQUUVnpWMAshCBwzukZ0vIZGa0R7SpsJg9Tzz7+/szvPtc5r4a+/knLVVY6EFU1J/jffUjj3R3I/+JCMxx5HWiwNPtdaWkruZ5/hHRdL8bJlHLrgQo5cfz25H39MWXJyjYQg1spK8r7+hpSrriLvy68cy55ABVVl/O9JvDt0IPLmmz32+RpC6PRLSfjhe5fUloa4OGIeeZiyf/4h4+GHsVZUUGpbv2zXmL07dkQfFkbJ6lWYUlNbpWDWBwbS+ccfa2SAsmvKBZUFmKwmd6d6HL9+fY8rqKvcXI7RaqTYWIxVNn7yqKHRFjj5oyBOEiZ//C9dd0g+TnyPmZPeAlR077FnnsVaUsKh6ZcRdeedRNxwfZNEqVYePEjWzJkEjh2Lb9++5Lz7LtayMmJffqlBUZ35P/yAtbCQjh9+gCEhgfw5cyj8+ReyZr6qDvDywrdnT/wGDMArMoL8b2djzsrCq317Mp9/noK5c4n6v/9SvGIFhT/9jC4ggNg3Xm90YYATRQjhdo1wyMUXY8rMJOftd6jYtw+djy/enTo6fKBCCPySkhyZozwpmM1WM0eKjtAltHHLpNzh06VzjW05FTmO//PK84gJaL2pF+2askRSbCwmxCekhXukodH8aBpzMxF12RXEZ1lp99VS9uarXMZZr76GtbKSTrO/JWjCBLJfe43DV11N+ZYtJ3w9a2VlVaF3k4n0Bx5US5KefYaoO+8g+oEHKF60iJSrr3bkEQa1pjj9wYdIu+cerJWV6nyjkbzPv8B/6FD8BgxAHxpK5C230PWPRXRf8zdx771HxPXXowsIoOCnn8h+400MHTvS8fPP6LZ8GbFvv4WlpJjU2++g8Nd5hF99FV0X/0FgHYklmhshBFG3307c++9hOnKU8s2bCRg23OUYvwFJYLMy+Pb2XODXgoMLmDpvKtll2R5r0xnndp2FdGukoLLA8X9RZVHLdURDowXRNOZmInDsWAIuu4Rz5sxlwbfPcstpd1P4889E3HQjPkn9SX/gMnbHF9JndjLll11O4NixRN55Z63rdkH544yHUjBnZWLOycWcnU3l7l2Ub9+B8eBBx5pN4e1NxfbtxL7xuqPEW8T11+EVFUXWzJkcmXEd/sOGoQ8JoXjJEoSfH7K8HGtFJXFvvkHhbwsxHztG+2eertEHr/Bwgs4Y70i8Ic1mzLm5eEVHOwKQgs88k8DRoylethy/pP4Y4uOb4A57hqDx4+k89wcyZ84kdPp0l312P7NX+/YerVt7oOAAFmkhpSiFKP8oj7VrJ6e8Shg3VwDY8eIsmAuNhcTTep8VDY2mQhPMzUjcQ4+y8a9ljPh0A4d/fwSiIvhqWAXzf5hAbkUufu380N2q4/pdnRi7ahMpl1yCT/duBJ05icCxp4OUWIpLMGdlUbb+H0rWrMGS7aoB6SMj8evbl+CzJmHKzKR88xaMBw8SfP55BE92zb8cct65BE06k4Lvvidn1ixkZSURt95C+DXXULRwIZnPPEvGY49Rvn0HPj17EmAr6F4XwsvLbZUanZ8fIeeec2I30IbJYsIszfh5NY0Z3JCQQPw779TY7tuvPwjh8WVSaSVpjr9DqVkS8EQ5aQWzhwPANDROFjTB3IzofH1JeO0tMi6/Gvan8MYFOtanzGVc3Dgmd57MmNgx/JHyB094PUHh2RdzQ1o3ihcvJuf998l57z2XtvRhYQScdhoBI0fgHd8Rr8gI9OHh6ENDayyVsZSU1OrL1fn4EH7N1YRdfhlI6fA3h195JdaiIrLfVP7wDjNntmhqQmee++c59ubv5dtzvm3W6+oDA4j6750OzdlTpBanuvz1NDnlOQQbgikyFjVbZPbxoglmDQ1NMDc7Uf2HsO6/55OZ/BcjrrqB57tdQIRfVQL6i7pfxIGCA3yx8wuih9zHoMn3k5+Rgty2k3bhnYht1x3v0HAMCZ0avPRDHxhY7zHuytpF3HIL0mSibPNmgief1fAP2cQkZyZzuOgw+RX5hPmGNeu1I2+91eNt2gWyXXP2NNnl2cQFxXG46PBJpTEXGTUfs8apiSaYW4Dz/vMS/Kf2/XcPvpuDhQeZmTzTdUc2+OX70TeyLyNLRjI6djQ9w3sikWSVZXGs9Bgx/jG0C2jXaO3WHijmfJ4Qgqj//rdR7TQ1paZSDhcdBmBL1hbGd6y7rm5rp7CykGJTMdB0GnNueS7R/tGUGEtavWAurCzEz8uPcnO5pjFrnLJogrkVotfpeXXcq/yZ+id+ej/CfcMx6A3szd/L9pztbM7azFub3+KtzW8R4hNCuUmt/bQT4hNCz/CedAnpQsegjnQM7ohBb8BoMVJpqWRg9EAi/SIdx1usFu5cfic55Tl8cOYHhPt6LrDJ0+zJq0pssjl780kvmFNLlDAO8QlpUo25d0RvioxFJ0VUdoRvBLkVuR7P/qWhcbKgCeZWip+XH5MTXIO1eoT34Lyu5wHKb/h32t9szNxIiE8I8UHxtAtoR0ZJBrvydrE7bzfzDsyj1FQzhWaMfwxfn/017QLUGt0Ptn3A6rTVeAkvbl58M5+c9UmD1o9apRWdcDWn/5v9L7cvu52Pz/qYxLDGVziaf2A+8UHxDIge4Hb/rjxVQCI2MJbNmZsb3X5rI61YCeNh7Yax5PASKswV+Hr5eqx9i9VCXkUeEX4RFBmLOFBwwGNtNwUFlQWE+oRilmZNY9Y4ZdEE80lKpF8kF3S7gAu61azpa0dKSX5lPkeKjmC2mvHR+1BoLOT+P+/n5iU388XkL9iVt4sPt37I+V3P55zO53DH8ju4ecnNfDTpI4INwbW2++6Wd5m7dy5fnf0V8UFVS1re2fIO+ZX5/Lr/V+4fen+jPlOxsZgn1jxBpF8k8y6c5zbqenfebsJ8wpjUaRJf7frK44KsOlJKZibPZGKniQyMHujx9u0as10wp5ekeyTRiJ38ynys0kqUXxSFlYX8U/6Px9puCgorCgnxDcFkNWnrmDVOWbQEI20YIQThvuEMiB7AkHZD6BfVj9Gxo3n7jLdJL0nnlqW38PDqh+ka2pVHhz/KabGn8cb4N9ibv5drFl7DssPLaqRFlFLyzpZ3+HDbh+RW5PJq8quOfVuzt7ImfQ1+Xn4sSlnU6JSKq1NXY7aaOVZ6rNZKSLvzdtMzvCeDYgZhtprZkbuj8TemEezN38uXO7/kix1fNEn7acVpDtcDVAlqT2FfKhXpF0mkXyRFxiJMlqZJy+kJH7ldYw7xCdGCvzROWTTBfAoypN0QXjn9Ffbk7aHcXM6rY1/F39sfgNPjTuftM97GZDVx18q7uHjexXy/53u2ZG0hryKP97a+x6xts5jafSp3DryTZUeWsTZ9LQAfbP2AMJ8wHhj6AFllWWzOapypedmRZUT6RTI+fjwf//txjUxYJouJ/QX76RnRkwFRAwAafY3GsvzocgDWpK/BaDHWc3TjSS1JJS4wjtjAWPXewwFg9nsY6RfpiP5viiVT+/L3MeWnKSdcrtFZMGumbI1TFU0wn6KM7zieD878gFlnzqphOh0dO5pfL/yVF8a8gFVaeWbdM1z9+9WM/W4sH2z9gAu7Xcj/Rv6Pa/tcS3xQPC+tf4ktWVv4K+0vrulzDWd3PhtfvS+/H/q9wf2ptFTyV9pfjI8fz31D7sNkNfHOFtckH/sL9mO2mukV3otQ31C6hHRpcsG84sgKR5Rw8rFkj7efVpJGbGAskX6R+Oh9PB4A5qIx+6qAv6aIzN5fsB+gRpGWxmCymigxlRDiE0KwIVgL/tI4ZWnTglkIMVkIsUcIsV8I8ZCb/fcIIXYKIbYJIZYJIZqn/mArYUT7EbUGWXnpvDi3y7n8fMHPzL9wPu9OeJcHhj7A4yMe56nTnkIndPjofbh/yP0cKDzAHcvvIMQnhMt7Xo6/tz9j48ey5PASzFaz2/arsy59HWXmMiZ0nEDH4I5c0fMKft73s8tAb/+/V7jKvDUweiCbszY3WRWi9JJ0duXt4vq+1+Or92VV2iqPtm+xWkgrSSMuKA4hBLGBsU0qmJtSY7b3+0jxkeNuw64hh/qEEuwTTGFl4Ulfw1xD43hos4JZCKEH3gWmAL2By4UQ1UsCbQaGSCn7A3OBl5u3l60fndCREJLA6XGnc3Xvq7m0x6Uukdjj4scxqsMoCisLuab3NQR4BwAwJWEKeRV5DTZtLjuyjCDvIIa1U/WP/5P0H0J8Qngt+TXHMbvzduPv5U/H4I4ADIoZRLGx2BFp/OWOL7lz2Z0eK224/IgyY0/pPIVh7Yex8uhKjwqK7PJszFazw4wdFxTncVN2TnkOQd5B+Hr5OpbIOafo9BQOwVzkGcEcYlABYOXmco/0T0PjZKLNCmZgGLBfSnlQSmkE5gAuIcxSyhVSyjLb23VAXDP38aRHCMHjIx/n6t5Xc2WvKx3bR8eNJtA7kN9TlDk7qyyLb3d9y/78/TXaMFvNrDy6kjFxY/DWqwxkwYZgbuh7A2sz1rIpcxOgBHOP8B6OiYE9SnpT5iZe3/g6ryS/wsrUlczbP88jn2350eV0C+1Gp+BOjI0bS1pJGocKD3mkbYCjxUcBJZABh8bsaeEf6a8EskNjbgJTtn3Z14lozPasX3YfM2jZvzROTdqyYI4Fjjq9T7Vtq40bALdOUSHEzUKIZCFEcnZ205TmO5mJDYzlgaEPOLRlAB+9D2d0PINlh5fx5JonmfzjZF5Y/wKXzL+E59Y9R0FFgePYzVmbya/MZ0LHCS7tTu85nQjfCN7b8h5WaXVEZNuJC4wj0i+SNze9yafbP+XSxEvpF9mPWdtmnXDkcUFFARszNzI+XiUwGRM7BoA/U/88oXadsWuZcYFVgrnEVOLRoKfc8lyHpuyj9yHQO7BJTNnppekAZJRmHPe9dyeYtQAwjVORtiyYG4wQ4ipgCPCKu/1SyllSyiFSyiFRUZ4vy9dWmdJ5CsWmYlVvuPtU5pwzh0sSL+H7vd9zzs/n8MI/L7A6dTW/H/odg87A6FjX6lV+Xn7c0O8G/jn2Dz/v+5kyc5nDvwxKWx8YPZBiUzE39L2Bx0Y8xq1Jt5Jems6vB349ob7/mfonVml1TBbaB7YnMSyRVame8zOnFqeiEzraB7QHqjRnu8AuNhbz2sbX2JK15bivkV2e7ZLlLdIv0uOmbKu0kl6STrRfNFZpPe4lXy4+Ztsaek1j1jgVacsJRtLApZhrnG2bC0KIicCjwFgpZWUz9e2UYFSHUbw1/i36RfVzCIc+kX2Y3mM672x+h5/2/cS3u1WFqHFx4xxLtpyZljiNz7Z/xksbXgJw0ZgB7hl8D+d1Oc+RmnN07Gj6R/Zn1rZZXND1AodpvLEsP7KcGP8YekdUhSWMjRvLp9s/pbCysEGZ0eojrSSNGP8YRx/tmnNqSSp9Ivvwza5v+Gz7Z3y2/TNGdRjFrQNuJSmqcZWtcspzXARzuG+4x03ZWWVZmKwmRnQYwbwD8zhSdITOIZ0b3Y5dYw7xCSHEqGnMGqcubVlj3gB0F0J0FkIYgMsAF+ejEP/f3r2HRVnmjx9/3wwMBzmJioKAqBCeKk8pnkjJTMMycystv5Vr535pbmWZ33Vbv2qt6bbZZuVq5bYZtWZqxiqKrJomhpmWp1REjiqKIKic798fM0yMgIJxGGc+r+vigueZ53nmvrm5+Mx9Vr2AD4C7tdanmyGNdk0pxbCQYVaBASC8ZThvR7/NtvHbeG/4e/y+x+95umfNuza5Obsx+cbJXCq7hLOTM2G+YVavB3kFWa2XrZTi6Z5Pk30hm6+OfnVN6T5x/gQ7snYQHRJttalHVFAU5bqcHVk7rum5l8soyLDUkgGruczF5cV8dugzIgMimdZnGgfOHmBi3ETWpayr8/MvlF7gUtkl2rj/2srTGDXmyhr+gMABwLX3M+cV5WF0MuLu7I6PUQKzcFx2G5i11mXA/wM2AAeBL7TW+5VSs5VSd5svexPwBP6tlPpRKdUwo4ZEnbg5uzG4/WCm9ZlmVTO93O9u+B3+Hv6E+4bXqQY8KHAQN7W5iQ/2fVDjYLMrOZ5/nEnrJ+Hh4sGDXR60eu3G1jfi7+7Pm9+/yb6cfZbzuUW5vLbjNZb9tKza8wpKCmodaV05h7mSp9ETX1dfMgsziUuJI7col8k3Tub3PX7P+nHr6dmmJ68nvV7nwFp1qlSlVu6tGryPOavQ1L/co1UPvFy8LLt/1Vfl4iJKKRn8JRya3QZmAK11nNb6Bq11Z631XPO5WVrrteafh2ut22qte5q/7r7yE0VzcDW48sHwD5gzeE6drldKMf2W6ZSUl3Dfuvt4Z887FJebeilKyktq3NgDICU/hckbJlOuy1k2YhmhPqFWrxucDLx/+/sYDUYmrZ/E2mNriUuJ457V9/DlkS95Z887pOanWq7XWjNl8xRGfzWa9358z2oaV1FZkWmfZE/riQDtPduTXpDOPw/8kxta3kD/dv0B8HDxYPag2RSVFTEvaV6dfg9VV/2q1Nq9NQUlBQ26illln3KgZyDB3sGW0eb1lVech4+bKSC7O7vj7OQsNWbhkOw6MAv7EdYyrF67Vd3c5mbW3LOGUaGjWLJvCbf/+3YGxw6mz7/6MDh2MPGp8VbXp59PZ/KGyVToCj6840PCWobV+NzwluHExsTSy78XM7+dycvbXibYK5ilI5ZiNBh598d3LdduSN1A8qlkIvwiWLx3MQ/HPWyZblVZy2zvZT1RIMgriOSTyRzNO8rD3R62akrv6NORZ3o+w8YTG6ulvyaVWzxa1ZjdGn7KVGZBJv7u/hgNRjp4dbjmGnN+cT6+rr6A6cOVrP4lHJU9D/4SDs7PzY95Q+YxuvNo1hxdg5fRizbubdiSsYWZ384k2CuYrq26kluUy1ObnqKsoozlI5dfdXcnXzdf3rv9PZbuW4q3qzfjI8ZjcDLwP93+hyX7ljCpxyRCvUNZkLyArn5dWXHnCjambeT/vvs/xq4Zy+0dbrf0lddUYy7TZbRxb8OdHe+s9t6PdH+E+BPxzE2aS792/fB18601nWcu1tyUDabVvwI8A+r0e7yazMJMyweMYO9gNpzYQGl5ab0H3uUV59HZt7PlWNbLFo5KArOwewMDBzIwcKDleNwN45jwzQSe2/wcH438iJe3vszpi6dZesfSOm+56OLkUm3A2qPdH+Xzw5+zaM8ierTqwamLp5gfNR+Dk4GRoSPp49+H5fuXs+rIKtanrgewGvxV9XhClwk1BjZnJ2dmD5zN/evuZ/mB5UztPbXWNJ65dAZnJ2erEeSNsfpXVmEWvdv2BqCDdwfLlKn6jsyu7GOu5GP0ka0fhUOSpmzhcFq7t2bRsEWcLznPPavvYf/Z/cyPml/vqUiX8zJ68ViPx9ieuZ1lPy1jVMdRloAF0MajDS/e8iKb7tvEjH4zePzGxy1Ny5UGBw5mVMdR3B9xf63vE+EXwa1Bt7LqyKor9hXnXMqhlVsrqyVUG7opu7SilJMXTxLoGQhAiJdpudT69jNrrTlffN46MMvWj8JBSWAWDqlrq67MHTwXpRQz+8+0mnL1W4zvMh5/D39cDC78oc8farzGw8WDB7s+yJTeU6z6kMG0kMn8qPlXnSc9vst4coty2ZC6odZrzl46azVVCmjwjSxOXjhJha6wNMlXrmNe337mwtJCynSZVb6lKVs4KmnKFg7r9g63MzRo6DUvQlITN2c33h/+PhdKL9CuRbsGe+7lIgMiCfUOJfZwLHd1vqva66UVpWQWZhLqHWp13mgw4mX0arCm7Mo5zJXTvlq6tsTTxbPem1lULtFatcYsg7+Eo5Ias3BoDRmUK4W3DK91O82G4qSceCDiAfbl7OPA2QNWr+3K3sV9a+8j9Xwqfdv1rXZva/fWDdaUXTm6vLIpWylFiHdIvRcZqbpOdiVvV28ulF5osN3ChLheSGAW4jp1d9jduDu7E3soFjD167645UUmx0+mqLyIv0f/nUe6P1LtPn93f7ZlbmPmtzNJSEv4TVsrZhRkYFAGq9aBEK+QGmvMpeWlzNk5h+9Pfl/ttarLcVaqXP2rPgPAfsr5iYlxE5mWOI2FyQtZfXR1vfbrLq0olT2gRbOTpmwhrlPeRm9iOsXw9bGvcTW4svLISpyVM8/c/AyTekzCzdmtxvum9Z3GioMr+G/6f1l7bC1GJyN92/VlUOAgBgQOoLNvZ6sBY1eSWZhJuxbtcHb69V9JiHcI8Sfiq02ZWrh7IZ8f/pyswixuaXeL1XNqqjFXXf2rsm/8ahbtWcSxvGOcLznP1oytlFSU4O/hbzUqvzZFZUXc8eUdPHHTE1ZbmArR1CQwC3EdGx8xnpW/rOTfv/ybseFjefrmp/H38L/iPd1bdWfu4LmUVpSy+9RutmZsZXvmdt5MNm2u5mX0omebngwJGsIDEQ9cMUhnFWZZmrErhXiFUKErTH3c5tXT4lLi+PTgp/i5+bEzeyeFJYV4Gj0t91TdWapSfbd+PHD2ADuzd/J87+eZfONkisqKiPo8is1pm+sUmH84/QO5Rbms/GWlBGbRrKQpW4jrWIRfBO9Ev8OqMav404A/XTUoV+Xi5EJkQCTTb5nOmnvWsGHcBuYMmsOIDiPIKMxgXtI8pm6eSmFJoeWe/OJ8fjj1g6V5+PL1vuHXkdlf/PIFKfkpHDl3hNe+e43e/r15M+pNSitK+TbzW6t78orzUCi8jF6Wc5am7DpOmfro549o4dLCMtXMzdmNQYGDSExPrFNz9s7snQAczTvK4dzDdXpPIRqD1JiFuM4NDR7aIM8J9AxkTNgYxoSNQWtN7OFY/rLrL0yMm8j0ftNJOJHA2mNrKSovon9Af2ZFziLnUk61wBzRMoKIlhF8cuATPjnwCc7KGV83XxbcugA/Nz/83PxISEtgZMeRlnvyivPwcfXB4GSwnPN2Ne3JXJcac/r5dOJPxPNIt0esgnt0SDSb0jZx4OwBerTuccVnJGUnEeYbRmp+KnHH44jwi6jT7+16UVxeTHlFeY3bqwrbIoFZCFGNUooJXSbQyacTL2x5gSc3PonRyUhMpxg6+3bm3R/fZdzacQDVArOHiwcr715JZmEm2zO3s/vUbh7s+iBtPExzqocFD2N96npKykswGoyA9TrZla609WNxeTGnL5wm2Nu05fryA8sxKAMTu020ui4qKAqDMrA5bfMVA3NeUR4Hzx7kmZ7PsC9nH/85/h+m9p5a577268Efv/0jaQVpxI6Obe6kiKuQwCyEqFX/gP7ExsSyJWMLI0NHWgZhDQ0eyqvbXmXfmX21LmPa3rM990fcX20Vs+iQaL488iU7s3cSFRQFwLnic9UWVams+V7elK215pWtr7ApbROdfTozvMNwVh9dzV2d76rWlO/j6kPftn3ZnLaZKb2n1JrPXSd3odFEBkQS5BXEjG0z2HN6D33a9qnDb8n2FZUVkZieSFF5UY3jAoRtsZ+Pg0KIRhHkFcRDXR+yGhndwbsDy0ctZ+VdK+neqnu9nhcZEEkLlxZsTtsMwKWyS2QUZFSrMRucDHgZvarVmOOOx7EpbRN3drwTXzdfluxbQkl5SY1TwwCGhQzjWP4xqy05L7czeyctXFrQvXV3ooOjcXd2Jy4lrl75smVJ2UkUlRcBVOvfr4uswixeT3rdMm9dNC4JzEKIa+Ls5HxN/bBGg5Eh7YeQmJ5IXlEeT258kqzCLEZ3Hl3tWh+jj9XqX6cvnmZe0jxuanMT8wbP4+ORH7PxdxuJHR1LJ5+aa+7RwdEAJKYnAqZm6+X7l3Ou6JzlmqTsJG5pewsuTi54uHgwNHioZZes5pZfnP+b51YnpifSwqUFAS0C2Ja5rd73J6QlsOLQCsoryn9TOkTdSGAWQjS520JuI7col3Frx/HzmZ9ZcOsCRoaOrHadt6u3pcastWb2d7MpLi9mzqA5loFibVu0pVurbrW+V4BnAF39upKQlsA3Kd8wZs0YFiQv4KWtL1FeUU5mYSZpBWlEBkZa7onpGEN+cT6fHfqM7MLsZll0pEJX8I99/2BI7BBm7ZhFWUXZNT9nS8YWBgUOIiooiqTspCtuflKThLQEwluGW/r0ReOSwCyEaHKD2w/GxcmFwtJCFg9fzIjQETVe52P0YW/OXp5NeJYnNj7BlowtTO09td5bSkaHRLM3Zy+vbHuF9p7tefKmJ0nKTuKDfR+QlJ0EmJrYKw1sP5AgzyDeTH6TEV+OoP+K/szaPus3b6qRX5zPupR1FJUVXfG68yXnmbp5Kov2LKJbq26sPrqa5xOfv6ZV2vaf2c+ZS2cYGjyUqKAoLpVdIvlUsuX1lPwUvjryVa335xblsuf0Hm4Lua3e7y2ujQz+EkI0OU+jJ4uHL8bf3f+Ke2DHdIrhQtkFzlw6Q2lFKfeG33tNi3/EdIph04lNjA0fy/iI8TgpJ7IvZPP+3vfp6NORNu5trJrCXZxcWHn3Sg6ePUhKfgoHzh5g9dHVbM3YyszImdwWchunL54mvSCdi6UXcXV2xc3gRkFJAYfPHeaX3F9o5d6KP/T9Ay5OptXPKnQF07dOZ0fWDt7yeItnbn6GMWFjrFZNA8i5mMOj6x8lqzCLV/q9woNdHuSLw18wN2kuT8Q/waiOo8gvzqegtIAxncdctTshMT0RgzIQFRSF0WDE6GRkW8Y2BgYOpLS8lOcTn+d4/nECPQPpH9C/2v3/Tf8vFbpCAnMTUrIubP307dtXJycnX/1CIYRNu1h6kYfiHuJo3lFGdxrN60Nev+L1h3IPMWv7LA7mHsToZKSkovbm4LYebTl18RQTukzg1f6vAvDpwU95Y9cbPNztYfbm7GVvzl46+XRi8fDFlilnFbqCpzY+xZ7Te1gyYgm9/HtZnhmfGs+MbTMs7+usnPEyevFpzKcEe/3axHz03FE8XDwsI6/vXXsvPkYfPhr5EQBPbXyKzMJMvh77NR/+/CFv7X4LTxdPgr2CiR0dW22K2LMJz3Is7xj/ufc/1bYprQ+l1G6tdfVdVUQ1UmMWQjgkDxcPFt66kMnxkxnRoeam9Kq6+HVhRcwKy3rfIV4hhHiH4GX0oqisiKLyItwMboS3DMfH1YeFyQv5eP/HhPmG0adtH97a/RZRQVG82PdFwFST/d/t/8tTG59i+ajl+Ln58cmBT/gu+ztmDZhlFZQBRoSOIDIwktLyUnxcfcgoyOChuId4LuE5PrnzEzxdPPnXwX/x1+S/4mJwsTzjyLkjlvcEGBI0hDd2vcH3J7/n/b3vMzR4KHeE3sGMbTP4JuUbq21EL5Re4Lus7xjfZfxvCsqifqTGXE9SYxbCvmitGyXolFeU89zm59iRtYNAz0AKSwpZNWYVrd1bW67Zc3oPj8c/TphvGNNvmc5j8Y8xuP1g3h72dp3StCt7F09ufJJ+Af3wNnqzPnU9w4KHmZZOPf0DnX06cyz/GOvGrqODdwcA0s6nEfNVDN5Gb0rKS1h9z2oCWgQwft148orz+HqsaVMUgPWp63lpy0t8PPLj3zynW2rMdSeDv4QQDq2xaoIGJwPzo+YT6h1KekE6rw18zSooA/Ty78XCWxdyKPcQj65/FF9XX/488M91TlO/gH78ccAf2ZG1g/gT8UzrM423h73NsjuW8fiNj5OSn0Inn06WoAymtcxDvEI4X3Kex296nPae7XFSTrzQ9wWyL2Sz4uAKy7UJJxLwc/OjZ5ueDfI7EXUjTdlCCNFIPI2eLL1jKQfPHmRI0JAar7k1+FZmD5rNG7veYO7gubR0a1mv97g3/F6MBiOBLQLp3bY3YOp/ntJ7CtEh0bgZqm//OSZsDIlpiTza/VHLuf4B/RnSfgiLf1xMRkEGMZ1i2Ja5jZGhI63WMBeNT5qy60masoUQjaFCVzT72twnL5zkbz/8jYQTCZaVwt697V3L0qm/hTRl153UmIUQwgY0d1AGaNeiHW8MeYOC/gXEp8ZzPP84AwIGNHeyHI4EZiGEEFa8jF6Mu2FccyfDYTX/RzQhhBBCWEhgFkIIIWyIBGYhhBDChkhgFkIIIWyIBGYhhBDChkhgFkIIIWyIBGYhhBDChkhgFkIIIWyILMlZT0qpHODENd7eGjjTgMm5Xjhivh0xz+CY+XbEPEP9891Ba92msRJjTyQwNyGlVLIjrhXriPl2xDyDY+bbEfMMjpvvpiBN2UIIIYQNkcAshBBC2BAJzE1rSXMnoJk4Yr4dMc/gmPl2xDyD4+a70UkfsxBCCGFDpMYshBBC2BAJzEIIIYQNkcDcRJRSI5VSh5VSR5VSrzR3ehqDUipYKZWolDqglNqvlJpqPu+nlNqolDpi/t6yudPa0JRSBqXUHqXUOvNxR6VUkrm8P1dKGZs7jQ1NKeWrlFqplDqklDqolBpg72WtlJpm/tv+WSn1mVLKzR7LWin1oVLqtFLq5yrnaixbZbLInP99SqnezZdy+yCBuQkopQzAu8AooBswQSnVrXlT1SjKgBe01t2ASOBZcz5fARK01uFAgvnY3kwFDlY5/gvwltY6DDgHTG6WVDWut4H1WusuwM2Y8m+3Za2Uag9MAfpqrXsABmA89lnWHwMjLztXW9mOAsLNX08A7zVRGu2WBOam0Q84qrVO0VqXALHAmGZOU4PTWmdrrX8w/1yA6R91e0x5XW6+bDlwT7MksJEopYKAGGCp+VgB0cBK8yX2mGcfIApYBqC1LtFa52HnZQ04A+5KKWfAA8jGDstaa70VyL3sdG1lOwb4pzbZCfgqpQKaJKF2SgJz02gPpFc5zjCfs1tKqVCgF5AEtNVaZ5tfOgm0ba50NZK/AdOBCvNxKyBPa11mPrbH8u4I5AAfmZvwlyqlWmDHZa21zgQWAGmYAnI+sBv7L+tKtZWtw/1/a2wSmEWDU0p5Al8Cz2utz1d9TZvm59nNHD2l1GjgtNZ6d3OnpYk5A72B97TWvYALXNZsbYdl3RJT7bAjEAi0oHpzr0Owt7K1NRKYm0YmEFzlOMh8zu4opVwwBeVPtdarzKdPVTZtmb+fbq70NYJBwN1KqVRMXRTRmPpefc3NnWCf5Z0BZGitk8zHKzEFansu6+HAca11jta6FFiFqfztvawr1Va2DvP/ralIYG4a3wPh5tGbRkwDRtY2c5oanLlvdRlwUGv91yovrQUeMf/8CLCmqdPWWLTWM7TWQVrrUEzlullr/RCQCPzOfJld5RlAa30SSFdKRZhP3QYcwI7LGlMTdqRSysP8t16ZZ7su6ypqK9u1wMPm0dmRQH6VJm9xDWTlryailLoTU1+kAfhQaz23eVPU8JRSg4FtwE/82t/6KqZ+5i+AEExbZt6vtb58YMl1Tyk1FHhRaz1aKdUJUw3aD9gDTNRaFzdj8hqcUqonpgFvRiAFmITpw77dlrVS6s/AA5hmIOwBHsPUn2pXZa2U+gwYimlrx1PAn4DV1FC25g8pf8fUrH8RmKS1Tm6GZNsNCcxCCCGEDZGmbCGEEMKGSGAWQgghbIgEZiGEEMKGSGAWQgghbIgEZiGEEMKGSGAWwsYopcqVUj9W+WqwjSCUUqFVdwwSQtge56tfIoRoYpe01j2bOxFCiOYhNWYhrhNKqVSl1Hyl1E9KqV1KqTDz+VCl1GbzXrgJSqkQ8/m2SqmvlFJ7zV8DzY8yKKX+Yd5XOF4p5d5smRJCVCOBWQjb435ZU/YDVV7L11rfiGmlpb+Zz70DLNda3wR8Ciwyn18EbNFa34xpHev95vPhwLta6+5AHjCuUXMjhKgXWflLCBujlCrUWnvWcD4ViNZap5g3CzmptW6llDoDBGitS83ns7XWrZVSOUBQ1eUhzdtxbjRvdo9S6mXARWs9pwmyJoSoA6kxC3F90bX8XB9V13EuR8aaCGFTJDALcX15oMr378w/78C0sxXAQ5g2EgFIAJ4GUEoZlFI+TZVIIcS1k0/KQtged6XUj1WO12utK6dMtVRK7cNU651gPvcc8JFS6iUgB9MuTwBTgSVKqcmYasZPA7IdnxA2TvqYhbhOmPuY+2qtzzR3WoQQjUeasoUQQggbIjVmIYQQwoZIjVkIIYSwIRKYhRBCCBsigVkIIYSwIRKYhRBCCBsigVkIIYSwIf8f/zCIKdlk9L4AAAAASUVORK5CYII=\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "model.plot(path=False)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The plot shows unambiguously that, even when using two *Dropout* layers, there is major overfitting with virtually no relevance of the model with regards to validation data." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "For code, maths and pictures behind *Dense* and *RNN* layers, follow these links:\n", "\n", "* [Dropout - Regularization](https://epynn.net/Dropout.html)\n", "* [Fully Connected (Dense)](https://epynn.net/Dense.html)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Convolutional Neural Network (CNN)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Convolutional networks are generally preferred when dealing with image data. They are a particular kind of Feed-Forward network whose specific Convolution layer is designed to extract relevant data with respect to spatial organization.\n", "\n", "By comparison, the *Dense* layer does not make assumptions about the relationship between data points at index ``i`` and ``i + 1``. In contrast, the *Convolution* layer will process data points related through coordinates within groups defined by ``filter_size``." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Embedding" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Using same embedding configuration than above." ] }, { "cell_type": "code", "execution_count": 10, "metadata": {}, "outputs": [], "source": [ "embedding = Embedding(X_data=X_features,\n", " Y_data=Y_label,\n", " X_scale=True,\n", " Y_encode=True,\n", " batch_size=32,\n", " relative_size=(2, 1, 0))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Time to explain one thing:" ] }, { "cell_type": "code", "execution_count": 11, "metadata": {}, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "fig, (ax0, ax1) = plt.subplots(1, 2)\n", "\n", "ax0.imshow(X_features[Y_label.index(0)], cmap='gray')\n", "ax0.set_title('label: 0')\n", "\n", "ax1.imshow(X_features[Y_label.index(1)], cmap='gray')\n", "ax1.set_title('label: 1')\n", "\n", "plt.show()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "There is a reason why we did not make the random image non-random by simply randomly setting values to zero.\n", "\n", "As stated above, CNN are best to **detect patterns through space**. We do not expect any pattern following a random modification of values within one image.\n", "\n", "If we have had done so, we would not expect the CNN to do better than the classical Feed-Forward, *Dense* layer based network.\n", "\n", "Instead, we have voluntarily alterated the random image with a clear pattern. Visually a black cross in the image. Therefore, we may expect the CNN to overperform because there is actually a space-defined pattern to detect." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Conv-Pool-Flatten-Dense" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "When dealing with CNN, the specific *Convolution* layer often comes along with a so-called *Pooling* layer.\n", "\n", "Such a *Pooling* layer may be seen as a data compression layer. It will let pass through one value per ``pool_size`` window which is often one of the two minimum or maximum extrema." ] }, { "cell_type": "code", "execution_count": 12, "metadata": {}, "outputs": [], "source": [ "name = 'Convolution-6-2_Pooling-3-3-Max_Flatten_Dense-2-softmax'\n", "\n", "se_hPars['learning_rate'] = 0.001\n", "\n", "convolution = Convolution(unit_filters=6, filter_size=(4, 4), activate=relu)\n", "\n", "pooling = Pooling(pool_size=(2, 2))\n", "\n", "flatten = Flatten()\n", "\n", "dense = Dense(2, softmax)\n", "\n", "layers = [embedding, convolution, pooling, flatten, dense]\n", "\n", "model = EpyNN(layers=layers, name=name)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Note that while we used a single *Convolution-Pooling* block here, these are often stacked in the design of CNNs.\n", "\n", "Our *Convolution* layer uses ``6`` filters or kernels with ``filter_size=(4, 4)``.\n", "\n", "Practically speaking, ``6`` filters means the output shape will be ``(m, .., .., 6)`` while the input shape was ``(m, ..., ..., DEPTH)`` or ``(m, ..., ..., 1)`` in this example.\n", "\n", "Considering ``filter_size=(4, 4)``, it means the output shape will be ``(m, h // 4, w // 4, 6)`` while the input shape was ``(m, h, w, 1)``.\n", "\n", "Since the numerical dimensions of the input were ``(m, 28, 28, 1)``, we then expect the output of the *Convolution* layer to have shape ``(m, 7, 7, 6)``.\n", "\n", "Note that there is another *Convolution* layer argument, such as ``strides=()``. When not provided, ``strides=filter_size``. Strides describe by how much the convolution window defined by ``filter_size=(4, 4)`` will jump between each iteration through image dimensions. \n", "\n", "We pass for now, and will instead set the default for the ``end`` argument value below." ] }, { "cell_type": "code", "execution_count": 13, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "\u001b[1m--- EpyNN Check --- \u001b[0m\n", "\u001b[1mLayer: Embedding\u001b[0m\n", "\u001b[1m\u001b[32mcompute_shapes: Embedding\u001b[0m\n", "\u001b[1m\u001b[32minitialize_parameters: Embedding\u001b[0m\n", "\u001b[1m\u001b[32mforward: Embedding\u001b[0m\n", "shape: (32, 28, 28, 1)\n", "\u001b[1mLayer: Convolution\u001b[0m\n", "\u001b[1m\u001b[32mcompute_shapes: Convolution\u001b[0m\n", "\u001b[1m\u001b[32minitialize_parameters: Convolution\u001b[0m\n", "\u001b[1m\u001b[32mforward: Convolution\u001b[0m\n", "shape: (32, 7, 7, 6)\n", "\u001b[1mLayer: Pooling\u001b[0m\n", "\u001b[1m\u001b[32mcompute_shapes: Pooling\u001b[0m\n", "\u001b[1m\u001b[32minitialize_parameters: Pooling\u001b[0m\n", "\u001b[1m\u001b[32mforward: Pooling\u001b[0m\n", "shape: (32, 3, 3, 6)\n", "\u001b[1mLayer: Flatten\u001b[0m\n", "\u001b[1m\u001b[32mcompute_shapes: Flatten\u001b[0m\n", "\u001b[1m\u001b[32minitialize_parameters: Flatten\u001b[0m\n", "\u001b[1m\u001b[32mforward: Flatten\u001b[0m\n", "shape: (32, 54)\n", "\u001b[1mLayer: Dense\u001b[0m\n", "\u001b[1m\u001b[32mcompute_shapes: Dense\u001b[0m\n", "\u001b[1m\u001b[32minitialize_parameters: Dense\u001b[0m\n", "\u001b[1m\u001b[32mforward: Dense\u001b[0m\n", "shape: (32, 2)\n", "\u001b[1mLayer: Dense\u001b[0m\n", "\u001b[1m\u001b[36mbackward: Dense\u001b[0m\n", "shape: (32, 54)\n", "\u001b[1m\u001b[36mcompute_gradients: Dense\u001b[0m\n", "\u001b[1mLayer: Flatten\u001b[0m\n", "\u001b[1m\u001b[36mbackward: Flatten\u001b[0m\n", "shape: (32, 3, 3, 6)\n", "\u001b[1m\u001b[36mcompute_gradients: Flatten\u001b[0m\n", "\u001b[1mLayer: Pooling\u001b[0m\n", "\u001b[1m\u001b[36mbackward: Pooling\u001b[0m\n", "shape: (32, 7, 7, 6)\n", "\u001b[1m\u001b[36mcompute_gradients: Pooling\u001b[0m\n", "\u001b[1mLayer: Convolution\u001b[0m\n", "\u001b[1m\u001b[36mbackward: Convolution\u001b[0m\n", "shape: (32, 28, 28, 1)\n", "\u001b[1m\u001b[36mcompute_gradients: Convolution\u001b[0m\n", "\u001b[1mLayer: Embedding\u001b[0m\n", "\u001b[1m\u001b[36mbackward: Embedding\u001b[0m\n", "shape: (32, 28, 28, 1)\n", "\u001b[1m\u001b[36mcompute_gradients: Embedding\u001b[0m\n", "\u001b[1m--- EpyNN Check OK! --- \u001b[0m\n" ] } ], "source": [ "model.initialize(loss='MSE', seed=1, se_hPars=se_hPars.copy(), end=None)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "When ``end`` is provided with ``None`` or simply by default, the ``.initialize()`` method returns EpyNN check logs which include shapes for output of forward and backward propagation and for every layer.\n", "\n", "Note the assumption we made about the output shape of the *Convolution* layer was right, it is indeed ``(m, 7, 7, 6)`` with *m* equals to the ``batch_size`` we set upon instnatiation of the *Embedding* layer.\n", "\n", "Let's train the model." ] }, { "cell_type": "code", "execution_count": 14, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "\u001b[1m\u001b[37mEpoch 99 - Batch 14/14 - Accuracy: 0.781 Cost: 0.1636 - TIME: 13.11s RATE: 7.63e+00e/s TTC: 0s \u001b[0m\n", "\n", "+-------+-------------+----------+----------+-------+--------+-------+--------------------------------------------------------------------+\n", "| \u001b[1m\u001b[37mepoch\u001b[0m | \u001b[1m\u001b[37mlrate\u001b[0m | \u001b[1m\u001b[37mlrate\u001b[0m | \u001b[1m\u001b[32maccuracy\u001b[0m | | \u001b[1m\u001b[31mMSE\u001b[0m | | \u001b[37mExperiment\u001b[0m |\n", "| | \u001b[37mConvolution\u001b[0m | \u001b[37mDense\u001b[0m | \u001b[1m\u001b[32mdtrain\u001b[0m | \u001b[1m\u001b[32mdval\u001b[0m | \u001b[1m\u001b[31mdtrain\u001b[0m | \u001b[1m\u001b[31mdval\u001b[0m | |\n", "+-------+-------------+----------+----------+-------+--------+-------+--------------------------------------------------------------------+\n", "| \u001b[1m\u001b[37m0\u001b[0m | \u001b[1m\u001b[37m1.00e-03\u001b[0m | \u001b[1m\u001b[37m1.00e-03\u001b[0m | \u001b[1m\u001b[32m0.482\u001b[0m | \u001b[1m\u001b[32m0.484\u001b[0m | \u001b[1m\u001b[31m0.289\u001b[0m | \u001b[1m\u001b[31m0.277\u001b[0m | \u001b[37m1635012595_Convolution-6-2_Pooling-3-3-Max_Flatten_Dense-2-softmax\u001b[0m |\n", "| \u001b[1m\u001b[37m10\u001b[0m | \u001b[1m\u001b[37m1.00e-03\u001b[0m | \u001b[1m\u001b[37m1.00e-03\u001b[0m | \u001b[1m\u001b[32m0.540\u001b[0m | \u001b[1m\u001b[32m0.528\u001b[0m | \u001b[1m\u001b[31m0.252\u001b[0m | \u001b[1m\u001b[31m0.247\u001b[0m | \u001b[37m1635012595_Convolution-6-2_Pooling-3-3-Max_Flatten_Dense-2-softmax\u001b[0m |\n", "| \u001b[1m\u001b[37m20\u001b[0m | \u001b[1m\u001b[37m1.00e-03\u001b[0m | \u001b[1m\u001b[37m1.00e-03\u001b[0m | \u001b[1m\u001b[32m0.622\u001b[0m | \u001b[1m\u001b[32m0.604\u001b[0m | \u001b[1m\u001b[31m0.236\u001b[0m | \u001b[1m\u001b[31m0.234\u001b[0m | \u001b[37m1635012595_Convolution-6-2_Pooling-3-3-Max_Flatten_Dense-2-softmax\u001b[0m |\n", "| \u001b[1m\u001b[37m30\u001b[0m | \u001b[1m\u001b[37m1.00e-03\u001b[0m | \u001b[1m\u001b[37m1.00e-03\u001b[0m | \u001b[1m\u001b[32m0.698\u001b[0m | \u001b[1m\u001b[32m0.632\u001b[0m | \u001b[1m\u001b[31m0.224\u001b[0m | \u001b[1m\u001b[31m0.224\u001b[0m | \u001b[37m1635012595_Convolution-6-2_Pooling-3-3-Max_Flatten_Dense-2-softmax\u001b[0m |\n", "| \u001b[1m\u001b[37m40\u001b[0m | \u001b[1m\u001b[37m1.00e-03\u001b[0m | \u001b[1m\u001b[37m1.00e-03\u001b[0m | \u001b[1m\u001b[32m0.722\u001b[0m | \u001b[1m\u001b[32m0.680\u001b[0m | \u001b[1m\u001b[31m0.212\u001b[0m | \u001b[1m\u001b[31m0.214\u001b[0m | \u001b[37m1635012595_Convolution-6-2_Pooling-3-3-Max_Flatten_Dense-2-softmax\u001b[0m |\n", "| \u001b[1m\u001b[37m50\u001b[0m | \u001b[1m\u001b[37m1.00e-03\u001b[0m | \u001b[1m\u001b[37m1.00e-03\u001b[0m | \u001b[1m\u001b[32m0.742\u001b[0m | \u001b[1m\u001b[32m0.700\u001b[0m | \u001b[1m\u001b[31m0.200\u001b[0m | \u001b[1m\u001b[31m0.206\u001b[0m | \u001b[37m1635012595_Convolution-6-2_Pooling-3-3-Max_Flatten_Dense-2-softmax\u001b[0m |\n", "| \u001b[1m\u001b[37m60\u001b[0m | \u001b[1m\u001b[37m1.00e-03\u001b[0m | \u001b[1m\u001b[37m1.00e-03\u001b[0m | \u001b[1m\u001b[32m0.768\u001b[0m | \u001b[1m\u001b[32m0.716\u001b[0m | \u001b[1m\u001b[31m0.190\u001b[0m | \u001b[1m\u001b[31m0.197\u001b[0m | \u001b[37m1635012595_Convolution-6-2_Pooling-3-3-Max_Flatten_Dense-2-softmax\u001b[0m |\n", "| \u001b[1m\u001b[37m70\u001b[0m | \u001b[1m\u001b[37m1.00e-03\u001b[0m | \u001b[1m\u001b[37m1.00e-03\u001b[0m | \u001b[1m\u001b[32m0.778\u001b[0m | \u001b[1m\u001b[32m0.732\u001b[0m | \u001b[1m\u001b[31m0.180\u001b[0m | \u001b[1m\u001b[31m0.190\u001b[0m | \u001b[37m1635012595_Convolution-6-2_Pooling-3-3-Max_Flatten_Dense-2-softmax\u001b[0m |\n", "| \u001b[1m\u001b[37m80\u001b[0m | \u001b[1m\u001b[37m1.00e-03\u001b[0m | \u001b[1m\u001b[37m1.00e-03\u001b[0m | \u001b[1m\u001b[32m0.792\u001b[0m | \u001b[1m\u001b[32m0.748\u001b[0m | \u001b[1m\u001b[31m0.173\u001b[0m | \u001b[1m\u001b[31m0.185\u001b[0m | \u001b[37m1635012595_Convolution-6-2_Pooling-3-3-Max_Flatten_Dense-2-softmax\u001b[0m |\n", "| \u001b[1m\u001b[37m90\u001b[0m | \u001b[1m\u001b[37m1.00e-03\u001b[0m | \u001b[1m\u001b[37m1.00e-03\u001b[0m | \u001b[1m\u001b[32m0.816\u001b[0m | \u001b[1m\u001b[32m0.768\u001b[0m | \u001b[1m\u001b[31m0.163\u001b[0m | \u001b[1m\u001b[31m0.176\u001b[0m | \u001b[37m1635012595_Convolution-6-2_Pooling-3-3-Max_Flatten_Dense-2-softmax\u001b[0m |\n", "| \u001b[1m\u001b[37m99\u001b[0m | \u001b[1m\u001b[37m1.00e-03\u001b[0m | \u001b[1m\u001b[37m1.00e-03\u001b[0m | \u001b[1m\u001b[32m0.808\u001b[0m | \u001b[1m\u001b[32m0.760\u001b[0m | \u001b[1m\u001b[31m0.154\u001b[0m | \u001b[1m\u001b[31m0.169\u001b[0m | \u001b[37m1635012595_Convolution-6-2_Pooling-3-3-Max_Flatten_Dense-2-softmax\u001b[0m |\n", "+-------+-------------+----------+----------+-------+--------+-------+--------------------------------------------------------------------+\n" ] } ], "source": [ "model.train(epochs=100, init_logs=False)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "We readily observe the model could converge to reproduce both training and validation data at some extent." ] }, { "cell_type": "code", "execution_count": 15, "metadata": {}, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "model.plot(path=False)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Looking at the plot, it seems clear that:\n", "\n", "* The model is converging and has not completed convergence.\n", "* There is overfitting seen from the first training iterations." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "For code, maths and pictures behind the convolution and pooling layers, follow these links:\n", "\n", "* [Convolution (CNN)](https://epynn.net/Convolution.html)\n", "* [Pooling (CNN)](https://epynn.net/Pooling.html)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Write, read & Predict" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "A trained model can be written on disk such as:" ] }, { "cell_type": "code", "execution_count": 16, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "\u001b[1m\u001b[32mMake: /media/synthase/beta/EpyNN/epynnlive/dummy_image/models/1635012595_Convolution-6-2_Pooling-3-3-Max_Flatten_Dense-2-softmax.pickle\u001b[0m\n" ] } ], "source": [ "model.write()\n", "\n", "# model.write(path=/your/custom/path)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "A model can be read from disk such as:" ] }, { "cell_type": "code", "execution_count": 17, "metadata": {}, "outputs": [], "source": [ "model = read_model()\n", "\n", "# model = read_model(path=/your/custom/path)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "We can retrieve new features and predict on them." ] }, { "cell_type": "code", "execution_count": 18, "metadata": {}, "outputs": [], "source": [ "X_features, _ = prepare_dataset(N_SAMPLES=10)\n", "\n", "dset = model.predict(X_features, X_scale=True)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Results can be extracted such as:" ] }, { "cell_type": "code", "execution_count": 19, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "0 0 [0.72836536 0.27163464]\n", "1 0 [0.56434711 0.43565289]\n", "2 1 [0.30717667 0.69282333]\n", "3 1 [0.40234684 0.59765316]\n", "4 0 [0.84712438 0.15287562]\n", "5 0 [0.80588772 0.19411228]\n", "6 1 [0.27219075 0.72780925]\n", "7 1 [0.33549057 0.66450943]\n", "8 0 [0.63908393 0.36091607]\n", "9 1 [0.22657009 0.77342991]\n" ] } ], "source": [ "for n, pred, probs in zip(dset.ids, dset.P, dset.A):\n", " print(n, pred, probs)" ] } ], "metadata": { "kernelspec": { "display_name": "Python 3 (ipykernel)", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.9.2" } }, "nbformat": 4, "nbformat_minor": 4 }