{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "## Programming Exercise 8: Anomaly Detection and Recommender Systems\n", "#### Author - Rishabh Jain" ] }, { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [], "source": [ "import warnings,os\n", "warnings.simplefilter('ignore')\n", "\n", "import matplotlib.pyplot as plt\n", "import seaborn as sns\n", "import pandas as pd\n", "import numpy as np\n", "%matplotlib inline\n", "\n", "from scipy.io import loadmat" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 1    Anomaly detection\n", "\n", "#### Problem Statement\n", "In this part of the exercise, we will implement an anomaly detection algorithm to detect the anomalous behavior in server computers. The features measure the throughput (mb/s) and latency (ms) of response of each server. While our servers were operating, we collected m=307 examples of how they were behaving, and thus have an unlabeled dataset. We suspect that the vast majority of these examples are \"Normal\" (Non-anomalous) examples of servers operating normally, but there might also be some examples of servers acting anomalously within the dataset.\n", "\n", "**We will use a gaussian model to detect the anomalies in our dataset. On this dataset, we will fit a gaussian distribution and then find the values that have very low probability and hence can be considered anomalies.**" ] }, { "cell_type": "code", "execution_count": 2, "metadata": { "scrolled": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "__header__\n", "__version__\n", "__globals__\n", "X\n", "Xval\n", "yval\n" ] } ], "source": [ "# Loading dataset\n", "mat=loadmat('ex8data1.mat')\n", "X=mat['X']\n", "print(*mat.keys(),sep='\\n')" ] }, { "cell_type": "code", "execution_count": 3, "metadata": { "scrolled": false }, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "fig=sns.scatterplot(X[:,0],X[:,1],marker='x')\n", "fig.set(xlabel='Latency (ms)',ylabel='Throughput (mb/s)',title='Original Dataset');" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### 1.1    Gaussian Distribution\n", "To perform anomaly detection, we will first need to fit a model to the data's distribution. \n", "Given a training set, we want to estimate the gaussian distribution for each of the features. For each feature, we need to find the parameters $\\mu_{i}$ and $\\sigma_{i}^{2}$ that fit the data. The gaussian distribution is given by:\n", "\n", "$$\\boxed{p(x_{j};\\mu_{j},\\sigma_{j}^{2})=\\frac{1}{\\sqrt{2\\pi\\sigma_{j}^{2}}}e^{-\\frac{(X_{j}-\\mu_{j})^{2}}{2\\sigma_{j}^{2}}}}$$\n", "\n", "$$p(x)=\\Pi_{j=1}^{n}p(x_{j};\\mu_{j},\\sigma_{j}^{2})$$\n", "\n", "$$\\text{Anomaly, if }p(x)< \\varepsilon$$" ] }, { "cell_type": "code", "execution_count": 4, "metadata": {}, "outputs": [], "source": [ "def mutlivariateGaussian(X,mu,sigma):\n", " p=(1/(np.sqrt(2*np.pi*np.power(sigma,2))))*np.exp(-np.power(X-mu,2)/(2*np.power(sigma,2)))\n", " p=np.product(p,axis=1).reshape((-1,1))\n", " return p" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### 1.2    Estimating parameters for a Gaussian\n", "We can estimate the parameters ($\\mu_{i},\\sigma_{i}^{2}$) of the i-th feature by using the following equations. To estimate the mean, we will use\n", "$$\\mu_{i}=\\frac{1}{m}\\sum_{j=1}^{m}x_{i}^{(j)}$$\n", "\n", "And for the variance, we will use:\n", "$$\\sigma_{i}^{2}=\\frac{1}{m}\\sum_{j=1}^{m}(x_{i}^{(j)}-\\mu_{i})^2$$" ] }, { "cell_type": "code", "execution_count": 5, "metadata": {}, "outputs": [], "source": [ "def estimateGaussian(X):\n", " mu=np.mean(X,axis=0)\n", " sigma=np.std(X,axis=0)\n", " return (mu,sigma)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Let's look at the Gaussian distribution contours of the distribution fit to the dataset." ] }, { "cell_type": "code", "execution_count": 6, "metadata": {}, "outputs": [], "source": [ "def plotGaussianContour(X,mu,sigma,title=None):\n", " # Constructing grid around the min and max range of original data\n", " temp=np.linspace(np.min(X)-5,np.max(X)+5)\n", " [x1,x2]=np.meshgrid(temp,temp)\n", " # Computing the Gaussian Density Probability for the grid\n", " temp=np.array([x1.reshape(-1),x2.reshape(-1)]).T\n", " z=mutlivariateGaussian(temp,mu,sigma).reshape(x1.shape)\n", " # Plotting\n", " levels=np.power(10,list(map(lambda x:float(x),list(range(-20,0,3)))))\n", " plt.contour(x1,x2,z,levels=levels);\n", " fig=sns.scatterplot(X[:,0],X[:,1],marker='x')\n", " title='Gaussian Distribution Contours' if title==None else title\n", " fig.set(xlabel='Latency (ms)',ylabel='Throughput (mb/s)',title=title);" ] }, { "cell_type": "code", "execution_count": 7, "metadata": {}, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "# Estimating Gaussian parameters\n", "mu,sigma=estimateGaussian(X)\n", "# Computing Density Probability\n", "p=mutlivariateGaussian(X,mu,sigma)\n", "# Plotting\n", "plotGaussianContour(X,mu,sigma);" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### 1.3    Selecting the threshold, $\\varepsilon$\n", "Now that we have estimated the gaussian parameters, we can investigate which examples have a very high probability given this distribution and which examples have a very low probability. The low probability examples are more likely to be the anomalies in our dataset. One way to determine which examples are the anomalies is to select the threshold based on a cross validation set. In this part of the exericse, we will implement an algorithm to select the threshold using F1 score on a cross validation set. \n", "\n", "**$y=1$ corresponds to an anomalous examples and $y=0$ corresponds to a normal examples.**" ] }, { "cell_type": "code", "execution_count": 8, "metadata": { "scrolled": false }, "outputs": [], "source": [ "Xval=mat['Xval']\n", "yval=mat['yval']" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "For many different values of $\\varepsilon$, we will compute the resulting $F_1$ score by computing how many examples the current threshold classifies correctly and incorrectly. The $F_1$ score is computed using **Precision** (prec) and **Recall** (rec):\n", "\n", "$$\\boxed{F1=\\frac{2.prec.rec}{prec+rec}}$$\n", "\n", "We can compute Precision (prec) and Recall (rec) using:\n", "\n", "$$\\boxed{prec=\\frac{tp}{tp+fp}}$$\n", "\n", "$$\\boxed{rec=\\frac{tp}{tp+fn}}$$\n", "\n", "where,\n", "- $tp$ is the number of true positives: the ground truth label says it's an anomaly and our algorithm classified it as an anomaly.\n", "- $fp$ is the number of false positives: the ground truth label says it's not an anomaly and our algorithm classified it as an anomaly.\n", "- $fn$ is the number of false negatives: the ground truth labels says it's an anomaly and our alogrithm classified it as not being anomalous." ] }, { "cell_type": "code", "execution_count": 9, "metadata": {}, "outputs": [], "source": [ "def selectThreshold(yval,pval):\n", " '''\n", " Returns the threshold value of epsilon and the corresponding F1 score.\n", " '''\n", " bestEpsilon=bestF1=F1=0\n", " epsilons=np.linspace(np.min(pval),np.max(pval),1000)\n", " for epsilon in epsilons:\n", " cvPrediction=pval0:\n", " prec=tp/(tp+fp)\n", " # Computing Recall\n", " if tp+fn>0:\n", " rec=tp/(tp+fn)\n", " # Computing F1 Score\n", " if prec+rec>0:\n", " F1=(2*prec*rec)/(prec+rec)\n", " if F1>bestF1:\n", " bestF1=F1\n", " bestEpsilon=epsilon\n", " return (bestEpsilon,bestF1)" ] }, { "cell_type": "code", "execution_count": 10, "metadata": { "scrolled": false }, "outputs": [ { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAYIAAAEWCAYAAABrDZDcAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADl0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uIDMuMC4yLCBodHRwOi8vbWF0cGxvdGxpYi5vcmcvOIA7rQAAIABJREFUeJzsnWd4VEUXgN9JT0hCCb33DoIUKSIokS5FQ+8dRFFQ/BSxoKJiBekoovQuHem9SG+RDiG9977lfD92EyNSdjcJBLjv88yzd++9c2ZumzPtnFEigoaGhobG04vdo86AhoaGhsajRVMEGhoaGk85miLQ0NDQeMrRFIGGhobGU46mCDQ0NDSecjRFoKGhofGUoymCPIpS6lOl1JKHkE55pZQopRxsiNtKKRV4n+O/KaW+yF4ONTQ0chtNETwilFKJWYJRKZWS5X/fR52/vIBSapxSKlQpFaeU+lUp5Xyfc1srpS4rpZKVUnuVUuWyHHM2x483yxufg3GHKaWum5/bn0qpkg+4pn5KKT+zvL+UUqUfcP6nSindHe/Le+ZjPZRSR8z53nc/OebzJyqlbpllBCqlVj4ozqNGKVVIKfWHUipJKXVbKdXnPuc6K6XmKqXClFLRSqlNSqlSWY6XV0ptVUrFmJ/lTFsqQE8imiJ4RIiIe0YA/IFXsuxbao2sJ/FlVkq1Bd4HWgPlgYrA5HucWxhYB3wEFAJOAlkLuU+BKkA54EXgPaVUuxyI2xL4EuhijnsLWH6fa3IHFgIjgALAG0Dqg+4FsDLr+yIi35j3RwPTgK8fJEApNRDoD3ib37mGwG4L0raYXHoPZwHpQDGgLzBHKVXrHue+BTQF6gIlgVhgRpbjs4FwoARQD2gJvJ4LeX7s0BRB3sZJKbVIKZWglPJVSjXMOGCuVf5PKXUeSFJKOSilSiql1iqlIsw1v7FZzm+slDppromGKaV+uCOtvkopf6VUpFLqwyzxnJVS05RSweYw7V41c6VUfaXUaXN+VwIu2bj2gcACEfEVkRjgc2DQPc59FfAVkdUikoqp8H5GKVXdfHwA8LmIxIjIJeDnLLKyE/cVYLU5j+nmPL6glKp0j3wKoAduiYhRRE6ISKQV9+TfwkR2icgqINiC0xsB20XkhjluqIjMzzhornkvND/jGKXU+izHhptbPdFKqY1ZWz3K1K04Ril1Dbhm3lddKbXTfP4VpVQPW65PKZUPeA34SEQSReQQsBGTQrsbFczXGGZ+liuAWnccXyUiqSISCvx5x/GnFk0R5G06Y3qZC2D6AGbecbw30NF83AhsAs4BpTDVpN8216wBpgPTRcQTqASsukPW80A1c7yPlVI1zPs/BJpgqkE9AzQGJt2ZUaWUE7AeWIypdrwa00d8V5RSZZVSsUqpsvc4pZb5WjI4BxRTSnk96FwRSQJuALWUUgUx1Q7vlFUrB+IqcyDLf4Da97imdOAssMos+2FyDBiglJqglGqolLK/4/hiwA3TtRUFfgRQSr0EfAX0wFSTvo3pncxKV+A5oKa58N4JLDPL6Q3MvlctXin1vlJq8z3yXBUwiMjVLPuy3v87WQA0N1eI3DC1ILZlOT4d6KWUcjN3GbXHpAyeejRFkLc5JCJbRcSA6UN95o7jP4lIgIikYKrxFRGRz0QkXURuYqq99jKfqwMqK6UKm2tXx+6QNVlEUkTkHKaPLSOtvsBnIhIuIhGYumfuViNrAjgC00REJyJrgBP3ujAR8ReRAiLif49T3IG4LP8ztj0sODfjfA/zMfivrAw52Ym7FeihlKqrlHIFPsZU63e7+yUxA9O9XQ7sylAGSqkpSqnv7xEHcxqxWcJ9xyHuhogsAd4E2gL7gXCl1Pvm9EtgKhRHmVs+OhHZb47aF/hVRE6LSBrwAdBUKVU+i/ivRCTa/B52AvxEZKGI6EXkNLAW8LlHvr4WkU73yPb9ns3duIqpmzUIiAdqAJ9lOb4fkxKJBwIxdQOuR0NTBHmc0CzbyYDLHf2wAVm2ywElsxYYwERMfasAQzHVsC4rpU4ope78+O5MK6MQLImpFpjBbfO+OykJBMm/vRjevst5lpIIeGb5n7GdYMG5GecnmI/Bf2VlyLE5rojsBj7BVNDdBvzMx/4zk8pcUx4KfGPu49/JP8qgGbDrLteVwSqz0swIlnQF/QcRWSoi3phakKOAz8wtxjJAtLkL7k7+9fxFJBGIwtTqzODO9/C5O97DvkBxG7J8v2dzN+Zg6o70AvJhGvvZBqCUsgO2m/flAwoDBYGpNuTriUNTBI83WQvdAEx9z1kLDA8R6QAgItdEpDem5vpUYI25cHoQwZg+7gzKcvc+6RCglFJK3XGurfjy7xbQM0CYiEQ96FzzdVXC1PcfY87bnbJ8cyAuIjJLRKqISFFMCsEBuHiXPNoB9pjGCBCR9zHVSI9hakE8tC4Kc41/NXAeUzdWAFBIKVXgLqf/6/mb748Xplp3psgs2wHA/jveQ3cRGW1DVq8CDkqpKln2/ev+38EzwG/m1kkaphZYY/OEgEKYFN5MEUkzv0cLgQ425OuJQ1METw7HgXjzALKrUspeKVVbKdUIMqctFhERI6bZFAAGC+QuByYppYqYP6iPgbvZNxzFVMiNNQ9cv4ppPMFWFgFDlVI1zbXmScBv9zj3D6C2Uuo1pZSLOY/nReRyFlmTlFIFzYPAw7PIsjmuUsrFfI+VeaxjPqZxmP/UrEUkAVNhP1spVcw8prIHk9JJx9StZhXmZ+yCSfnYmfNzVzlKqUFKqY5KKQ+llJ1Sqj2mbpK/RCQEU815tvk6HZVSL5ijLgMGK6XqmScJfGmO43ePbG0Gqiql+pvlOCqlGmUZc7IY83jNOkwtl3xKqeaYZmgtvkeUE5jGQfKb78PrQLCIRJoH5W8Bo83vZwFMExLO3UPW04WIaOERB0xdCt537PsUWJLlf3lMNS+H+8QpiangDgViMNU2vc3HlmCaOpeIqUbV9W5yzfv2AcPM2y7AT5hqxiHmbRfzsVZAYJZ4DYEzmJruK83hi3tcc1lzXsre576MB8Iw9ekuBJyzHPMF+mb57w1cBlLM+S+f5Zgz8KtZThgw/o50bIqLqYvlPJBkvudfAfb3uZ5CmAY0Q82yNmKqxR7K+qzv9x7ccWyQ+dllDb/d49xXgcPm9yIeuAAMuiNvv5vzFQOsy3JsFKYB9GhMBX3pLMcEqHxHWtWALUAEpm6kPUC9e+RrIrDtAfdsvfke+wN9shxrASRm+e8FLMX0nsea72vjLMfrmZ9vDBCJaUJD0Uf9/eeFoMw3SENDQ0PjKUXrGtLQ0NB4ytEUgYaGhsZTjqYINDQ0NJ5yNEWgoaGh8ZTzWDgrK1y4sJQvX/5RZ0NDQ0PjseLUqVORIlLkQec9FoqgfPnynDx58lFnQ0NDQ+OxQillkXW/1jWkoaGh8ZSjKQINDQ2NpxxNEWhoaGg85TwWYwQaGhqPPzqdjsDAQFJTLVmUTcMaXFxcKF26NI6OVrusAjRFoKGh8ZAIDAzEw8OD8uXL828ntRrZQUSIiooiMDCQChUq2CRD6xrS0NB4KKSmpuLl5aUpgRxGKYWXl1e2WlqaItDQ0HhoaEogd8jufdUUgYaGhsZTjqYINDQ0nir++OMPlFJcvnz5wSfnEu7uppVgg4OD8fG563LODxVNEWhoaOQ9EhNh9mwYOBA+/RQC/7MMtM0sX76c559/nhUrVuSYTFspWbIka9asedTZ0BSBhoZGHiMuDtq3Bzs7+OQTaNAAevSAM2eyLToxMZHDhw+zYMGCTEWwb98+WrVqhY+PD9WrV6dv374ZK5qxe/du6tevT506dRgyZAhpaWmAye3NxIkTadq0KQ0bNuT06dO0bduWSpUqMXfu3My0WrduzbPPPkudOnXYsGHDf/Lj5+dH7dq1ATAYDEyYMIFGjRpRt25d5s2bB0BISAgvvPAC9erVo3bt2hw8eDDb9+FOtOmjGk8FIkJyfDIx4fHEhscRExZHQnQi6SnppKWkk56STnrqP9s6nR6jwZgZDFm2M1BKkTlGpxRKKewd7LB3sMfe0R4HBwccHM3bjg645HPGzcMVVw9X3DxccPVwxdXdBfcC+ShatjAehdy1wVSAWbNg9Gjo08f0v2JFqFvXtG/r1myJXr9+Pe3ataNq1aoUKlSI06dPA3DmzBl8fX0pWbIkzZs35/DhwzRs2JBBgwaxe/duqlatyoABA5gzZw5vv/02AGXKlOHo0aOMGzeOQYMGcfjwYVJTU6lVqxajRo3CxcWFP/74A09PTyIjI2nSpAmdO3e+5zNesGAB+fPn58SJE6SlpdG8eXPatGnDunXraNu2LR9++CEGg4Hk5ORs3YO7oSkCjSeOcP8ILh66zIWDl7h2+ibRobHEhsejS9PdN56Doz1Ork44uzrh4OSAvb0ddncJSilTjdG8ymvmmrgCBr0Bg96AXmcKBp3etJ2uJy0l/b7pu3m4UrxCUYpXKEqJCkUpXqEY5WqVpu4LNbF3sM+p25P32bsXNm36975y5SAhIduily9fnlmQ9+rVi+XLl9OxY0caN25M6dKlAahXrx5+fn54eHhQoUIFqlatCsDAgQOZNWtWZvzOnTsDUKdOHRITE/Hw8MDDwwMXFxdiY2PJly8fEydO5MCBA9jZ2REUFERYWBjFixe/a9527NjB+fPnM7uK4uLiuHbtGo0aNWLIkCHodDq6du1KvXr1sn0f7kRTBBqPPf6Xgzi3zxffw6bCP9w/EjAVrNUaV6ZszdIULFqAAkXzU6CoJwWK5qdg0fx4ernj7OaMk4sjTq5O2NvnbmFrNBpJSUw1hYQUkhNMvwkxSYT5hRN6K5xQv3CCroVwase5TMVRqHgBXurTgjYDW1KhTrlczWOeoGhRuH0bqlX7Z59eD7r7K/IHERUVxZ49e7h48SJKKQwGA0opOnTogLOzc+Z59vb26PV6HrSee0YcOzu7f8W3s7NDr9ezdOlSIiIiOHXqFI6OjpQvX/6+c/1FhBkzZtC2bdv/HDtw4ABbtmyhf//+TJgwgQEDBlh7+fdFUwQajyXpqensX32UTXO2c+nYNcBUYNZuUQOf8a9Qp0UNKtQpm6dq0nZ2duTzdCOfp9sDzxURYsPjuHj4CrsW7+ePn7ay5odNVK5fgZcHtOSlPs9ToEj+h5DrR8Drr8N778HKleDiAiLwzTfQtWu2xK5Zs4YBAwZk9r0DtGzZkkOHDt31/OrVq+Pn58f169epXLkyixcvpmXLlhanFxcXR9GiRXF0dGTv3r3cvn1/j9Bt27Zlzpw5vPTSSzg6OnL16lVKlSpFZGQkpUqVYvjw4SQlJXH69GlNEWg8mSQnpHDz/G1iQmNJTUojNSnV/JtGarLpvz5dj0FvJD0tndM7zxMXmUDpqiUY/cMgnuv0LCUrFX9i+tiVUhQsVoAWrz5Hi1efIzYijr3LD7Nz8X7mjPuN+RMWU791bQoWL5A5FuHglDEm4YCbhyueXu54enngWdgDTy8P8hf2wKOQO45OtvmjeWg0b24aH2jVCsqWhaAgeOklmDw5W2KXL1/O+++//699r732GnPmzKFSpUr/Od/FxYWFCxfSvXt39Ho9jRo1YtSoURan17dvX1555RUaNmxIvXr1qF69+n3PHzZsGH5+fjz77LOICEWKFGH9+vXs27ePb7/9FkdHR9zd3Vm0aJHFebAU9aDmT16gYcOGoi1M82QgIkQERnHjrB83z93mxrlb3DjrR/CNsHvGcXR2xMXNCUdnR+wd7bF3sKdy/Qq8Mrot9V+q/cQU/pZy66I/uxbt5+jmU6Qlp6FPN49D6PQYMsYm9IZ7xq/RpAre/VrSskdT8hf2fGj5vnTpEjVq1LA8gsEAERFQoICpZaBxX+52f5VSp0Sk4YPiaopA46EgIpzccY6FHy7j2ulbmftLVi5OpXrlqfSMKRQtWxiXfM7m4IKzW+733T+JpKWkER+VSHxUAnGRCSREJRAflUBUcAxHNp7g1gV/7B3sadyhPt79XqBJpwY4uTjlap6sVgQaVpEdRaB1DWnkOn8fu8qvE5dxbp8vxcsXYfQPg6jWuDIV6pTFzcP1UWfvicTZ1ZkipZ0pUtrrP8cGfd6LG+f82L3kALuXHeLoxpPky+/GCz5N6f7uK5SpVuoR5FjjUaIpAo0cJzU5jeiQGKJDYlj9/SaObDhBwWL5GfPTEDqO8H6kfdQigl6nR5emR5/VVsAomdtiFIxGIyKAeWqoCPecRZK1a0opUHZ2KGUaHMb8qxTYOZi6tezt7bB3sPvnv4PdQ2/1ZLTAhn7dl3N7fdm15AB7lx9i+297aT/kJTqOfBlPLw/cPF1x83TNsfyJyFPXlfcwyG7PjtY1pGETep2es3t9CbkRSqhfBGG3wwnziyDUL4LY8LjM89w8XekxoQuvvtUBV/ecrf0b9AZuXfDn6qmbxITFkhCdSGJMEgkxiSREm0JibBLpqTp0aTr06Xp06foczUNO4ejkYLJhcHPGxc306+zqhJunK4VLe1GklJfpt3Qh869XjhugxYTHsWzKWjbP3YFe9+8xBo9C7tRtWZPG7erTsF09ipYpbLX8W7du4eHhobmizmEy1iNISEj4z3oE2hiBRq5xYvtZ5o7/Df9LQYCpECtWvgjFyheleDnTb+FShciX343aLarjWcgjR9KNDo3h0rFrXDp2lUt/XePqiRukJqdlHndxc8ajkPu/gnt+NxxdnHBydsDByQFHZ0ccnBxwMg8829nbZRqOKTu7zP+oDMths/Vw1u0sZP18TEZlptaD0WgE868IiNFsoaw3ZhqdZfzXp+tJT00nNTmNtOT0LNtpJMYmExUUTVRwNEbjv79Vr5IFad2nBd4DWlKhdtkcuccAYbcjuHryBklxySTHp5AUl0x4QCSndp4jIiAKgPK1ytCoXT0atqtP7eer4+T84FaetkJZ7nGvFco0RaCR4wReDWbeu4s4tvkUJSsVY8iXfan9fHUKFstv6gbJBdJT09nx+37WTd9CwGWT4nFwNM0aqv5cFWo0qUqN56rgVaqQRYXR44pBbyAmLJaIwGgiA6OICIjizN4LnNh2FoPeQOX6FfDu9wIv9XmegsUK5EoeRITbfwdy4s+znPjzDBcO/I1eZ8DTy4NBn/WkwwhvbWA/j6EpAo0cIykuiSWfr2X9jK04uTjRd9JrdB3bIVcL3oSYRDbN2cEfP20lNjyOqg0r0apnc2o2rUqVZyvk+gyXx4XYiDj2rTjCzsX7uXryBnb2djRs+wwdR7xMk04Nck1BA6QkpnBmz0XWTdvCuX2+VKxbjtenD+aZlrVyLU0N69AUgYbNpKfpuHbqJr6HL3P5xHXO7fUlITqRtoNfZMiU3tmqcRoMBsJvRxITHkdseByx4fHEhMWatiPiSYpLJj0lnasnb5CSmEqjdvXoMaELz7SqpfUrP4Dbfwewa/EBdi05QGRQNKWqlKBY+SK4ZkzFdXXC1d2FouWKUL5WGcrVKkOh4gWyfV9FhINrjzHv3UWE+0dSp0UNSlUuTtGyRajZrCoNXn4mh65Qw1o0RaBhMQkxiVw4eAnfw1fwPXKZqydvZjpoK1GxGBWfKUffD1+jyrMVbU4jJSmVPxfsYe2Pmwm7HfGf426erhQo4km+AvlwcXOmZKXidHurA5WeKW9zmk8rBr2BfSuPsGvJfpLikjMttNOS00hOSCE16Z9xFY+C+ShXqwzlapahQp2yvNirOZ5eto3ppKWkseb7zRzbfJLwgCiiQ2IAeK7js7w+bTAlK93d2ZpG7vHIFYFSqgywCCgOGIH5IjJdKfUpMBzIKA0mish9fctqiiB30KXrWPvDZpZ8voa0lHQcHO2p0qAitZpVp1bzatRqVi3b/c2xEXFsmPknG2b9SUJ0IrWfr87L/VviVaqQ2fmbJ/mLeOLs6vxgYRrZJsOHkZ9vALd9A02/fwdw2zeAhJgk8uV3o9f73eg2tn22n0l6ajobZv7J4s9Wo9cZ6PW/rvT8XxftWT9E8oIiKAGUEJHTSikP4BTQFegBJIrId5bK0hRBznNmzwVmvLGAgMtBNO/WmFff6ki1RpVy7CMNuRnGmh82sX3hXtJS0mnWpRE9JnShVrNqD478iEmISST4eiixEfHEmUPmdmQ8unS9ybeP2a9PxpoDjo4OFCpRkJKVilOiUjFKVipGwWLZ73p5GIgIty74s3DSco5tPkWR0l4M/Kwn3v1fyPYAcGRQFPMmLGbfisMUr1CUMdOH0KRTgxzKucb9eOSK4D8JKbUBmAk0R1MEjwRduo6b5/1ZN20ze5YdokTFYoz5aQjPdXg227KT4pOJDIomKiiavcsPseP3fdjZ2+Hd7wV83u1MuRqlc+AKHoyIoEvTkZyQQkpCKqlJqejMvniMWdcJyDKF02gwEhEQxZWT17ly4gbB10P/I9fRyYH8RUytF0dnx3/WGTCvOaBLNxmpxUXE/8u4x8XNmeIVi1KqcnGqN65CqSol/rO+gb2DPY5ODjg6m6a3moJp2zWfM26ebg9VmZzb78vP7y3myokbVKhTlp7vdaV01RKUr10mWxWFM3suMPPNBfhfCqJJpwb0nvgqVRtUxMFRs2vNLfKUIlBKlQcOALWB8cAgIB44CbwjIjH3i68pguwRciuMee/8zvFtZ9Gl6XB0dsxWM11EOLb5FOtnbiPCP5LIoGhSEv+ZG+7gaE/n19vR/d1XKFzqvy4OskNaShoBV4IJuByM/6VA/C8HEXg1mMSYpEwf//dzuHY/ipT2omqjSlRrWJlyNUtnrl2Qv4gnbh6uFhXG6Wk6wm9HEHwjjOAboYTcCCP4ZiiBV4IJvBpiU77sHezJX9jDpIgKe+BZ2JP8hT0pUbEY9VvXpmLdcjk+O0hEOLDmGL9OXJrpENDewZ7ytctQtUElqjWqRLVGlSlfu4xVBbkuXcf6n7axaPIqUpPScHFzpkbTqtR5vga1W1SnRpOquLhpXUc5RZ5RBEopd2A/MEVE1imligGRmNZ3+hxT99GQu8QbAYwAKFu2bIMH+fJ+4jAaTQtxONv+Ueh1etZ8v4kln6/Bzt6O9kNbU7NZNWo/Xx2vEgVtknn7UiBzxv3GqR3nKFGxGJWfrUDhkoUoXMoUvEoVomz1Ujk6l/3i4cv88dNWrp68QZhfRGaN285OUbxiMcpUK4lnYQ/c3DOWgXTF1cMFNw9XXPI5m90zO2DvYGf6NXfrZNbI7e3IX8STQsVtuyeWEhsRR3RILEaj8d/LYOqN6NJM1s/pafp/tlN1pCalER8ZT1xkAvFRpi6q+MgEYiPiSYhOBCB/YQ/qt65D/dZ1eda7DsXLF82xPOt1em5d8CfsdgTXTt3kyskbXD15IzNtR2dHajWvxtAv+1C9cRWL5cZFxnN2z0UuHLzEhUOXuHXeHxHB3sGeqg0r8srotnj3e+Gx6FbLy+QJRaCUcgQ2A9tF5Ie7HC8PbBaR2veT8zS1CFYeuUmbtfMoeGgfuLuDCMHvfsiBwlXo1dhy69GLhy8zfdR8/HwDaN6tMWOmD7mrAzJLSYxNYvHk1WyY9Scu+ZwZ8EkPOo9pm2vNehHh+NbTrJi6nouHLuNRyJ0GbZ6hbPVSlK1RmrLVS1KqSomn2p4gMiiKM7svcnr3eU7vupA5S6dkpWK07NGMV9/umCuL14gIobfCuXLC1JW2Z/khokNiaDvoRYZ+1cemSkBibBK+R65w8eAljm87w83zt6n3Um3emjOC0lVK5Pg1PC1Yqggy11vN6QAoTLOGpt2xv0SW7XHAigfJatCggTwtxLw5Xn559U25GZ4gIiJ+vjfEt1Jd8T950aL4cVHx8sPwOeKtfKRPuVFyZOOJbOVHr9fLlvk7xafoEHnZrrv8MHyORIfFZkvmfdPT6WXXkgMyvO548VY+0rvsSFk3fYskJ6bkWppPAkajUfx8/WXd9C3yQYcp8rJdd+no1kfmjFsoEUFRuZp2UnyyzH9vsbRz6imd8/eXtT9uFl26zmZ5BoNBNs7ZLl0KDJD2Lr1lyedrJD0tPQdz/PQAnBQLyuvcnDX0PHAQuIBp+ijARKA3UA9T15AfMFJE7tt5+tS0CNLS4KWXuLV+O+NWneMt7ypM33WNuUUiKX7uOEyZcs+ounQdq77dyLppW0iMTeK1tzvS/5PuNjl6i49K4Ozei5zZfYGTO84Reiuc2s9X5/Vpg7NlSwAmz6Q3z/kRFRKb6aE0OiSGqFDT/4iAKOKjEihXszQ93+vKi72ba4OJNuB/OYgVX//B7qUHsbe3o3iFoibfSwXzUapyCSrXr0CleuUpV7N0jt3fgCtBzBn3Gyf+PEuR0l5Ub1KFhi8/Q9vBL9q0ZGhUSAxzxi1k/6qjlKxUjLaDX8K7XwuKli2SI/l9GsgTXUM5xVOjCCIiYNQoWLuWvVfCGbzwBAsHN+JFpyT45BO4xxJ1vkeu8OOIudz+O5DnOj7L4C96W2WIlZKUyoUDlziz+wJn9lzg5rnbiAiu7i7UeaEGL/dvScsezbLVX5uems7meTtZ/uU6YiPiM/fb2dtRsFh+CpUoiFeJguQv7EmzLo1o8kruukd4Wgi5GcamOdsJ848kMSaR+KhEAq8EZzrrc3RyoHztMlR6pjxVGlTixd7N8SjobnN6IsLRTSfZuWg/18/cIvRWOJXrV+DNWcOo2aSqTTKPbzvDiq//4MLBSyil6DjCm2Ff9yVf/nw25/NpQVMEjyMi0KwZfis28Pbma5ktgl8SjlG4oDuMHPmv05Pik1nwwTI2z91B4dKFeGv2cJ7raPn8bIPBwJZ5u/j1w2UkxSXj6ORAzWbVqP9SHeq3rk3VhpWyXVs06A3sXLSfRZNXEREQRf3Wdegyph3FyhXBq2RBPAt7aI7KHjIGg4Gga6FcP3OLG2ducf3sLa6f8SM+KgGPgvno8+FrdB7TLtu+pMQ882ju+N+IDIqmw7DWDP2qr82WyyG3wvhj+lY2zNxGweIFGDtrOM26NMpWHp90NEXwmBK2ZBVBX35PsZ++o1T9mkQuWk7o7AW4795B+SxN4iMbTjDjjV+ICo6hyxvtGPxFb6tW+7p2+ibTR8/nyokb1G9dhx4TulD7+eo5NnXPaDQqQHRyAAAgAElEQVRycM0xfvt4BYFXQ6jeuDKDp/Th2dZ1ckT+w8BoNBIXmUBMaCzRobGZv7o0ncmltZND5oLxGf+9ShWidNWSOeLD52EiItw468eCiUs5uf0cxSsUZeiXfbLdEgRITkhh8eTVrJu+BfcC+Rg+tR9tBrWyucV35cR1fhg+l5vnb9PCpwljpg+xeRbck46mCB5TVhz3p0ViIKVWLYLQUGjVCr+uvTkWnkavxmWJDI5m9lu/cnDtX1SoU5Zx80dR4znLp+0FXAliw8w/2TRnO/mLeDLq+4G82Pv5HCm0khNS8L8UyM3z/myas53rZ25RvlYZBn/Rm6adGz7UgtFoNJIQnUhcZALpKemkmYMu1fSbsVhNxvoApmmcBmJCY7l84jqBV0OIDY/DaDA+OLG74ObhSqmqJShdtQSlKpfAzdMtc/pqhiVyxraDkwOu7i64erji6u6Cm8c/249ifOTkjnP8/N5ibp6/TbVGleg0sg1la5amWqNK2Wq93bpwm+mv/4zv4SvUbGaaclqnRQ2b3gu9Ts/q7zax+LPVOLk4MnxqP9oNfUlrXd6BpgieMESEbb/sZt6ERejS9PT7yIceEzpbVFAY9AY2z9vJ1l92cfPcbZRSdBrVhiFTeuNewLZ+1pSkVA6uOcbN87fxv2TyWZOxaAlA8QpFGTi5Jy/2bp5rH2d6mo6Lhy5zbu9FIoKiiA2LIyYszuzNNN4mwzJHJwcq1StP+VplKFSiIAWLF6CQORQsXoCCxQrg7OqELl2faVGcsfKZLk1PuH8kgVeDCboaQsDVYIKuBhN2O9LmpQRd3V0oUakYpSoXp1TlEpSsXJySlYtTqnJxCpUomGvjKAaDgV2LD/DbRyuIDIoGTAZ3rfu2wLv/C5SrWcYmuUajkZ2L9vPL/5YQGxFPxbrl6DKmHS/1bWFTazTwajDTRs3n3D5fKtevwLj5I6naoJJNeXsS0RTBE0TwjVB+HDGXs3t9eaZVLcbNH0mpypbNrb5+5hY/jJjLtVM3qd64Mi/2fp4WrzWx2aZARDiw+ijz3l1ERGAUTi6OlK1RmnI1S2f+lqtVhhIVi+aKAgi5FcbJP89y/M8znN1zkdSkNOwd7ClUwlRIFyyWn4JF81PAvF2giCcu+VxwdHHE2dUJp4xfVyccnRywd3Qwu3kwuXpwdnXK8Vq4Lt1kHGbQGdCbXVMY9AbzfwO6NJPhmMktRgopiamkJKSSkphKbEQcITfDCL4eSsjNsH8tIVmktBdd32xPxxHeuTZwatAbCPULN9kLLDvIiT/PYjQYqdKgIi/3b0mrXs0pWNR6W4XU5DT2LDvEhpnbuHn+Nu4F8tFuyEt0fr0tJSoWs0qWiLBv5RHmvvM7seFxdH/nFfp/0l1zboemCJ4IDAYDf0zfym8frcDe0Z4R3/Sn/bDWFtUCU5JSWfzpKtZO20L+wh6MmT6EF7o3zVb3jJ9vALPGLuDsXlPta/SPg6jVvFquN8fDAyLZMGMbRzaeyHTTULxCURq1q0+jdvWo92KtHF8POS9iMBiICIgi+HoogVdDOLj2KGf3+uLm4Ur7oS/R7a2OFCuXu1MrY8Ji2bv8MLuW7Ofa6VvY2dvRtHNDhn3dzybDLxHh4qHLrJ+5jUPr/kKMwnOdnqXfR92p1tC6mn1ibBLz3vmdPxfupXTVEoz/eTR1WtSwOk9PEpoieMy5ddGfH4bN4fLx6zTp1ICxs4dbXIs/sf0sP42eT6hfBB2GtWbY1H7ZmhKYFJfEok9Xs37mNvJ5ujJ4Sh86DG+d6wog8FoIK6euZ9fi/RiNwrPedWjUrj6N29enVJUSj9VgbG5x7fRN1v64mX0rjyAivODTBJ/xr1CtUeVcT9vPN4Cdi/azed4OdKk6fN55hd4TX8U1n4tN8iKDotg8bydb5u0kPiqBbmM7MPCznlYr+VM7zzFt5DxC/SLo/Hpbhn7V16qJFE8SmiJ4TDHoDaz6diOLPl1JvvxuvD59CC/2am5RoRdwJYhf3l/KkQ0nKFOtJG/PG0ndF2ranJdbF/35/ZOVnN55ntSkNDoM92bwF73IX9jTZpl3IyEmkbN7LnJq53kCrwZnztBJjE3C0dmR9kNfovu7nXPUh86TRkarafP8nSTHp+Dm4UqRMl4ULu1FEXMoXNqLImW8qP18dZsL67sRHRrDL+8vZeei/XgUzEej9vV5rsOzNGxXD89C1k8VTYpL4pf3l7J53k6KlPFi5HcDecGniVWKPyUxhV8nLmfDrD8pUakYX/85yeoupycBTRE8hty66M93Q2Zz9eQNWrz2HGNnD7fIV4xep2fVtxtZ8tlqHJ0d6fFeF7q/29nmeeApSaks+WwNa3/cjJunKy27N6XDcO9sWxVnze/l49c5teMcp3ae48rx6xiNgpuHKxXqlqVQiYIUKlaAYuWK0Lpfi1x3BvckkRSfzJ5lh/C/FEhkkGmh+/CAKGJCYzMHrAsUzU/fSa/RcYQ3jk45t+70xcOX2bZgN8e3nCY2Ih47O0Wj9vUZ/eMgi8e07pQ3441fuHnuNnVb1mTM9CFUrFvOKhnn9vsy+bXvsLNTvDVnBC1ea2J1Ph5nNEXwGKHX6Vn5zQaWfr4GN09X3pw1nJbdm1oU9/qZW3w3dDY3zvrRwqcJb/w0JFsF59FNJ5n55gLC/SNpN+Qlhk/tZ7MB0J1Eh8awePJq9iw/RHJ8CnZ2imqNK9Pg5Wdo0OYZqjeurLmTyCX0Oj3RITH4Xw5mxdd/cG6fL8XLF2HA5J681Of5HO3mMxqNXDlxg6MbT7Bh1p/o0vT0mfgqPd7rYnXlxGAwsPXn3SyctJyk2CQ6jmzD4C96WdXVGXAliC/7TOf6mVu06tmMN2YMzfFWbV7lkTudy8nwJDudu3HOT0Y3mCDeykc+7/m9xIRb5tAtLSVNfnl/ibRx6CE9SgyTA2uPZSsfYbfD5ZNuU8Vb+ciw2uPkwsG/syUvK8mJKbJo8irp5N5X2jr2lG8Gz5QDa45KfHRCjqWhYTlGo1FObD+b+d4NqzNODm84LkajMcfTigiKks96fC/eykcG13hLzu6zzHnincRFxcuMN36RNvbdpUfJ4XJ4/XGr4uvSdbLk8zXSzqmn+BQdIgfWHLUpH48bPGqncznJk9oiWP39Jn6duBT3gu6MnTXM4mbrtdM3+arvdAKuBNN20IuM/H6AzYPBunQda3/cwtLP1yAi9P+kB6+N65jtmnl8VAJXTt7g8l/X2DxvJ9EhMbR47TmGfNk3z7sVTk/TkZqUmjm9U6/T/2sbARQopcwBlJ0dSoGDkwNOLk44uzrh6OKIk4tjnjVyyrD+XvjRCoKuhVCzaVVa932BWs2rUb52mRzN9/FtZ5gx5mdC/SJ4eUBL+n/c3aY++6unbvD90DncPH+bF3s3Z9y8kVYNJt+6cJtvB8/i2mlT62DCb29k25VGXkbrGsrDxEcnMPPNBexdfpjmXRsxbv4oi5qqIsKO3/cxY8wveBb2YPzPo2nY5hmb8/H3sav8OHwufr4BNO3ckNenDc72gGyoXzjzJyzi4Nq/MvfVfr46w77u90jXKzYYDITfjiTwWghB5hAREElSXLIpxKeQbN7WpetzNO0M+wRPL3fyF/ln1bMChU3bhUoUpPKzFShTreQjcbSn1+nZ8ds+ln25jrDbEQC4ebpSo0lVajWtRq3m1aj+XJVsz7xJTU5j6eemsSeD3mDqevymv9VGjbp0HSunbmDx5FVUbVSZKZs/sKr7Uq/Ts+Lr9fz+yUp6vNuZ4d/0t/ZSHhs0RZBH+WvLKX4YPpe4yAT6f9ydXu93tchFb2RQFNNGzeevLaep80INPlo53uZVwJITUvh14jI2zt5O4VKFeHPWMJq+8uBuxPuRlpLGqm82smLqHyil6PZWR571rkPVBhUfiZfIlMQUDqw5xpENJwi4EkzIjdB/GWO5urtQrHwR3AvkI19+N9w8Xcnn6Yabpxv58ruZVja7izsIe0d7lFLmJjWQ2bwGMRpNFsapJgOy9CzuLNKS04iPTiAuIp7Y8Hjzb9y/lE6+/G5Ua1SJ6o2rUP05U7DFWMtWRIRQv3B8D1/B9/BlfI9cwe9iACKCo7Mj3c3TQ7PrjyoyOJpV32xgw6w/KVDEkzdmDqPFq89ZLefw+uNM6T2NkpWK8fX2SVYvizpt1Hy2/ryLb3d/wjOtalmd/uOApgjyGElxScwdbzJ2qVCnLO/9/gaV61V4YDwRYeei/cwZ9xu6NB1Dv+pLlzfa2VxzPLrpJDPG/EJkUDRdxrRj8BTrnNXdLX+H1v3FvHcXEXY7glY9mzH8m/4ULVPYZpnZyYvvkSts/3UP+1YdITUpjeIVilK5fgWTi4YqJShVxeT/p2CxR+8UTkRITkgh3D+SKydM3WiXj1/j1gX/TB9HZaqVpN2Ql2g7+MVHMsCZFJfE38eusXvJAXYvPUjRsoUZ9cMgnu/WONv379rpm3w/bI5posNrz/HGjKFWT3Q4u/cin3T9Bo9C7ny9fRKlq5a0OG5KUiqjn32P2PA43pgxlNZ9WzzydyKn0RRBHuL07gt8P3Q2kYFR9PxfV/p93N2ifsnI4Gimj5rPsc2nqP18dd5Z8LrN/evRoTHMftu0yEf5WmUY9/Mom/3DZ+DnG8DstxdyZvcFKtQpy5jpQx56zUqv0xN2O4KDa/9i+8I9BF4NwSWfM616NKPt4Bep1bz6Y/dxpySlcv30LS7/dY2jm05y4eAlHJ0ceME8jbdi3XLky+/20K/rwsFLzHjjF25d8KdBm2cYM30wZaqVypbMrM7jnF2dGPndANoOftGqa7t66gYT209BKcW7v75ulSv2kJthfD1gBn8fucLzr5qmbD/MVlhuoymCPMLl49cY2/RDSlUpznu/v2mxp9C4yHhGN3iP+MgEhkzpQ5c329k0eCci7Fl2iFljF5CalEbfST70eK9ztuaP374UyKJPV3Fg9VHcC+Rj4Gc9eWVUG5tWobIEo9HI2T0XMx3bhQdEEhEQSURAFNEhMRiNpne4TosatBn0Ii27N3miXE74+Qawee4Odi7eT3J8CmBaNL5YucJUqleeyvUqUKl+BSrXr5DrhZhBb2Dj7O389vEKUhJSqd+6Nh2GeWfbfUnAlSB+HDGPCwcv0axLI95ZMNoqY7SAK0F85vM9fr4BdH/nFYZ+3dfi78VgMLD2h8389tEKCpf2YsaxL5+Y6aWaIsgDGPQGPuz0FddO3WTRjZnk83SzKJ7RaOSjzl9zZtcFfjz4uc3uAqJDY5g2aj5HN56kZtOqvLPgdcpWt70GF3wjlMWfrWbP0oM4uznT9c32vDauU659NAkxiWxfuJeNs7cTcjMMACcXR4qWLUyRMoUpUsaLomUKU6S0F3Vb1rSqW+BxJCUpleNbzxDuH0lsWCxBN0K5ceYWoX4Rmed4lSxI5foVaNa5EW0Gtco1u4yYsFg2zTEpp9Bb4dRtWZO3547IVgvBaDSy/qdt/Py/xXgW9mTcvJE06WR57T49Tcfc8b+zac52GrR5honL3rJKmfgeucKE1pOp0aQKX2+flKPGdo8KzY7gERNwNVjeaPKBeCsfWfPDJovjRQRFyQftvxBv5SPrZ26zKW2j0Si7lhyQboUGSgfX3rLqu42i1+ttkiUiEuYfIT+OmCttHXtKB9feMu/d3yU2Is5meQ/i5nk/+XHEXOmUr694Kx95u8Uk2bvikMRGxOXKXPfHnfjoBDmz54Ks/n6jfNV/ugyq9qZ4Kx/pX2mM7Ph9X7ae/YMwGAyy5edd0rXgQGnv3EsWfbpK0lKzt9D8tdM3ZXjd8eKtfGTqwBlW25ts+XmXtHfuJf0rjZGb5/2sirt76QHxVj7yw/A5T8S7hoV2BI+8kLckPE6KwGg0yuZ5O6RTvr7SteBA2bP8kMVx9644JN0KDZSObn1k/cxtNr2IUSHRmYZhbzb9QPwvB1otI4OEmESZ/fZCae/cS9o59ZQZb/wikcHRNsu7H0ajUQ5vOC7jW30s3spHOrj2lu+GzpZrZ27mSnpPMkajUY5tOSWjnp2Qaci1b9URMRgMuZZmVEi0fNH7x8z0zu33zZa89LR0WThpubRx6CE9Sw2XY1tOWRXf98hl6VFyuHRy7yv7Vx+xKu6CiUvFW/nI2mmbrYqXF9EUwSNAr9fLp699K97KRyZ4T5bwgEiL4hmNRvlm8EzxVj7yRpMPJOBKkE3pH9l4Qrp5DZL2Lr1l1bcbslUTPLb5pPQoOVza2HeX74bOllC/cJtl3Qu9Xi9XT92QVd9uyGw99S0/WlZ+s17iIuNzPL2nDaPRKAfWHJWhtd4Wb+UjI555RxZOWp6ryvX4ttPSr8Jo8VY+8t2QWdluOV45eV2G1Rkn3spHpo+eb1XlKCIoSsY2myjeykdWfrPe4ngGg0E+efUbaWPfXc7suWBLtvMMmiJ4BGyau0O8lY8snbLWqtrX+pnbxFv5yC/vLxG9zvrCOzkhWaaNmifeykdG1n9Xbl+yvRWQnJgiP440yRped7xcOXndZll3IzI4Wv6YsVU+efUb6VZooHgrH/FWPjKk5luyZf5Om65f4/7o9XrZuXi/jG74nrSx757Z3bZv5WHRpetyPL3kxBSZP2GRtHXsKa8VGSx7VxzKVjdLWmq6zBn/m3grH1k0eZXVcTNayL+8v0TS0yzrtkpOSJbeZUaKT7GhcmrXeVuynSfQFMFDJi4yXrp5DZLxrT626qX3vxwoHd36yAftv7DpY/E9clkGVB4jL9t1l7nv/C5pKWlWy8jg0l9XZWDVN+Vlu+4yf8KibPf1ZiUtNV2Wf7VOOrn3zaz5fzdkluxaciDXups0/kt8dIKs/n6j9K80RryVj/QsNVwWf7ZaokNjcjytm+f9ZEzj/4m38pFPX/s2W2kYjUaZOmiGSRl8usqqCkNyYop8P2yOeCsfGd3wPYu7S6+duSmDq481fQ/vLbZYieQlNEXwkJk+er60cehh1eCULl0nYxr/T7p5DZKIoCir0ktPS5cFE5dKG/vu0rf8aJudeYmI6HV6WTR5lbRx6CG9y46Us3ttl3U3jm46KQMqmwqeT7pNFb+/A3JUvob16PV6ObrppLzf7nPxVj7S3rmXfNV/ugReC87ZdHR6WTF1vbR36S3dvAbJriUHbG4dpKWmy1f9pv/ThXrVurweXHdMunkNkk75+sqmuTssykdyYor8MPwfJWJrt+2jQlMED5Grp27Iy3bdZdZbv1oVb9Gnq8Rb+ci+VdYNZvn5+mcOBH47eJYkxiVZFT8rAVeC5M2mpv75r/pNl4SYRJtl3cntS4EyseOUzAHEE9vP5phsjZzD/3KgzHxzgbzi0U/aO/eSXz9cJskJyTmaxu1LgZnv2aTOX2WrFbhv5WHpVmigdMrXVzbO2W71uMF7bT4Tb+UjH3X52uIxjKxKZNuC3bZm/aFjqSLQ7AiyiYgwscMUrpy4waLrMy12oPXXllN83GUqrXo154Mlb1mcXkpiCoOqvYVRb+DteSNp3rWxrVln/6ojfDd0No5ODrw5azgv9mpus6ysXD11g98/WcnxrWdw83Cl/yfd6fpm+zy31kB6mo7YsFjTimhhcaYQGktMWCyJcUmkp+rMfoNM/oJ0aSYfQmIUUGBnZ4eyU9jZKZSdHXZ2CidXJ9w8XHHzdMXV3RU3DxdcPUx+jIqULUyJikUpUaHoI/G/9CCiQmL4+X+L2b3kIJ5eHrz6dke6jGlntVO4e2EwGFg3bSu/fbScgsUK8N3eT212chgZFMV3Q+dwasc5JiwcQ5uBrSyOm2Gv8Mv7S2j+6nN8uOxti+JFBEbxzcAZnN3ry+yTU3NsoabcRDMoewjERyfw/dA5HNlwgh4TujB8ar8HxtGl6/h14nLW/LCJinXL8eW2D/EqYZl/lejQGKYOmMHpXReYfvgLaja1zZunXqdn/oTF/PHTVmo1r8akFeOsdth1N1KSUvn945X8MX0LHoXc6fx6O155vW2eMNkXEQKvBv/LoVrAleC7npsvvxseBfPh5OqEk4sTTmZ30o4uTjg5O2Bnb2eyZhbBaBTEKBiNRowGI2nJ6SQnpJCSkEJyQiopCSmkpaT/Jw1PLw9KVCxK8QpFKV21JE07N6Jqg4p5wh3Gpb+usWzKWo5tPoWbpytd32jPq293zDHDwaunbvB+m89BKd6eO4IXfCxbhOlOjEYj77T6hNu+ASz4e5rVThh/ev1ndvy+j9XhCyxeujMuMp7uxYbR/+Pu9P+kuy3Zfqg8ckWglCoDLAKKA0ZgvohMV0oVAlYC5QE/oIeIxNxPVl5UBH8fvcKU3tOIDolh+NT+dHurwwM/4uAboUzpPY2rJ2/Q+fW2jPxuAE4uThal99fW03w3eBbJCSmMmT6EDsO9bcp3ZHA0X/T8Ad/DV+g2tgMjvu2fIzX1E9vP8tPo+YT6RdBxxMsM+7pvjtUkbSXcP4J9K49w8fBl/j5yhbjIBAA8CrlTq1k1qjaohFfJghQsXoCCxfJTsJjp19JnYikGvYGk+GTCb0cScjPsn3ArnJAboYT6RWA0GClRsRitejajVc/mVKhT9pErhetnbrHsq3UcWvsXzm5ODP68t82uTu4k8GowX/f/iSsnbuDd/wXe+GmITa0k/8tBjKr3Ls26NmLSivFWxT279yITWk9m0srxFq8ICDC22UREYMbRL63N7kMnRyyLARfAB5gOrMZUsL8H1HpQnxNQAnjWvO0BXAVqAt8A75v3vw9MfZCsvDRGYDAYZPnXf0gbhx7Sr+Lrcvn4NYvi7V52UDp79peuBQfKwXWWryaWlpous99emDmd08/X39asy9l9F6V78aHSyb2vVYZu9yM6LFa+7Dstcxzg/IGcW9nMFgwGg5zYflY+7jo1c6rkwKpvyjeDZ8qWn3eJ398BuWpYZQtxUfGy9Zdd8l6bzzLzPKTmW7Lo01V5YnDS7++AzLGeN5p8ILcu2v4OZkWXrpPfP1kpbRx6SJ9yo2ye8LDk8zXirXzk8AbrVi3T6/XiU2yoTOw4xSqbm0WTV8nLdt0tXk3wUUJ2B4uBT4FTwPdAH8Ab6ASMBzYBO4G6liRilrcBeBm4ApSQf5TFlQfFzUuK4Kv+plkLn/X4XhJjLRtYXfKF6UUd2/xDqwyz0tPSM6ffzXxzQbamhu5ackDaOPSQwdXH5tiHfGDNUenmNUjaOfWU3z9ZmaPTTS0lNTlVDq8/Losmr5LPe36faczkU3SI/PLBUgm5FfbQ85QdosNiZePsP2Vcy4/kZTuTUhjbbKLMHLtAtv+2V26e93skthZGo1F2Lz0grxUZLO2cesqq7zbmmAuGv4/9M23ZFrcq6WnpMrzueOlRcrhEh1lXOC+abJqw8V6bzyyedHH5xHXxVj6yae4Oq/P6sMkJRdDxvhGhKNDQokRM3UD+gCcQe8exmAfFzyuKIOx2uHgrH5n99kKLPwKj0Sg9Sg6X/7X93OoPeNuC3eKtfGTH7/tsya6ImKbvLZy0XF626y5vt5iUrRlGGSTGJcm3g2eJt/KRMY3/l61Wii0YDAY5s+eCfDt4lnT27C/eykdetusu/SuNkY+6fC27lx18JEopp4kIjJQln6+Rsc0/zPS7lOF+443n3pcFE5c+dAvsmPDYTOv5L/tOk5Sk1ByRm5yYIh+0/0I6uPaW4BuhVsf3PXpF2jv3kt5lRsrFw5ctjmc0GmXL/J3S1rGnjKz/rkSFPHg2k8FgkAGVx0gH196yY5Ht3+bDINuK4K4ngx3gaWUcd3PL4lXzf4sUATACOAmcLFu2bO7dKStY/tU68VY+Vr2oNy/cFm/lI1t/2WVVWnqdXgZUHiOjG75nc80rzD9C3m4xSbyVj3wzeGaOTAk8u/ei9C0/WtrYd5cFE5fmimXqvfDz9Zdf3l8ivcuOFG/lI6949JNvBs+UU7vO51iBlFfR6/Xi93eA7FpyQOa+87uMb/WxvGzXXTp79pdFn67KEQVvKUajUZZOWSsv23WXUc9OkLDbOeN+JDwgUl7x6CcTO06x6Z2/euqG9K80Rto69pRV326wSsbxbaelk3tf6VfxdYvsE6JCojP9Yk0bNS/PVjxyTBEAy8w1+XzAZSAEmGCRcHAEtgPjs+x7bLuGhtUZJ2ObTbQqzurvN4q38pEw/wir4u1aYvKCeOiPv6yKl8Hh9celW6GB8opHP9m15IBNMrKSmpyaOVYxsOqb4nv0SrZlWsqZPRcy56C3ceghH3SYIruXHXziC/8Hceuif2bt/NXCg2XVtxskNfnh3ZNjm09K5/z95dXCg21+T+9kzQ+bxFv5yIZZf9oUPzE2USb7fJtpJ2CN59LLx6/Ja0UGi0/RIXL5xINdq+h1epk/YZFp7OS593NMIeYkOakIzpp/+wI/mAv38xbEU+bB5Wl37P/2jsHibx4kKy8oghvn/GxyDf1+u89lSM23rIpjMBhkSM23ZFidcVYPbOr1epn55gKTJWSDCVZbX96Na6dvyuAab4m38pEZb/wiyYkp2ZZpUbpnbsqkV74Sb+UjfcqNkrU/bs4VVwiPO5dPXM+0EO5Rcrj8MWOrJMXnrEHYvfC/HCijG/xj3Jjdd0Ov08t7L08Wb+UjXw/4ySZlbzQaZd30LdLOqaf0LT9arp223MlewJUg6VdhtHRy7yundp6zKM6Btceks6dJIZ7enbf8EuWkIvA1F/6rgZbmfecsiPc8IMB54Kw5dAC8gN3ANfNvoQfJyguKYOU368Vb+VhVEB3ecNw00Dt2gVVpbZz9p3grH9m5eL+12ZQdv+/LTDMnmqvBN0Pl1cKDpVfpEXJyR+5bBut1ejmw9lhms7tz/v6yYur6bA2UPy2c3XdR3nr+w8zB8o1ztj+UgeX0tHT59cNl0sa+u0zwnpztZ6XX62XRp6aZOe+1+cxmeZf+uio9Sw2XN55736p4kcHRMrj6WBlcw/IKXMCVID9UYsQAACAASURBVBlcfaz0LDU8T61jkJOKYCwQBGw11/LLAQctEZ5TIS8ogh+Gz5HO+ftbdK7RaMyc0vZ6o/9ZNAAlYvoAMpqab7eYZFMz/82mH8jg6mNz5GWMComW4XXHS9eCA3PcB82d6HV6+WPGVulTbpR4Kx/pV2G0rPpuo9WLkjztGI1GuXj4soxr+ZF4Kx8ZVnvcQ3PtkVEJmdT5qxwZO/pz4Z5MebY6fFv82Wp52a671e6wMxSRNS2cbb+a8puX1tDIiVlDTTEbnN2xXwEOlgjPqfAoFYHBYMicYvZJt6kPPD85MUUmd/8u03ePpYV5XFR8pg+U6aPn2/TiXztz07Sgxo/ZX1Dj1K7z0r34UOno1ifXWwJXT93I7F4Y1/IjOfTHX7m6qtbTgNFolANrj2V6Gf2gw5SH4uwvozX7Ra8fcuQZZsj7rMf3NrVuLv11VbyVj+xedtCqeIfXm1rz1oyFRQZHi7fykWVfrrM2m7lGTiiCucBpYAUwCChuicDcCI9KEWQt1KcOnPHAJmrIrTAZ8cw70sa+u1WzFm6e95P+lcZIe+desuVn62YXZZAQkyjvtv5UOrj2lrgo26cU6nV6WfiRabrpkJpv5ZjNwd1ITkiWOeN/kzb23aV78aGyb9WRPNWsfhJIS02XVd9ukM75+0sbhx7y05ifc33K6apvN2SOGeSE8V7GhIuvB/xk05hZN69BMnXQDKvihdwKs8lWYNSzE+TtFpOsipOb5GTXUHVgHPAncBT4EngBsLckgZwIj0IR6PV6eev5D6WNfXdZ/f2DjWcS45Kke/Gh0qXAADm+7bTF6QTfDJVO7n2lR8nhNs/EyejTbOvY02ZFImKqRWYovpwY+Lsfl09cl34VXxdv5SM/jpyXo15PNf5LTHisyVW6Wenmdivvt49XiLfykYUfLc8ReRldrUunrLU67he9fpBuXoOsmj5tNBqlS4EBMqXPj1altWDiUmnj0OOhTue9H7llR+BqHvCdYWkCOREehSLIaJJu/22vRefvWX7o/+ydd1xT1/vHPycJgbCniAoC7r21rVoX7lUVHHWLo+466rbWarVVW2tdtc7Wuvfee+KeoKDsvTdk3ef3R0iKyLg3CWj7+75fr/sS8DznHkJyn3OeSV7MW3Brux3f7qWOIh+9kmiINJmoo2pPpR6Wgw3qSUD0T8jq30sPGjRPcWh7Onc1HUiD3MZ98JIU/9948ySERtedRh1FPrRt/u5ScyZzHKcrPfLHrJ0Gm4k4jqNpbRbSmPrTBcveO/OIOok1OQ9C+n5oqwj8tXg/75Pqpd03yIt5fzQ9N4yqCAA0znMaT0Ze/aCyvMpaESTHpdIXdsNpZofveL8Blg5aTd7OvoLe8BzH0bCqE+kbr8V6rTMtKZ3GNphB3c2/NFgJJMUkUx+HETTls3mlZp/PTMvSfbjmdFlicD/b/6EfOVm5tMp3g8Yn8/lC3r21haKQK2jN+D80PoquSw12/O/58Qh5MW/BTZyIiO6eekg9LAfTILdxvJtHKeQK+mn4Wl3/ZT4O8PvnnpAX86bnNz6ODY4xTUPfAngOYHHe9RTAAj6TG+sqa0Xw04i11EU6gHfvX4VcQb1th9GqUesF3eflndfkxbzp7PbLgteYmZpJ45vOoq5mg3jHOxfHYu+V1NVskEH9josjwC+QhlaZSJ3EPvTX4v3/cwZ/CNRqopcvid6+JSLNCbCH5WDq6ziS7p56WGq3PbnpPHWRDqDh1ScbtFPWZunP7bpUL9NL0KNgGlBxDPWyGcr7M8NxHG1fuEe3eSkpPyPw4VtNwMavhgdsGANjKoIAAGb5vpcBCOAzubGuslQEz2/4axpdz93FW+bhhad6VT/8beJm6iYbJPhNLc+R05TP5lEX6QC6e/KBINnCuHbgNnkxb9rz4xGD5yqM/auOU2eTAfRl5a/o+c2AUrnH/yie81sOU06zFkS+vkSDBhF16EDhD1/S7wce0NiGM8iLedPm2TtLzVn//IY/eTv7Ui/roQb5J079cYE6SfrT6HrT9DoZxIUn0Jj606mzyQBBGfenNl+kTpL+NK7RzGKd7UqFkqa2mk8dRT50ZO1pweszNsZUBGcA2Ob73hbAST6TG+sqS0Xwy5iN9IXdcEGOUm11UaHO1dF1p9H8HsuELlH34DZG6QilQklj6k+n0fWmlYq9+NKu67rm5f8Vh/AevzAKTnj3dwlOyKQ9fmEfaEUlkJpKOY2b0pAfT+rWHXHzPj2v2pCC4zNIniPX9eXlEx2nL3HhCTSq9lQa4jnBoGiihxeeUk+rITSl5Xy98hUy07JoSsv51MdhhCB5v9OPyIt5087vDxQ7Ljc7l7794ifyYt5054ThGzVD4KsIRCgCxthaxthvAOQAXjLGdjDGtgN4ASCzKLl/OxGvo1G5TiXeHYsAID0xAzJLM0EyABAfnggXT2ehS8Tz6wEwMzdFm/76dXbSkpOZg297/4SQ5+EYOLsPxBLDG47kJ/RlBFaP3YS6rWpi/p6vP3ijGmPRwtMB0/Y9QUhiFgAgJDEL0/Y9QQtPw7u8lQqHD8Ns9Ch879sW0/Y9wZXX8Zj0RA63Vk3gEf4aUjMpvt40DsMW9ceFv65hRttFSIxKMvoyyrk6YvACb8SGxOPxped6z9PYqz6mb/4K/rdfY+vc3YLlLazNMeCb3shIzsTjyy94yzXv2gj1WtfCtf23ix1nKjPFvN1TUa2xB5YPWYPIwMI74X1MFKkIoKn8+RDAEQDzAFwBcBXAfGhOCf9JIl5Hw7V6BUEyaUnpsHG0EiSTmZqF7IwclHNzEiQHAM9u+KP2Z9UN6iyWlpiOWV7f4+H5p5i++St0GNxa77kKIzsjB997r4LMygzz90776PoV6wuRHO72aqzuXwfT9j3GldfxmLbvCVYPaAgPx49U0aWlAY6O8HC0wFSvahi5/T6melWDtWsFIDUVAMAYw9BFPvju8DcI84/ExOZz4X830OhLadWnOawdrHBq80WD5mk7oCV6TeiMg7+cwO1j9wXLN+3cAOZWMlw/cEeQXJv+nyH0ZQRCX0YUO85UZopFh76BiVSCRX1WIDsjR/Aay5IiFQER/VncVZaLLCsyU7OQGp+GSjUqCpJLT8qElQN/RaDIVeDHob8BAKo3FdYAOyMlEyHPwlGvdW1BcvmJC0vAtNYLEfwsDIsOfYOuvh30nqswiAi/jNmIqKAYzN8zDY4V7I06f2lDxIHU0SD5LVDW3+DSl4BLHgUuvh0orj4ovikqq5vjUN/RaCLrgL19pqEy1wNcQldwKRNAmX+AFPdA3EdycO7SBdi1CyEJmVhzMQjbRzbD+jMvkXvmHPDpu6fKll80x5rbP8BUJsXMtotwdvsVoy5FaiZFx2FtcPvofaTEpRo017ifh6NaE0+sGLEOMcFxgtfxaa+muHX0HlRKFW+5z70/gUjEcHXfrRLHOld2wvy90xD5OhorR67XmtY/Soo7EQAAGGM9GGOPGWPJjLF0xlgGYyy9LBZX1kS9iQUAVKruwltGkatA6Itw3icCIsKKEetw7/RjTN04Fg3a1BG0Rv87gSAi1GtdS5CcFrVKjTmdlyA5NhU/nluIz3o302ue4jiy5jSu7b+DkUsHoUFbYb/fh4C4TM1DP3MtuGRfUHwzUEJbUMpIUMb3QM5hgEsFpI0Ai4lgVnOQIpqIQ6+7IZW+wOXQRsikRoCkCqB6A8pcBUoeAopvDC6+JbikQeDS5oJyTn0Y5VCzJlKq1UJkly+w0SUF7QL9sPPwYqyr2w0h2e8/nDzqumHdveWo93kt/Oy7ATcO3TXqcrqN8YJapcbl3TcNmkdqaoKF+6eDMYa1k7cKlv/c+1NkJGfixc1XvGXsnG1Rv01t3qeQRu3rYcyKobh52A9X9pasPD4UfM7rvwLoC+A5fcwqzQhkpmg+pHwf6mq1Gj8O/Q0JEUmY8OtIXjLndlzFtf134LvsS/QY11HwGt88DgEAuNWuJFgWAG4cuovIwBh8e3Cm3sqkOA6vOYWN03fgkx5N0H9Wb6PPbyxI8QiUcxRQPgZUgdAUymWApDpg1h3MpDYg9gAk7oConK6R/N574ahoJ8PP5wOxesBouDlaIEyRgO47nuMv3xbwcLIAccmA4imehd6Fh10yLBEN5F4C5RwCB1PEZDdBJZc+gGl7MJEwk6K+nPMZj9ZdusPl6jnAzAyy7VvRz6Y8/IKTCjVpWdtbYdnp+RhTbzr2/HgErfq20L0GhuJWsyIqVnPB6S0X0XF4G1jb6/8auHg4w2vo5ziz5RJUSpUgE6Rng8oAgNiQeKAd/3tWaeCOU5svgoh4vSb9pvXA3h+P4MH5J2g/qBX/G5UlJXmTofENiPh4nkvrKquooZtH/HhXD+Q4jtZO2iKoyFtEYDT1sBxMM9sv0itq4sH5J9RFOoBmtl+kV5gfx3E0vuksGlFjcqk0cN/1wyFdhJC+1SJLG07+iNRJI0gdU43UsY1InTSKuIy1xOXeJE5dcsJTcEImtfrxEl0PjNd933vdTboeGP9e1JD2/4ITMonjVBQVf52OXZ9A8piWmvvH1CZ18hjisg8Tx32cZbZP/H6evJi3wQmLBXl48Rl1NdO03DS0HMOVvZqsfj7NZPIjz1VoMumXCMuk19ZSErLuRX1+oqFVJgq6jzGAoVFD+ZgF4DRjbC5jbLr2Kk3l9KHIycwFAJjxiP7Zv/I4jq0/C58ZPdH36+4ljlcpVfhxyBqYSCWY9edkiER8Xvp/eHUvCN/1XQm3WpWw6NA3eu3Onl59iaCHwfCe3lPw/YuDiLB9wR5sX7AHHQa3xoK902AiNTHa/MaAFE81Zp/kAYAqAMxqNpjTTYjst2Kffy+EZjQEE1nqxockZmHvvfD35vFwtMBfvi3w8/nAdxzFras5YWBzt/fGrh7QENP2PcHVwCRM2C9CvVorYOJ8Hcx+P2A+FFAGgdJmgxJ7gHLPf3R25I7DPoeNoxUO/nLCqPM27lAPC/dPR+DDYCzs9SNys+V6z1X7sxoAAP/brwXJSU1NYGVviaSYFEFyDhXsAABJ0fzl6raqhZjgOCRGJwu6V1nB52nwA4BsAGYArPJd/zm0ikBmWbwiuLb/NrbM+RvtBrXE6J+G8Jp719JDeH3/Lab98RWcKgkLM4wJjsP87sth52yLZWfm6x2GeeDn47AtZ4OOw9roJV8UOxbuxe5lh9HVtwO+2THR6GGohkCqN+CSR4OSfZCb8wwpoqlgjpfBLHzBROYIScxCYqacVzjo9H1PcCMo4Z3om8Zutlh7KUg3pqAC8QtOwoBmrrpIHb/gJNx8k4R9T+whsp4D5nQZ8aLfkJZDoNRJoOTBIFVw2bw4PDCVmaLn+M64e+Ih7p15bNS5P+3ZFLP/mowXN15hSf+f9VaC5Vwd4eTqgJe3+dv6tThUsENyjLCHs0Ne8EOSgIe61gz74kaAoHuVFXwUgT0R9SWiRUS0WHuV+so+AIocBQDAVCYtdtzuZYfh2aAyZm6byGtnTUQ4vfkiPu3VFK37fSJ4XbuXHYY8W47lZ+fDwcVOsDygcRI/uvAMHQa3htSs+N9PCClxqdi34hg6DGmNaX+Mg1j8cSgBIgJlbQEl9gKUT8AsZyBeehq+BxoiNFnzwNE+8LvXr6DbuRcXDtqncUX47riPDVfeYM3FIIxq6Y5tt0JhbyHF3nvhhSqQinYyLDr2AjM6Vceai0EQixjG7XwIsYhh771whCZl46sDVkiVHQSz/l7jbE7qA8re/9GcDryn90CVhu74YdBqo8fEtx/UCmNXDsW9048FxfQXpEoDd0S8Fr42WydrpCYIi32xzvMhpifxd/xXaegOAAjzjxR0r7KCjyK4yBjrVOor+QjQxvqKTYp+mEW9iUHwszB0GtYWUlN+5o/IwGgkx6bik+5NBK8pJT4Nl3bdQMdhbVCxKv9opoLEBMdBpVTDo55byYMFcOGva1Cr1PhyXj+jORMNhbgMUOpEUMYKwLQDmNN5MMtxcHdyKvKBXzDG3sPRAtP3PcGSEy91J4XW1ZzQu2FFrDj3GgzA3vsRGN3KA9tuhSAxU45hW/0wo1N1+AUnISQxCyGJWVh2KgC9GlTA+itvUM7SFPOPPIeLtRkWHNU89Kbte4IZnarjb79IzDhRE8zxOGDSAJS+AJQ6FcSlfcBXUoOFjQUWH5kFiYkE3/VdiZxM48bE95rQGdYOVji+Xv/0JBtHa6QnZgDp6UBsLMBTicqsZMjJyBV0L+1GUbtx5IPERAJrByukCVQ6ZQUfRTARwFnGWM5/OXw0ITIJR9acQo1mVWBmblrkuBuH/AAArfq24D3306v+AID6eoRSntx4Hkq5kpcfojjCA6IAAG619Is2Kgwiwpmtl1CnZQ241RSWe1FakDIAlNQHkF8Fs5oHZvsbmOifPIbCHvgAsO5yEFacfYXtI5thzcUghCRm4dMqDvjzbhhG/3kfIYlZuBGUgKNPomBpKsbjiFR0quOMB2EpqOlshVXnAzGgmSvmHX6OB6HJGLbVD8O3+iElR4EWng6QikU4HxCHHvUrICw5G2qOw5zDz+HpZIH5R15gl1847CxMEJpihTD1ejxNGQPIL0IZ3xNnH1/6UC+nDufKTpi/52tEvIrCylEbjHpakZpJ0W10B9w5/gDx4Ql6zRGXI0dqTDKoT19g4kSgTRtEn71SqJ8nP1UauCP4WRjunnzIf715ikAuQBEAgI2TNVITP85HZ4mKgIisiEhERDIiss773rosFldWqNVq/DRsLZQKFebsnFLszvbm4buo3rQKnCvzzwh+dv0l7F3sULFqeUHrUuQqcHzjObTo3hiuApPcChIeoDmSutUUljVdHC9uvkJkYIzRE9L0hbIPg5L6A5QLZr8TzGLEe3/LkMQsXVKV9oG/7nIQjjyOAghwd9A4eEf/eR8/n3+N5X3qITw5Gz3X3oDvjvtwsJBCruJQxdECRx9Hw0IqhlzNQSICVl8MQu0K1jjyJBoRKTmISMlBt7ouWHD0BbLkKjRytcHhx1Fo4WEPEWMQi4Cjj6MQnpyNIS0qIyI5B6P/vI8Jux8jUzICB4NXIiVbjnbOX4NyP3wyf2Ov+vBdPhg3Dt7FgVXHjTp3j680RocTv1/QS77hsxtQccCrrXuBQ4cQtulPpI+fjE+tuWLlBs3tA88GlbFq1Hrejlx9TgQAYFvO+t93ImCMuRcnyDQYb3v5Abm69zaeXn2JiWtGoVIx5SXSEtPx+v5btPyiuaD5/W8Hol7rmoJNJ36nHyM1Pg19pnQTJFcYUUExsC9vCwsb45VBuLrvFswsTPG5j2E1j4wB5Z4Hpc8BpI3AHI6BSd83w2lt+KsHNES7GuV0ZqKUbAWkYhHmda+FYVv9cOpZNKJSc9C9vgt8mrqiZ/0KyJSroVATEjLk+KJhRbxNzAIDcOttEhq72cHKzARqjnAxIB5qTrNbNpeKse1WKBQqDtZmEgTEZsC3pTtuv02CmiOoOYAjwNpMgq23QsDy1hibnotFx15i0x0LfH1uAdSimhozkdywBCxj4DOzF1p7f4Kt83YbNQLGubITWvRogos7rwkXjoqCg6nmNZ/95z1ceR2PqZejYT97OiqfPVqsqNRMigV7p0GercCWOX/zup1WEQiNdLJx/BcqAgArGWOHGGPDGGN1GGPlGGNujLH2jLElAG4BMH5G0gfg3I4rcPF0RueRxWeVRL/VpLELsbNzHIfEqGS4eAgvLvf2SQhEImaUxK/UxHTYOtsYPE9+wgMi4VHPTXCxPWNDXCYofQkgqQlmtxVMXHhUll9w0jtOYG14Z7VyVtgwpAl+Ph8Ir1rOWHU+EJPaVdX8/MobHHkcBWszTaKSmoADDyNhbSaBzEQEETTfK1UcXO1kOiXwmacDshRq3b1TclSY0r4aTj2PgYOFCdR5lhURA9JzVXC1Ncc5/zhYSsXIzFUhODELRMAyn/aQOe8EJFVBaXNAnLBQR2PDGMPQb33AqTn4CTCn8KFuy5pIjEpGRorA7OvERNhUcAQA9CxvpjP7latTDYiPL1HctUZFdBzWBjcO3kVmalaJ47U+RLVSXcLIdzGzMBVsTioriqs15ANgIYAaANYDuAHgGIDRAF4DaE9E+p3jPiLiIxLx5PILdBzapsQde3yYxn5Z3p2/WSgjORNqlRr2ekT7hPlHokLV8kaJ8slIzoS1vWXJAwUQGRiDSjWMZ2rSF8r8DeDiwayXgLGiHfgDm7vpHLlaPBwtkJgpx6ln0RjQzBXbb4di5GfuWH0hEJuvB2PFuddwtJTCXCqGq51MJ5eeq0IjN1toDQ+ZCjUiUnJ0H6jbwUnQvpsImg/aLxcCka1QIzFLCQAwkzDk6Q2Ep2TD3ESEdLkaUrEo7x6acYyZgdmsArgUUNrCDx5N5F7HFeU9ygmyq/NB67/S+rN4U6sWmsQ/h0MlBxxcfhjbRjTFmotBSPt7L9C+Pa8puvi2hyJXyavshVgsRsVqLrh9/L6gv4XU1ASKvL/px0axPgIi8iei+UTUlohqEFEjIvqSiP4mImGu9o+Uizuvg4jgNezzEsfGhmoUQTkB/oHkvGQVvRTBywhUruMqWK4gCZFJCHoYjIrVjPfQzsnMQWJUMioZcU59IMU9IPsvQDYQTNrgnf/ThnTmJyguA19uvot1l4N0kT1HHkdh681gLDz6ArXKW+Hks2hYmErwNjELrnYypGQroFJziEjRRMtoH/C33r5rGjERAaYmIojzBhCg+5oDoOII6bkqOFpKIQKQqyJI8n0ClRwHExGQrVDDyVIKEGHCrocIScwCM6kNZjUNkJ/X1D76gDDG8EmPJnh08ZlBiWAFcaul8YNp/Vm8kUqROmY82qsCwYXHweTcDewIPIKnDwMR0oBfuHa1xp7wbFAZZ7fxc8wPnt8Pbx6H4OaRe/yXaSaFMvdfdiL4/8LFnddQ7/NavEw3cWEJsLKzgIW1Oe/5k2M1FRbty9sKWpdCrkTUm1i41zZcEexaegjEEQbO+cLgubToU6DP2BCXAkqdCogrg1l9897/5+8bsPdeOG4EJeD22ySYS8U48jgKw7b6of/vt5Geo4Sa00RBRaTkICVbgfRcFaxNxYhIyYGKAxKzlNAGFYuKODgqOUDNcTqzDwDYW0hhJnlXIDFTAQ6ATMKgyufLVKoBG5kJytuYISlLgcqOFgABp57lxcebjwKkn4AyloLUsfq/cEbg055NochV4tHFZ0ab09ndCVIzE71i7S83aIfOu5bB1d4Efy4+AJs2n8H11CH4hfDzYzDG0HVUBwQ9CkHws7ASx7cf3AquNSpg5+L9vNcoNTP595mG/j+Qk5mDiNfRaNa5Ea/x6UnpsHESFjCVlZYNALC05a88ACA1Pg2cmkM5N0dBcgUhItw5fh+t+rVAefdyBs2Vn5Q8BedY8QOWmM45BXBJYLY/v1MeQkv+Eg8EYNzOh5jXvRa2DG8GhUqzw0/NUaKRmx2y5Cp41XJGplwFFaf5YKTL/7EBS8WA9jt1MdaAfG4BMAAJmQrkqgoXyCnk54lZSihVapiIRWhYyRYbhjSBo6UmnJkxEZj1twBlAfKrxb82pYy2rEPYS+MlSInFYjhWtNerPPXA5m6o3O4T9Fo0FGGpHBKbt4GHs/V7ZT+Ko0WPxgCA1/ff8Fprj3GdEPI8nHeJCrGJGCqBfoWy4v+1IogLSwSg2YnwQZ6t4FWHKD9am6C0hGzlgmSna8wQFjbCFEhBYkPjkRybinqtjOvXD36mic92NqJyEQrlngQk1cFM6hY5Rps3MPfwc3SpUx7LTgfALzgJ8Rkak4alqQTn/ePQp1FFnPOP05hkABQMOlSo/zEJ5afgbl+Lo4UJCj7mCxtpbSaBq50Mjhb/+DYSs5So42KNIZ+6w8PRQvcwC0nMwr5HJoDIHqR4VOTvXBaYmZvCwsZcZ/o0FjIrme69rw9VG3sAAN4+CRUsW87VESKxCHGh/HIZtL1E3jziVxJEJBaBUxcfzvqh4NOP4D2jWWE/K2TMNsZYPGPsRb6ffccYi2KMPcm7DI+LNIC4POcv35yA3KxcmFkUnWxWGDpFINDhqz1JmFvLShhZPP63NV2mtDs4Y/Hg3GN41HPTu+SFvmjt/qSOBpSPwMy6F1kgDtA8PL89+gLL+9ZDQGw6olJyMOfwc5hKRGjsZouUbCVszCQ4+jQarao4ICGz6KN7Yfv6onb7iVnKdz5cYlHh8mIGSCUiyKQSyPIcBiIGJGTKdf4B7e+hKV/hCJg0BpQfVhEAGr9XUqxxFYG5lcygbl6e9SuDMaYr1y4EsUQMp0oOiA0tOdIIADwbuIMxhqBH/O6lLb/CcR+fMiguj8CMMWYPwJExZscYs8+73AHw8RDuANClkJ+vJqKGeddpfRZtLOJ1ioCf+SU3WwHTYrKOC0OR5xySmgmrxpmdrlUEhp0IXt5+DZmlGdzrGu5r0JKTmYMXN1+haacGJQ82Mlq7f3LSEQBAZE77IvsFax+ey/rWw777ERjV0gOZck03qiyFGo/CU+HTpBLSclUwFYtw820STCXGOyRz+OcUUHAjyACYiBiyFWo0crNFbHoO1EQaR3Je9Npneb9rwXIYTNoEUIeD1IlGW6s+OLjYGv1EYG5t2InA3EqGClXL4+3TUL3ky3uU460IzK1kqFitPN485n8iAADiPo4aUvkp7l0/DpqexTUBPMr7+iE0IaTrS5qYiK4D+DhrruaREqep42LH05GryFUIfqAr8x48Eqmwnr25WRrThdATSEHC/CPgUb+yUYvBhbyIgEqpRp2WNY02J1+0dv+3UVeRpXbH5P2JRfYL9gtOgletcqhkZ44Znapj0fGX+NTTAQyAmiNIxQwHH0bCRMyQpVBDKmaQq7hCTTj6UtRHXmYihpu9OSrZm+OSfxyIGBRqwkqfBtg+shkSMjV//8LKYUCSZ+ZTBRUxLCwp9AAAIABJREFUe9lg45RX38eImJqbQm5gJJJrjQqIfqOfM11TjZS/j8KtViVEBfG7F8uLMlB/hOah4vII1hCRB4CZROSR72pAROsMuOckxtizPNNR2doVCqBNDOFrt2OMCY7hFmlDTITKGWn3YGZhCqXcuLHLWr/Fh4qA8HC0gKtDeaRkpb37gMT7IaMNXG0x6I872HTtLRb2qI1bb5MgEgF2MgkUagIBUKoJJmLNgxgo+uEtFIkIKHjAEDPAzsJEE3nEgLbVncBBo5h+7FsPay4GoZKdOZb0ros7wUnvlcPQLDDvQckMOy0ailrFFVugUR+I43TvfX1RyJUwNdcv90alVAvatCkF3Ev77PhIajO+A59XPC0vu/idS8/7bQRQBUBDADEAfi5qIGNsLGPsAWPsQUKCfoWoSkJozRB9nD3aXQAn8IGuremvVhkWZWBlZ4nMlJKzJYVgmxc5VRbp8oXlAtwISsDlQA4VrDKx5mKgzkcQkpj1TshoRTsZvjnwFFKJGHeCk7Di7CswAPbm0nciggCNMsiPiREsRH0aVXonPBTQlJSwlEqwqFcdZMlViEjJQXquCpXsZGjh6YDVAxpiwq6H+P3qWxDwXjmMkMQsgPJ24aIPW/JLkauACc8KvHzh1IYrgpyMHMis9POtKXIUJZahz09Weg5/823eW+xjqdKbHz6veLN8V2sA3wHopc/NiCiOiNRExAHYDKDIoj1E9AcRNSWipk5O/BO4hGAqsIqgWA9FoO1XIFROnLeVNPQYaWFjzittXghW9pYQiViZKIL8D3ZAowTG7XyIT6rWhIgpsaa/J6bte4KKdjJM2/cEAHQP02n7nkAqEcNExGBtZoKUbCUaudogJVupO6FZmxa+o1VyRecL8OXAw8j35nCwlCJTocLCYy/QpW55nPePw4yO1fGXbwtM2/cEoUlZAAFVylliw+Am75XD8AtOArSlqUXGLRkiFKVcZXRFoFZxBjc2yk7PgYWeQRa52XJBp4ns9GzeAR3/nAj+hYqAiCbnu8YAaARAr3MXYyx/9lEfAPp3ojACunKy2fxPBOqCWzweMoA+ikC/eiYFsbKzRFZqFpQK45mHRCIRrB2sBHVo0pf8uQBXXsdj3uHn2DS0CTydNWGCbraa+kFRKTm6caFJWZArOSRmKiARMVRxstQpgUcRaTCTMMikErSq6oDcYv6e+lrl8n/MtXMwaCKHlGpCllyFxm522HE7DF61yuFigMY5qfUHzOpaE38Ma/qe30MbSkpc3uvOjFsyRCiKXAWkpsJ8XyWhVqkNPhFkpGTpfSKQZ8sFnQgyU7JgzvNeOrPyx6cH9MojyAZQraRBjLE9AO4AqMEYi2SM+QJYwRh7zhh7BqAdgGl63N9olPfQxMDzTWmXWcl07Sz5om/tcou8dpQZyQILcBWg1qfVwXGEuyeMXCCsdS3cOnYf8hzjlRgoivw9BL7/oi5aV3MCpJ8AzAKUuUH3gMw/DgzYPrIZVBzhQkAcOtUuh8cRaXC1kyFTwaFlFQfcC03W+QWMhZlEVKiPwbeVByrYyJCWo4SlVII7b5PgaidDVEoOZnSqjgm7HmLFmVfv+wMKQESA/BwgqQvGjNdpTh9iQ+Lh5GpYwmNBMlKyYGmnf4XcsIBIJMekoGpDD8GyHMchPCAKLp78ysWH+UcgMSoZ1Rp78ps/bzNozH7hxoJPHsEJxtjxvOsUNAXnjpUkR0SDiMiFiEyIqBIRbSWioURUj4jqE1EvIooxxi+hL9WbeEIkYgjw4xd9YWVvifQkYVES2iOq0JA4BxdNJJPQxtoFadq5AZwqOeD0losGzVOQDoNbIyM5U6/EHaEU1kOAiR3BLCYA8ksg+XXduBVnXsHTyQKmYhEkIgaFSg1HSynO+8fDu3FFRKbkoJGrLc75x8EmbzdrqAkoP/IiThj7H0ZAKhbB0cIEydlKWMsk+Mu3BTYMaYJlpwKgUHHoXt/lfX9AQZQPANUbMPMvjbdoPUhPzkBSdArcjVALKz8psamCy7Hk5/qBO2CMobW38Jaw4QFRyErLRh2eOTdX9t6CSMTQpj+/MuwqpRpiifijNA3xOdetyve1CkAYEX2cjTcFIrOUwb2uG39FYGcpeIdurlME2YLk7JxtwRgzOE5bLBajq28H7Pz+AGJC4vQqh10Y2iQ8bQhuaZG/h4CHowXcHSx037s7DAdyDoDSf0Ao6mPa/pfoXt8F3etr0lw0rSNr4Ofzr9GpljNOv4hFI1dbPIpIRcsqDrj1NglVHC3wtojdtxAkDFDR+xFHYqYpSZGeo0K9ijYIS9a8DxzywoI9HC3Qvb7GYjqpfTXdz7T+gILmIcreDTArQGZYxzpDCXmuSeAzZutTIkJybCrsnQ1TBHVb1YRjBeGlT/xvvwagOUWXBBHh6r7bqN+2DuzL8wt+5FRqSIwcZWUs+PgIrkFzCrABYA+NMvjPULN5Vby+94ZXtp+1gyYCR63mb7fXhlpmCTwRiCVi2DhZGyVhp/OodmAMOLv1ssFzadHmXmiL6pUWRfUQ8AtOAmNSMKu5gDoECfF7sHpAQ0xqX03Xg3hZ33r47VIQ9oz9FO1rlcPiXnXgH5sORwsT3HqbhJZV7PE2MatIh3F+CtvDifP9sLAE476NKujCh6VihltvkuBiY4btI5vB1ESkKyY3qX01nRLQkr+0hBZSJwK55wFZHzBmWMa5oYS+iABgXEWQnZ4NpVzJO6+nIGEBkQh9GaF3oyT/O4GwcbTi1Ukw6FEwooJi0G5gK97za08EHyN8TEOjAdwD0BeAN4C7jLFRpb2wsqJBu7rISsvGzcN+JY61L28HIkJSNP+Hs1VeD4DUeOE75/Ie5RDxOlqwXEHKuTqiSiMPvOJRTIsvduVsYCKV6J24wxet7T8/7zwkTdsCkrpo6rgN7rZx74yLSsnBX74t4OFogRaeDtjlF44lvetCIhHB0VKKW2+TYW0qRrpcDZmJqFgfXmF2fzUVHxN++HE0HC1N4WhhAoWaYG0mgaWZBO4OFtgwuAkuBsQX6Qt47/5cKihlLAB8cLMQANw9+QD2LnZw0GPnXRTa97q+hRZ3LT0IE6kErfsJNwulxKXi5hE/NGhXl5fpZveywzCVSdGqL/9uhUq5UnBiaVnBx2vxDYBGRDSCiIYDaAJgdukuq+xo4/MpPOq5YfOsnSU6Pj0bVAYgrKCVc2UniCViRAUJd4fU/7w2Au4GIifL8NYPjhXtkWpEM45YIkb1ZlXgf+e10eYsjMLyCPLXFmKMgdn+CjAxKGU0SJ2kG5dfiWhPFmqOsNK7ge6hL1cTOtd2xpct3OBsrTHXWEjFuv/P/0hg0BSpQ4GfmeY7GliaijGrcw2dXFqOAhlyNRq52qKinQzzutV6J8zVLzgJJUHqJFDyUED1Gsx2HZiEn3OytHjzOAQPzj1Fn8ldjWrvfnbNHwBQt5XwjPUAvyBc2XMLg+b21av+1eY5f0OeLceI7weUOJbjONw6cg/dx3aEtb0V73tkZ+bA3OrDdvMrCj6KIBJAfg9pBoCI0llO2SOWiDF+9QjEhibg4C8nix1bpYHwglYSEwlcPMshUg9F0NirHlRKNV7cCBAsWxB7Z1ujm3HqfFYTgQ/elmrkUME8gn+Kr/1TW4hJ3MBsNwHqRFDqOBy4H/ie8mjh6QC/4CS08HTAstMBcLQ0xfaRzeDpaIE3CZm4+ioBYIBvS3dkKdRg0PQczn8SIADZChUspP8c74k0ysREDEjFIkxoWxWrL76GSMTQ2M0WOQoO5axM8cuAhtgwWNMOc0an6jr7f0llkkkdB0oeAqjCwOz+ADMrvp1qWbD3pyMwt5ah5/hORp336bWXcK1ZkbfNPT+ReaeJDkNaC5Z9cesVLvx5Dd4zesG1RsUSx2tLSduWE5bHkZuZq3dYa2nDRxFEAfDLqxy6CMBdAG8YY9MZY9NLd3llQ6P29dCqbwvsXX4EiVFF79BkljJUqu6Ct0+EVTasVL0CogKFK4I6LWvCRCrB40vPBcsWxN7FDmkJ6QZnKuenbquaUCnVCHzAr+iWPhTMI8jvOM4PkzYAs/0ZUD5HV7efMWPfo0KVx6ln0QAB3eu74GVUGuZ1r4UsuQoutmaY0bEGjj+Lhp1MAolYVGg5EY6AXBUHETTlI0zEDGIRQ+8GFeFqJ8Nvl4OgUgN9GlZA/6au+Mu3OSzNJDj1LFr3u0Sl5PCqk0/qGI0S4GLB7LeAmbY0ymtqCJFBMbhx8C56je8MCxv9wzwLolap8eLGKzRoU1sv+ax0/ar1qlVqrJ20BU6uDvhyfl9eMiqFfvXDsjP+3YrgLYCj+MdMegya8hBWedd/grErhkKt5rBuyrZix1Vt7IGAu0FQKfn7zCtWc0FkYLSuEilfzMxNUadlDdw6ek+wbEHsytvm+TeMlwSmDbMzdu/aguTPDyhYWyg/zKwjmNU8mNMVbOr1J749ckOnPLS7cEdLU2wY0gTd61fAqecxWHYqACt9GqCGsxUWHnsB4gjzuteGvYUJcpQc7MxNYCJm75iI1BzB3sIEtuYmKG8jQ5+GFeAXkoxejSogV8mhY21nrOrfEAObu6F1NSdsGPxPcxlepwAiUO5ZUJKPpvGO3TYwKX9bdGmhVqmxaeafEJtI0GeqcSvIP7r0HNkZOajfpo5e8v+UbRdWf+n4hnMIfhqG8b+MgIxnrxFt7S6hEUDZ6dmQWf5LTUNEtLi4qywWWRa4eDqj+1gv3Dpyr1hTR4fBnyM5NhXntl/hPXfzbo2hyFXixqGSHdIF8ZnZG9Fv47Bt3m7Bsvmplteww/9OoEHz5MfawQptB7bEkTWnEBlouFO7KArLIygKZjEcyaIZsBbdxu/dFmHn1R0Y2MwVP58PRAtPB53fwMNR47AFAxYde4ljT6NR0UaGA+NbIi49F4wxdKrlDKWag4OFFATomtYAQEq2ErO71IKFVAx3RwtMbFcVqy8EYVrHaojPkL+zRj4Pfy2kCgeljAGlTgFEDmD2u8Ck/DrolSZEhF+/+gN3TzzEmJ+G6GW+KYqczBz8NmEzKlRxxqe9muo1R0JEEqwdrCAVWPLi0aVnqFDFGa36tuAto00qFbq7T4hIgtOH7OhXDHyihqozxv5gjJ1njF3WXmWxuLJGG2OvbSZTGM27NkLtT6tj19JDvHfpDdvVQYUqzji1+YLgNTXv2gi9JnTGoV9P4eGFp4LltVRr7AlzaxmeXDZuVY/xvwyHVCbFmgmbBVdm5UP+PIISk63ycCw3DjsCViIsRYYtvbfAXfwVvu+aARC908DGw9ECs7rURHBiFhIzFVjQU2OWuBgQj91jPsEfw5tiQFNXpOYo4dvSHYlZCl2oqalEhIXHXmBe91po4GqL70/648e+9XDlVQJmdKpe4hoLQqQAZW4EJXYHlA/BrOaDORwCMzFuZzl92TL7b5zddhmDF/RDnynGPQ1snr0LcaEJmLltIswE9vvQEhsar6sUIISstGw4VLQX5PTWnj6EdA/MzZYjOTYV5T2Nk8djbPiYhg4AeAxgATQRRNrrP4dJXkRIcWWbGWMYuXQQEiKTcPJ3fg92kUiEbmM64vn1AIS/ihK8rrErh8KtVkWsHLlecGazFrFEjPqf18aTqy/1ki8K+/J28F0+GE8uv8DFv68bdW6g+DyCoghJzMLRl1aYdGYull7rjXrOKahrPgXZcT5o4+6vU1jrLgdh6Ul/eDpawNPJAivOvMLfd0PhVascPBwtEJKYhYfhqVjSuy4OPoqEs5UpFByhb6OKyFZysJSKcfXVP/WPBjZ3w+oBDd9xCPOB5HdBiT1BmasBs/ZgjmfALIaDsY8j1PDOiQfYv+o4ek3ojOGLS46qEcKjS89xYuM59J3aDfVa66/04kLjebeczU92eo7gdrA6RSDAHxEboqknVaEKv/IVZQ0fRaAioo1EdI+IHmqvUl/ZB0BbSVHbTKYoGrari0Yd6mHP8sO8K3t2GtEWEhMxTmw4J3hdpjJTzN01FWkJ6fhlzEa9W901bFcXUUExiA83blnv7mO9UOuTatg040+DS2IUpMQ8gkLwC07CvG61YGoiw9XI7ui7/3usufclKlmnw5mbAkrqi7j4Y9h5JxiRKTlY3LsOtg5vBoWaw993w5GSpdDNow059W5cCXYWUizpXRf3Q5Mxo1N1pOWq8Do2A3/5ttDUPwJ4O4SJSwNl7QSX1A+UMgyACsxuC0S2a8DEH9fD4uy2y7BztsGEX0caNVw0PTkDP/tuQKXqLhj5wyC95+E4DnFhiXDRo392Vlq2YEWgTz/xmGBNjouL54fr8V0cxbWqtM9rVXmCMTaBMeaSr13lx2noMhBtNzA+heV8lw9GZmoW5vdYjpzMkrOG7crZwGvI5zi67gzObhNuWava0ANjfhqKW0fvY+3ELYLlAaBFjyaQmIixZsJmo/ZNFYlEmLZpHOTZCnzdcn6p+gv40MLTAT+fD8SGIU2wsEdtvI5X4ERgWyTLToFZLwMoE07cN7gw9Fss6XASJ+4fQViSJsfCykwMOwuNL0CrhAY2d0M1ZyvM61YLu/zC8ZdvC0xuXw3bRjTTlYzIT1GKiohAcj9wqTNB8S1BGUsAUoNZzQNzPAVm+nnpvjB6cOfEA9w+dh9dfTsYNSs2LTEds7y+R0psKr7ZMQmmMv078b289RpKuRKeDdwFyanVaiTHpMDWSVgYaGKUJuBCSPjog3NPYGJqAtcafLr8fgCIqNALQAiA4Lx/C17BRcmVxtWkSRMqCx5efEZezJueXnvJa/z1g3eok9iHZnb4jnKzc0scL89V0JwuS6ijyIcu/n1d8Po4jqM14/8gL+ZNaYnpguWJiI6tP0tezJv+WrxfL/nieHUviLzLjaK+jiPJ/26g0efnyx6/MApOyKTghEzqve4mXX4VR11+vUZrL2nWxHEq4rJPkTp5PKliapM6pholh9SnC3e+pNi4A8SpU3Vz5GftpUDdHFqCEzJpj19YoevgOI44VTRxudeJy1hP6ngvUsdUI3VsY1KnfUecgt/77EOREJlIfR1H0rhGM0meqzDq3LM6LqZuskF07+xjg+f6afha6mUzlLIzcwTJRQRGkxfzpjPbLguS+23iZuppNYQ4juM1Pjsjm3pZD6XlQ9cIuo8xAPCAeDxjizRCkqZN5f8rbBw10bBpPPuwtu73Cb7ZMQkrhq/Dltm7MPG34itvSE1NsOjQN1jYczlWjFgHE1MJPvfmXxeFMYZmXRvhxO/nERkUg9oOwqN3e47vBP+7r7Fz8QHUbF4VzboYLyKlRrOq+PXWUszt8gNmd/weW16uRjkjlynmw8DmbkUWq+tev4LG1CTrBibrhtCEeGy78jfqODyCl2cA7Lh5oPiF+MKtKp5GmMFeXRXWFhWQmG2LlJQMjPq8OUj1BiAlACXcrRVwb6AEyUM1LSTVEZr/116Ur0ihSTMwy0mAWWcw9nGGEWpRq9VYPuQ3KHIVmL/na8HROMWRmZqFJ5dfYNC8vmjWuaFBc2WlZeH6gTvoOKwN7/BPLaEv8grn1RVWQTX0ZQTc67ryNpNd2XML2Rk56PlVZ0H3KUtK9EYxxgrLskgD8JyI4o2/pA+HVhGkJ/LvvOU15HOc3HQeoS/DSx4MTW7A98dmY27XH7DsyzVw8XTmXc8cACpV11SqjAqKQe1PSq6SWBDGGL7+fRxCnoVj+ZDfsOHBTyivh221KCpWdcGKi9/Ct/bX2DTzLyzc92FyDotzMmt/FpKYhQm7XwHUFO0aDMHQY/6o7hiCRR3jYWMShAYuccjOuQCidDgAmN8SgBqgxBJuLnIAJNUAWW8wSTXN15KqYKIP2qJbEHuWHcGza/6YuW0Cr2xbITy9+hIcR2jSsYHBc13ecwvyHAW6+HYQLKstnOdWuxJvGSJCyPNwtOYZbkpEOPH7eXjUc0NtHlVNPxR8whJ8AXwKQBs43xaa7OLqjLHviWhnKa2tzLF21PSATYjkF+2hxcrOEvERJT0d/kFmKcOcnVMw1HMiXtx8JUgRlPcoB7FEjMAHb9FxaBtB69RiZm6Kbw/OwMRmczCn81L8cGouKlZ1KVmQ7xrdy2HQ3L74c9E+bK68EyN/GASJSdlGwBRmo9fmD2jRZhlvGNJEd2qY8LcIu162wqT21WAG4M7reIz54y7+HOGJz9zVABenOQ0wEwAmAJNqLu3X4vJgon+vC43jOOxfcQw7F+9H+y9bodPwtkadn4hwdvtlmFmYomaLqgbNFRYQid0/HIJng8qo3kRY/SUiwqOLmhwCISeJoEfByEjOhEf9yrzGH1lzGm8eh2DK+tEfZR8CLXyihjgAtYioHxH1A1AbgBxAC/yHis8BGtNNtSaeeCowxNK5shNiQ+IFxdE7V3aChY05IgSGk5pITdC6Xwuc//OqLq1eHypWdcHSk3ORkZyJqZ/NF1Q/iQ8DZvdGj3EdsX/Vccxs/51g5VoWaLOM858aNgz5JwtYm8i2efgnWHkhDaHpVcHMOoHJumv+NWsHZtoSTNoMTNoQzKT2v1oJZKZm4bu+K7F13m587vMpvt40zugPr+MbzuHuiYcYtqg/TKT6m5te3n6Naa0WQK1S45vtEwWv88reW3h+IwB9v+7BW0atVmPN+M2wc7ZBh8HF1zQiIvy5aB82Tt+BVn1boItve0HrK3NKciJAYwLK/z0D8CLv68d8HBGGXmXlLCYi2jZ/N3WS9KeMlMySB+dx6NeT5MW8KTkuVdC9prScT9PaLBS6RHp1L4i8mDcd/OWEYNmCRARGk095X5rbdanBcxXGpd03qIflYOrnNJLun3tSKvcoDbSOZq3DuOD3/zWig2NpWNWJ1NlkAB1ec4q3I1QIQY+DqavpQJrb7QdSq9V6z3Pr6D3qJhtEw6tPpui3sYLlM1Iyyae8L01sPptUKhVvOe3n/PKem8WOU6vVtHbSFvJi3rRq1HpSKfnfw9iAp7OYz4ngBmPsJGNsOGNsODS1hq4zxiwAlG5Xkg9Asy4Nwak5QYXeKlb7x24vBPfalRDuL7zZW41mVVGvdS0c+e20wUXkKlVzQY9xnfDg3FPEhMSVLCCQ9oNaYf39n2BX3hbzuv6AHd/uFdTY50OhTyLbv5W4sAR8034xMpIzserKd+gzpZvRTwI5mTn4YeBqWDtaYdaOiXr37T256QIW91sJzwbuWHNrKVz0yNTdNm830hLSMXXjWIjF/EJi4yMSsWPhXjTr0hBtB3xW5DgiwooR63Bs/Vl4T++J6VvGf7TNaN6hJE0BzQnAG8BqAL/mfc34aBljXWV5IlApVdTbdhgt9lnFe1cU8TqKvJg3nd5yUdC9Dq3W7DASIhMFr/PWsXvkxbzp+IazgmULEh+RSJ3EPvTLmI2lshMkIsrJyqWVI9eTF/OmmR2+o/gI4b/z/zA+b56E0NAqE6m37TB6/eBNqdxDnqugxT6rqJPYh55cfaH3PKH+EeTFvGlOlyWCQ0W13D/3hDqKfGjD19t5y2jDvrubf0nRwcWfQEJfhpMX86Z1U7aW2mdJCOB5Iiizh7khV1kqAiKizbN3khfzpmWDfyV5jrzE8SqlioZ4jKdRtaeSQs4/3jr0ZTh1NhlAi71XCn7TqNVqmtZmIXkxb9rx7V6DjtpEmthoL+ZN337xkyCzmFDObL1E3c2/pF42Q+nUHxc+ig/L/0eUCiX9veQgdZEOIG9nXwrwK528j7iweJrYfDZ5MW/av/KYQXNtmbuLOol99No4ERGd3HSeOpsMIN86X1NWejYvmZT4VJraaj55MW868fv5EsffP/dEUC5SaWM0RQBNI5r0vCsXgBpAOp/JjXWVtSLgOI52LztMXsybpraaTynxJdv+7556SF7Mm/5eelDQvfavPEZezJtObir5TVYQea5Ct8te1HcFZWfwe3MXBsdxdOjXk9TZZAANqzqR3jwJ0Xuukoh6E0Mz2y8iL+ZN33gtLnGX9T+MS8iLcBrfdBZ5MW9aOmg1pSaklcp9nl33p35OI6mX9VC6cfiuQXMpFUryKe9LC3otFyyrUqpo/dRt5MW8aW7XpZSZym+jE+ofQUM8J1A32SC6uu8WL5lTmy+SF/Om2NB4wessDUrtRADgCwDLhMoZcpW1ItBydf9t6iYbREOrTKSwgMgSxy/2WUXdZIMo6k0M73uo1Wqa3XkJdZMNopAX4YLXqH2AdxL70Oh60/RynuXn+c0AGlBxDHWTDaJzO64YNFdxqNVqOrnpPPWyHko9LAbT4TWnDD7V/I/ikecqaPeyw9TVdCD1cxpJ1w7cLrV7ZaRkUn+X0TS8+mSKeB1l8HzXD94hL+ZNd08+ECx78JcT5MW8acPX2wU5bic0my34tLR9wR7qJPb5oA7i/JSqaQjAXX3k9L0+lCIgIvK/G0jezr7U23YYPb78vNixCVFJ1Mt6KM3uvESQySMpJpm8nX1pdL1pvEpVFMbDC0+pj/1wGlFjssHmluTYFJrRTrNjXz32d6OXF8hPXHgCzev+A3kxb5rScj6FvhSuDP9H8XAcRzcO36WhVSaSF/Omxd4rBUe4CWX1uE3USexDgQ/fGmW+WZ2+p0Fu4wRF+WhZ0Gs5jaw5RZCMWq2mbrJB9PuMPwXJ/TjsNxrkNk6QTGnCVxHw6UfQN9/lzRj7EQD/gPl/ObVaVMPau8tgYWOO1WN/L3asYwV7jFr2JR6ef4ofh/6G3Gx+vXzty9th1p+TEPoiAt90WKxXzH1jr/oYv3okIgNjcHGnYeWg7Zxt8dP5hRgwqzdObb6I5YPXGLXFZX7KuTpi6Ym5mPXnJEQERGJsg5lYO2kL0gRkd/+Pogl9GYHZnZZgcb9VkJqZYNmZ+fj2wEzYCem3GxoKTJ0KtG0LjB0L+PsXOTQnKxerx/6OU39cQJ+p3QUlSxaGUqHE79N34NGFZ+g+piPvKB8tKXGpeHbNHzU/qSZILsw/EopcpS7WQRI1AAAgAElEQVSTnw/yHDle3AhAxaofV/VYXpSkKQBsz3dtBjAfQDk+WsZY14c8EWjZ8e1e6ijyKdEZzHEc7frhEHUU+dDYhjMEmWquHbhNPa2GkLezb4mnj8JQKVU0rc1C6mE5mJcpiw+H15wiL+ZNy4es0Ws3JoSU+FRaM2EzdZL0py/shtPBX04Icr7/j3/ISMmk9VO3USdJf+pjP5yOrD2tn7kiKIgS6jSi6KNniNRqonv3iFq3psgL198rthf48C2NrDmFOop8aPPsnaRUKA36HeLC4mnyp3M1UTiTt+r1Xlg+dA11kQ4Q/HlYO2kLdTUdyMs/qEUbZKLPZ7e0wP+ihozLuR1XyIt5U0RgNK/x9848oj72w6mP/XB6dS+I931C/SNoZK2p1EnSX6+HeUJkIvVzGklj6k/X28xUEK3jvDTDS/MT8iKc5nRZQl7Mm4ZXn0y3jt37X3QRTxIiE+nQ6pPkXW4UdRT50OpxmwxzBo8eTVFnr7yTTBf+4AXdrddK971araa9Px2lLtIBNLDSWKM8CP1OP6I+DiOol/VQurpfP1+Gtprw9gV7BMllZ2RTLxth1UKDHgdTJ0l/WjVqvdBllipGUwQAKgE4AiAeQByAQwAq8ZDblifzIt/P7AFcABCU968dn0V+DIrg2XV/8mLegrJjo9/G0hd2w2nlSGFvjoTIRPJi3rTrh0NCl0lEGiWkte8bi23zd5MX86b1U7eV2UPZ7/QjGllrqi734M6JBwZFRv1XCQuIpN3LDuvCNL2YN33degEFPQo2fPLWrYk47p2S3r3X3aTsT1sSEVFidDLN7PAdeTFv+q7fSr3Lo+fnr+/2kxfzprENZujtaJbnyGl49ck0rOpEwRuik5vOkxfzppe3X/Ear1KqaHzTWeRT3pfSkgz//Y2JMRXBBQAjoSlQJwEwAsAFHnKfA2hcQBGsADAn7+s5AH7is8iPQRFoH857lh8WJDenyxIaWWuq4IiY8U1nkW+dr/WO6dceU/f8eMQo0Tgcx9GGr7drFMy4TXon9AhFqVDSkbWnqY/DCPJi3tRFOoAW9FxOL27x+5D+V1GpVHRh5zUaXXea7uE/odls2vXDIQr1jzDejfr2JQrWKJTLr+Ko8uyTdP1eIFH79vT8ZgAN8RhPPSwG06nNF42yQbh24LbOFKnviVYhV9DPozcK3rgRaT7nI2pMpnGNZvL6fVQqFW2cpvlc8A0xLUuMqQie8PlZEbLuBRTBawAueV+7AHjNZ56PQRFwHEcz2i2irqYD6dl1f95yWpPS0XVnBN3vxuG71NlkAI2qPVWvkFClQknf9Vupy8RMikkWPEdBOI6jP2ZpFMywqhPp+Q3+r4OhyHMV9PDiM9o080/q5zRSd0p4cuXF/yuzUUxIHO34di99Wfkrza654Qw68ttpigtPKJ0b3rhB1LUrhQZFUO91N+naw2A636gjrew4mzqKfGiw+3hBps/iOL7hLHUS+9CkFnMoJ0s/JRAdHKs7Gf3xzV+CZO+dfUz9nEZSD8vB9OB8yQokKSZZlw/z61ebPsr3oTEVwUUAQwCI864hAC7xmvx9RZBa4P9T+MzzMSgCIqK0xHQaUWMy9bEfTuGv+NnvOY6juV2XUg+LwYIf6E+uvKA+DiOor+NIQcon/72PbzxH3WSDyLvcKHp06ZngOQpd19UXNMRzAnUU+dDaSVt4Z2kai+zMHDrw83Hq7zJal/R36NeTFPQ4+D+ZiyDPkdOl3TdoVsfF1FHkQx1FPjS78xK6cfhumfy+MXuP0LNqjSj705b0pF57+tJpmCYZzXejUf72HMfRlrm7yIt504Key/U+bV47cJt62w6j3rbD6PrBO7zlVEoVbZ2nuf+Y+tN5fbafXH1B/V1GU3fzLwV3OCtLjKkI3AAcB5CQZ/M/CqAyr8kNUAQAxgJ4AOCBm5tbab5Wgoh+G0ve5UbREM8JlBybwksmPiKRetsOo2ltFgr+4EYGRdPImlOoi3SA3gleoS/DybfO19TLeihvZ3dJZGdk07rJW6mjyIe+rPwV+Z1+ZJR5hZCbnUtH152hYdUm6cwjX9gNpwW9ltP+Vcfp1f03/CNlFAqi6GjNvx+Y9OQMev3gDV3dd4t+m7iZvrAbTl7Mm4Z4jKe/Fu+nuLCyzVrd4xdG/iEJujapw6pOpDPHHhTZolMICrmClg9dozM56puIdfv4ffJi3jTpk7mCMtUTo5N1pVp+Hr2R10lEnqugnlZDaHj1yRT8LFSv9ZYVfBUB04wtHMaYGMAUIlpd5KBiYIy5AzhJRHXzvn8NoC0RxTDGXABcJaIaJc3TtGlTevDggT5LKBVe3QvCzHbfwb2uK1ZcXARzK1mJMme3X8HPvhvw1c/D0W8a/xroAJCRkokl/X/B40vPMXD2FxixdKDgeOr48AR81XgWnCo5YPWNJbzWzIeXt1/jlzEbER4QhQ6DW2P86hGwyWvwU5bEhyfg6TV/PLvmj2fX/RH9JhaApgmPQ0V72LvYwsHFDvbl7WDvYgfXmhXQpGN9mMpM8fCb71HnykmYVfXUxMwPHIiQwaPhF5JcaIMbY5Acm4KnV/2RGJWM1Pg0xIbGIyY4DjFv45CZmqUbZ2Kq6T/ReWR7NGxXR++qnfpCRLh97D42TtuB+PBE9J3aDSOWDoKZuf7N5rXkf1+PXDoIg+b20avqKcdxmNZ6IVLi0rDVf7WgPgeL+qzAowvPMPX3sfAa8jkvmaBHwZjQdDYW7JuONj78W81+CBhjD4moaYnjilMEeRNdJaK2ei7CHe8qgpUAkojoR8bYHOD/2jvv8CqKLg6/k95DOjX0DoL0LlUQUKRJEylSpEhRAbtgLyAiiDRBkI5KFZAqvfcaSEggvfd6y3x/3JuIfiC5yQ2kzPs8++zm3t3ZmWyyZ/fMOb+Du5Ry+qPaKWyGAOD41jPM6vsNZaqW5r11Ux6ZOCOl5MNeX3Fyxzn6TO7Bq18OMakOrFajZcHry/ljyV4atK/LF7vfM7mwx5ndF3i/5xf4VPLmreXjeapdHZOOfxhZmRrWff4767/cjIOLA2O+Gcqzw9o/0YpMMaGxXD58A7/T/sSGxxEbFk9ceDxx4Qn/SPSrXd2dKpbJ7G/WkQ8mdqJpwwokjxnPT7rSvDhnxj8qmuWHzPRMrh69ybk9lzi39zJ3Lt/N+c7K2hKfSt6UrepD6co+lK3qQ5kqxnXV0ma56eaFsIAIFkxazpldF6hYpzxTl7xG3VaPfG7LFef3X+Gb4QuIj0zkzWXj6PJK3qrtxYTG8s2IHzi/7wqTFo7m+deezfWxV47c4K2OBtnt1+YMy9UxUko+H/wdhzedYFXAD/hU9MpTvx8X5jQEnwGuwAYg51FFSnn+Ecetw1DW0hND2OlHGNxKGzG4m+4B/aWUcY/qZGE0BGCovfrl0O9JjE5i2s8T6TCw9X/un5WRxZJpv7D1h91UbViJd9dOwbdW7uvBSinZtWw/c8cuZvjHAxnyfl+T+3zlyA2+GfEDEYFR9JnSgxGfDsTW3jw3mqBrwXz32mKuHfOjXpta9J3akxY9Gz/2MpX/hZSStOR0/E77c+HAVa4u2sTtTHsy0zUAOLg7ofV24/kUP9xfH4OLhzMuHs44uzvh4uGEi4czVjZWaDU6dFodOo0OrUaLTqtHm6UlLiKBqHsxRN2NJvJedM52dEgcOq0Oaxsr6rapReMuDWjUuT7lqpfBwdm+UJUxzMrIYsNXW1n35WasbawYNmsAvSZ2M5uu/s6l+5g3finlqpdhxqrXqdmkap7aOfLbSeaOXYwmQ8O4ucN5blSnXP8e4yMTeK3RdOyd7PjhzJc4ujjk6rjf5/3Bj1N/ZuRngxn0Tu889ftxYk5DcPABH0sp5WOrvVZYDQFAYkwSM579BG2WlmVXc+dBO7H9LLNHLiQzLZPZB2dSq5lp6e+fDZrLsc2nWXxpdp4Ki6enpLN0+mq2L9qDb+1yTP95IjWb5q9+bDZ6vZ7dPx1g9ae/Eh0ci0dZN7qN7Ej30Z3xruBplnOYlbZt0e4/QNC1ELZuO8/G385SOS2ZhMAIdDLvN2cLC4FHOXe8fT3xqeiFt68X9dvWpn672ibVyH3cnPnzIgsmLiMsIJL2A1szdvYreJY1T/lNKQ3lG9d8+htNuzXk/Q1v5MlFmZaczsLJK/jz54PUaFKVd1ZPonyNsrk+XqfT8XbXT7l+3I/5J7+gSi7rD189dpO3OsykWfenmfn7tMfupssLZjMEhYHCbAgANn6zlaUzVrMuZHGu/2liwuIY2+AtGnSoy4cb3zTpfHER8bxaZypVGlRk9oGZeX6aPLvnEnNeXUhcRALDPx7IwLdfNNuTqU6n48yui+xYvIfTOy8gBDTr0YieY5+lSdcGJs9xFBjjxsHgwQTWbsTUDReZ3Lk6u5Zu5v3w41gtWkRyXApJsckkxSYbt1PQarRYWlliZW2JpZUllsa1lbUlpbxd8anohUdZt0L1JvRfaDVaLh68xo7Fezi2+TTla5Th9QWjaNT5KbOdQ5OlYe7YxexdeYhuIzowedGYPP1+rp/w48uh84kMimLg270Z+lF/k9v5+YP1rPnsN95aPp6uwzvk6pi4iHjGNZ6BnYMNP5z5CqdS5nEZFjS5NQS5ifyxBQYD7wIfZi+5mYk211JYwkcfxu0Ld3KiHkzRQ1n81krZ1XrAI2ugPohs3fPvJyzNl5REcnyK/HTgt7Kz6Cff6/l5gVQOCw+MlMvfWyv7l37VEP1SZbzct/pw4Qj1DA6W6Y2bym9f+UDeO3NFyjVrZHrjpnLUx78W2/rE2WQn6/XzHik7i37yBZehcvWnv5pdbTb4Vpic0vZ92Vn0k6tmbsxzvP2BdUdlV+sBckilcXnKYdFqtXL9V1sMtYRfXZjr40Juh8nXGk2TPRwGy4BLhTtK6N9gxvDR3RjmB6YDb2YvuWncXEthNwR6vT6nwtdrjablOrMzLjIhR1Trs8FzZVJccq7PqdPp5IJJP8nOop8cUXtyvpJ69Hq9/H3eH4bKYS5D5fZFewrkJq3J0si/Nh6XrzWalvO7OrfPPLkN+eG3PZdkzMzPpBw+XMqvv5YyJkbeiU4xS3hkYUSv18sT28/KEbUmGRLzOn4kj205natqfKag1Wjlxm+2yu72g2SvUq/IfasP57m/2Tfwqe0+MOn/JJuIoKicMNFZ/b7J1cOTXq+XO5ftkz2dhsje7sPyVAvhSWNOQ3A1Nw0V5FLYDUE2x7aeln29Rsju9oPklgW7cpeirtHK1Z/8KrtaD5CDKow1+cZ4bu8lOajCWPms1Utyxfvr8qXWGeofnqMb80b7D82Wc/BvdDqd3Lf6sBxSaVxO1aii9qRVFNHpdPLGqVtyWudZsrPoJ4fXfF0e33bG7Bmxer1ent51Xo5p8GZO+dPo0Ng8taXVauW88YaHrE8HfpsnY3XhwBX5gutQ+YLLUPnnzwdzPd7svIm3On5UZGtsm9MQLAHq56axglqKiiGQ0pB2/k53Q6GVd3t8luuks5tn/HOe0BZOWWGSuyc5PkV+NXx+TkJNXp6Yssl+CupV6hXZ3X6QXPfl5gKTgs5Mz5QbZ2+TL7oNk10s+suvRyyQt84FmP3JtKSSmZ4pLx++Ltd98bt8r+fnOYlpvT2Gy83f78y3TPSD8Dvrn/MwMbTqBHlo0/E8G5r01Az5Qa8vc+Qi8vKWmpGWIV+uPE6OqDVJhgdG5vq4yHvRsotFf/nt6B8Lhwszj+TWEDx0slgIcRXQYxCaqw7cATIBYZhakOabSXoEhX2y+N9IKdm28E+WTFuFg7M9s7bOoE6LGo88LiMtk2UzVrP1h91UqluBL3a/h2c5j1yf99CmE3w19Hsq1q3AJ9vfzle0R0xYHAte/4ljm0/j7evJyx/0o+uIDgUSKZEUl8z6LzazZf4uNFlaLCwE5aqXoVK9CtRoUo3uozrh4uFs9vMWN6SUXD58nWObT+N3NoDbZwPQZGkBqFCrHPVa16Ju65q06tUUZzcns547OiSWpTN+4eC6Y7h6OjPk/X70fK2Lybku97f3cb/Z3DobwPh5I+k1oZvJbUgpWTZjNRtnb2P2wZk0eKZuro/96d21rP9yM6sCFlCmso/J5y4s5DtqSAgRDzR82IFSyrsP+87cFDVDkM3d68G82/1zLCwtWHxxdq5D5U7vusAnL83B2c2JWVumm1Tl6czuC8zqOxsrGyte+3Y4XYfnL7HrzO4LrJq1iZunblO7RXUm/ziGqg0q5bm9/yImLI5rx/wIvHKXoGvBBF0NJvR2OPZOdvSa0I0XJnTDq3zuDWNJQa/Xc2LbWTZ8vYUbJ29ja29DlQYVqd+mNnXb1KJuq5oFlu2t0+rYumA3P3+4Hp1WR9+pPRkwvReOrnmLqpFSsnv5ARa9uRK9Vs87aybTqldTk9uJDY9n7phFnPrjPF2Hd+Ct5eNzdVxqYio/TFnB3pWHaN27GTN/m2byuQsT+Y4aAs7n5pXicSxFyTX0b64cvZFTIMQUbl+4Iwf5jpU9HAabJKAlpSHKIXtibEbXT/KtTaPX6+WeVX/Jft4j5bNWL8kfp654bEJzgVfvyU8HzZVdLPrn1DX+7bsdMjqkaPpszUlWZpbctfxATs2Gl6uMl9sW7jZbQaL/IjE2Sa7/akuOCuq7PT4zSePnQUQFx8h3nvs0Z44q1D/c5Db0er3cv+aw7O0+THa3HyR/+25Hrl075/dfloN8jfNtH+Rvvq2wgBlcQyHAt/9hQB76nbkpqm8E2SyZtopNc7bz+a73aNr1oS9Z/0d8ZAIz+3zD9RO3GDZrAEPe75vrp3u9Xs+ORXtZOuMXhBCM/nooPcZ0zpdrJzk+hZ/eWcvOpfvwKOvGa98Op03vZmbLOP0vwgIiOLj+GId/PcGdS4aX0bqta/JM/1a07dvcJBdaUSU1MZW710MMy7VgDm06QUxoHFUaVGTgjN6069eiwK/F3evBbP5+F/t+OURmehYNO9Sl79Tnad6jUZ7fPKWU7PvlMD9MXo5Oo+PVL4fwwviuJv+tJkQn8v34pRz57RS1W1Rn2ooJuUq4zEzP5Kd31rL5+5052c61m5uW5FlYMYdrKBz4EcOcwP8hpZyVrx6aQFE3BFkZWYxrPJ20pHSWXvnWpGSUrIws5o5dzL5fDtN+YGve+mmcSZIQEUFRzB2ziPP7rlC/XW0mLxxNxToV8jKMHK6fvMW8cUu4c+kuzm6ONOveiJbPN6FJ1wZ5dgmYQrBfKIc3nTQYBaNmj7ObI57lPfAs545HWXe8jNvuZdxwcLHH3skOeyc77BxtcfVyybPv2tykp2aQEp9KamLaA5f4iHju3gjh7rUQokNic46ztbehbuua9HvjeZp0bVigEhVajZazf15i8/ydnN97GWtbazoNaUvvSd1znZX7MOIi4pk7djEnt5+jbuuaTFsxgXLVcl8wPpvrJ2/x0Ytfk5qQyiuzBtD/redzlbQYcCmIzwZ9R/DNUHpN6Maor15+YtpOBYE5DMF5KWUjs/csDxR1QwDgdzaASS3fpUbjKkxfOdEkaQgpJRu+3sryd9dSsW553lo+wSR9Fmn0uy6dsZq0pHQGTO/FkPf7YmNnk5ehAAbf8PFtZzmx/Qyn/zhPYkwy9k52DH6vL32m9DBJUC8/BPuFcnL7OcIDo4gNiyMmNI6YkFjiIxN52N+2naMtTbo25OmO9anTsga+dco/tv6mJadz9ehNLh28ysW/ruF//g56/cOz+23srPGtXZ6KdctTqU4FfOuUp1LdCvhU8irw7GwpJQfXH2PZ26tz5EJeGN+NHmM653vOQUrJnz//xZK3VpKZnsWITwfRe3J3k8ek1+vZuXQ/S6atws3HlZmbp1O5Xu4UY49vO8OcV3/EytqS6Ssn0rhLg7wMpVBjDkNwQUr5tNl7lgeKgyEAOPzrCb4bu5jM9CxGfjaY3pO7m/T6e3rXBb4d/SMJUUm8+sUQ+r3R06QnwYToRJZM+4W9qw5RvkYZpiwea1IkxcPQ6XTcOHGLTXO2c3zrGcpWK82oL1+m1QtNHovb6EFoNVriwuOJDU8gPSWDjNQMMlIySE/JIOBiECe2nyUuIgG9To+llSUV65SnSoOKVG1QiSoNKlG+emmc3Jywd7Iz+Wlbp9MRH5lIbFg8saFxxIbFEREUzdWjN/A7E4BOq8PK2pLaLWrw1DN18K7giYOLPY6uDv+32Dmafn5zcP3kLRa98TM3Tt6m2tOVGfJ+X7MICEopOfvnRdZ+/jtXj96kXptaTF3ymknii9mE34nk29E/cvHgNZ7uVJ9pKybkKpggJSGVhVNWsHfVIao0qMi7a6dQsXb5vAyn0GMOQ+Auc6EM+jgoLoYADNEM341dzMkd56jftjbvrZ+KRxm3XB+fHJ/CnFE/cmzzaVr1aspby8ebHAp4bu8l5o1bSvidSLqN7MiYb4aaLZzw7J5LLJyyguCboZTycqFd/5Z0HNyWOi1rFCqFTSklof4RBFwIJOBSkGG5GERsWPw/9rOwtMDR1QGnUo44lXLAsZQjVtaW6LR69Dq9QYFUqzOoj2q0JMUk5xiY+7G0sqRGkyo0aF+PpzvWo06rmoXSBREVHMNP76zhwNqjuJcuxcjPB9PllWfyHTas0+o4/OtJ1n+1mTuX7uJZzp0h7/ej++hOJret1+vZumA3y99di4WlBWNnv5Jr5dEzuy/w7ehFxEUkMOid3gx5v2+hcRMWBEp0rhAjpWTvqkPMn7iMCjXLMufQxyYpUkop2TxvJ0um/4JXeXfe3/CGyeqhGWmZ/DJrE79+ux1XT2cGzuhNp5fbmiXMUKvRcuqP8xxcf5QT286SlaGhdCUv2g9oTcfBbahcP39+5YIkITqRO5fuEhEYRWpiGikJqaQkpOZsJ8enGt8iLLC0ssTC0rDO/tnF3dk4T+GGh3G+wqOsG24+roVHaO8+9Ho9UfdiuHcjlMuHrrFl/i6klPR743kGvv0i9k75K2CUmZ7Jnp//YtOc7YTfiaRCrXK8NK0XnYa0ydMNOORWGLNfXci1Y3407daQKYvH5krVNi05ncVvrmTnsv1UrFOeaT9PzLP8dVFCGYIiwKk/zvFhr69o0q0h76yebLKi4fWTt/hs4FziwuN59YshefKx+l8MZMHrP3HtmB9W1pa07t2M4Z8Monx10yfsHkRacjrHtpzm4PpjnNtzCb1Oj7evJ+VrlKFe69q8OOk5syc3Kf6bm6dvs2XBLoKuBhPiF0ZmelbOd+0HtmbUF0PyXXBFk6Vh87ydbJqznYSoRGo1r87AGS/S8oUmeXq70Gl1/D5vJz9/sA4bOxvGzR1Ol1eeydVbwLXjfnwxZB5R92Lo/9YLDJv1Ur7mx4oSyhAUEXYs3sv8CUtxK12KKYvG0qJnY5OOT4pLZvbIhZzYdpZazavzxpKxeXriDrxyl93LD7J7xQE0mVoGzniRgW+/aNZ/mIToRA5vOsm14zcJuRXOrbMBOJVypN+bz9Nncvd8P30qHo5er+fC/its/WE3J7adxdndiVrNq+Nbsyy+tctToVY5fGuXM8sb4fl9l1nw+k8E+4XRpGsDBr7dm6fa1cmzazDgUhDfjl7ErbMBtHyhCZMWjs511vzOpfuYP3EZ3r6eTF/5utkqrBUVzCZDXRiWopxQlhtunvGXo+pPlZ1FP/nF0HkyMTbJpOOzk2j6eI6QXSz6y1n9Z8tb5wLy1JeYsDj52eC5OUXKT+++kKd2coP/xUD5/gtfyM6in+zrNUJumrNNpqWkF9j5SiKx4XFy7ee/y5erjJedRT/Zx3OEXDVzY4EkBEYFx8hPBszJ+ds5tfN8vtrLSMuQy95ZI5+1ekn283lV/rUx97pFWZlZOaJxb3f7JF/6W0UZzFG8vrBQnN8IssnK1LD2s99Y/+UWXDycmLRwNG16NzepjcSYJH7/7g+2LNhFWlI6Tbs1ZPC7fajXprbJ/Tm/7zLzJy4j5FY4pSt707jzUzTq8hQNO9bDxd28uj83Tt3m5w/WcX7fFSytLKnSoCJ1WtSgTssa1G5Zg9KVvAvVRHNhR6/Xc27vZXYu3ceJbWfRaXU07FCX7qO70Lp3M7OHymo1Wn7/7g9++XgTep2eQe/04aVpL+TrbfLSoWvMHbOY0NvhdBvRgdHfDM313118VCKfvDSHK4dv8NJbLzDyi8GFcn7mcaBcQ0UU/4uBzB65kICLQXQf1Ylx340wObokNTGVbQv38Pt3O0iITqJ+29oMercPTZ5tYNINNStTw56f/+LM7gtcPHCVtOR0LCwENZpUpZHRMNRvW9tsQnRXj97g1M4L3Dh5C7/T/jlF5t18XKnTsgbevl7G6B1HHFwdcCpliObxLOduUqnCokxiTBLBfmGkJ6eTFJtiCJENiyM2IsGwDosnLiyejLRMXD2d6Tq8A8+N6mT234+Ukhsnb3HzlD87l+3j7vUQWvRszPjvRlCmSt5F2u7dDGXj11v58+eDlKniw5TFY2nUqX6uj/e/EMhHvb8mISqRN5eNo+PgtnnuS3FAGYIijFajZeWHG1j/1RbKVS/D1CV5i/fPSMtk17L9bJq9jeiQWJo+9zTjvh2WpzrHWo2Wm6f9Ob/3Muf2XebmqdvodXqqN67CuG+HU7+t6W8d/4VOqyPw6j1unLjF9ZO3uHnqNnERCaQlpT9w/6oNK9FpSDs6DGptthq7hQW9Xs/5fVfYuWwfJ7aeQavR/eN7Owdb3Mu6GSKVyrrjUboUtVvUoGWvpgWSKOd3NoCFU1Zw/bgfABVqlmX010Np+fyjXdEPIy05nZUfbmDL/J1YWlny4uvP8cqsAbl+CMrK1LDpm22s+fRXSnm7MnPzNGo0Lv5RQY9CGYJiwMWDV/l29CLC70TSc2wXRn31Mo4uDia3o8nSsO2HP1k1ayOZaVn0ntSdlz/omy85iNTEVI5uPs3KDzcQHRJL2wiASd4AAByASURBVH4tGP3VywUu2avT6UhPzvhHWGfglXvs++UQfmcCsLAQNOxUn85D2tG6d7M8FUcvDGRlagi6eo8zuy6ye/l+IoKicfFwpsvQdjR+toEht8HNCY+ybjg42z8W11lcRDzL313HnpV/4erlwvCPB9Di+SYm5cE8iONbz7Dg9Z+IDoml59guDPt4AKW8XHN1rFajZe+qQ6z+5Fei7sXwzEstmfD9q7h55+744o4yBMWEjLRMVn64gd+/24F7GTcmLRyd5yev+MgEVry/nt3LD+Dq5cLIzwblu8ZARlomv87ZzoavtqDT6ugzpQeD3u2TJ4OVX4L9Qtm/+gj71xwmIigaW3sbmvdsTOV6vpSp4kPpyt6UqeKNm0+pQjXnkJmeyZ3L97h97g63z9/B/0IgQVfv5Tz5N+xYj+6jOheIf/9RSCmJvBvNXxuOs+7z38nKyKLP5B4Mfr9vvq9xVHAMCycv59iWM1Su78uURWOo0zJ3UT06nY6/1h9n1ayNhPlHUKtZNYZ/MrBYykTkB2UIihl+Z/yZM+pHAq/co13/lrzyUf88i8fdOhfAD5MNr/bVG1dhwryR+Q6riwmNZfn769i78hClvF15aVovKtf3xauCB94VPB5raKiUkmvH/di/+jCn/jj/D7E2MLhSSlf2xquCB46uDtg72ePgYo+Dsz32zvY4uthj62BrSBKztsLK2hJLK8uctaE00/0Rd4CU6PUSnUZLVoYGTaaGrEwtmowsNJlasjKySI5LITEmmaS4ZMM6Jomk2BSS41JydJFcPJyp1qgyNRpVoVqjKtRuXg1v3/zF9JtCfGQCfmcC8Dvjj9/ZAG6d8ScxJhmAFs83ZuzsYfnKMdFpdfidDeD0zvP8/t0f6HV6hn70En2n9siVfIWUkqO/n2LlRxu4ez2EKg0qMvzjgbTo2bhQGffCgjIExRBNloaNX29j/ZebyUjLpG2/Foz7dnieirVIKTm47ihLZ6wmJjSOWs2qMejdPrR6wfQiIPfjdzaARW/8zNWjN//xubObI16+njTv3oiXpvUyOXkuP2RlZBERFE34nUjC70QScSeS8MAookNiSU9OJy0pnbTkdDJSMwu0HzZ21rh6uuDs4YSrpwsuHk64eLjg5u1KlQYVqd6oMl4VPB/rDU2r0bJ7+UH2/nKIyKCoHIkNCwtBxboVqNmkKjWaVqNOyxr5KkgUExrL8vfWcWzL6Zx5nhY9GzN+3ohcuxNvnLrN/InLuH3uDhVqlWPYrAG07du8QKrmFReUISjGJMYksfn7nfw6ZzuWVpaM+GwQz497Nk8hcumpGWydv4s9qw4RfDOU5j0aMf67EZStWjrP/ZNSEnUvhqh7MUQHG9ZRwbGE3g7j/L4rOLjY021ER158/bl8RZiYG51OR0ZKBmnJGWSmZaLT6tBqdDlrvXEtpUQIYbhhCxBCYGEhQAisbaywtrXG2tYKGzubnLWNnXWhymbV6XQcXHeMVTM3En4nkmpPV6byU75UqV+Rmk2rUa1RZZNkTx6GVqNly/xdrJq5EZ1WR6ch7Wjc5SkadKib63mA1MRUlr+3ju0/7sGjrBsjPxtMxyFtSmxIqCkoQ1ACCL8TyXfjlnB+72Vqt6jO1MV5yyqGf/7DajU6Bs54kQEzeplU+yA3+F8MZNPsbRzaeAK9Tk+L5xvTe1J3Gnaop17tHwNSSo5tMUzyB10LpmrDSoz4dBDNnnvarL//tOR0zv55kdWf/ErglXs079GICfNGmmT4pZQc+e0kP0xeQXxEAr0mdmP4JwOfyPxTUUUZghKClJIDa4/y49QVpCSk0XNsF9r2a0G91rXyJAEdExbH0um/cGDtUUpX9mbc3OE079HI7E9fMWFx7PhxDzsW7yExJpnK9X158fXutOrVBBcPZ/W6bwaklMRFJBB45Z5huXoXv9P+3LsRSoWaZRn28UCzulZC/cM5teM8p3ae4/Kh62g1Orx9PZkwbyQtX2hikqGJuhfN/Ik/cXLHOao2rMTUxWNNFlZUFHJDIIQIApIBHaB9VEeVIXg0iTFJLJ2+mgNrj6DJ0uLs5kjT556mVa9mtOnTzOQb+aW/rjF/4jLuXg/B2saKMlV9qFCzLOWql6VCzbI06/407qXzFzYIBv/9gbVH2fz9zpxqY1bWlriVLoVHGTfcy7jhXroU7mXcDPr8DrbYOtjiU9GTuq1rldi3iHs3Q/G/EEhGaiYZqRnGmguZZBhrL0QERXHn8j2SYpNzjnEvXYpK9X3pMLANXYa2y3etiNSkNE7tOMetswGc2nmekFvhAPjWLkeLHo1p1qMRdVvVNKmGQUJ0In8s3sf6rzaDhGEfD6D3pO5PrK5FUacoGIImUsqY3OyvDEHuSUtO59yeS5zYcTancliNJlWZsmgM1RtVMaktrUbL4U2GcpAht8IIuRVOmH8Emiwt9k52DHqnD70mdjNLrL6UkqtHb+J/IdCQLRsRT1x4AnHh8cSFx+dErtxPhVrleGF8V7q88kyJcBekp6RzaOMJdi0/kJPMdT+WVpY55Tg9y3tQuZ4vlev/vZhDUA4M8wt/Lj/Iig/WkxCViLWNFQ061KV598Y079EoT/M+2ZXGlr+7huT4VFr0bMzE+a/mWwW1pKMMgQKdTsehjSdY9MbPJEYn0eWV9jw/7llqNKma5ydpnVbH3eshrPxoA8e3nsHR1YHuozrx4uvPFWiYoyZLQ0ZqJplpmWSkZXHjxC22LdzNzdP+CCFo3rMRDZ6pS4P2danSoGKxmUiUUnLj1G12/3SAvzYcIz0lgwq1yvHcyI40fe5pYxUzW+wcbR9LgZXz+6+w+M2V3Ll8l3ptavHq54Op0aRqvibC/S8GMm/cUm6euk2D9nWZMG9Eoa5ZUZQo7IYgEIgHJLBYSrnkv/ZXhiB/pCSksvLDDexefoCMtEyqPV2ZHmO60HFwm3w9zd84dZvfv9vB4V9PAtCuf0v6Te35WH25N0/f5q/1xzj5x3lCbxtcE46uDtRvV5sGz9SlXptaeFXwpJSXS6F3L6SnZhBxJ5KwAMMSHhDBlSM3CLoWjJ2DLc+81IrnRnV6ItXeQm6Hs2TaKk5sO0vpSl6M/noobfu2yFc/7peVcPFwZszsV+j8crsS6+4rCAq7ISgrpQwTQngDe4HXpZSH/7XPGGAMgK+vb+O7d+8+9n4WN1ITU9m/5ih/LNnLnct3sXO0peOgNvQY2yVfuixR96LZMn8XfyzdR1pSOvXa1KLbyI54VfDExd0JFw8nnN2dCrz+bkxoLJcPXefSX9e4dOh6jmEAQ4inq6czbqVLGRYfV1w9XLB1sMHW3ta4tsHG3rC2trXGwtIiZ7G0ssTSuC0ESGNCGRjXxp9zQk41OrQabc62JktLRkoGqUlpObkLqcnppCenkxyXQvidSOIjE/8xHqdSjlSu70vnl9vxzIBWBe7+0ul0RAfHEno7nNDbEYT5hxPqH2H42T8COwdbBr3Tmz5TeuT5DSA5PoW714LxvxDE+q82ExeeQI8xnRn5+WBVoKgAKNSG4B8dEGImkCKlnP2wfdQbgXnJdjf8sWQvhzYcJzM9CxcPZ7qP7szg9/rkOX48LTmd3csPsPn7nUQERv3f99Y2VpTyceXZYe3pM7kHLh7mlbP+NzFhcfid9jfMM0QkEB+ZSHxkgmGJSCAxJpnM9Kz/qy9c0Nja2+Dg8ncWs6OrA6UreVOmamnKVPGhbFUfylT1Mbvc94MIuBTEL7M2cvXoTVIS0tBp/xa0s7W3oWy10pSrXoaKdcrzwviueQoQ0Ol07Fy6n/Vfbibq3t/e4GpPV2bSwtHUbl7dLGNR/D+F1hAIIRwBCyllsnF7L/CxlHL3w45RhqDgSElI5a8Nxzm//zJHfj2JV3kPxs5+hXb9W+Z9HkGnI8QvzCCjEJtMclwKSbEpJMUmE3TtHqd3XsDOwZbuozvT942euao5W5BoNVoy07PITMskMz2LrHSDLIROZyhQn12kPns7ByHI/hVlJ5jdL0thZW3597aNFfZOdjg42xcKF9XdGyGsmrmRw5tO4OjqQLt+LSnl7ULpyj6Uq1aactVL41HWPd9vcPdnA9dvW5sWPRtTsU55KtatgE9FL0P7sbGwdi2EhkLbttCtGxSTOZ4nTWE2BFWAzcYfrYC1UsrP/usYZQgeD1eP3WTB6z8RcDGIhh3qMuH7V6lUN296Rv/F3evBbPh6KwfWHkUI6DSkHS9N74VvLdPlsRW5R0rJvZuhrP9yMwfWHMHWwZY+k3vQ942eZnXLJMencHL7OQ7/doKT28/hUdaNsbOH0X5Aq/8zLLtX76L93A+xmzQRqlWDrVtJvXaDHe99x4BWSkY6vxRaQ5AXlCF4fOh0OnYu2ceK99eRmpROrwndaPF8E8oYRdpMiQl/FJF3o/l1znZ2/bSfrAwNrXs345n+LfEs74FnOXc8yro9lkiY4ohOqyPYLwz/C4H4Xwgk4GIgAReDSI5PxcbOml4TuvHS9F65lnl4FLHh8Rzfeoajm09x6eA1dFodXuU96PRyOwa90/uhQQnp7TvyeueJvPdaVyp7OhIYk8qxkW/QtWsTvCaMNkvfSjLKECjyRWJMEiveX8/OpftyJkUtLAReFTwpXdmb0pW88ankRaPOT+VbuTQhOpEt3+9i6w+7SUlI/cd3pbxc8Cjnjmc5dxxc7LGxNej3WNtaY2NnbdT1scbW3oZGnesX27DD6JBYjm89Q1pSOlqNFp1GR1ZGFukpGTlLWnK6USspnYjAKLIyNABY21pT5SlfqjWsTNWGlWj1YrN81RDQ6XQc/e0UgVfukRCdlFNASEpJueplaNunOW36NH90mHJKCvTtS+Ca35m64SKTO1dn3r7bfN/aA98vZ8L69Xnuo8KAMgQKsxAbHk+IXxjhgVFEBEYSERhl3I4iLtygVNm6dzNGfTEk3+UQM9MzCQuIJCYklpjQOGJC44gNjSM61PBzRkoGmkytUeJZgyZDgyZL+482qjSoSOfsSmXlTFdlLUykp6RzetdF/lxxgHN7LqHX//2/KoTA2tYqRzrb3skOe2c7w9rJDu8KnlR9ujLVnq6Mb61yZpuXuHjwKoveXEnAxSAsLAQuHs74VPKiRc8mtOnTnIp1yud+XiErCzp2hKNHOegXxYgVZ1gxoikdUkNgyRJYtMgsfS7JKEOgKHDSktPZPG8nG77eQlaGhudfe5aXP+xntgzW3CClRJOlJTkuhSO/nWT/miPcPHUbIQQNO9aj5fNNqNemFuVrljWLmmZBEh0Sy7VjN7l2zI9rx28ScOkuep0er/IePDusPZ1feQbvCh5YWls+9oS5kFthLJ2xmuNbz+Dt68mrXwzhmZda5r8fY8cS2aIdY9MqMblzdRb8eYNVu77BceYH0Ly5eTpfglGGQPHYiI9MYNXMjexcug87JzsGv9uX3pOee2KyyyG3w9m/+jD71xwh6l5MTkikVwUPKtQqh2/NclSoVY4yVbxxdncylH0s5YhjKccCqwCm1+tJjku5L4Q1kQTjduS9aK4fv0Xk3WjAELZZq3l16raqSYP2dWnQoe5jv/GnJadz7dhNLh++wZUj17l5yh8bO2sGvdOHPlO6m02VNuhuFEH9h9KslAUONauRceIUi2s/ywtz36Gy5+OrWVFcUYZA8di5ez2YZW+v4eSOcziVcqRc9dJ4+3riVd4Tb9+/l1LerjmJW7YONgV2k5NSEnIrjMAr9wj2CyPYL5Tgm2EE3wwlPSXjgcfY2Fkbq5bZYWlthbWNFZbGUFArGyusrK3+kVAm9fLvSmV6iTbLGIqanoUmQ5MTjpqZnsWD/tcsrSzxKOtGzWbVqNeqFnVb16Rqw0pmnZS/H51OR2ZaFhmpRpG61Ewy0gzrlPgUrp+4xZUjN/A/fwe9XmJpZUnNplVp0L4uvSd1x82nlFn7s/70PZpX8aCyJgkiI6FWLQJTdJy6E8vAZr5mPVdJRBkCxRPj4sGrHFh7lKhgY2GauzFkpD24+peNnTXdR3VmwIxej82nL6UkNiyOiKBoUhNSSU1MIyUhjRTjdmpCKumpGcasYEN2sCZLm5MhjJRgLEZzf3GabL99ToaynQ3WdkaDZ2+Dq5cLbj6ulPJ2xc3HFTefUji5OT4Wye3Iu9Fsmr2N3csPkJme9dD9rG2tqd2iOvXb1uapZ+pSu0X1Qu9SUzwcZQgUhQYpJcnxKcaKZbEkRiflPCkHXrvHgTVHsbC0MIjXTeqer5q4in9y72YoG77ewv7VRwDoMKg1VZ6qhJ2DDXaOBqVSWweDaJ2Dsz2+dcoXmHtM8fhRhkBRZAgPjGTd55vZs/IvdFodZauVpmnXhjTt1pCn2tdVT6R54Pb5O6z7cjNHfzuFjZ01z43qRP83ny9QhVhF4UMZAkWRIyo4hhPbznL2z4tcPHCVjLRMrG2sqN+uNk26Po1v7XK4ejrj4uGMq6czDi4OJVqpMitTQ9Td6Jxw3sigKCKCogjzj+D2+UAcXOzpNaEbvSf3wM3bPIljiqKFMgSKIk1WRhZXj97kzO6LnNl9gbvXQ/5vH0srS1w8nHDxcMbG3gZrGyvDhK6NVU4ReStrS4NiqIXAwsICCwvDtqWlRY5WkMHPL3DzcaVGk6rUaFLVLDfO9NQMwvwjCPOP4N7NUOLC4/+eXM6ZZAap16PT69Fr9ej+pWuUM/ls1EHKTPt7Oy0p/R8T0FbWlnhX9KJ0JS8adqjPC+OfxdFVRd6UZJQhUBQrYsLiiA6OJSkmiaTYFBJjkkiKTSYpJpmkuGQ0mVqyMjVos7RoswxJZxrjtl4v0ev0SL1Er9ffty3BGPGj10tS4lNzbqz2Tnb4VPSilLcLpbxdKeVlmOR19XLB2tbKKDOtM5wve0I5U0NMSKxButk/IifhLhtndyfDBLOFRY4BEhbZYnWW90le3yd9bWWJrYNNTolOWwfDJLStgy3Obk6GLO/Khixvj7JuxaYgj8I85NYQFEyMmkJhZjzLuuNZ1r1Az5GWnI7/hUBun7tDRGAUMWFxJEQl4n8hkISopP+Tv3gQ7qVL5cxxlK1W2qjkWYYyVX1KRDlNRdFEGQKFwoiDsz1PtavDU+3qPPD7rEwNidFJaDVarKyNbqh/yU0/jlBQhcLcKEOgUOQSG1trvMoXbf0iheJBqMcXhUKhKOEoQ6BQKBQlHGUIFAqFooSjDIFCoVCUcJQhUCgUihKOMgQKhUJRwlGGQKFQKEo4yhAoFApFCUcZAoVCoSjhKEOgUCgUJRxlCBQKhaKEowyBQqFQlHCUIVAoFIoSzhMxBEKIbkIIPyGEvxDi7SfRB4VCoVAYeOyGQAhhCfwAPAfUAQYJIR4sAK9QKBSKAudJvBE0A/yllHeklFnAeqDXE+iHQqFQKHgyhqAcEHzfzyHGzxQKhULxBHgShkA84DP5fzsJMUYIcVYIcTY6OvoxdEuhUChKJk/CEIQAFe77uTwQ9u+dpJRLpJRNpJRNvLy8HlvnFAqFoqTxJAzBGaC6EKKyEMIGGAhsewL9UCgUCgVPoHi9lFIrhJgI/AlYAsullNcedz8UCoVCYeCxGwIAKeVOYOeTOLdCoVAo/onKLFYoFIoSjpDy/wJ2Ch1CiGjgbi529QRiCrg7Two1tqJLcR5fcR4bFP3xVZRSPjLapkgYgtwihDgrpWzypPtREKixFV2K8/iK89ig+I8vG+UaUigUihKOMgQKhUJRwiluhmDJk+5AAaLGVnQpzuMrzmOD4j8+oJjNESgUCoXCdIrbG4FCoVAoTEQZAoVCoSjhFAtDUNwrngkhgoQQV4QQF4UQZ590f/KDEGK5ECJKCHH1vs/chRB7hRC3jWu3J9nH/PCQ8c0UQoQar99FIUT3J9nHvCKEqCCEOCiEuCGEuCaEmGz8vMhfv/8YW7G4do+iyM8RGCue3QK6YFA2PQMMklJef6IdMyNCiCCgiZSyKCe2ACCEaAekAKuklPWMn30NxEkpvzQacjcp5Ywn2c+88pDxzQRSpJSzn2Tf8osQogxQRkp5XgjhDJwDXgSGU8Sv33+M7SWKwbV7FMXhjUBVPCtCSCkPA3H/+rgXsNK4vRLDP2CR5CHjKxZIKcOllOeN28nADQxFpYr89fuPsZUIioMhKAkVzySwRwhxTggx5kl3pgDwkVKGg+EfEvB+wv0pCCYKIS4bXUdFznXyb4QQlYCngVMUs+v3r7FBMbt2D6I4GIJcVTwr4rSWUjYCngMmGN0PiqLDj0BVoCEQDsx5st3JH0IIJ+A3YIqUMulJ98ecPGBsxeraPYziYAhyVfGsKCOlDDOuo4DNGNxhxYlIo48221cb9YT7Y1aklJFSSp2UUg8spQhfPyGENYYb5Rop5e/Gj4vF9XvQ2IrTtfsvioMhKNYVz4QQjsbJK4QQjsCzwNX/PqrIsQ0YZtweBmx9gn0xO9k3SSO9KaLXTwghgJ+AG1LKb+/7qshfv4eNrbhcu0dR5KOGAIwhXd/xd8Wzz55wl8yGEKIKhrcAMBQSWluUxyeEWAe0xyDvGwl8BGwBNgK+wD2gv5SySE64PmR87TG4FiQQBIzN9qkXJYQQbYAjwBVAb/z4XQy+9CJ9/f5jbIMoBtfuURQLQ6BQKBSKvFMcXEMKhUKhyAfKECgUCkUJRxkChUKhKOEoQ6BQKBQlHGUIFAqFooSjDIGiyCOESDFh3/ZCiFYF2Z9HnH+KEOIVM7SzXghR3Rx9UiiUIVCUNNoDT8QQCCGsgJHAWjM09yMw3QztKBTKECiKJ0KI54UQp4QQF4QQ+4QQPkYxsdeAqUZt+bZCCC8hxG9CiDPGpbXx+JlGkbG/hBB3hBCT7mv7FaMI2SUhxC9CCGchRKBRogAhhIuxhoT1v7rVETgvpdQa9/tLCDFXCHHYqIPfVAjxu1HX/1PjPo5CiD+M57oqhBhgbOsI0NloXBSKfKH+iBTFlaNACymlFEKMAqZLKd8UQiziPn15IcRaYK6U8qgQwhf4E6htbKMW0AFwBvyEED8CNYD3MAgBxggh3KWUyUKIv4AeGLKkBwK/SSk1/+pTaww69/eTJaVsZyyEshVojEHGOkAIMRfDG0yYlLKHsb+uAFJKvRDCH2jwgDYVCpNQhkBRXCkPbDBqxdgAgQ/ZrzNQxyA1A4BLtrYT8IeUMhPIFEJEAT4Ynup/zS4SdJ+UwjIMrpotwAhg9APOVQaDzv39ZOtiXQGuZcsXCCHuYBBTvALMFkJ8BeyQUh6579gooCzKECjyiXINKYor84EFUsr6wFjA7iH7WQAtpZQNjUs5Y2ESgMz79tNheHASPEDmXEp5DKgkhHgGsJRSPkicLP0B/cg+h/5f59MDVlLKWxjeEq4AXwghPrxvHztjmwpFvlCGQFFccQVCjdvD7vs8GYOrJ5s9wMTsH4QQDR/R7n7gJSGEh3F/9/u+WwWsA1Y85NgbQLVH9vw+hBBlgTQp5WpgNtDovq9rANdMaU+heBDKECiKAw5CiJD7ljeAmcAmIcQR4P5az9uB3tmTxcAkoIlx8vc6hsnkhyKlvAZ8BhwSQlwC7pdjXgO4YTAGD2IXYGpRofrAaSHERQxzE9mTyD5AenFUwlQ8fpT6qEJhJoQQ/YBeUsqh/7HPZgwT17fzea6pQJKU8qf8tKNQgJosVijMghBiPoZSot0fsevbGCaN82UIgATgl3y2oVAA6o1AoVAoSjxqjkChUChKOMoQKBQKRQlHGQKFQqEo4ShDoFAoFCUcZQgUCoWihPM/Bfmx34sU8NQAAAAASUVORK5CYII=\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "# Using sample mean and std. to compute density probability for cross validation set\n", "pval=mutlivariateGaussian(Xval,mu,sigma)\n", "# Calculating the threshold based on the best F1 Score\n", "epsilon,f1=selectThreshold(yval,pval)\n", "# Getting indices for anomalous examples\n", "indices=np.where((p\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
012345678910
863-3.357801-6.06349519.827681-2.843608-6.47280513.165775-1.30180411.396985-11.5868983.16464317.165776
3772.5412021.2953662.816464-18.192452-5.44531417.679813-15.3258509.203726-3.411643-4.39875414.293232
2820.506733-1.74664321.146559-27.537185-9.62469024.728547-18.7321478.330862-0.3971589.1972459.742638
3697.149015-7.7357636.911932-13.206095-30.845135-3.0047592.893837-1.338351-10.686856-12.0073507.673190
5210.440863-20.1224968.223160-2.15436212.276639-4.383862-11.5438523.127246-0.237430-1.6946384.206813
\n", "" ], "text/plain": [ " 0 1 2 3 4 5 \\\n", "863 -3.357801 -6.063495 19.827681 -2.843608 -6.472805 13.165775 \n", "377 2.541202 1.295366 2.816464 -18.192452 -5.445314 17.679813 \n", "28 20.506733 -1.746643 21.146559 -27.537185 -9.624690 24.728547 \n", "369 7.149015 -7.735763 6.911932 -13.206095 -30.845135 -3.004759 \n", "52 10.440863 -20.122496 8.223160 -2.154362 12.276639 -4.383862 \n", "\n", " 6 7 8 9 10 \n", "863 -1.301804 11.396985 -11.586898 3.164643 17.165776 \n", "377 -15.325850 9.203726 -3.411643 -4.398754 14.293232 \n", "28 -18.732147 8.330862 -0.397158 9.197245 9.742638 \n", "369 2.893837 -1.338351 -10.686856 -12.007350 7.673190 \n", "52 -11.543852 3.127246 -0.237430 -1.694638 4.206813 " ] }, "execution_count": 12, "metadata": {}, "output_type": "execute_result" } ], "source": [ "pd.DataFrame(X).sample(5)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### Principal Component Analysis (Optional)" ] }, { "cell_type": "code", "execution_count": 13, "metadata": {}, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "# Centering and scaling the data matrix\n", "xPCA=(X-X.mean(axis=0))/X.std(axis=0)\n", "# Computing Covariance\n", "C=np.cov(xPCA.T)\n", "# Computing eigenvalues and eigenvectors\n", "eigenValues,eigenVectors=np.linalg.eig(C)\n", "# Sorting eigenvalues in descending order\n", "idx=eigenValues.argsort()[::-1]\n", "eigenValues=eigenValues[idx]\n", "eigenVectors=eigenVectors[idx]\n", "\n", "# Plotting elbow curve\n", "chart=sns.lineplot(list(range(len(eigenValues))),np.cumsum(eigenValues));\n", "chart.set(xlabel='Eigen Values',ylabel='Cumulative sum');" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Looking at the graph above, we can conclude that most of the singular values matter for this dataset.\n", "\n", "#### Finding Anomalies" ] }, { "cell_type": "code", "execution_count": 14, "metadata": {}, "outputs": [], "source": [ "# Computing Gaussian Parameters\n", "mu,sigma=estimateGaussian(X)\n", "p=mutlivariateGaussian(X,mu,sigma)" ] }, { "cell_type": "code", "execution_count": 15, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Epsilon : 1.3786074982000233e-18\n", "F1 Score : 0.6153846153846154\n" ] } ], "source": [ "# Using Cross Validation set to select a threshold\n", "Xval=mat['Xval']\n", "yval=mat['yval']\n", "# Computing density probability\n", "pval=mutlivariateGaussian(Xval,mu,sigma)\n", "epsilon,f1=selectThreshold(yval,pval)\n", "print(f'Epsilon : {epsilon}')\n", "print(f'F1 Score : {f1}')" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "**Found 117 Anomalies**" ] }, { "cell_type": "code", "execution_count": 16, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
012345678910
015.107877-16.43076619.707360-19.811888-1.644537-6.444184-6.1212147.0422837.23247617.223479-2.956852
112.4117063.15095914.827734-10.482672-8.250082-7.982698-20.76691830.6894764.62254712.23475123.167294
220.9467541.0481708.296324-2.595042-14.0619708.776611-21.8860689.769264-20.07113013.8719064.197881
35.127033-18.51713711.422480-28.993408-5.797960-15.989215-12.03975331.2966818.2032088.03566819.519680
411.622006-0.22972310.005823-9.700729-14.76549326.933578-9.29988213.1091718.9762188.15717018.663064
5-5.689178-9.70742322.2581807.890772-11.39764134.445407-9.836411-0.179841-13.26105215.2006897.595782
616.452993-15.32002617.283979-5.896654-2.94096412.148073-3.42262315.684343-20.903409-0.306900-8.481797
7-1.907518-10.1910115.041437-31.5398850.7613682.6712012.14960011.920996-10.353145-5.472842-7.579770
8-2.665572-1.793277-3.312666-11.771151-22.9488240.6577024.0408982.684116-4.217029-12.9934726.657632
9-2.120839-22.57335210.638703-2.0648670.942871-11.1363181.74789822.794201-3.7267474.053987-1.185641
10-12.692722-11.4989050.026479-8.809048-16.233664-6.701840-10.635467-8.274253-12.428766-2.3964409.134138
1114.552377-38.59361319.161298-11.379035-24.67981729.394102-10.2559914.409564-20.899036-6.9976682.424330
123.968173-0.94844516.3905324.925583-30.25214714.208280-11.77589914.966458-10.9491190.96774622.231068
1321.302835-22.47878622.219274-10.333549-15.15376022.31641712.582181-0.541537-9.43633710.1685427.909259
1412.9819348.31903119.570986-17.000717-23.49379416.9813199.99673920.3867083.952619-4.3102156.554124
15-14.696577-17.20923714.525584-20.4754096.15927112.879206-13.9424174.008424-5.97408817.80836413.138762
166.1045853.181527-3.318357-23.428609-14.55989120.376025-8.4343546.850325-17.518661-4.5840835.415755
1718.8294491.171611-0.177123-3.604261-3.41329819.5233490.90354218.084633-11.911412-7.92111818.581649
188.511318-16.10722529.176976-21.298302-29.8558740.995455-7.2669778.1599630.9856097.729459-12.966527
19-5.513919-6.8386574.026831-7.0591060.96788315.2059734.9478555.362446-20.47781811.95815316.785018
2019.861932-7.8575065.643955-4.439531-0.84603726.410503-28.74180813.098772-14.189061-2.01023310.575248
21-10.373139-33.57765814.393455-3.373885-12.0783831.415410-6.675364-7.337178-4.6860003.7006220.949668
226.766758-4.40757910.305895-4.4008966.75428723.58476014.64471116.288997-17.19577318.1586902.366239
231.081479-12.69050731.5374069.477382-15.6769291.106263-10.3240354.418272-19.2676746.1746475.671273
24-15.600509-20.35123018.33472810.487489-16.0376351.283141-8.87962112.1409374.8448132.226241-4.970682
256.075045-23.85770911.6931874.866555-11.308274-14.698708-6.384952-10.841639-14.239166-9.7034914.654031
2617.438743-12.6158990.7892131.746310-13.324761-4.484684-8.72846926.461376-13.22848710.5459758.663423
27-0.345422-9.86808526.251767-25.748620-22.1684800.075066-4.9023242.7726235.538813-10.65286312.019222
288.782745-11.03972419.792848-7.454397-11.136051-5.493029-26.63675214.116266-9.00101012.18234721.790293
291.8152326.53683915.9589746.2318715.501488-4.8442461.44260926.645073-15.078784-14.62122411.307183
....................................
87-7.107823-2.659451-9.9137767.865090-15.062972-6.669139-10.886804-5.428388-6.145721-1.69492736.544551
8814.410571-22.4777263.857208-2.952726-24.88094126.884771-10.30126014.843514-5.62955015.83472514.923468
892.024200-17.99589218.1202559.302085-20.657652-1.342614-18.167920-6.7616271.510516-0.82274312.133360
9024.1614732.15071822.656128-13.8344544.338249-5.126474-6.1192243.4149711.0665109.99734327.965546
91-11.113160-5.64785023.2609814.848569-6.39947818.21001613.16430019.956570-0.3458789.65433110.193919
92-11.316527-8.60039925.029113-2.779305-2.41441918.9462122.166333-5.7781130.0441834.84972722.058928
9310.463708-21.58087823.9466227.302745-22.0521800.784292-7.5729496.403820-1.5673847.09663521.298699
94-2.731858-1.160324-1.203266-9.844513-8.30969027.4091558.01383410.136497-16.9462085.64617410.622073
95-0.343405-2.9805903.57423010.676147-3.6621732.813027-21.867923-6.557764-2.5759853.41159416.251755
96-1.741997-1.48763127.069244-7.5857682.93621824.6169082.10137041.978198-0.5265888.414796-1.203203
97-9.546285-5.59847416.340206-0.153478-14.9821392.475574-14.79176925.6550022.786267-5.18495918.274686
9812.453219-4.06505117.5362157.5435188.57137420.703939-18.2567047.374196-10.9452390.359840-12.650669
9913.4197617.41029923.401764-17.150200-8.98799916.752096-7.50370520.8561911.77092617.36948514.560195
100-8.993098-24.1379588.507993-28.898992-4.012547-2.715727-4.0275056.212865-15.7770598.403863-1.090873
1017.663754-21.31595910.085647-13.4764591.86976931.556190-4.2077396.783527-9.06969825.7114984.205376
102-9.653924-10.0979666.088028-17.224249-35.3518222.677276-13.81538210.687653-10.8043565.571192-9.528244
1035.5912356.70706925.2612027.251960-15.3359476.264382-1.49367224.244968-4.64305813.6280949.853019
1045.349885-12.91908312.132417-30.097538-23.68771415.293885-7.95428716.382830-2.277219-12.92647225.837356
10511.459300-6.87355724.0648250.688340-14.256252-14.539024-26.29600318.508660-6.11472915.6682790.323248
106-3.840912-12.8003351.341582-5.303823-11.195030-0.0784780.028865-8.083519-21.34462910.631312-8.177534
10712.687826-7.98979415.5369746.6412901.06200533.3528656.12296417.815628-17.525844-2.7214043.446680
1080.117894-24.10831425.600026-2.184434-26.4068519.524311-10.713197-1.100855-7.452232-16.072449-1.506024
109-14.471792-12.09913017.744803-5.173237-13.187795-3.559686-6.379751-5.804498-10.55295221.1747724.976100
110-8.591807-7.0446478.2141134.041871-13.3614538.9308216.097335-11.421545-5.72395612.70534223.809446
111-11.788266-11.48362712.438678-3.1628110.12198315.905273-14.98810015.049161-19.249455-8.94927116.943905
112-7.514689-11.63308212.714199-9.659930-20.17002646.574569-10.49880420.522685-1.2237424.478910-0.186369
1138.610956-2.08759513.609762-5.5094574.565548-2.1501336.6527946.604923-0.554557-21.5514095.522046
1144.712890-5.4680147.46378515.156009-4.815854-10.0926293.830391-0.360002-11.221351-3.2624861.591322
115-12.120077-5.84591328.951978-10.215184-18.07029715.439734-4.96133831.429439-7.4064235.84700020.797016
1163.059507-5.92629831.8374230.24534010.050776-1.9974282.05944912.5716244.11015914.8156449.035330
\n", "

117 rows × 11 columns

\n", "
" ], "text/plain": [ " 0 1 2 3 4 5 \\\n", "0 15.107877 -16.430766 19.707360 -19.811888 -1.644537 -6.444184 \n", "1 12.411706 3.150959 14.827734 -10.482672 -8.250082 -7.982698 \n", "2 20.946754 1.048170 8.296324 -2.595042 -14.061970 8.776611 \n", "3 5.127033 -18.517137 11.422480 -28.993408 -5.797960 -15.989215 \n", "4 11.622006 -0.229723 10.005823 -9.700729 -14.765493 26.933578 \n", "5 -5.689178 -9.707423 22.258180 7.890772 -11.397641 34.445407 \n", "6 16.452993 -15.320026 17.283979 -5.896654 -2.940964 12.148073 \n", "7 -1.907518 -10.191011 5.041437 -31.539885 0.761368 2.671201 \n", "8 -2.665572 -1.793277 -3.312666 -11.771151 -22.948824 0.657702 \n", "9 -2.120839 -22.573352 10.638703 -2.064867 0.942871 -11.136318 \n", "10 -12.692722 -11.498905 0.026479 -8.809048 -16.233664 -6.701840 \n", "11 14.552377 -38.593613 19.161298 -11.379035 -24.679817 29.394102 \n", "12 3.968173 -0.948445 16.390532 4.925583 -30.252147 14.208280 \n", "13 21.302835 -22.478786 22.219274 -10.333549 -15.153760 22.316417 \n", "14 12.981934 8.319031 19.570986 -17.000717 -23.493794 16.981319 \n", "15 -14.696577 -17.209237 14.525584 -20.475409 6.159271 12.879206 \n", "16 6.104585 3.181527 -3.318357 -23.428609 -14.559891 20.376025 \n", "17 18.829449 1.171611 -0.177123 -3.604261 -3.413298 19.523349 \n", "18 8.511318 -16.107225 29.176976 -21.298302 -29.855874 0.995455 \n", "19 -5.513919 -6.838657 4.026831 -7.059106 0.967883 15.205973 \n", "20 19.861932 -7.857506 5.643955 -4.439531 -0.846037 26.410503 \n", "21 -10.373139 -33.577658 14.393455 -3.373885 -12.078383 1.415410 \n", "22 6.766758 -4.407579 10.305895 -4.400896 6.754287 23.584760 \n", "23 1.081479 -12.690507 31.537406 9.477382 -15.676929 1.106263 \n", "24 -15.600509 -20.351230 18.334728 10.487489 -16.037635 1.283141 \n", "25 6.075045 -23.857709 11.693187 4.866555 -11.308274 -14.698708 \n", "26 17.438743 -12.615899 0.789213 1.746310 -13.324761 -4.484684 \n", "27 -0.345422 -9.868085 26.251767 -25.748620 -22.168480 0.075066 \n", "28 8.782745 -11.039724 19.792848 -7.454397 -11.136051 -5.493029 \n", "29 1.815232 6.536839 15.958974 6.231871 5.501488 -4.844246 \n", ".. ... ... ... ... ... ... \n", "87 -7.107823 -2.659451 -9.913776 7.865090 -15.062972 -6.669139 \n", "88 14.410571 -22.477726 3.857208 -2.952726 -24.880941 26.884771 \n", "89 2.024200 -17.995892 18.120255 9.302085 -20.657652 -1.342614 \n", "90 24.161473 2.150718 22.656128 -13.834454 4.338249 -5.126474 \n", "91 -11.113160 -5.647850 23.260981 4.848569 -6.399478 18.210016 \n", "92 -11.316527 -8.600399 25.029113 -2.779305 -2.414419 18.946212 \n", "93 10.463708 -21.580878 23.946622 7.302745 -22.052180 0.784292 \n", "94 -2.731858 -1.160324 -1.203266 -9.844513 -8.309690 27.409155 \n", "95 -0.343405 -2.980590 3.574230 10.676147 -3.662173 2.813027 \n", "96 -1.741997 -1.487631 27.069244 -7.585768 2.936218 24.616908 \n", "97 -9.546285 -5.598474 16.340206 -0.153478 -14.982139 2.475574 \n", "98 12.453219 -4.065051 17.536215 7.543518 8.571374 20.703939 \n", "99 13.419761 7.410299 23.401764 -17.150200 -8.987999 16.752096 \n", "100 -8.993098 -24.137958 8.507993 -28.898992 -4.012547 -2.715727 \n", "101 7.663754 -21.315959 10.085647 -13.476459 1.869769 31.556190 \n", "102 -9.653924 -10.097966 6.088028 -17.224249 -35.351822 2.677276 \n", "103 5.591235 6.707069 25.261202 7.251960 -15.335947 6.264382 \n", "104 5.349885 -12.919083 12.132417 -30.097538 -23.687714 15.293885 \n", "105 11.459300 -6.873557 24.064825 0.688340 -14.256252 -14.539024 \n", "106 -3.840912 -12.800335 1.341582 -5.303823 -11.195030 -0.078478 \n", "107 12.687826 -7.989794 15.536974 6.641290 1.062005 33.352865 \n", "108 0.117894 -24.108314 25.600026 -2.184434 -26.406851 9.524311 \n", "109 -14.471792 -12.099130 17.744803 -5.173237 -13.187795 -3.559686 \n", "110 -8.591807 -7.044647 8.214113 4.041871 -13.361453 8.930821 \n", "111 -11.788266 -11.483627 12.438678 -3.162811 0.121983 15.905273 \n", "112 -7.514689 -11.633082 12.714199 -9.659930 -20.170026 46.574569 \n", "113 8.610956 -2.087595 13.609762 -5.509457 4.565548 -2.150133 \n", "114 4.712890 -5.468014 7.463785 15.156009 -4.815854 -10.092629 \n", "115 -12.120077 -5.845913 28.951978 -10.215184 -18.070297 15.439734 \n", "116 3.059507 -5.926298 31.837423 0.245340 10.050776 -1.997428 \n", "\n", " 6 7 8 9 10 \n", "0 -6.121214 7.042283 7.232476 17.223479 -2.956852 \n", "1 -20.766918 30.689476 4.622547 12.234751 23.167294 \n", "2 -21.886068 9.769264 -20.071130 13.871906 4.197881 \n", "3 -12.039753 31.296681 8.203208 8.035668 19.519680 \n", "4 -9.299882 13.109171 8.976218 8.157170 18.663064 \n", "5 -9.836411 -0.179841 -13.261052 15.200689 7.595782 \n", "6 -3.422623 15.684343 -20.903409 -0.306900 -8.481797 \n", "7 2.149600 11.920996 -10.353145 -5.472842 -7.579770 \n", "8 4.040898 2.684116 -4.217029 -12.993472 6.657632 \n", "9 1.747898 22.794201 -3.726747 4.053987 -1.185641 \n", "10 -10.635467 -8.274253 -12.428766 -2.396440 9.134138 \n", "11 -10.255991 4.409564 -20.899036 -6.997668 2.424330 \n", "12 -11.775899 14.966458 -10.949119 0.967746 22.231068 \n", "13 12.582181 -0.541537 -9.436337 10.168542 7.909259 \n", "14 9.996739 20.386708 3.952619 -4.310215 6.554124 \n", "15 -13.942417 4.008424 -5.974088 17.808364 13.138762 \n", "16 -8.434354 6.850325 -17.518661 -4.584083 5.415755 \n", "17 0.903542 18.084633 -11.911412 -7.921118 18.581649 \n", "18 -7.266977 8.159963 0.985609 7.729459 -12.966527 \n", "19 4.947855 5.362446 -20.477818 11.958153 16.785018 \n", "20 -28.741808 13.098772 -14.189061 -2.010233 10.575248 \n", "21 -6.675364 -7.337178 -4.686000 3.700622 0.949668 \n", "22 14.644711 16.288997 -17.195773 18.158690 2.366239 \n", "23 -10.324035 4.418272 -19.267674 6.174647 5.671273 \n", "24 -8.879621 12.140937 4.844813 2.226241 -4.970682 \n", "25 -6.384952 -10.841639 -14.239166 -9.703491 4.654031 \n", "26 -8.728469 26.461376 -13.228487 10.545975 8.663423 \n", "27 -4.902324 2.772623 5.538813 -10.652863 12.019222 \n", "28 -26.636752 14.116266 -9.001010 12.182347 21.790293 \n", "29 1.442609 26.645073 -15.078784 -14.621224 11.307183 \n", ".. ... ... ... ... ... \n", "87 -10.886804 -5.428388 -6.145721 -1.694927 36.544551 \n", "88 -10.301260 14.843514 -5.629550 15.834725 14.923468 \n", "89 -18.167920 -6.761627 1.510516 -0.822743 12.133360 \n", "90 -6.119224 3.414971 1.066510 9.997343 27.965546 \n", "91 13.164300 19.956570 -0.345878 9.654331 10.193919 \n", "92 2.166333 -5.778113 0.044183 4.849727 22.058928 \n", "93 -7.572949 6.403820 -1.567384 7.096635 21.298699 \n", "94 8.013834 10.136497 -16.946208 5.646174 10.622073 \n", "95 -21.867923 -6.557764 -2.575985 3.411594 16.251755 \n", "96 2.101370 41.978198 -0.526588 8.414796 -1.203203 \n", "97 -14.791769 25.655002 2.786267 -5.184959 18.274686 \n", "98 -18.256704 7.374196 -10.945239 0.359840 -12.650669 \n", "99 -7.503705 20.856191 1.770926 17.369485 14.560195 \n", "100 -4.027505 6.212865 -15.777059 8.403863 -1.090873 \n", "101 -4.207739 6.783527 -9.069698 25.711498 4.205376 \n", "102 -13.815382 10.687653 -10.804356 5.571192 -9.528244 \n", "103 -1.493672 24.244968 -4.643058 13.628094 9.853019 \n", "104 -7.954287 16.382830 -2.277219 -12.926472 25.837356 \n", "105 -26.296003 18.508660 -6.114729 15.668279 0.323248 \n", "106 0.028865 -8.083519 -21.344629 10.631312 -8.177534 \n", "107 6.122964 17.815628 -17.525844 -2.721404 3.446680 \n", "108 -10.713197 -1.100855 -7.452232 -16.072449 -1.506024 \n", "109 -6.379751 -5.804498 -10.552952 21.174772 4.976100 \n", "110 6.097335 -11.421545 -5.723956 12.705342 23.809446 \n", "111 -14.988100 15.049161 -19.249455 -8.949271 16.943905 \n", "112 -10.498804 20.522685 -1.223742 4.478910 -0.186369 \n", "113 6.652794 6.604923 -0.554557 -21.551409 5.522046 \n", "114 3.830391 -0.360002 -11.221351 -3.262486 1.591322 \n", "115 -4.961338 31.429439 -7.406423 5.847000 20.797016 \n", "116 2.059449 12.571624 4.110159 14.815644 9.035330 \n", "\n", "[117 rows x 11 columns]" ] }, "execution_count": 16, "metadata": {}, "output_type": "execute_result" } ], "source": [ "indices=np.where((p\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
grad (derivative)grad (numerical)
02.5704362.570436
1-0.173870-0.173870
20.4435130.443513
3-1.151438-1.151438
43.0783153.078315
51.4061081.406108
60.2513070.251307
70.8603910.860391
8-2.623469-2.623469
9-0.681626-0.681626
10-1.868502-1.868502
112.9086192.908619
12-1.269194-1.269194
13-0.828064-0.828064
14-0.727420-0.727420
150.4203400.420340
160.4051810.405181
17-1.245199-1.245199
180.0020560.002056
190.2489650.248965
20-3.372456-3.372456
211.4020441.402044
22-1.401868-1.401868
234.4467944.446794
241.5647901.564790
250.5185270.518527
26-0.877819-0.877819
\n", "" ], "text/plain": [ " grad (derivative) grad (numerical)\n", "0 2.570436 2.570436\n", "1 -0.173870 -0.173870\n", "2 0.443513 0.443513\n", "3 -1.151438 -1.151438\n", "4 3.078315 3.078315\n", "5 1.406108 1.406108\n", "6 0.251307 0.251307\n", "7 0.860391 0.860391\n", "8 -2.623469 -2.623469\n", "9 -0.681626 -0.681626\n", "10 -1.868502 -1.868502\n", "11 2.908619 2.908619\n", "12 -1.269194 -1.269194\n", "13 -0.828064 -0.828064\n", "14 -0.727420 -0.727420\n", "15 0.420340 0.420340\n", "16 0.405181 0.405181\n", "17 -1.245199 -1.245199\n", "18 0.002056 0.002056\n", "19 0.248965 0.248965\n", "20 -3.372456 -3.372456\n", "21 1.402044 1.402044\n", "22 -1.401868 -1.401868\n", "23 4.446794 4.446794\n", "24 1.564790 1.564790\n", "25 0.518527 0.518527\n", "26 -0.877819 -0.877819" ] }, "execution_count": 19, "metadata": {}, "output_type": "execute_result" } ], "source": [ "def computeNumericalGradient(J,theta):\n", " '''Computes the numerical gradient using two point slope equation'''\n", " numGrad=np.zeros(theta.shape)\n", " perturb=np.zeros(theta.shape)\n", " epsilon=1e-4\n", " for i in range(theta.size):\n", " perturb[i,:]=epsilon\n", " numGrad[i,:]=(J(theta+perturb)-J(theta-perturb))/(2*epsilon)\n", " perturb[i,:]=0\n", " return numGrad\n", "\n", "def checkNNGradients(lmbda):\n", " # Create small problem\n", " X=np.random.randn(4,3)\n", " theta=np.random.randn(5,3) \n", " Y=np.dot(X,theta.T)\n", " Y[np.random.rand(*Y.shape)>0.5]=0\n", " R=np.zeros(Y.shape)\n", " R[Y!=0]=1\n", " numUsers=Y.shape[1]\n", " numMovies=Y.shape[0]\n", " numFeatures=theta.shape[1]\n", " # Gradient from cost function derivative\n", " params=np.row_stack((X.reshape((-1,1)),theta.reshape((-1,1))))\n", " J,grad=costFunction(params,Y,R,numUsers,numMovies,numFeatures,lmbda)\n", " # Computing numerical gradient\n", " def cost(params):\n", " J,grad=costFunction(params,Y,R,numUsers,numMovies,numFeatures,lmbda)\n", " return J\n", " numGrad=computeNumericalGradient(cost,params)\n", " # Evaluating the norm of the differences between two solution\n", " diff=np.linalg.norm(numGrad-grad)/np.linalg.norm(numGrad+grad)\n", " return grad,numGrad,diff \n", "\n", "lmbda=1.5\n", "grad,numGrad,diff=checkNNGradients(lmbda)\n", "print(f'DIFFERENCE : {diff}')\n", "pd.DataFrame(data={'grad (derivative)':grad.reshape(-1),'grad (numerical)':numGrad.reshape(-1)})" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### 2.3    Learning Movie Recommendations\n", "Now that we have finished the collaborative filtering cost function and gradient, we can now start training our learning algorithm to make movie recommendations for ourself. Later, we will also enter our own movie preferences, so that when the algorithm runs, we can get our own movie recommendations." ] }, { "cell_type": "code", "execution_count": 20, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Y : 1682 X 943\n", "R : 1682 X 943\n" ] } ], "source": [ "# Loading data\n", "mat=loadmat('ex8_movies.mat')\n", "Y=mat['Y']\n", "R=mat['R']\n", "\n", "numUsers=Y.shape[1]\n", "numMovies=Y.shape[0]\n", "numFeatures=10\n", "\n", "print(\"Y : {0} X {1}\".format(*Y.shape))\n", "print(\"R : {0} X {1}\".format(*R.shape))" ] }, { "cell_type": "code", "execution_count": 21, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
MovieYear
ID
1528Nowhere1997
14120,000 Leagues Under the Sea1954
27Bad Boys1995
1060Adventures of Pinocchio, The1996
972Passion Fish1992
588Beauty and the Beast1991
159Basic Instinct1992
1454Angel and the Badman1947
16648 Heads in a Duffel Bag1997
239Sneakers1992
\n", "
" ], "text/plain": [ " Movie Year\n", "ID \n", "1528 Nowhere 1997\n", "141 20,000 Leagues Under the Sea 1954\n", "27 Bad Boys 1995\n", "1060 Adventures of Pinocchio, The 1996\n", "972 Passion Fish 1992\n", "588 Beauty and the Beast 1991\n", "159 Basic Instinct 1992\n", "1454 Angel and the Badman 1947\n", "1664 8 Heads in a Duffel Bag 1997\n", "239 Sneakers 1992" ] }, "execution_count": 21, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# Loading Movies\n", "movies={'ID':[],'Movie':[],'Year':[]}\n", "with open('movie_ids.txt') as f:\n", " for line in f.readlines():\n", " movies['ID'].append(int(line.split()[0]))\n", " movies['Movie'].append(' '.join(line.split()[1:-1]))\n", " movies['Year'].append(line.split()[-1][1:-1])\n", "movies=pd.DataFrame(movies)\n", "movies=movies.set_index('ID')\n", "movies.sample(10)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "##### Y is a 1682x943 matrix, containing ratings (1-5) of 1682 movies by 943 users" ] }, { "cell_type": "code", "execution_count": 22, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
0123456789...933934935936937938939940941942
Movie
Toy Story5400440004...2340400500
GoldenEye3000300000...4000000005
Four Rooms4000000000...0040000000
Get Shorty3000005004...5000002000
Copycat3000000000...0000000000
\n", "

5 rows × 943 columns

\n", "
" ], "text/plain": [ " 0 1 2 3 4 5 6 7 8 9 ... 933 934 \\\n", "Movie ... \n", "Toy Story 5 4 0 0 4 4 0 0 0 4 ... 2 3 \n", "GoldenEye 3 0 0 0 3 0 0 0 0 0 ... 4 0 \n", "Four Rooms 4 0 0 0 0 0 0 0 0 0 ... 0 0 \n", "Get Shorty 3 0 0 0 0 0 5 0 0 4 ... 5 0 \n", "Copycat 3 0 0 0 0 0 0 0 0 0 ... 0 0 \n", "\n", " 935 936 937 938 939 940 941 942 \n", "Movie \n", "Toy Story 4 0 4 0 0 5 0 0 \n", "GoldenEye 0 0 0 0 0 0 0 5 \n", "Four Rooms 4 0 0 0 0 0 0 0 \n", "Get Shorty 0 0 0 0 2 0 0 0 \n", "Copycat 0 0 0 0 0 0 0 0 \n", "\n", "[5 rows x 943 columns]" ] }, "execution_count": 22, "metadata": {}, "output_type": "execute_result" } ], "source": [ "pd.DataFrame(Y,movies['Movie']).head(5)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "##### R is a 1682x943 matrix, where R(i,j) = 1 if and only if user j gave a rating to movie i" ] }, { "cell_type": "code", "execution_count": 23, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
0123456789...933934935936937938939940941942
Movie
Toy Story1100110001...1110100100
GoldenEye1000100000...1000000001
Four Rooms1000000000...0010000000
Get Shorty1000001001...1000001000
Copycat1000000000...0000000000
\n", "

5 rows × 943 columns

\n", "
" ], "text/plain": [ " 0 1 2 3 4 5 6 7 8 9 ... 933 934 \\\n", "Movie ... \n", "Toy Story 1 1 0 0 1 1 0 0 0 1 ... 1 1 \n", "GoldenEye 1 0 0 0 1 0 0 0 0 0 ... 1 0 \n", "Four Rooms 1 0 0 0 0 0 0 0 0 0 ... 0 0 \n", "Get Shorty 1 0 0 0 0 0 1 0 0 1 ... 1 0 \n", "Copycat 1 0 0 0 0 0 0 0 0 0 ... 0 0 \n", "\n", " 935 936 937 938 939 940 941 942 \n", "Movie \n", "Toy Story 1 0 1 0 0 1 0 0 \n", "GoldenEye 0 0 0 0 0 0 0 1 \n", "Four Rooms 1 0 0 0 0 0 0 0 \n", "Get Shorty 0 0 0 0 1 0 0 0 \n", "Copycat 0 0 0 0 0 0 0 0 \n", "\n", "[5 rows x 943 columns]" ] }, "execution_count": 23, "metadata": {}, "output_type": "execute_result" } ], "source": [ "pd.DataFrame(R,movies['Movie']).head(5)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "##### Visualizing the movie ratings" ] }, { "cell_type": "code", "execution_count": 24, "metadata": {}, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "plt.imshow(Y,cmap='gray')\n", "plt.xlabel('Users')\n", "plt.ylabel('Movies');" ] }, { "cell_type": "code", "execution_count": 25, "metadata": { "scrolled": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Please enter the movie ratings(1-5 or 0 if not seen): \n", "\n", "Toy Story (1995) 4.1\n", "Silence of the Lambs, The (1991) 4.5\n", "Twelve Monkeys (1995) 1.5\n", "Usual Suspects, The (1995) 4.7\n", "Professional, The (1994) 3\n", "Shawshank Redemption, The (1994) 5\n", "While You Were Sleeping (1995) 3.5\n", "Forrest Gump (1994) 5\n", "Alien (1979) 3\n", "101 Dalmatians (1996) 3.8\n", "Sphere (1998) 0\n" ] } ], "source": [ "print('Please enter the movie ratings(1-5 or 0 if not seen): \\n')\n", "userRatings=np.zeros((numMovies,1))\n", "\n", "# Ask user ratings for set movies\n", "indices=[1,98,7,12,55,64,66,69,183,225,355]\n", "for index in indices:\n", " movie=movies.loc[index]\n", " try:\n", " question=f\"{movie['Movie']} ({movie['Year']})\"\n", " question=question.ljust(50)\n", " rating=float(input(question))\n", " if 1<=rating<=5:\n", " userRatings[int(index)-1]=rating\n", " except Exception as e:\n", " break" ] }, { "cell_type": "code", "execution_count": 26, "metadata": {}, "outputs": [], "source": [ "# Adding new user ratings \n", "Y=np.column_stack((userRatings,Y))\n", "# Updating R with new user ratings\n", "R=np.column_stack((np.zeros(numMovies),R))\n", "indices=np.where(Y[:,0]!=0)[0]\n", "R[indices,0]=1" ] }, { "cell_type": "code", "execution_count": 27, "metadata": { "scrolled": false }, "outputs": [], "source": [ "# Normalize Ratings\n", "Ymean=np.zeros((numMovies,1))\n", "Ynorm=np.zeros(Y.shape)\n", "\n", "for i in range(numMovies):\n", " idx=np.where(R[i,:]==1)\n", " Ymean[i]=Y[i,idx].mean()\n", " Ynorm[i,idx]=Y[i,idx]-Ymean[i]" ] }, { "cell_type": "code", "execution_count": 28, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Training Collaborative Filtering...\n", "ITERATIONS : 500\t\tCOST : 38914.118\r" ] }, { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "# Setting Initial Parameters\n", "X=np.random.randn(numMovies,numFeatures)\n", "theta=np.random.randn(numUsers,numFeatures)\n", "initialParams=np.row_stack((X.reshape((-1,1)),theta.reshape((-1,1))))\n", "\n", "# Setting Gradient descent options\n", "lmbda=10\n", "alpha=0.003\n", "iterations=500\n", "\n", "# Training Collaborative filtering\n", "jHistory,params=regularizedGradientDescent(initialParams,Ynorm,R,numUsers,numMovies,numFeatures,lmbda,alpha,iterations)\n", "# Unrolling the learned parameters into X and theta\n", "X=params[:numMovies*numFeatures].reshape((numMovies,numFeatures))\n", "theta=params[numMovies*numFeatures:].reshape((numUsers,numFeatures))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "**After training the model, we can now make the predictions by computing the prediction matrix.**" ] }, { "cell_type": "code", "execution_count": 29, "metadata": {}, "outputs": [], "source": [ "P=np.dot(X,theta.T)\n", "userPrediction=P[:,0]+Ymean.reshape(-1)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "**For Original Ratings provided by the user :**" ] }, { "cell_type": "code", "execution_count": 30, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
MovieYearUser Ratings
ID
1Toy Story19954.1
7Twelve Monkeys19951.5
12Usual Suspects, The19954.7
55Professional, The19943.0
64Shawshank Redemption, The19945.0
66While You Were Sleeping19953.5
69Forrest Gump19945.0
98Silence of the Lambs, The19914.5
183Alien19793.0
225101 Dalmatians19963.8
\n", "
" ], "text/plain": [ " Movie Year User Ratings\n", "ID \n", "1 Toy Story 1995 4.1\n", "7 Twelve Monkeys 1995 1.5\n", "12 Usual Suspects, The 1995 4.7\n", "55 Professional, The 1994 3.0\n", "64 Shawshank Redemption, The 1994 5.0\n", "66 While You Were Sleeping 1995 3.5\n", "69 Forrest Gump 1994 5.0\n", "98 Silence of the Lambs, The 1991 4.5\n", "183 Alien 1979 3.0\n", "225 101 Dalmatians 1996 3.8" ] }, "execution_count": 30, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df=movies.copy()\n", "df['User Ratings']=userRatings\n", "df[df['User Ratings']!=0]" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "**Top 10 Recommended Movies are :**" ] }, { "cell_type": "code", "execution_count": 31, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
MovieYearPredicted Ratings
ID
1201Marlene Dietrich: Shadow and Light19965.0
1122They Made Me a Criminal19395.0
1293Star Kid19975.0
1467Saint of Fort Washington, The19935.0
1599Someone Else's America19955.0
814Great Day in Harlem, A19945.0
1653Entertaining Angels: The Dorothy Day Story19965.0
1189Prefontaine19975.0
1536Aiqing wansui19945.0
1500Santa with Muscles19965.0
\n", "
" ], "text/plain": [ " Movie Year Predicted Ratings\n", "ID \n", "1201 Marlene Dietrich: Shadow and Light 1996 5.0\n", "1122 They Made Me a Criminal 1939 5.0\n", "1293 Star Kid 1997 5.0\n", "1467 Saint of Fort Washington, The 1993 5.0\n", "1599 Someone Else's America 1995 5.0\n", "814 Great Day in Harlem, A 1994 5.0\n", "1653 Entertaining Angels: The Dorothy Day Story 1996 5.0\n", "1189 Prefontaine 1997 5.0\n", "1536 Aiqing wansui 1994 5.0\n", "1500 Santa with Muscles 1996 5.0" ] }, "execution_count": 31, "metadata": {}, "output_type": "execute_result" } ], "source": [ "limit=10\n", "df=movies.copy()\n", "df['Predicted Ratings']=userPrediction\n", "df.sort_values(by=['Predicted Ratings'],ascending=False).head(limit)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "" ] } ], "metadata": { "kernelspec": { "display_name": "Python 3", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.7.1" } }, "nbformat": 4, "nbformat_minor": 2 }