From f9e66aa340985866c48c252e33e7ab6c4385d739 Mon Sep 17 00:00:00 2001 From: ritchie46 Date: Tue, 8 Oct 2019 18:09:39 +0200 Subject: [PATCH] core team vi training init --- .../training_bayesian}/1_intro_bayesian.ipynb | 0 .../training_bayesian}/2_mcmc.ipynb | 0 .../training_bayesian}/data/votes.npy | Bin .../images/2d-continuous.png | Bin .../training_bayesian}/images/2d-discrete.png | Bin .../images/PyMC3_banner.svg | 0 .../training_bayesian}/images/bernoulli.png | Bin .../training_bayesian}/images/cdf.png | Bin .../images/conditional_prob.png | Bin .../images/conditional_prob_continuous.png | Bin .../training_bayesian}/images/dieprob.png | Bin .../images/donotunderstand.jpg | Bin .../training_bayesian}/images/gauss.png | Bin .../training_bayesian}/images/islands.png | Bin .../training_bayesian}/images/marginal1.png | Bin .../training_bayesian}/images/marginal2.png | Bin .../training_bayesian}/images/marginal3.png | Bin .../images/random-variable-1.svg | 0 .../training_bayesian}/images/weights.png | Bin .../expectation_maximization.ipynb | 489 ++++++++++++++++++ 20 files changed, 489 insertions(+) rename {training_bayesian => trainings/training_bayesian}/1_intro_bayesian.ipynb (100%) rename {training_bayesian => trainings/training_bayesian}/2_mcmc.ipynb (100%) rename {training_bayesian => trainings/training_bayesian}/data/votes.npy (100%) rename {training_bayesian => trainings/training_bayesian}/images/2d-continuous.png (100%) rename {training_bayesian => trainings/training_bayesian}/images/2d-discrete.png (100%) rename {training_bayesian => trainings/training_bayesian}/images/PyMC3_banner.svg (100%) rename {training_bayesian => trainings/training_bayesian}/images/bernoulli.png (100%) rename {training_bayesian => trainings/training_bayesian}/images/cdf.png (100%) rename {training_bayesian => trainings/training_bayesian}/images/conditional_prob.png (100%) rename {training_bayesian => trainings/training_bayesian}/images/conditional_prob_continuous.png (100%) rename {training_bayesian => trainings/training_bayesian}/images/dieprob.png (100%) rename {training_bayesian => trainings/training_bayesian}/images/donotunderstand.jpg (100%) rename {training_bayesian => trainings/training_bayesian}/images/gauss.png (100%) rename {training_bayesian => trainings/training_bayesian}/images/islands.png (100%) rename {training_bayesian => trainings/training_bayesian}/images/marginal1.png (100%) rename {training_bayesian => trainings/training_bayesian}/images/marginal2.png (100%) rename {training_bayesian => trainings/training_bayesian}/images/marginal3.png (100%) rename {training_bayesian => trainings/training_bayesian}/images/random-variable-1.svg (100%) rename {training_bayesian => trainings/training_bayesian}/images/weights.png (100%) create mode 100644 trainings/variational_inference_core_team/expectation_maximization.ipynb diff --git a/training_bayesian/1_intro_bayesian.ipynb b/trainings/training_bayesian/1_intro_bayesian.ipynb similarity index 100% rename from training_bayesian/1_intro_bayesian.ipynb rename to trainings/training_bayesian/1_intro_bayesian.ipynb diff --git a/training_bayesian/2_mcmc.ipynb b/trainings/training_bayesian/2_mcmc.ipynb similarity index 100% rename from training_bayesian/2_mcmc.ipynb rename to trainings/training_bayesian/2_mcmc.ipynb diff --git a/training_bayesian/data/votes.npy b/trainings/training_bayesian/data/votes.npy similarity index 100% rename from training_bayesian/data/votes.npy rename to trainings/training_bayesian/data/votes.npy diff --git a/training_bayesian/images/2d-continuous.png b/trainings/training_bayesian/images/2d-continuous.png similarity index 100% rename from training_bayesian/images/2d-continuous.png rename to trainings/training_bayesian/images/2d-continuous.png diff --git a/training_bayesian/images/2d-discrete.png b/trainings/training_bayesian/images/2d-discrete.png similarity index 100% rename from training_bayesian/images/2d-discrete.png rename to trainings/training_bayesian/images/2d-discrete.png diff --git a/training_bayesian/images/PyMC3_banner.svg b/trainings/training_bayesian/images/PyMC3_banner.svg similarity index 100% rename from training_bayesian/images/PyMC3_banner.svg rename to trainings/training_bayesian/images/PyMC3_banner.svg diff --git a/training_bayesian/images/bernoulli.png b/trainings/training_bayesian/images/bernoulli.png similarity index 100% rename from training_bayesian/images/bernoulli.png rename to trainings/training_bayesian/images/bernoulli.png diff --git a/training_bayesian/images/cdf.png b/trainings/training_bayesian/images/cdf.png similarity index 100% rename from training_bayesian/images/cdf.png rename to trainings/training_bayesian/images/cdf.png diff --git a/training_bayesian/images/conditional_prob.png b/trainings/training_bayesian/images/conditional_prob.png similarity index 100% rename from training_bayesian/images/conditional_prob.png rename to trainings/training_bayesian/images/conditional_prob.png diff --git a/training_bayesian/images/conditional_prob_continuous.png b/trainings/training_bayesian/images/conditional_prob_continuous.png similarity index 100% rename from training_bayesian/images/conditional_prob_continuous.png rename to trainings/training_bayesian/images/conditional_prob_continuous.png diff --git a/training_bayesian/images/dieprob.png b/trainings/training_bayesian/images/dieprob.png similarity index 100% rename from training_bayesian/images/dieprob.png rename to trainings/training_bayesian/images/dieprob.png diff --git a/training_bayesian/images/donotunderstand.jpg b/trainings/training_bayesian/images/donotunderstand.jpg similarity index 100% rename from training_bayesian/images/donotunderstand.jpg rename to trainings/training_bayesian/images/donotunderstand.jpg diff --git a/training_bayesian/images/gauss.png b/trainings/training_bayesian/images/gauss.png similarity index 100% rename from training_bayesian/images/gauss.png rename to trainings/training_bayesian/images/gauss.png diff --git a/training_bayesian/images/islands.png b/trainings/training_bayesian/images/islands.png similarity index 100% rename from training_bayesian/images/islands.png rename to trainings/training_bayesian/images/islands.png diff --git a/training_bayesian/images/marginal1.png b/trainings/training_bayesian/images/marginal1.png similarity index 100% rename from training_bayesian/images/marginal1.png rename to trainings/training_bayesian/images/marginal1.png diff --git a/training_bayesian/images/marginal2.png b/trainings/training_bayesian/images/marginal2.png similarity index 100% rename from training_bayesian/images/marginal2.png rename to trainings/training_bayesian/images/marginal2.png diff --git a/training_bayesian/images/marginal3.png b/trainings/training_bayesian/images/marginal3.png similarity index 100% rename from training_bayesian/images/marginal3.png rename to trainings/training_bayesian/images/marginal3.png diff --git a/training_bayesian/images/random-variable-1.svg b/trainings/training_bayesian/images/random-variable-1.svg similarity index 100% rename from training_bayesian/images/random-variable-1.svg rename to trainings/training_bayesian/images/random-variable-1.svg diff --git a/training_bayesian/images/weights.png b/trainings/training_bayesian/images/weights.png similarity index 100% rename from training_bayesian/images/weights.png rename to trainings/training_bayesian/images/weights.png diff --git a/trainings/variational_inference_core_team/expectation_maximization.ipynb b/trainings/variational_inference_core_team/expectation_maximization.ipynb new file mode 100644 index 0000000..f5c8401 --- /dev/null +++ b/trainings/variational_inference_core_team/expectation_maximization.ipynb @@ -0,0 +1,489 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Expectation maximization\n", + "\n", + "$$ \\begin{eqnarray} \n", + " z_i &\\sim & Multinomial(\\phi) \\\\\n", + " x_i|z_i & \\sim & \\mathcal{N}(\\mu_{z_i}, \\sigma_{z_i})) \\\\\n", + "\\end{eqnarray}$$ \n" + ] + }, + { + "cell_type": "code", + "execution_count": 379, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAAA6IAAAFlCAYAAADxilWiAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADh0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uMy4xLjEsIGh0dHA6Ly9tYXRwbG90bGliLm9yZy8QZhcZAAAgAElEQVR4nOzdd3RUdf7/8eedNNILKbQgLSF0pEuXSBOpFlC/KK7r6lrBtf/c9csXXdsiWLCCiKIioiIgJXRFQAjSQ5eSACkE0kmd+/sjyIoECJCZO0lej3M4x9yZzPuFejJ5zf3czzVM00RERERERETEWWxWBxAREREREZHqRUVUREREREREnEpFVERERERERJxKRVREREREREScSkVUREREREREnEpFVERERERERJzK3arBoaGhZoMGDawaLyIiIiIiIg60adOmE6ZphpX1mGVFtEGDBsTHx1s1XkRERERERBzIMIzDF3pMS3NFRERERETEqVRERURERERExKlUREVERERERMSpVERFRERERETEqVRERURERERExKlUREVERERERMSpVERFRERERETEqVRERURERERExKlUREVERERERMSpVERFRERERETEqVRERURERERExKlUREVExGnsdrvVEURERMQFqIiKiEiFW7VqFddffz0tWrTgmmuuoWbNmnh5eTFixAgANm/erFIqIiJSjblbHUBERKqOU6dOERwczOHDh7n//vtp2bIlfn5+Z/94eXlht9t57rnn+OSTT/D09CQgIAA3Nzero4uIiIgT6YyoiIhUCNM0GTJkCLt37+buu+9m1KhRtGzZkgYNGhAaGkqNGjUwDAObzcaiRYuIiIhg0qRJtGjRgq+++srq+CIiIuJEKqIiInJVEhISGDVqFEVFRSxfvpyYmJhyf+/48eOZMmUKzz//PC+//LIDU4qIiIgrUREVEZErdvz4cQYMGEDv3r3x8PDA09Pzsr7fMAxiY2NZvXo1M2bMYMKECQ5KKiIiIq5E14iKiMgVycvLY8iQIdx///088MADV/VaderUYdWqVfTp0wcvLy+eeuqpCkopIiIirkhFVERELpvdbmf06NE0b96c5557rkJes1atWqxatYoTJ05QUlKCzWbDMIwKeW0RERFxLVqaKyIil+2FF14gLS2NDz/8sELLYnh4OM2b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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "import matplotlib.pyplot as plt\n", + "import numpy as np\n", + "from scipy import stats\n", + "\n", + "np.random.seed(654)\n", + "# Draw samples from two Gaussian w.p. z_i ~ Bernoulli(phi)\n", + "generative_m = np.array([stats.norm(2, 1), stats.norm(5, 1.8)])\n", + "z = stats.bernoulli(0.75).rvs(100)\n", + "x_i = np.array([g.rvs() for g in generative_m[z_i]])\n", + "\n", + "# plot generated data and the latent distributions\n", + "x = np.linspace(-5, 12, 150)\n", + "plt.figure(figsize=(16, 6))\n", + "plt.plot(x, generative_m[0].pdf(x))\n", + "plt.plot(x, generative_m[1].pdf(x))\n", + "plt.plot(x, generative_m[0].pdf(x) + generative_m[1].pdf(x), lw=1, ls='-.', color='black')\n", + "plt.fill_betweenx(generative_m[0].pdf(x), x, alpha=0.1)\n", + "plt.fill_betweenx(generative_m[1].pdf(x), x, alpha=0.1)\n", + "plt.vlines(x_i, 0, 0.01, color=np.array(['C0', 'C1'])[z])\n", + "plt.show()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Log likelihood\n", + "Let $\\theta = \\{ \\mu, \\sigma \\}$.\n", + "$$\\ell(\\theta) = \\sum_{i-1}^n \\log P(x_i; \\theta) $$\n", + "\n", + "Or in vector form:\n", + "\n", + "$$\\ell(\\theta) = \\log P(x; \\theta) $$\n", + "\n", + "This log likelihood function cannot be solved directly as it not includes the latent variable $z$.\n", + "\n", + "$$ \\ell(\\theta) = \\sum_{k=1}^K \\log P(x | z_k; \\theta) P(z_k) $$\n", + "\n", + "## Continuous form\n", + "\n", + "$$ \\begin{eqnarray}\n", + "\\ell(\\theta) & = & \\int \\log P(x | \\theta, z) P(z) dz \\\\\n", + "\\log P(x; \\theta)& = & \\int \\log P(x | \\theta, z) P(z) dz\n", + "\\end{eqnarray}$$\n", + "\n", + "\n", + "\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "**Jensens inequality:**\n", + "*Only for concave functions*\n", + "$$ E[f(X)] \\le f(E[X]) $$\n", + "\n", + "**Jensens equality:**\n", + "$$ E[f(X)] = f(E[X]) \\iff X = E[X] $$" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Evidence Lower BOund\n", + "\n", + "\n", + "Multiply the **evidence** w/ an arbitrary distribution over $Z, \\quad \\frac{Q(z)}{Q(z)} = 1$ \n", + "\n", + "$$ \\begin{eqnarray}\n", + "\\log P(x; \\theta)& = & \\int \\log Q(z) \\frac{ P(x | \\theta, z) P(z)}{Q(z)} dz \\\\\n", + "& = & \\log E_{z \\sim Q}[ \\frac{ P(x | \\theta, z) P(z)}{Q(z)}] \\\\\n", + "\\end{eqnarray}$$\n", + "\n", + "As the log function is a concave function, we can apply Jensen's inequality.\n", + "\n", + "$$ \\begin{eqnarray}\n", + "\\log P(x; \\theta)& = & \\log E_{z \\sim Q}[ \\frac{ P(x | \\theta, z) P(z)}{Q(z)}] \\\\\n", + "& \\ge & E_{z \\sim Q}[ \\log \\frac{ P(x | \\theta, z) P(z)}{Q(z)}]\n", + "\\end{eqnarray}$$\n", + "\n", + "\n", + "\n", + "Resulting in a lower bound on the evidence called the **ELBO**:\n", + "\n", + "$$ \\begin{eqnarray}\n", + "\\log P(x; \\theta)& \\ge & E_{z \\sim Q}[ \\log \\frac{ P(x | \\theta, z) P(z)}{Q(z)}]\n", + "\\end{eqnarray}$$\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Now what?\n", + "\n", + "Jensen's inequality holds to equaltiy if and only if $X = E[X]$. This will be the case if we choose a distribution that leads to:\n", + "\n", + "$$ \\begin{eqnarray}\n", + "\\frac{P(x|z) P(z)}{Q(z)} &=& \\frac{P(x, z)}{Q(z)} = 1\n", + "\\end{eqnarray}$$\n", + "\n", + "Wich means that \n", + "\n", + "$$ P(x, z; \\theta) \\propto Q(z) $$\n", + "\n", + "A next requirement is that $\\int Q(z) dz = 1$ (requirement of probability distribution).\n", + "\n", + "$$ \\begin{eqnarray}\n", + "\\int \\frac{P(x, z; \\theta)}{\\int P(x, z; \\theta) dz} dz &=& 1 \\\\\n", + "\\end{eqnarray}$$\n", + "\n", + "This will lead to:\n", + "\n", + "$$ \\begin{eqnarray}\n", + "Q(z) &=& \\frac{P(x, z; \\theta)}{\\int P(x, z; \\theta) dz} \\\\\n", + "&=& \\frac{P(x, z; \\theta)}{\\int P(x; \\theta)} \\\\\n", + "&=& P(z|x; \\theta)\n", + "\\end{eqnarray}$$" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Gaussian mixture model\n", + "\n", + "### Expectation\n", + "Given a Gaussian mixture model, observed data points $x$ and current parameters $\\theta_t$ find $Q(z)$" + ] + }, + { + "cell_type": "code", + "execution_count": 377, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "array([ 4.28244273, 4.66972656, 3.35275075, 2.36158676, 3.74751768,\n", + " 9.75240814, 5.15756521, 4.80213993, 5.90145058, 1.91271217,\n", + " 4.71273852, 2.36241133, 1.61084671, 6.71697406, 3.11442326,\n", + " 5.15422491, 5.09580485, 2.11274369, 6.76574344, 1.48354695,\n", + " 2.65304672, 6.81892055, 2.77103106, 5.06418788, 5.72517362,\n", + " 3.54313443, 5.67858554, 1.03222311, 1.63983108, 5.51107055,\n", + " 0.65124788, 4.97843073, 4.32989217, 2.28812021, 4.51797044,\n", + " 4.52825271, 6.93340533, 4.94273792, 2.54969132, 0.78634279,\n", + " 4.81172184, 5.19576022, 6.11967179, 3.5235398 , 0.75307613,\n", + " 4.23428727, 7.15230773, 2.83345813, 8.60608829, 4.27073679,\n", + " 7.75388195, 6.79259227, 0.62404892, 4.26260727, 4.09584051,\n", + " 3.26993383, 4.86431429, 8.38977374, 6.48961063, 4.09783105,\n", + " 4.40498267, 3.27433241, 7.44164281, 7.62286463, 3.21797707,\n", + " 4.42538064, 7.06135769, 3.94733606, 1.91385988, 5.23226903,\n", + " 3.61125312, 1.86866663, 5.71568321, 2.50687193, 2.26842535,\n", + " 3.75523264, 0.71738199, 8.02274291, 2.46995812, 5.35222504,\n", + " 2.72716235, 4.15793385, 5.33299762, 1.00091742, 7.04351757,\n", + " 6.14452194, 2.62636128, 4.55251749, -0.38101307, 4.27776483,\n", + " 1.57442618, 3.75797097, 0.52259715, 1.59952851, 6.13345271,\n", + " 1.42972786, 2.82725842, 4.57300419, 2.59096887, 3.45567689])" + ] + }, + "execution_count": 377, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# Data points x\n", + "x_i" + ] + }, + { + "cell_type": "code", + "execution_count": 266, + "metadata": {}, + "outputs": [], + "source": [ + "import torch\n", + "from torch import nn\n", + "import torch.distributions as dist\n", + "import torch.nn.functional as F" + ] + }, + { + "cell_type": "code", + "execution_count": 363, + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/opt/miniconda3/lib/python3.7/site-packages/ipykernel_launcher.py:1: UserWarning: To copy construct from a tensor, it is recommended to use sourceTensor.clone().detach() or sourceTensor.clone().detach().requires_grad_(True), rather than torch.tensor(sourceTensor).\n", + " \"\"\"Entry point for launching an IPython kernel.\n" + ] + } + ], + "source": [ + "x_i = torch.tensor(x_i, dtype=torch.float)" + ] + }, + { + "cell_type": "code", + "execution_count": 364, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "" + ] + }, + "execution_count": 364, + "metadata": {}, + "output_type": "execute_result" + }, + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "torch.manual_seed(1)\n", + "\n", + "k = torch.tensor([2])\n", + "mu = dist.Uniform(x_i.min(), x_i.max()).sample(k) \n", + "std = torch.ones(k)\n", + "\n", + "def expectation(x, mu, std, k):\n", + " qz = torch.zeros((k, x.shape[0]))\n", + " \n", + " for z in range(k):\n", + " qz[z] = dist.Normal(mu[z], std[z]).log_prob(x).exp() \n", + " \n", + " # normalize zo that marginalizing z would lead to p = 1\n", + " qz = qz / qz.sum(0)\n", + " return qz\n", + "\n", + "qz = expectation(x_i, mu, std, k) \n", + "\n", + "plt.figure(figsize=(16, 8)) \n", + "plt.title(r\"$Q(z) = P(z|x; \\theta)$\")\n", + "plt.bar(x_i, qz[0], width=0.01)\n", + "plt.bar(x_i, qz[1], width=0.01)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Maximization\n", + "\n", + "Optimize $\\theta$ with the $Q(z)$ found in the expectation step.\n", + "\n", + "$$ \\sum_{z_i} Q(z_i) \\log ( \\frac{p(x_i| z_i; \\theta) p(z_i)} {Q(z_i)}) $$" + ] + }, + { + "cell_type": "code", + "execution_count": 370, + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/opt/miniconda3/lib/python3.7/site-packages/ipykernel_launcher.py:4: UserWarning: To copy construct from a tensor, it is recommended to use sourceTensor.clone().detach() or sourceTensor.clone().detach().requires_grad_(True), rather than torch.tensor(sourceTensor).\n", + " after removing the cwd from sys.path.\n", + "/opt/miniconda3/lib/python3.7/site-packages/ipykernel_launcher.py:6: UserWarning: To copy construct from a tensor, it is recommended to use sourceTensor.clone().detach() or sourceTensor.clone().detach().requires_grad_(True), rather than torch.tensor(sourceTensor).\n", + " \n" + ] + } + ], + "source": [ + "k = torch.tensor([2])\n", + "mu = dist.Uniform(x_i.min(), x_i.max()).sample(k) \n", + "std = torch.ones(k)\n", + "mu = torch.tensor(mu, dtype=torch.float, requires_grad=True)\n", + "std = torch.tensor([1., 1.])\n", + "std = torch.tensor(std, dtype=torch.float, requires_grad=True)\n", + "phi = torch.rand(2, requires_grad=True)\n" + ] + }, + { + "cell_type": "code", + "execution_count": 371, + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/opt/miniconda3/lib/python3.7/site-packages/ipykernel_launcher.py:4: UserWarning: Implicit dimension choice for softmax has been deprecated. Change the call to include dim=X as an argument.\n", + " after removing the cwd from sys.path.\n" + ] + }, + { + "data": { + "text/plain": [ + "tensor(-512.5377, grad_fn=)" + ] + }, + "execution_count": 371, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "def get_elbo(mu, std, phi):\n", + " elbo = 0\n", + " for k in range(2):\n", + " z_i = F.softmax(phi)[k]\n", + " mu_i = mu[k]\n", + " std_i = std[k]\n", + " \n", + " for i in range(len(x_i)):\n", + " elbo += qz[k, i] * ((dist.Normal(mu_i, std_i).log_prob(x_i[i]) + torch.log(z_i) - torch.log(qz[k, i])))\n", + " return elbo\n", + "\n", + "elbo = get_elbo(mu, std, phi)\n", + "elbo" + ] + }, + { + "cell_type": "code", + "execution_count": 372, + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/opt/miniconda3/lib/python3.7/site-packages/ipykernel_launcher.py:4: UserWarning: Implicit dimension choice for softmax has been deprecated. Change the call to include dim=X as an argument.\n", + " after removing the cwd from sys.path.\n", + "/opt/miniconda3/lib/python3.7/site-packages/ipykernel_launcher.py:21: UserWarning: Implicit dimension choice for softmax has been deprecated. Change the call to include dim=X as an argument.\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "215.0631103515625 tensor([5.8801, 2.9457]) tensor([1.5491, 1.5054]) tensor([0.3965, 0.6035])\n", + "214.99671936035156 tensor([5.6912, 2.8268]) tensor([1.5984, 1.4784]) tensor([0.4478, 0.5522])\n", + "214.94085693359375 tensor([5.5913, 2.7706]) tensor([1.6360, 1.4637]) tensor([0.4746, 0.5254])\n", + "214.90855407714844 tensor([5.5367, 2.7465]) tensor([1.6611, 1.4576]) tensor([0.4884, 0.5116])\n", + "214.89120483398438 tensor([5.5059, 2.7380]) tensor([1.6776, 1.4564]) tensor([0.4954, 0.5046])\n", + "214.88137817382812 tensor([5.4879, 2.7368]) tensor([1.6889, 1.4577]) tensor([0.4989, 0.5011])\n", + "214.87564086914062 tensor([5.4766, 2.7388]) tensor([1.6970, 1.4600]) tensor([0.5006, 0.4994])\n", + "214.8721160888672 tensor([5.4690, 2.7420]) tensor([1.7031, 1.4625]) tensor([0.5014, 0.4986])\n", + "214.8697509765625 tensor([5.4635, 2.7455]) tensor([1.7079, 1.4651]) tensor([0.5018, 0.4982])\n", + "214.8681182861328 tensor([5.4594, 2.7489]) tensor([1.7118, 1.4674]) tensor([0.5019, 0.4981])\n" + ] + } + ], + "source": [ + "lr = 0.01\n", + "for i in range(10):\n", + " \n", + " # expectation step\n", + " with torch.no_grad():\n", + " qz = expectation(x_i, mu, std, k)\n", + " \n", + " # maximization step\n", + " for j in range(150):\n", + " negative_elbo = -get_elbo(mu, std, phi)\n", + " negative_elbo.backward()\n", + " \n", + " with torch.no_grad():\n", + " mu -= mu.grad * lr \n", + " std -= std.grad * lr\n", + " phi -= phi.grad * lr\n", + " std.grad.zero_()\n", + " mu.grad.zero_()\n", + " phi.grad.zero_()\n", + "\n", + " print(negative_elbo.item(), mu.data, std.data, F.softmax(phi).data)" + ] + }, + { + "cell_type": "code", + "execution_count": 384, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "[]" + ] + }, + "execution_count": 384, + "metadata": {}, + "output_type": "execute_result" + }, + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAAA6gAAAFlCAYAAADmqMVrAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADh0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uMy4xLjEsIGh0dHA6Ly9tYXRwbG90bGliLm9yZy8QZhcZAAAgAElEQVR4nOzdeZzO5f7H8dc1M8aIscQgxp49+9gisowtJSRbVDpFUTmd+knldFJJnTpp0SLFsZRUlN2MQgkxdlmHLMNgxpYZY9br98etjmowY+77/t4z834+Hh7MfX+/1+c95WHmM9f1vS5jrUVERERERETEaX5OBxAREREREREBNagiIiIiIiLiI9SgioiIiIiIiE9QgyoiIiIiIiI+QQ2qiIiIiIiI+AQ1qCIiIiIiIuITApwOkJlSpUrZypUrOx1DRERERERE3GzDhg3x1tqQzN7zyQa1cuXKREVFOR1DRERERERE3MwYc/By72mJr4iIiIiIiPgENagiIiIiIiLiE9SgioiIiIiIiE9QgyoiIiIiIiI+QQ2qiIiIiIiI+AQ1qCIiIiIiIuIT1KCKiIiIiIiIT1CDKiIiIiIiIj4hSw2qMaaLMWa3MSbaGPP0Fa5raoxJN8bcld17RUREREREJH+7aoNqjPEHJgJdgTpAf2NMnctc9yqwNLv3ioiIiIiIiGRlBrUZEG2t3W+tTQFmAT0yue5R4CvgxDXcKyIiIiIiIvlcVhrU8sDhSz6Oufja74wx5YGewAfZvfeSMR4yxkQZY6Li4uKyEEtERERERETykqw0qCaT1+yfPp4AjLLWpl/Dva4XrZ1krQ2z1oaFhIRkIZaIiPiqCxcu8Oabb5KRkcELL7xAvXr16Ny5M0OGDGHMmDHs3LnT6YgiIiLigwKycE0MUOGSj0OBo3+6JgyYZYwBKAV0M8akZfFeERHJI6y1HD58mNDQUBITE7lw4QKPP/44PXv25MiRIxw5coTo6GjatGnDlClT6N69u9ORRURExIcYazOd0PzfBcYEAHuADsARYD0wwFr782WunwossNZ+md17fxMWFmajoqKy+amIiIiTtm/fzvDhwwkODmbBggVXvHb9+vWkp6cTFhaGn58ffn469UxERCS/MMZssNaGZfbeVb8jsNamASNw7c67E5htrf3ZGDPMGDPsWu7N7icgIiK+beLEibRv356+ffvyzTffXPX6pk2b0qJFC9577z1eeeUVLyQUERGR3OCqM6hO0AyqiEjusXz5cgYMGMDatWupVKlStu5NSUnhwoULnD17lvPnz1OzZk0PpRQRERFfkaMZVBERkcs5cuQIAwcOZPr06dluTgECAwMpWrQoUVFRtGvXDu3iLiIikr+pQRURkWtWtGhR3nvvPTp27JijcXr27MnAgQN5+OGH8cWVPSIiIuIdalBFROSa/Pvf/+bUqVPceeedbhnvxRdfZMeOHcyaNcst44mIiEjuowZVRESuSZkyZShevLjbxgsKCmLatGmMHDmS2NhYt40rIiIiuYcaVBERyZatW7cye/ZsBg8eTLFixdw6dlhYGEOHDmX06NFuHVdERERyBzWoIiKSZcnJydx1112kpKR4rMZzzz3HG2+84bHxRURExHepQRURkSybNGkSNWrU4J577vFYjcDAQEqUKEHPnj05evSox+qIiIiI7wlwOoCIiOQOiYmJjBs3jsWLF3u8lp+fH8888wxly5b1eC0RERHxHZpBFRGRLHn77bdp06YNDRs29Eq9pk2bEhkZycKFC71ST0RERJynBlVERK7q3Llz/Oc//2Hs2LFerWutZdSoUWRkZHi1roiIiDhDDaqIiFxVkSJFWLlyJTVr1vRq3c6dOxMUFMS8efO8WldEREScoQZVRESu6MSJE7zzzjvUqVPH67WNMTzzzDOMGzcOa63X64uIiIh3qUEVEZErSk5OJjg42LH6d955JwkJCSxbtsyxDCIiIuIdalBFROSyjh8/TmBgIPfff79jGfz8/Bg9ejQvv/yyYxlERETEO3TMjIiIXNaYMWMICQlxvDns378/pUuXxlqLMcbRLCIiIuI5mkEVEZFM7d27lzlz5vCPf/zD6SgEBARw6623Mn/+fKejiIiIiAepQRURkUxNmDCBhx9+mOuvv97pKIDryJk5c+aQkpLidBQRERHxEC3xFRGRv0hISOCzzz5j69atTkf5XVBQEFOnTiUpKcnpKCIiIuIhmkEVEZG/mDVrFrfccguhoaFOR/mD9PR06tWrx+7du52OIiIiIh6gBlVERP4iPj6e4cOHOx3jL/z9/Rk8eDCvvvqq01FERETEA4wvHnweFhZmo6KinI4hIpIv+fpOuXFxcVSvXp2DBw9SrFgxp+OIiIhINhljNlhrwzJ7TzOoIiLyByNHjuSrr75yOsZlhYSE0L59e2bPnu10FBEREXEzNagiIvIHY8eOpWPHjk7HuKIhQ4bwySefOB1DRERE3EwNqoiI/C4yMpJffvnF55fOdunShZiYGA4fPux0FBEREXEjNagiIgK4nj196qmniIuLczrKVQUEBLBnzx4qVKjgdBQRERFxIzWoIiICwLp16zh37hwdOnRwOkqWFChQgCeffJK0tDSno4iIiIibqEEVEREAPvjgA4YOHYqfX+740hAQEEDt2rVJTk52OoqIiIi4Se74LkRERDzqzJkzzJ07l/vuu8/pKNnywAMP5IolySIiIpI1WWpQjTFdjDG7jTHRxpinM3m/hzFmqzFmszEmyhjT+pL3Dhhjtv32njvDi4iIe0yfPp0uXbpQunRpp6NkS0JCAg0bNlSTKiIikkdctUE1xvgDE4GuQB2gvzGmzp8u+xZoYK1tCAwBJv/p/XbW2oaXO4xVREScFRISwt///nenY2RbkSJF6NGjBzNmzHA6ioiIiLhBVmZQmwHR1tr91toUYBbQ49ILrLUJ1lp78cPCgEVERHKFCxcu0LdvX5o3b+50lGty//33M2XKFP73ZUhERERyq6w0qOWBSw+ai7n42h8YY3oaY3YBC3HNov7GAhHGmA3GmIdyElZERNxv4sSJjB071ukY16xNmzYkJiayYcMGp6OIiIhIDgVk4RqTyWt/+TG1tXYuMNcY0wZ4Eeh48a1W1tqjxpjSQKQxZpe19vu/FHE1rw8BVKxYMav5RUQkh5544olcvROun58f9913H1OmTCEsTE+SiIiI5GZZmUGNAS49CT0UOHq5iy82n9WMMaUufnz04u8ngLm4lgxndt8ka22YtTYsJCQki/FFRCQndu7cyccff0xQUJDTUXLk3nvv5ccff9QyXxERkVwuKw3qeqC6MaaKMSYQ6AfMu/QCY8yNxhhz8c+NgUDgpDGmsDEm+OLrhYFOwHZ3fgIiInLtpk2bxt69e52OkWMVK1Zk06ZNXPxSJCIiIrnUVRtUa20aMAJYCuwEZltrfzbGDDPGDLt4WW9guzFmM64df/te3DSpDLDKGLMFWAcstNYu8cQnIiIi2WOt5fPPP6dv375OR3GLn3/+mVdeecXpGCIiIpIDWXkGFWvtImDRn1774JI/vwq8msl9+4EGOcwoIiIesGHDBvz9/WnUqJHTUdyiTJkyeeZzERERya+yssRXRETyoN9mT/PKstiQkBBatWrF0aOX3SZBREREfJwaVBGRfMhay+zZs/PM8t7fTJkyhWeffdbpGCIiInKN1KCKiORDCQkJDBgwgJtuusnpKG7Vq1cv5s2bR2pqqtNRRERE5BqoQRURyYeCgoJ45ZVX8szy3t+EhoZSvXp1li9f7nQUERERuQZqUEVE8hlrLQ0bNuTIkSNOR/GI3r1789VXXzkdQ0RERK6BGlQRkXzGGMNPP/1E+fLlnY7iEb1792bu3Lmkp6c7HUVERESySQ2qiEg+M2PGjDy9023VqlWpXLkyW7dudTqKiIiIZJMaVBGRfCQ9PZ0nn3wSP7+8/c//jz/+qDNRRUREcqG8/R2KiIj8wQ8//ED58uW58cYbnY7iUdZaRo0aRUZGhtNRREREJBvUoIqI5CPffPMNPXv2dDqGxwUGBlK5cmWSk5OdjiIiIiLZoAZVRCSfsNYyb948br/9dqejeMWwYcNISEhwOoaIiIhkgxpUEZF8YufOnaSmplK/fn2no3jF7t27CQsLw1rrdBQRERHJIjWoIiL5xK+//soTTzyBMcbpKF5Rs2ZNChUqRFRUlNNRREREJIsCnA4gIiLe0aJFC1q0aOF0DK8xxtC7d2+++uormjZt6nQcERERyQLNoIqI5APx8fE0adIk3y137dGjB/Pnz3c6hoiIiGSRGlQRkXygZMmSfPXVV/lmee9vwsLCiI+P55dffnE6ioiIiGSBGlQRkXxg/vz5FCtWzOkYXufn50fXrl1ZsmSJ01FEREQkC4wvLvcKCwuz2tRCRMQ9kpOTKVOmDHv27KF06dJOx/G6M2fOEBwcjL+/v9NRREREBDDGbLDWhmX2nmZQRUTyuJUrV1KnTp182ZwCFC9enKlTp5KYmOh0FBEREbkKNagiInnc/Pnzuf32252O4ajjx49z9uxZp2OIiIjIVeiYGRGRPMxay/z581mwYIHTURz1zDPPkJGR4XQMERERuQrNoIqI5GHbt2/HGEPdunWdjuKoI0eOULt27Xx3zI6IiEhuowZVRCQP279/P4MGDcp3x8v8Wbly5UhLS2Pr1q1ORxEREZErUIMqIpKH9ejRg7Fjxzodw3HGGG677TYWLlzodBQRERG5AjWoIiJ51LFjxxg8eLDTMXzGbbfdlu+fxRUREfF1alBFRPKo4OBgHnzwQadj+Iy2bdvy888/Ex8f73QUERERuQw1qCIiedSePXto3ry50zF8RlBQEO3atWPJkiVORxEREZHL0DEzIiJ5UGpqKrfeeivR0dGEhIQ4HcdnvPrqq5QoUcLpGCIiInIZWZpBNcZ0McbsNsZEG2OezuT9HsaYrcaYzcaYKGNM66zeKyIi7vfTTz9RrVo1Nad/UrNmTXbv3k1aWprTUURERCQTV21QjTH+wESgK1AH6G+MqfOny74FGlhrGwJDgMnZuFdERNwsMjKS8PBwp2P4pEmTJhEbG+t0DBEREclEVmZQmwHR1tr91toUYBbQ49ILrLUJ9n+nnxcGbFbvFRER94uMjKRTp05Ox/BJ06dPp0KFCk7HEBERkUxkpUEtDxy+5OOYi6/9gTGmpzFmF7AQ1yxqlu8VERH3OXPmDNu2baNVq1ZOR/FJR44coXfv3k7HEBERkUxkpUE1mbxm//KCtXOttbWAO4EXs3MvgDHmoYvPr0bFxcVlIZaIiGRm/fr1tGrViqCgIKej+KSyZcvy/fffc/DgQaejiIiIyJ9kpUGNAS5dCxUKHL3cxdba74FqxphS2bnXWjvJWhtmrQ3Tph4iItcuPDycefPmOR3DZ/n7+xMeHk5ERITTUURERORPstKgrgeqG2OqGGMCgX7AH77zMcbcaIwxF//cGAgETmblXhERca/x48eTnp7udAyf1rlzZzWoIiIiPuiqDaq1Ng0YASwFdgKzrbU/G2OGGWOGXbysN7DdGLMZ1669fa1Lpvd64hMRERFIS0sjLS1Ny3uvIjw8nG+//VbHzYiIiPgY87/Nd31HWFiYjYqKcjqGiEiuk5KSQmBgoNMxcoX69eszadIkWrRo4XQUERGRfMUYs8FaG5bZe1lZ4isiIrnEwIEDmTNnjtMxcoVx48ZRqlQpp2OIiIjIJdSgiojkEenp6Xz77beaEcyi7t27o035REREfIsaVBGRPGLDhg2UK1eOcuXKOR0lV0hJSeGmm27iwoULTkcRERGRiwKcDiAiIu4RGRlJp06dnI6RawQGBnLw4EH8/PSzWhEREV+hr8oiInlEREQE4eHhTsfIVXbu3MnHH3/sdAwRERG5SA2qiEgekJCQwMaNG2nTpo3TUXKdl156CV/c0V5ERCQ/UoMqIpIHFCxYkBUrVlC4cGGno+QqderUITU1lejoaKejiIiICGpQRUTyhK1bt1KtWjWnY+Q6xhg6derE0qVLnY4iIiIiqEEVEckTZs6cyYEDB5yOkSt16tSJiIgIp2OIiIgIYHzxuZuwsDAbFRXldAwREckH4uPjqVatGnFxcQQGBjodR0REJM8zxmyw1oZl9p5mUEVEcrnZs2czYcIEp2PkWqVKleL+++8nPj7e6SgiIiL5nhpUEZFc7uuvv6ZIkSJOx8jVJkyYQLly5ZyOISIiku+pQRURycUyMjJYtmyZzj/NoT179nDbbbc5HUNERCTfU4MqIpKLbd26leLFi1OpUiWno+RqVapU4Z133nE6hoiISL6nBlVEJBeLiIigU6dOTsfI9QoUKEBKSgrbt293OoqIiEi+FuB0ABERuXaRkZGMGDHC6Ri+KTkBoiMhdgsknICE4xd/nYDzp6BIaShRGYpXghKV+HbpHqIOnGXKZ185nVxERCTfUoMqIpKL3XXXXbRr187pGL4jMR52L4KdC2D/CkhPBr8CUKSMqyEtWh7KNYJCJVyN6ukDruvOHSU8IZ1XFp7Hvt8KU/9uuKk3FAt1+BMSERHJX3QOqohILpWYmEihQoXw89PTGhxYBStfdf1uM6BYRajdHWp1h4otwM//yvenXsCePkjlBjez9OEbqZWxy/V6pVZQ/25o0B8CCnr+8xAREckHrnQOqmZQRURyqbfeegtjDKNHj3Y6inNit8K3L0D0MgguB7c86WpMy9YHY7I+ToEgTOmahN/Wk8gSDag1oBts/wq2zob5j8OqNyF8LNS+I3vjioiISLZoBlVEJBdLS0sjICAf/qzx5D5YPg62fwlBxeGWf0CzB6FAoRwNO2vWLD799FPmzZvnesFa2PcdRDwHJ3a4ZlQ7v+xaJiwiIiLX5EozqFoXJiKSC504cYL//Oc/+a85TU+Db1+Eic1g10JXY/r4Fmj1WI6bU4AOHTpw8OBBfv/hrTFwYwcY+gPc9h+I2wWT2sHXj8C54zmuJyIiIn+kBlVEJBeKjIzkhx9+cDqGd52Ngam3wQ+vQ70+8Phm6PBPKFTcbSVCQkLYsmUL5s/LeP0DoOkD8NgmuPlR2PYFfNAK9q90W20RERFRgyoikitFRkYSHh7udAzv2bUIPmgNx7dDr8nQ8wMILuuRUitWrGDGjBmZvxlUDDq9CMNWQaHrYfqd8MN/ICPDI1lERETyGzWoIiK5jLWWyMhIOnXq5HQUz0tLhsVPw6z+UKwCDP0e6vfxaMkyZcpQuXLlK18UUhMe/A7q9nRt0vT5QEg649FcIiIi+UE+e3hJRCT327FjB4GBgVSrVs3pKJ6VGA+f3g1HNkCzoa6ZSy8c9VK7dm3Onj1LcnIyBQteoV7BItD7Y6jQHJY+A5Pawt3T4Yb6Hs8oIiKSV2kGVUQkl/ltee9fnpPMS87GwCdd4PgOV9PX7TWvnkPap08fli5devULjYHmQ+H+xZCWAh+Hw95lng8oIiKSR6lBFRHJZQoUKECvXr2cjuE58dGu5jThOAyaC3Xu8HqEDh06EBkZmfUbKjRzLT8uVcO1HHnXQs+FExERycPUoIqI5DLDhw+nS5cuTsfwjNitMKULpCbBfQugUktHYoSHh7NsWTZnQouEwL3zoGx9mD0Yts/xTDgREZE8TA2qiEgusmrVKoYPH+50DM84tBamdgf/gjBkCdzQwLEoDRs2JD4+npiYmOzdWKgEDP4aQpvBVw/A5s88E1BERCSPylKDaozpYozZbYyJNsY8ncn7A40xWy/+Wm2MaXDJeweMMduMMZuNMVHuDC8ikt80btyYkSNHOh3D/X75Hqbd6ZqFHLIESlV3NI6fnx/t27fP/iwqQMFguOdLqNIGvn4Yoqa4P6CIiEgeddUG1RjjD0wEugJ1gP7GmDp/uuwXoK21tj7wIjDpT++3s9Y2tNaGuSGziEi+tXr1aipVquR0DPeK3QqfDYASleH+JVC8gtOJANcy32w9h3qpwMLQ/3OoHg4LRsL6j90bTkREJI/KygxqMyDaWrvfWpsCzAJ6XHqBtXa1tfb0xQ/XAqHujSkiIidPnsx7myOdPgAz74KgYnDPV64ZVB/Rt29fJk6ceO0DFAiCvjOhRhdY9CTsWuS+cCIiInlUVhrU8sDhSz6Oufja5TwALL7kYwtEGGM2GGMeutxNxpiHjDFRxpiouLi4LMQSEclfvvvuO2655RYCAwOdjuIeifEwvRekJcOgOVDsSl9avC84OJgtW7Zw6NChax8kIBDu+gRuaAhfDoGYDe4LKCIikgdlpUHN7KA9m+mFxrTD1aCOuuTlVtbaxriWCA83xrTJ7F5r7SRrbZi1NiwkxHd+gi4i4it+O/80T0hOgJl94NcjMGA2hNR0OlGmtm7dSmxsbM4GCSwMAz6HIqXh07vh1H73hBMREcmDstKgxgCXPhAUChz980XGmPrAZKCHtfbkb69ba49e/P0EMBfXkmEREckGay0RERF06tTJ6Sg5l54KX9wHsZvhrilQsbnTiS7r0UcfpXlzN+QrUtq1hNmmw4y7IPHk1e8RERHJh7LSoK4HqhtjqhhjAoF+wLxLLzDGVATmAIOstXsueb2wMSb4tz8DnYDt7govIpJfREdHk5qaSu3atZ2OkjPWwvyREB0J3SdArW5OJ7qilJQU6tWrx4ULF3I+WKnq0H8WnI2BWf1dZ72KiIjIH1y1QbXWpgEjgKXATmC2tfZnY8wwY8ywi5f9EygJvPen42TKAKuMMVuAdcBCa+0St38WIiJ53JYtW+jWrRvGZPbURS6y7iPYPAPajoIm9zqd5qoCAwMpXLgwa9ascc+AFVtAr0lweB3MeQgyMtwzroiISB5hrM30cVJHhYWF2agoHZkqInIpa23ublAProH/docbw6Hfp+CXpaO4HTdmzBjS09MZN26c+wZd/Q5EPAcdnodbnnDfuCIiIrmAMWbD5Y4gzR3fHYiI5GNpaWk88cQT+OIPFLPs3DH44l4oXgl6fZhrmlOAjh07Xvt5qJfTcgTc1Bu+exH2r3Tv2CIiIrlY7vkOQUQkn0pOTqZu3br45aKm7g/SUmD2vZB8DvrOcJ15mou0bNmS3bt3c+rUKfcNagzc/jaUrO46fubXv+w9KCIiki/l0u92RETyj9TUVIYMGeJ0jGsX8RwcXgs93oUydZxOk22BgYG0bt2a7777zr0DFywCfae7Nkv64j7X7sYiIiL5nBpUEREfd9ttt7F8+XKnY1ybLZ/Dug//t6Q1l3r++edp0KCB+wcOqQl3vA2Hf4LIf7p/fBERkVxGDaqIiA87e/YsW7dupWXLlk5Hyb7jP8P8x6FSa+j4gtNpcqR58+YULFjQM4PXuwuaD4O178HPcz1TQ0REJJdQgyoi4sNWrFhBixYtKFSokNNRsic1Cb76GxQMhj5TwD/A6UQ5Yq2lR48exMfHe6ZA+IsQ2gy+GQHxez1TQwDIyLAkp6WTkJzGqcQUzpxPyd0bkImI5DG5+zsGEZE8LjIykk6dOjkdI/uW/QtO7ICBX0GR0k6nyTFjDJs2bfJcgYBA6DMVPmgNXz0ADyxzvSbXJD4hmT3HzxF9IoG9xxPYc/wc++ISOHM+lbSMvzajhQr4c0PxIMoXL0S5YoUoV7wQ9UKL0rTy9QQHFXDgMxARyb/UoIqI+LCIiAhmz57tdIzs2RsJP30AzR+G6h2dTuM2u3bt4uuvv+bpp5/2TIFi5V3Po35+D6wcDx30TGpWZWRYth45y7Idx1m28zi7jp37/b3goACqly5C+1qlKVWkIAX8/QgM8KOAvyHQ34+0DMuxsxc4ejaJI2cusOvYCeLOJQPg72eoH1qMllVL0rJaScIqXU+hQH+nPk0RkXzB+OKylrCwMBsVFeV0DBERRx08eJCmTZty7Nix3HPETEIcvH8zFC4FDy6HAkFOJ3Kbo0ePctNNNxEXF4e/vweblG+Gw+ZP4b5FUCkXPnvsJdZaVkXHs3BrLN/ucjWV/n6GppVL0K5maeqUK0qNMsGUDi6IMSZbYyelpLPp0GlW7zvJmv0n2XL4DGkZlsKB/tzeoBx9m1agYYXi2R5XRERcjDEbrLVhmb6nBlVExDelp6dz6NAhqlSp4nSUrLEWPusP+76Dh5ZDmbpOJ3K7unXrMnXqVJo2beq5IsnnXEt9bQYM+xGCinquVi6UlJLO3E1HmPLjL+w9kUCRggG0rRlCeO0y3FozhOLXuX9pdGJyGusOnGLJtmPM33qU8ynp1CobTN+mFejZqLxHaoqI5GVqUEVEcqGIiAiaNm1KiRIlnI6SNes/hoVPQJfx0OJhp9N4xMiRIylTpgyjR4/2bKFDP8GULtCgP9z5nmdr5RLHzl5g+toDfPrTIU6fT6VuuaI80LoKt9W/gYIB3lt2e+5CKgu2xjJr3SG2xJwlMMCP/k0rMLz9jZQOzjsrBkREPOlKDWouWTMmIpL/LFq0iPPnzzsdI2vi9sDSZ6FaB2g21Ok0HtOxY0ciIyM9X6hic2j9BGyeCTvmeb6eDzt7PpWx83dwy2vf8d6KfTSrcj2fP9SCBY+2plfjUK82pwDBQQXo36wi34xozaLHbqFXo/LM+OkQbV5bzqtLdnHmfIpX84iI5DWaQRURkZxJT4PJHeDsYXh4NQSXdTqRx5w7d45y5cpx/PhxrrvuOs8WS0+FyR3hzCF4ZE2e/u+amdT0DGauPciEb/dyNimVvmEVeOTWG6lY0sP/3a/BgfhEJizbwzdbjlKkYABD21Tl/lZVKFxQe1GKiGRGM6giIrnMm2++yfvvv+90jKxZ8w7Ebobb/pPnm6jg4GD+8Y9/cObMGc8X8y8AvT5ynSn7zXDXM775gLWW5btO0GXC9/xr/g7q3FCUhY/ewvje9X2yOQWoXKowE/o1YvHjt9Ciaklej9hD+zdWELnjuNPRRERyHTWoIiI+aN68eVSsWNHpGFcXtweWvwJ1ekDdO51O4xX/+te/uOGGG7xTLKQGhL8A0ctgy2feqemgX46dpPfLn9PvhcnE71rP3yqdpn/ZOOqUK8r+/fvZuXMnAMnJyQ4nzVytskX5aHAYXz18MyWuC+TBaVGM+HQj8Qm+mVdExBepQRUR8TEJCQmsX7+etm3bOh3lyiTF3OwAACAASURBVDLSXTN7gddBt9edTuM1u3fv9u7/m6YPQoUWsGQ0nMsbM3JpaWkkJCSQlpbGQw89hLWWx57/N9UqlGPhW6MovmseIQciWLPgM6ZNmwbAli1b+OGHHwBo1KgRxYsXp27duvTu3ZvXX3+d1atXc+HCBSc/rd81qVSCeSNa84/wGkT8fJyO/1nJnI0x+OJjVSIivkbPoIqI+JhFixbx2muvsWLFCqejXNma92DpaNcy1Pp3O53Ga9LS0jh58iRlypTxXtH4vfB+K6jZBe6e5r26bmKtZcuWLXz33Xd89913/PDDD7z88suMGDGC9z/6mN2FGzB3Ywz1KlzPhP6NuLF08FXHO336NEeOHGHbtm2sWbOGNWvWMHjwYB599FHGjBnDmDFjKFiwoJc+w8vbe/wco77aysZDZ2hbI4R/31Wf0kW126+I5G9XegZVT++LiPiYyMhIwsPDnY5xZaf2w7djoUYXqNfH6TReFRAQQGxsLEePHqVRo0beKVqqOtw6yvXffMc8qHOHd+q6wbvvvsubb76Jn58fHTt25N5772XKlCmEhISwOjqe6fGVOf7LCUZ2rsOI9jdSwP/qi7uMMVx//fVcf/311KtXjwEDBvz+XkpKCqVKlSIwMJCPPvqIvXv30rdvXxo3bowxxpOfaqaqlwnmi2E3M23NAV5bsptub6/i7f4NublaKa9nERHJDbTEV0TEx0RERPh2g5qRAfMec23i0/1NcOCbfqf9+OOPvP32294tevNjULYeLHoSkk57t3Y2HT58mCeeeAKA0NBQPv/8c/bs2cP7779Pnz59KFmyFG8t28uAyT8RFOjPnIdv5u/hNbLUnF5NYGAgI0eOxBhD69atKVCgAHfffTc1atTg1Vdf9c4GV3/i72e4v1UVvhnRimKFArhn8k9MXB5NRobvrWITEXGaGlQRER9irWXUqFE0adLE6SiXt2EKHPgBOr0ERcs5ncYR4eHhREZGeveZQv8CcMe7kBgPEc95r24WnTp1iueff56vv/6aMmXK0Lp1awDuvPNOwsLCfp+9PHchlWEzNvDmsj30alSehY/eQoMKxT2SqXbt2rz88stER0czc+ZMtm/fTtWqVZk5c6ZH6l1NjTLBzBvRmu71y/Hvpbt54L/rOZ2oc1NFRC6lBlVExIfEx8fTr18//P39nY6SubMxEPlPqNIWGg92Oo1jqlevjr+/P7t27fJu4XINodVjsGkG7Fvu3dqXceLECZ5++mmqV6/OkSNHqF+/PoGBgfTq1esv1+6PS6Dne6v5dtcJ/tm9Dm/c3YBCgZ7/u26MoVmzZkyfPp0tW7bQqlUrTpw4wbBhw7y+cVHhggG81a8hL955Ez9Gn6T7O6vYctj7s7oiIr5KDaqIiA956623mD59utMxLm/xKNfuvXe8nS+X9v7GGEPHjh1ZtmyZ94u3HQUlb4T5j0FygvfrXxQXF8cTTzxBrVq1+PXXX9m4cSOTJ0+matWqmV7/7c7j9Hj3R04lpjD9gWYMaV3FkWdCK1SoQOXKlSlUqBC9evXCGMPkyZOJiYnxWgZjDINaVOLLh1tiDNz94RqWbD/mtfoiIr5MDaqIiA956aWXGDJkiNMxMrdrEexa4Nqsp0Rlp9M47rdlvl5XoBDc8Q6cOQQrx3u9fFpaGunp6axZs4aUlBS2bdvGe++9R6VKlTK93lrLByv38bdpUVQseR3zRrTyiQ2CgoOD6dSpE9ZaDh48SIMGDXj++edJSPBe018/tDjfDG9F3XJFeXjmBib/sF9H0YhIvqcGVUTER+zcuZM33njDkVmlq0pJhMX/ByG1oeUIp9P4hA4dOhAfH+9MQ1HpZtcS6zXvwfGfvVr60UcfZc6cOdxxxx28++67lC9f/rLXZmRYXpi/g/GLd3FbvRv4ctjNhJa4zotpr84Yw4svvsjGjRuJjo6mZs2aTJkyhYyMDK/UL1mkIJ8+2IIudcvy0sKdvDB/B+naPElE8jE1qCIiPmLBggXs27fP6RiZWzEezh6G2ye4NusR1zEpq1c79wOFji9AoeKw4AnXzsoeFBsby7Bhwzh58iTjx4/nrrvuuuo9yWnpPP75ZqauPsCQVlV4u18jrzxveq0qVarEzJkzmTt3Lh999BHdu3f32g8fggr4M3FAYx68pQpTVx9g6PQNnE9J80ptERFfowZVRMRHREZG0qlTJ6dj/NWx7bBmomvGrmILp9P4lCVLlvDJJ584U/y66yF8LBxeC5tneKzMZ599RoMGDShevDhBQUEUK1bsqk15QnIaD0yNYv6WozzdtRZjutfGz88HVwZkolmzZqxatYrx48djjGH+/Pmkp6d7vK6fn+HZ2+owtkddvtt1nP6T1nIyIdnjdUVEfI0aVBERH5CUlMSaNWto166d01H+KCMDFvzdNVPX8QWn0/icqlWr0qBBA+cCNBgAFW927ayceNKtQ586dYp+/foxduxYFi9ezPjx4ylcuPBV74s7l0y/SWtYs/8kr/dpwLC21Xxz2foV+Pn5Ub9+fRITE5kzZw6pqaleaVIBBreszKRBYew6do5+k9Zy4twFr9QVEfEValBFRHzAqlWrqF+/PsWKFXM6yh9t/C/ErHOdeXrd9U6n8Tk1atSgXLlyJCUlORPAzw+6/weSz8Gyf7pt2HXr1tGgQQPKli3Lxo0bs3wu79EzSfT5YDXRJxL4aHAT7moS6rZMTihcuDBTpkyhYMGC3HrrrUyYMMEry3471inD1PubceRMEv0+XEvsWYf+fomIOCBLDaoxposxZrcxJtoY83Qm7w80xmy9+Gu1MaZBVu8VERHX8t7w8HCnY/xRwglY9jxUag0N+judxmcNGjTImd18f1O6NrQc7job9dDaHA114cIF4uPjCQ0NZerUqUyYMIFChQpl6d4jZ5LoN2ktJxNSmPm3FrSvVSZHWXyJMYapU6fy6aef0rNnT06fPu3xmi2rlWT6A82IO5fM3R+u4fCp8x6vKSLiC67aoBpj/IGJQFegDtDfGFPnT5f9ArS11tYHXgQmZeNeEZF8LzQ0lB49ejgd448ixkDKeej+Zr4+8/RqwsPDnTkP9VJtR0GxCq7l2Omp1zzM5MmT+fjjjylXrhwdOnTI8n2u5nQNp8+nMP1vzWlSqcQ1Z/BV1apVY9WqVVSqVIkmTZoQFRXl8ZpNKl3PzAeb82tSGnd/uIb9cc6deysi4i1ZmUFtBkRba/dba1OAWcAfvouy1q621v7248S1QGhW7xUREXjsscdo1KiR0zH+5+Aa2DoLbn4UQmo4ncandezY0dkZVIDAwtD1NTixA9a+l+3bIyIiWLlyJY888gj/93//l617Y06fp9+kNZw5n8qMB5rTsELxbNfPLQIDA3nrrbd47bXX6Nq1K7NmzfJ4zfqhxfnswRakpGXQd9Ja9h4/5/GaIiJOykqDWh44fMnHMRdfu5wHgMXZvdcY85AxJsoYExUXF5eFWCIiecPnn3/OE0884XSM/8lIh0VPQdHy0OZJp9P4vEaNGhEXF0dMTIyzQWp1g5rdYMWr8Gtslm7JyMjg5Zdf5r777sPPzw8/P79sbWh0+NR5+k1a+3tz2iAPN6eXuuuuu1i9ejWNGzfm/PnzJCR4dmazTrmizHqoBQbo/9FP/BKf6NF6IiJOykqDmtlXqkx3CDDGtMPVoI7K7r3W2knW2jBrbVhISEgWYomI5A09e/bM9qyVR0V9Ase3QeeXXTNzckV+fn60b9/e+VlUgM7jICMNlv3rqpeePXuWnj17snDhQtavX88tt9ySrVIxp8/T/6O1/JqUysy/5Z/m9DfVq1enRo0aTJs2jddff93z9coE8+mDzcmwloEfrSXmtJ5JFZG8KSsNagxQ4ZKPQ4Gjf77IGFMfmAz0sNaezM69IiL5lbWW2bNnU7p0aaejuCTGw3cvQpU2UOdOp9PkGuHh4Xz33XdOx4Drq8DNI1zLsw+vu+xlv/zyCy1atCA0NJQVK1ZQvvyVFkb9Vdy5ZO6Z/NPF5rQF9UPzV3N6qaFDh/Lcc8+xbds21q9f79FaN5YOZvoDzUhITmPg5J848auOoBGRvCcrDep6oLoxpooxJhDoB8y79AJjTEVgDjDIWrsnO/eKiORnW7du5YUXXsDPz0dO/fp2LKQkQtd/a2OkbBg4cCCTJk1yOoZL6ycguJxrmXZGRqaXjB49mkceeYSJEycSGBiYreHPJqUy+JN1HP81mSn3N6NeqI8djeRlxhgCAgI4fPgw3bp148svv/RovbrlijF1iGt334GTf+JUYopH64mIeNtVvyOy1qYBI4ClwE5gtrX2Z2PMMGPMsIuX/RMoCbxnjNlsjIm60r0e+DxERHKlpUuX0rlzZ6djuBzZABunQfNhULqW02lyleuuu47ly5dz4MABp6NAwSIQPhZiN8PmGX94a8GCBcTGxjJz5kweffTRbA+dlJLOA1PXE33iHB8OapInd+u9Vt26dSMiIoK///3vjBs3zqPnpTauWIKP723KoVPnGfTxT5xNuvadm0VEfE2WfmRvrV1kra1hra1mrX354msfWGs/uPjnv1lrS1hrG178FXale0VExGXJkiV06dLF6RiumbZFT0HhENeRJZJthw8f9sr5mFlS7y6o0AKWvQBJZ35/ef/+/Zw4cQJ/f/9sD5mSlsHDMzew8dBp3urXiDY1tF/EnzVq1IiffvqJOXPmMGTIENLS0jxWq2W1knxwTxP2HD/H/VPWcT7Fc7VERLzJePInfNcqLCzMeuN8MRERJyUkJHDDDTcQGxtLkSJFnA2zcRrMexR6fggN+jmbJRez1mZrF1yPit0CH7YlvekwnlyWzO2330779u2vaaj0DMvjszaxYGss43vVo1+zim4Om7ckJibSp08fatSowYQJEzxaa9G2WIZ/upH2NUvz4aAmBPj7yOMCIiJXYIzZcOmk5qX0r5iIiEOWL19Os2bNnG9Ok864dn2t0ALq93U2Sy6WnJzMjTfeSFJSktNRXG5oQGqDexg0+k02rfuRxo0bX9Mw1lqen7edBVtjGd21lprTLChcuDDffPMNo0ePJiEhgTNnzlz9pmvUrd4NjL2jLt/uOsGYb7Z7dGmxiIg3qEEVEXHIoUOHuPNOH9gpd+VrcP4UdHtNGyPlQMGCBSlXrhwrV650OgoASUlJ9PpoL7+m+LF4SFmKF7u2zYzeW7GPGWsPMaxtNYa2rebmlHlXgQIFKFOmDDNmzODdd9/1aK1BLSszvF01Plt3mLe+3evRWiIinhbgdAARkfxq+PDhTkeA+L2w7kNoPAhuaOB0mlyva9euLF682PHnis+dO8cdd9xB2bJlmTb5dQosewZ2L4Za3bI1ztebjvDvpbu5s2E5RnWp6aG0edvQoUOx1rJp0yaKFStG1apVPVLnyU41OXY2mQnL9lK2aJBmukUk19IMqoiIA/bt28dTTz3ldAxY+iwEFIL2Y5xOkid06dKFJUuWOB2D559/nho1ajBjxgwKtHwIQmrB0tGQmvVzM1fvi+epL7fQsmpJXrurge88W5vLGGPw8/Nj06ZNtGnThh07dniszvje9WhTI4Rnv97OtzuPe6SOiIinqUEVEXFAiRIl6Nq1q7MhopfB3qXQ9ikoUtrZLHlEw4YNOXv2LPv373ekfmxsLIcPH2bcuHF88MEHrt16/QtAl/Fw+gCsnZilcfYcP8fQ6RuoXLIwHwxqQmCAvl3IqSFDhjB+/Hg6duzI9u3bPVKjgL8f7w9sTJ0bijL8041sOuQju0qLiGSDvuKIiDggPj6etm3bOhcgPRWWPAMlqrjOPRW38PPzo3PnzixevNiR+osWLWLBggUEBQX9ccazWjuo1R2+fwN+PXrFMY7/eoH7PllHoQL+TB3SjGKFCng4df5xzz338MYbbxAeHs7WrVs9UqNwwQA+ua8ppYODeHBaFDGnz3ukjoiIp6hBFRHxsuTkZMLCwjy6s+dVrf8Y4ndD55choKBzOfKg0aNH061b9p71zKnY2FiWLFnCAw88wMMPP5z5RZ1fhow0iHz+suMkJKcxZOp6ziSl8sl9TSlfvJCHEudf/fv356233qJTp04ea1JDggvyyX1NSU7L4IGpUZy7kOqROiIinqAGVUTEy1atWkXdunUpWbKkMwHOn4IVr0CVtlDTu41UflCrVi0SEhJITk72Sr3Y2FjatWvH5s2br3xhicrQ6jHYNhsOrf3L2+kZlsc/28SuY+eYOLAxN5W/tl1/5eruvvtuPvnkE0qX9tzS+htLF+H9gU2Ijkvg0c82kZae4bFaIiLupAZVRMTLlixZQufOnZ0LsHwcJP/qei5RG994xMsvv8yBAwc8Xic2Npb27dszaNAgnn766avf0PrvULQ8LHoKMtL/8NZrS3bx7a4TPH97HdrV1DPJntatWzfKlClDnz592Ldvn0dqtK5eihd73MSK3XG8tHCnR2qIiLibGlQRES9bunSpc8eQnNgJUZ9A2BAoU8eZDPnArFmzqFnTs8eyHDt2jPbt2zNw4ECeffbZrN0UWBjCx8KxrbBp+u8vz446zIff72dQi0oMblnZM4HlL4wxPPvss1SpUoX09PSr33ANBjSvyN9aV2Hq6gNMW3PAIzVERNxJDaqIiBcdOXKEI0eO0LRpU+8XtxaWjIaCReDWZ7xfPx85ceIEgwcP9tj48fHxtG/fngEDBvDcc89l7+abekPFm+HbsZB0mnW/nOLZudtofWMp/nm7fmjhbQ0bNiQhIYH69euzc6dnZjlHd6tNx9pl+Ne8n1mx+4RHaoiIuIsaVBERL1q5ciXh4eGu4z+8bc8S2L8cbh0NhR16/jWfKFWqFEuWLOHgwYMeGf+6665j9OjRjBlzDefXGgNdX4Wk0/y65CWGTo+iQonrmDigMQX89W2BE4oWLcqoUaMIDw8nOjra7eP7+xne6teQWmWLMuLTTUSfOOf2GiIi7qKvRCIiXtS/f38mT57s/cJpKbD0WShVA5r+zfv18xk/Pz86derk9uNm0tLSGDRoEImJiQwaNOjaB7qhPikNBlF4yydUyojh4/uaUuw6HSfjpMGDBzNmzBg6duzIoUOH3D5+4YIBTL43jKAC/vztv1GcPa+dfUXEN6lBFRHxkrS0NN58802uu+467xdf9yGc2gedx4G/GhFv6Nq1q1sbVGstAQEB3HvvvTneATo9w/JkfHcSbRBTys2lSqnCbkopOTF06FBGjhxJhw4diI2Ndfv45YoX4oN7GnPkTBIjPtuonX1FxCepQRUR8ZLExESSkpLw8/PyP70JcbDyNbgxHKqHe7d2Pta5c2dWrFjhluNmUlNT6dOnD6tWraJjx445/jv0RsRu5kWnsqf2cEoc/R72ROQ4o7jHyJEjuf/++xkxYoRHxg+rfD0v3XkTP+yNZ/ziXR6pISKSE2pQRUS8pHDhwlnfbdWdlr8Eqedds6fiNaVKlaJWrVr8+OOPORonPT2de++9lwsXLtCsWbMc51qw9SjvrdhH/2YVaHLXU1DyRlg62rUMXHzCM888w7Rp00hISCAhIcHt4/dtWpH7bq7M5FW/8NWGGLePLyKSE2pQRUS8JCwsjB07dni36LFtsHEaNH0QQmp4t7bwzDPP5Gg5rrWWESNGcOzYMb744gsCAwNzlGfH0V956outNKlUghfuuAkTUBA6vwIno2H9RzkaW9yrcOHCvPvuu3zyySceGf/Z22pzc7WSjJ67jU2HTnukhojItTDWWqcz/EVYWJiNiopyOoaIiNv88ssvtGzZkqNHj3pvia+18N/b4fjP8NhGKFTCO3XlD5KSkihUqNA13fuvf/2L+fPns3z5cooWLZqjHKcSU7jj3VWkpVvmPdqK0sFB/3tzRm84vN7196RwqRzVEfdJT0/Hz8+P6Ohoqlat6vbdv08nptBj4o9cSE1n3ojWlC0WdPWbRETcwBizwVobltl7mkEVEfGCBQsW0K1bN+8+f7pzPhz4Ado/q+bUIdZa6tatS1xcXLbvnTt3LjNnzmTRokU5bk7T0jMY8elGTpxL5sNBTf7YnIJr+XdKAix/OUd1xL38/f0xxvDUU08xYsQI3D2pUKJwIB8NDiMhOY2HZ24gOS3dreOLiFwLNagiIl6wYMECunfv7r2CqRcg4jkoXQca3+e9uvIHxhh27dpFSEhItu5LTU2la9euLF++nDJlyuQ4x8uLdrJ630le6VmPBhWK//WCkJrQ7EHYMBWObc9xPXGvadOmsW7dOp5//nm3j12zbDCv92nApkNneHGBlx9BEBHJhBpUEREPO3fuHKtXryY83Is76K59D84chC6vgH+A9+rKX8THx/POO+9k+fpDhw7RunVrAgMDCQ0NzXH9uZtimPLjAYa0qkLvJlcY79anIag4LHnatTxcfEbRokVZvHgxn3/+Oe+++67bx+9W7waGtq3KjLWHmB112O3ji4hkhxpUEREPW7ZsGS1btiQ4ONg7Bc8dgx/egJq3QdVbvVNTLuu33ZsTExOvem1iYiIVK1Zk/vz5blkOvuPor4yes43mVa7nmW61rnxxoRLQ7hnXsvBdC3JcW9yrdOnSLF26lFdeeYW5c+e6ffynOtXk5molee7r7WyLOev28UVEskoNqoiIh3Xo0IH33nvPewW/fRHSkqHTi96rKZdVrFgxmjVrRmRk5BWv++WXX6hduzYxMTGULl06x3XPnk9l2IwNFC8UyLsDGhPgn4Uv+U3udy0LX/qsa5m4+JTKlSszb948Jk6cSEZGhlvHDvD3453+jShVOJBhMzZwKlHHDomIM9Sgioh4UEZGBqtWraJatWreKXhkI2yeCS0ehpJeqilXdccddzBv3rzLvn/q1Cm6du3KqFGj3LKsNyPD8vfZm4k9m8TEgY0JCS6YtRv9A1zLws8cdC0TF5/TpEkTIiMjOXfuHPv373fr2CWLFOSDQU2IS0jmsc82kZ6hpd4i4n1qUEVEPOjkyZN8/vnnGGM8X8xaWDLadUxIm6c8X0+y7Pbbb2fhwoWkp/91l9Tk5GR69erFbbfdxvDhw91S793l0Xy36wT/7F6HJpWyuYNz1Vtdy8N/eMO1XFx8jjGGiIgIPv30U7ePXT+0OC/1uIlV0fG8HrHb7eOLiFyNGlQREQ8KCQnhv//9r3eKbf8KDq+F9mMgKGfHkoh7ValShdKlS7Nu3bo/vG6t5YEHHqBkyZL8+9//dkut5btP8OayPfRqVJ57WlS6tkE6XVwm/u1Yt2QS9+vTpw/PPfccGzduJCEhwa1j3920AgOaV+T9FftYvC3WrWOLiFyNGlQREQ+688472bdvn+cLpZyHyOehbD1odI/n60m2PfrooyQlJf3htf/+979ER0czffp0t2yKdPjUeUbO2kytskV5uWe9a5+5L1nNtUx880zXsnHxWZMnT6Zv376kpaW5ddznb69DwwrFefKLLUSfOOfWsUVEriRLXw2NMV2MMbuNMdHGmKczeb+WMWaNMSbZGPPkn947YIzZZozZbIyJcldwERFfd+TIEb7//nsqVbrGWazsWP0O/BoDXV4FP3/P15Nse+ihh2jfvv3vHycnJzNw4EAWLVrEddddl+PxL6SmM2zGBqy1fHBPYwoF5vDvQZunoHCIjp3xcW+99Rbp6ek88sgjWDf+fyoY4M/7F/8ePTR9A+cupLptbBGRK7lqg2qM8QcmAl2BOkB/Y0ydP112CngMeP0yw7Sz1ja01oblJKyISG6yaNEiunTpQkCAh88hPXsEfpwAdXpA5VaerSU5cuutt7J//35iYmJo1aoV/v7+XH/99Tke11rLc19v5+ejvzKhX0MqlSyc87BBRaHDP+HwT67l4+KTChQowBdffEFUVBTjxo1z69g3FCvEuwMac/Dkef4xewsZ2jRJRLwgKzOozYBoa+1+a20KMAvocekF1toT1tr1gH68JiJy0YIFC+jevbvnCy17HjLSIVzHyvi6adOmUbp0aUJDQ4mMjHTLsl6AT9cd4ssNMTzeoTrta5Vxy5gANBwIZetD5D9dy8jFJwUHB7Nw4UImT57s9mfeW1QtyTPdahOx4zjvr/TC4woiku9l5StjeeDwJR/HXHwtqywQYYzZYIx56HIXGWMeMsZEGWOi4uLisjG8iIjvSUpKYvny5XTp0sWzhQ6ugW1fQKvHoYQXlhJLjiQnJ1O1alX27t1LiRLZ3F33MjYdOs2/5v3MrTVDeLxDdbeM+Ts/f+j6Kvx6BFa/7d6xxa1uuOEGFi1axJdffun2M1KHtKrMHQ3K8XrEbr7fo+/RRMSzstKgZrbDQnbWeLSy1jbGtUR4uDGmTWYXWWsnWWvDrLVhISEh2RheRMT3rFixgoYNG7pl+eZlZaTD4qegaCi0/rvn6ohbJCQk0KdPH86ePUupUqXcMmZ8QjKPzNxI2WJBTOjbED8/DxxnVOlmqNsTVk2AszHuH1/cpnbt2syfP5/Tp0/z888/u21cYwzje9ejZplgHpu1icOnNJsuIp6TlQY1BqhwycehwNGsFrDWHr34+wlgLq4lwyIieVrNmjXd/jzYX2z8LxzbBp1fgsCcb7IjnpOWlkbfvn1p2rQp/8/efcdVVf9xHH8dtspSERUV3BsXuPcM98iRuTel/iyzYWVZmZYz9yz33jNnaomigqLi3orKEFT2uNzz++NaWTkY53IZn+fjwSO995zP9w0J3M893/P9tmzZkr1796a/ZrKekWvOEhGTyPxeHjjmttIg6Su0/BZQDStFi0zv+PHj7Nq1S9Oaua0sWNDbg2S9ynur/YlP+u+evkIIoYWUNKingTKKopRQFMUKeAfYkZLiiqLkURTF7s8/A62AwLSGFUKIrCA5ORlFUWjQoIHxBomNgEPfQfGGULGT8cYR6aaqKiNHjkSn0zFv3jw6duzIjh0p+jX6WlP3X+PErXC+7+xO5SIOGiR9DUdXqDcSAjfBPV/j1cC8mwAAIABJREFUjiXSrX379nz66aecOHGCZ8+eaVa3uFMefupRjcAHkYzbFqjpqsFCCPGnNzaoqqrqgBHAPuAysEFV1YuKongriuINoChKIUVRgoDRwJeKogQpimIPFASOKYpyDjgF7FZVNf1vGwshRCZ2+/ZtvL29jTvIkUkQ/9Rwf2Ba97oUGWLLli34+PiwceNGLC0tadeuHfv27SMpKe3rCu4NfMSCozfpVduVrh5FNUz7Gg0+BDsX+PVT0PgeR2EcGzZsoFu3bun6t/ZvzSsU5H/NSrPRP4h1p++/+QQhhEglJTO+++Xp6an6+cmWqUII8VLBgbCwIdQcDG2mmDqNeI2EhAQsLCx48uTJP+47rVWrFj/88MM/9kVNqRuh0XSa60NpZ1vWD6uDtUUG7nt7bj1sHQod50H1Xhk3rkgTnU5H586dKViwIIsXL0bR6M2sZL3KgGWn8b0ZzgbvulQr5qhJXSFEzqEoiv+rtiDVZn17IYQQgGE6Z+/evYmKijLWAIYrWDaO0GSsccYQmnj8+DG1atVCr9f/Z1Gkd999l6Cg1C84FJOgw3uVP9YWZszvXSNjm1MA925QxBMOfQMJRvo3LjRjYWHB2rVrOXPmDD/88INmdc3NFGb2qEYBO2veX+VPeHSCZrWFEEIaVCGE0JC/vz9+fn7Y2toaZ4CLW+HuMWg+DnIbcYVgkS6xsbE4OTlx5MgRLC0t//P8Bx98QN++fVNVU1VVPtl8nlth0czuWZ3CDrm0iptyZmaGaeXRIfDH9IwfX6Sara0tu3btYsGCBaxdu1azunnzWLGwjwePYxL537qzJOsz34w8IUTWJA2qEEJoaPPmzXTp0kWzqXT/kBgD+8dBIXeo0U/7+kITjx8/plq1agQEBLx2r9PRo0fj7++f4ro/H7vN7vOP+MSrPPVKa7NNTZoU9YQq78CJORBx23Q5RIq5uLiwa9cuNm3apOnCRpWLODChU2V8boQzbf9VzeoKIXI2aVCFEEIjqqr+1aAaxbGfIDIIWk8Bswye2ilSJC4ujo4dO/L2229TrVq11x7bu3dvSpUqlaK6vrfCmfTrFbwqFWJYo5JaRE2fFl+DmQUcGGfqJCKF3N3d2bx5MyEhIdy4cUOzut09i9Gzlivzjtxk38VgzeoKIXIuaVCFEEIjFy9eJCEhAQ8PD+2LP7kDPjMN9wC61dW+vkg3vV5Pv379cHV15fvvv3/j8dWrVycgIOCNV7SCn8UzYs0Z3PLnZkq3Ksa5Op9a9i7QcDRc3gk3D5s6jUiFQ4cOabIP74vGd6hI1aIOjNlwjlth0ZrWFkLkPNKgCiGERrZs2WK86b37vjBcsWr5rfa1hSbGjh3Lo0ePWLp0KWZmKfv1OmTIEM6cOfPK5xN1et5f7U9sYjILe3tgZ/Pf+1lNpu5IyFsCfv0EdImmTiNSqFevXowYMQIfHx/i4+M1qWltYc683h5YWpjhvcqfmASdJnWFEDmTNKhCCKERT09PBg4cqH3hm7/BlV3QaIzhypXIdPbv38+2bdvYtm0bNjY2KTpHURS6du3Kpk2bXnnM97svcebeU6Z0rUqZgnZaxdWGpY1hwaTH1+DkAlOnEam0YMEC+vXrh16jPW2LOOZids/q3AiN5tPN5zW911UIkbNIgyqEEBqIiYmhRYsWuLu7a1s4OQl+/cxwparucG1rC00kJibSokUL/vjjD/Lnz5+qc7t168bGjRtf+mJ+69kglp+4y5CGJWhbpbBWcbVV9i0o6wVHf4TIR6ZOI1Jh8eLFPHjwgC+++EKzmvVLOzHmrXLsOv+IpT53NKsrhMhZpEEVQggNbNmyhY8//lj7wqcWw+Or4PUDWFhrX1+kS2RkJB4eHiQkJODs7Jzq86tXr45er+fcuXP/ePzSw0jGbrlA7RL5+NSrvFZxjcPrB8MbKbJgUpZiY2PDtm3b2Lx5M4sXL9as7nuNS9GqYkEm7rnMqdsRmtUVQuQc0qAKIYQG+vTpw4wZM7QtGh0KRyZB6ZaGK1UiU4mNjcXe3p6jR4+SK1fa9iRVFOWvq6h/ehabhPcqfxxyWTLn3RpYmGfyX9X5SkCDD+DCRrhzzNRpRCo4OTmxe/duxo0bx759+zSpqSgKU7tXpVi+3Axfc4bQSG3ucxVC5ByZ/LeeEEJkfg8ePODbb79N8cI4KXboG0iKA69JkBlWbhV/efbsGbVr1+bYsWPky5cvXbW6devG5cuXAdDrVUZvCODRszjm9fKggF0WuWpe/wNwcIU9Hxuupooso0yZMmzevJkVK1ZoVtPexpIFvT2Ijtfx/uozJCVrc5+rECJnkAZVCCHSaevWrdy8eVPbokH+cHYV1HkPnMpoW1ukS1JSEl27dqVx48bUr18/3fU8PT3ZsmULAHMO3+DQlVDGtauIh1vedNfOMFa5DW+khF6C00tMnUakUv369Vm9ejVBQUE8ePBAk5rlCtnxY9cq+N19wsQ9lzWpKYTIGaRBFUKIdNq8eTNdunTRrqA+GXZ/CLaFoJER7msVaaaqKt7e3tjY2PDTTz9ptqXQ/v37+eDrycw4eI3O1YvQp46bJnUzVPm2UKo5HJ4IUSGmTiPSYNu2bRw6dEizeh2qujCwfgmW+txhe4A2ja8QIvuTBlUIIdLh4cOHBAQE0KpVK+2Knl4Cj84ZrkjZ2GtXV6TbxIkTOXfuHOvWrcPCwkKzutb5XNgVnIcKheyZ2NndOHvpGpuiQOvJhmnpsmBSljRixAj69u3LsWPH0Om02ct0bJvy1Cyel882X+BqcJQmNYUQ2Zs0qEIIkQ7r1q2jU6dOaV4k5z+iguG3CVCqGVTqrE1NoYnjx4+zePFidu7cSZ48eTSrG52gY8Lv4djY5WPCW0XJZWWuWe0M51TasGDS+fVw+3dTpxFpoKoqEydOZOTIkZrsZWppbsbcd2tga2OB9yp/IuPlHmUhxOtJgyqEEOmwevVqevXqpV3BfZ+DLgHaTJWFkTKRxMRE6taty8mTJylcWLs9SfV6ldHrA7j1OAb3J3+wfe0yzWqbTMOPIG9x2DXa8G9ZZCmKorBu3Tp8fHyYNm2aJjWd7W2Y16sG9yNi+WjDOfT69De+QojsSxpUIYRII51OR/v27WnatKk2BW/+BoGboeFoyF9Km5oi3eLi4vDw8CAyMpKCBQtqWnvO4RvsvxTC520qMGpI339sN5NlWeaCNtMg/Dr4zDR1GpEG9vb27N69m59++onNmzdrUrNm8Xx80bYCBy6FMP+oxovKCSGyFWlQhRAijeLj4xk/fjzm5hpMyUyKh91jIF9Jw5YdIlOIjY0lV65cHD16FAcHB01rH7oc8teiSAPrF6dWrVpERUURGBio6TgmUaaFYYr671MhXJqRrKhYsWLs3LkTb29vfH19NanZv15xOlZzYer+qxy+EqpJTSFE9iMNqhBCpFGLFi3+2r8y3XxmQsRNw9ReSxttaop0iYqKomHDhuzfvz/de53+282waD5YF0AlF3smdTEsimRmZsa7777LqlWrNB3LZN6aBOZWsGcMaHAvo8h41atXZ9myZSxZos3WQYqi8EOXKlQoZM//1p3l9uMYTeoKIbIXRYsb4LXm6emp+vn5mTqGEEK8VlJSEhYWFulfcTX8JsyrC+XbQLdlmmQT6ZOUlET79u1xdXVl4cKFmq6qGxWfRKe5PjyNTWLHyAYUcfx7ga3AwEC8vLy4e/euNlfmTe3kQvj1E+j6C1R+29RpRBqpqsqdO3dwcHDQ5M2aoCexdJjjQ748VmwbXh9ba+1WxBZCZA2Kovirqur5sufkCqoQQqTBggULuHTpUvobF1U1XGEytzJccRImp6oqQ4cOxcLCgnnz5mnanOr1Kh+uP8ed8FjmvFvjH80pQOXKlSlVqhRXrlzRbEyTqjkYCleDvWMh/pmp04g0UhSFVatWcfToUU3qFc2bmznvVuf24xhGrw+QRZOEEP8gDaoQQqRSUlISX331lTZbjZzfYFgcqfk4sNdudViRdl9//TUXL15k/fr1mu51CjDrt+scvBzCl20rULdU/pcec+TIESpVqqTpuCZjZg7tZkB0KBz6ztRpRDqMGzeOzp07c/z4cU22n6lXyokv2lRg/6UQZv92Q4OEQojsQhpUIYRIpQMHDlCyZElKly6dvkIxj2HvZ1C0puFKkzA5Hx8f1qxZw65duzTd6xTgwKUQfjp4nS41itC/XvFXHqeqKv379yc6OlrT8U2mSA2oNQROL4H7p0ydRqRDcnIyY8aMYezYsZrUG1C/OF1qFGHGwWscuBSiSU0hRNYnDaoQQqTSmjVrtNn7dO9YSIiCDrMNV5qESUVHR1OvXj1OnTqFs7OzprVvhEbz4foAqhR1YGJn99dOGzYzM6N79+6YmWWjX9HNvwL7IrBjpOyNmoWZm5uzY8cOtm3bxsyZ6d9CSFEUJnZ2x72IAx+uD+BaSJQGKYUQWV02+u0nhBDGFxMTw65du+jRo0f6Cl0/CBc2GPY8da6gTTiRZjExMdSuXZuYmBjNV+yNjE9i6Ao/bCzNWNDbAxvLN78Z4eXlpd0K0ZmBtZ1hqm/YFfhjuqnTiHRwcnJi3759TJ06lXXr1qW7no2lOQv7GL4vBi/340lMogYphRBZmTSoQgiRCtu3b6du3brpu8KWEA27PgSnstDwI+3CiTQJDw8nd+7cnDp1CltbW01rJ+tVPlwXwL2IWOa+WwOXfy2K9CoJCQm0bNmSoKAgTfOYVNlW4N4N/pgGodmo+c6B3Nzc2LNnD//73/84ePBguuu5OOZiYR8Pgp/F8/7qMyQl6zVIKYTIqqRBFUKIVChUqBAff/xx+ooc/h6e3TNM7bWw1iaYSJOQkBBq1aqFj4+P5vecAkzed4VDV0L5qn1Fapd8+aJIL5MrVy66du3K6tWrNc9kUl4/GK6mbh8B+mRTpxHp4O7uzqZNm9i6dasm9Tzc8jKpizsnboXz7c5LmtQUQmRN0qAKIUQKxcXF0aBBA5o1a5b2IkF+4DvfsCiSax3twolUi46Opl27dvTu3ZsGDRpoXn+TfxALj96idx1X+tRxS/X5ffv2ZcWKFZqsmJpp5HGC1pPhgR+cWmTqNCKdGjVqxNy5c7ly5Qo3bqR/Jd63PYoyrFFJVvreZaXvXQ0SCiGyohQ1qIqieCmKclVRlBuKonz2kufLK4pyQlGUBEVRxqTmXCGEyCp27tzJiBEj0l4gOQl2/A/sCkPzr7ULJlJNp9PRo0cPqlSpwvjx4zWvf/pOBGO3nKd+6fx83b5SmvZSrV+/PnFxcZw5c0bzfCbl3hXKtIJD38KTO6ZOIzRw/PhxAgICNKn1iVd5mpV3ZvyOixy/+ViTmkKIrEV50zuziqKYA9eAlkAQcBroqarqpReOcQbcgE7AE1VVp6b03Jfx9PRU/fz80vo5CSGE0SQlJWFpaZm2kw9PgqM/wDtroXwbbYOJFFNVlSFDhvDw4UO2b9+e9v+fr3A/IpaOc31wyGXJtvfr45A77fXHjx/PkydPNFkxNVN5eh/m1TFssdRnK6ShgReZz+bNm2nVqhV2dnbpqhMVn0Tnecd5HJ3A9uH1ccuv/fR7IYRpKYrir6qq58ueS8kV1FrADVVVb6mqmgisAzq+eICqqqGqqp4GklJ7rhBCZAWnTp1i5syZaW9mHgbAH1OhSg9pTk3s4MGDnD9/ng0bNmjenEYn6Bi83A9dsp4l/TzT1ZwC9OnTh8DAQI3SZSKOxaDFeLh1GAKy2X22OdiBAwfo0qULiYnpW4nXzsaSJX0Nr1sHLjvNs9h/v7wUQmRnKWlQiwD3X/h70PPHUiI95wohRKYxb948dDpd2k7WJcC29yC3E7T+UdtgIlWCgoJo2bIlv//+u1FW7B219iw3wqKZ18uDUgXSX79UqVIcOnRIg3SZkOcgcGtg2A/46f03Hy8yvblz52Jra0v//v3R69O3Em9xpzws7O3BvYhY3lvtT6JOVvYVIqdISYP6snk3KV2xIcXnKooyVFEUP0VR/MLCwlJYXgghjO/Jkyds27aNfv36pa3AkR8g9JJh1d5cebUNJ1IsLCyMLl26kJSUhI2Njeb1J+65zKEroYxvX5EGZZw0qxsQEMDo0aM1q5dpmJlBp7mg6mH7+5DOhkaYnrm5OWvWrCEoKIiPPvoo3Qt81S6Znx+6VOH4zXC+3HYhey0YJoR4pZQ0qEFAsRf+XhR4mML6KT5XVdVFqqp6qqrqWaBAgRSWF0II41u1ahWtW7fGySkNTUeQP/j8BNV7G/aBFCYRGBiIk5MTvr6+mk/rBVjmc5ufj92mf73i9KlbXNPapUqVonv37prWzDTyFoe3vofbv8PpJaZOIzSQK1cutm/fzsGDB5kyZUq6673tUZSRzUqzwS+I+UdvapBQCJHZpaRBPQ2UURSlhKIoVsA7wI4U1k/PuUIIYXKqqrJo0SKGDh2a+pOT4mCbN9i5wFsTtQ8nUuTIkSM0a9aM27dvY2am/e5qBy+F8O2uS7SoUJBx7SpqXt/Ozo6yZcty7NgxzWtnCjX6QemWcOArCJcGJDvImzcve/fu5fHjx5pc9Rzdsiztq7owee9Vdp9/pEFCIURm9sbf1Kqq6oARwD7gMrBBVdWLiqJ4K4riDaAoSiFFUYKA0cCXiqIEKYpi/6pzjfXJCCGE1nx9fYmPj6dJkyapP/m3CfD4GnScDTYOmmcTb3bmzBm6d+/O+vXrKVmypOb1LwQ9Y+Tas1Qu4sCsntUwNzPOarSPHj2iR48eJCVlw8ViFMUw/d3CGrZ6gz7Z1ImEBooUKcLkyZO5cOECmzdvTlctRVGY0rUKHm55Gb0hgLP3nmiUUgiRGaXorWRVVfeoqlpWVdVSqqp+//yxBaqqLnj+52BVVYuqqmqvqqrj8z9HvupcIYTIKgoXLszChQtTv4/lPV84MRc8B0KpZsYJJ14rMDCQtm3bsmjRIpo2bap5/aAnsQxcfpp8eaxY0s+T3FYWmo/xp0qVKlGmTBm2bdtmtDFMyr4wtJkKQafg+CxTpxEaUhRFk6uoNpbmLOrjQUF7G4as8ONeeKwG6YQQmZH2c52EECKbiIyMBKBZs1Q2mPGRsHWYYSuNlt8aIZl4k+vXr/PWW28xffp0OnXqpHn9Z3FJDFx2mvikZJYOqImznfaLLv3b+++/z7x584w+jsm4d4UKHeDwRAiRyVbZhbu7O127dmXRokUcPnw4XbXy21qzdEBNdHqVfktPER6doFFKIURmIg2qEEK8wrlz5/jxxzRsC7PnY3h6D7osAev0bVgv0mbfvn18++239OzZU/PaCbpk3lvlz62wGBb29qBswYz5f9ypUyeuXLnCpUuXMmS8DKco0G6GYTr8lmGQFG/qREJDZcuWpUePHvj6+qarTqkCtvzcz5OHT+MYuNyP2MQ0bv8lhMi0pEEVQohXaNiwIfPnz0/dSec3wvl10PhTcK1tnGDilR4+fMjBgwcZMWIEgwYN0ry+Xq/y0YZzHL8Zzo9vV6Feae22k3kTKysrhgwZkvp/k1lJHifoMAdCLsDB8aZOIzTUpEkTli1bRseOHQkICEhXLQ+3fMzqWZ0LQU8ZueYsumTZokiI7EQaVCGEeImTJ0/i7e2dupOe3IHdo6FYHWg4xii5xOs9fPiQwMBAo9RWVZVvd11i1/lHfNa6PG97FDXKOK8zdOhQ9Nl9v9ByXlDbG07Oh6t7TZ1GaKhNmzbMmTOH1q1bp/v79K1Khfi2Y2UOXQll3PZA2SNViGzEeCs6CCFEFrZgwQIqVKiQ8hOSdbB5iOHPXRaBufx4zUgREREsWbKEMWPG4OnpaZQx5h+9ybLjdxjUoATDGmm/InBKFC1alLlz55KcnIy5ublJMmSIFt/AHR/Y/j68dxzsCpk6kdBIt27d0Ol0tGrVCl9fX1xdXdNcq3cdN4KfxTPn8A0KO+Tif83LaJhUCGEqcgVVCCH+JSQkhO3btzNgwICUn/T7ZMMKpO1mQF4344UT/xEREUGLFi0IDQ1N/WrLKbTB7z6T916lYzUXvmhTwWjjpMTFixdTv3BXVmNpA11/MewlvGUoZPerxjlMz5492bhxI0WKFEn3jICPWpXl7RpFmX7gGmtP3dMooRDClKRBFUKIf5k9ezbvvPMOBQoUSNkJd0/A71Og6ruGlUhFhnny5AktW7akadOmTJkyxSiN46HLIYzdcoGGZZyY0rUqZkba6zSlKlSowJYtW0yaIUMUKAteP8Dto3B8pqnTCI3Vr1+f6OhoateuTXx82hfEUhSFH952p0m5Any+9QK7zz/SMKUQwhSkQRVCiBdER0ezcOFCRo8enbIT4p7AliHg6AZtJhs3nPiHP5vTxo0bM3XqVKM0p353Ihi+5gyVXOyZ39sDKwvT/9o0MzMjLi6OuXPnmjqK8dXoCxU7wW8TIMjP1GmExhwcHNi0aRM2NjZER0enuY6luRnze3ng6ZaXD9af5cjVUA1TCiEymul/0wohRCayYsUKGjVqROnSpd98sF4PW70hKhje/lm2lMlACQkJtGrVioYNGzJt2jSjNKcXgp4xYOlpXBxy8Uv/mthaZ577im1tbfnyyy959CibXy1SFGg/E+xcYNNAiH9m6kRCY25ubly4cAF3d3du3ryZ5jq5rMxZ0q8mZZzt8F7lj9+dCA1TCiEykjSoQgjxgv79+zN79uyUHXxsOlzbC29NhKIexg0m/qLX67G2tuaHH35g+vTpRmlOr4VE0feXkzjktmT1kNo42VprPkZ6ODo60rdvX2bMmGHqKMaXyxHeXgLPgmDb+yCrtWY77u7ujB07liZNmnD16tU013HIZcmKQbVwccjFgGWnufhQ3tAQIiuSBlUIIZ47fPgwAQEBuLi4vPngW0fg8PdQ+W2oNcTo2cTf2rVrR2BgIM2bNzdKc3rncQy9lpzE0tyM1YNrU9ghl+ZjaGHMmDH8/PPPRETkgCtFrrWh5bdwZRf4yP2o2dHQoUP59ttvadasGRcvXkxzHSdba1YOro2dtQX9fjnFrbC0Tx0WQpiGNKhCCPFcYmIiiYmJbz4w8iFsGgT5y0D7WYZpiMLoIiIi0Ov1LFiwgEqVKhlljAdP4+i15CTJepXVg2vjlj+PUcbRQrFixejYsSNz5swxdZSMUXe44X7UQ9/AraOmTiOMYMCAAUyePJkWLVpw7ty5NNcp4piLlYNro6rQe8lJ7kfEaphSCGFs0qAKIQSGrWWaN29OkyZNXn9gchJsHGDY/qLHSrC2zZB8Od39+/epW7cu+/fvx9XV1ShXTkOj4um95CSR8UmsGFiLMgUz/z3Fn376KbNnz07XAjNZhqJAxzmGN4Y2DYRnD0ydSBhBr169mDVrFqtWrUpXnVIFbFkxqBYxicm8s8iXoCfSpAqRVUiDKoQQGN65X7NmzZsPPPA13PeFDrOgQDnjBxPcvHmTRo0a4e3tjZeXl1HGeBydQO8lJwmJjGfZgJpULuJglHG0Vq5cORYtWmTSfVkzlLUd9FgFunjY2A90KZjxILKcbt26MWXKFM6ePcvx48fTXKeSiwOrB9cmKj6Jnot9efA0TsOUQghjkQZVCJHjBQYGcvbsWbp37/76Ay9uBd+5UGuo7HeaQa5cuUKTJk349NNP+fDDD40yRlhUAj0X+XI/Io6f+9XEwy2fUcYxls6dO3PmzBkSEhJMHSVjFCgLHedC0GnY97mp0wgjCgsLIyQkJF01KhdxYOWg2jyNTeLdxb48eiZNqhCZnTSoQogcb+rUqYwcORIbG5tXH/TonGEF0aI1odX3GRcuBzt9+jRNmzZlwoQJeHt7G2WM0Kh4ei72JehJHEsH1KRuqfxGGcfY1q5dy+3bt00dI+NU6gR1R8DpxXBunanTCCNp1aoVnTt3Zv78+axfvz7NdaoWc2TFwFqERyfy7mLDTAkhROalqJlwuXZPT0/Vz0825BZCGF9QUBBVqlThxo0b5Mv3iitnUcGwuBmgwJDfwK5ghmbMqebMmfPXQkDGEBppaE4fPYtnaf+a1C6ZNZvTP+n1elRVxdzc3NRRMkayDlZ0NFxJ7b8bitU0dSJhJOfPn6d169Z8+eWXvPfee2mu4383gr4/n6KgvQ1rh9ahoP1r3pQUQhiVoij+qqp6vuw5uYIqhMjRvvvuOwYPHvzq5jQpHtb1grgn0HOtNKcZYPPmzWzfvp0RI0YYtTl953lzumxArSzfnAIMGjQoXVeZshxzC+i+AuxdYF1PeHrP1ImEkVSpUoXff/+dqVOnMmHCBNJ6ccXDLR/LB9YiJDKe7gtPyMJJQmRS0qAKIXIsnU5HUFAQn3322csPUFXYMQIe+EGXRVC4SsYGzIFUVaV48eKUKFHCaGM8ehbHO4t8CXkWz/KBtahVImvdc/oq77zzDpMmTUKv15s6SsbJkx/e3WBYLGlND4iPNHUiYSSlSpXi2LFjbNiwgQ8//DDN/849i+dj5eDaPIlJpPuCE9x+HKNxUiFEekmDKoTIsVRVZffu3a++evrHNLiwEZqNgwrtMzZcDqOqKuPGjWP8+PF4eHhQpYpx3gy4/TiGrvNPEBqVwLKBtahZPHs0p2C4X8/KyoqdO3eaOkrGKlAWui+HsKuweRDok02dSBhJ4cKFOXr0KAEBASxfvjzNdWq45mXt0DrE6/R0W3CCq8FRGqYUQqSXNKhCiBzp1q1b1KtX79VTxS7vhN++A/fu0PCjjA2XwyQmJtK/f3/27t3LiBEjjDbOpYeRdFtwgrikZNYOqZOtmlMARVH46quvGDduHMnJOaxJK9UU2kyB6/th/5emTiOMKG/evOzbt4++ffty5swZHj9+nKY6lVwc2DCsDmYKvLPoBBeCnmmcVAiRVtKgCiFypJIlS7J///6X7x8Z5AdbhkIRT+gwG3LKHpMmEBERwVtvvUVkZCRHjhyhQIECRhnH/24E7yw6gaW5woZhdXGvRTc7AAAgAElEQVQvmjX2OU2tDh064OjoyLJly0wdJePVHAS13wPfeeD3i6nTCCOytrbG3Nyc/fv3ExAQkOY6pZ3t2Ohdl9xWFry72Be/OxEaphRCpJU0qEKIHOfo0aPMnj2bvHnz/vfJsGuwuhvYOsM7a8BSVnk0lps3b1KvXj08PDzYtGkTefLkMco4R6+F0WvJSfLbWrPRuy6lnW2NMk5moCgK06ZNY8uWLaaOYhpvfQ9lWsHuMXBtn6nTCCP77LPPaNGiBTNnzuTEiRNpquGWPw8bvetSwM6a3j+f5MCl9O27KoRIP2lQhRA5iqqqfPLJJzg5Of33yWcPYGVnMDOHPltlxV4jO3LkCKNGjWLq1KlG2xpl1/mHDF5+mhJOtmwYVpeieXMbZZzMpGbNmuzatSvNK51maWbm0PUXKOQOG/rC3bQ1LSJrKVOmDB06dGDDhg1pOt/FMRcbvOtSrqAdw1b6sfaUrAgthClJgyqEyFG2b99OQkICPXr0+OcTcU9g1dsQ/wx6b4Z8JU0TMAfYtm0b69evZ9CgQena0/B1VFVl0e83GbHmLFWLOrJuaB0K2FkbZazMSKfTUbNmTSIicuCURWs7w/ewQ1HDyr7BgaZOJIysTZs2HDx4kE8++YRx48alaYVfJ1tr1gypQ6OyBRi75QIzDlzLmW/yCJEJSIMqhMgxkpOT+fzzz5k4cSJmZi/8+EuMhTXvQMRNeGc1FK5qupDZWHJyMgkJCZQqVYoKFSoYbRxdsp6vtl9k4p4rtHUvzKrBtXHIZWm08TIjS0tLtmzZ8uoVqrO7PE7QZxtY28KqLhBxy9SJhJFVrVqVU6dOcfToUbp06UJUVOpX5s1jbcHivp508yjKzEPX+WzzBXTJOWjbJiEyCWlQhRA5xsqVK3FycqJ169Z/P5isg00D4f5J6LIYSjY2XcBsLCIigjZt2jB79mzc3d2Nto1MbKKOYSv9Wel7l2GNSjK7Z3VsLI0zfTizc3V1ZdasWelaRCZLcyxmmKqfnGSYuh8VbOpEwsicnZ05ePAgzs7OLF26NE01LM3NmNy1CiOblWa9332GrvQnJkGncVIhxOtIgyqEyBGSkpIYP348kydP/nvlXn0ybHsPrv0KbadCpU6mDZlNBQYGUqtWLSpXrswHH3xgtHFCo+LpsdCXw1dD+a5jJca2qYCZWc5egdnCwoIxY8bk3KmKBcpBr00QHQYruxim8otszcrKioULFzJy5EgOHz7MkSNHUl1DURQ+alWOCZ0qc+RqKF0XnCDoSaz2YYUQL5WiBlVRFC9FUa4qinJDUZTPXvK8oijKrOfPn1cUpcYLz91RFOWCoigBiqL4aRleCCFSytLSEl9fX+rUqWN4QJ8MW73hwgZo/hXUHGzagNnUli1baNq0KePHj2fatGlYWFgYZZxLDyPpPPc4N0KjWdzXkz51ixtlnKxmyJAhBAUF8euvv5o6iukU9TBM3X98zXCfedxTUycSRqYoyj+2EEtOTk7Tfam967jxS/+aBEXE0mmuD/53c+A93UKYwBsbVEVRzIG5QGugItBTUZSK/zqsNVDm+cdQYP6/nm+qqmo1VVU90x9ZCCFS5/jx43z11VcUKlTI8MCLzWmzcdDwI9MGzKa+/PJLPvzwQ/bu3Uvv3r2NNs7Ocw/pMt+HZL3KhmF1aV5BVl/+k6WlJVOmTGHMmDEkJiaaOo7plGoK3VfAo/OwoiPESqOREzRt2pQmTZqwePFiOnXqxJMnqb+C3qScM1uH18PW2oKei06yyT/ICEmFEC9KyRXUWsANVVVvqaqaCKwDOv7rmI7ACtXAF3BUFKWwxlmFECJNKlasSPv27Q1/+XNa75/NaaMxpg2XDf25cmyDBg04c+YMHh4eRhknWa/y494rjFx7lsouDuwYWR/3og5GGSsra9euHSVKlGDSpEmmjmJa5dsYrqSGXpImNYcZOHAgJUuWxMPDA39//1SfX9rZjm3D6+NZPC9jNp5j0p7LJOtz6LR5ITJAShrUIsD9F/4e9PyxlB6jAvsVRfFXFGVoWoMKIURarF69mrCwMGrWrPl3c3p+PTT7UppTI1BVlU6dOnH58mW8vLzInz+/UcZ5FpfEoOWnmX/kJj1rubJmSB2c7WyMMlZWpygKixYtYsGCBYSGhpo6jmmVfQveWQthV2F5B4gJN3UikQGsrKz46aef+PHHH/Hy8mLhwoWpvi/bMbcVywfWok8dNxb+fotBy0/zJCYHz0oQwohS0qC+bIWJf39Xv+6Y+qqq1sAwDXi4oiiNXjqIogxVFMVPURS/sLCwFMQSQojXu3HjBqNGjcLS0tKwkudW7xea049NHS9bSUpKYurUqcTHx3Pw4EGjbiNzPSSKTnN9OHb9MRM6VWZSF3esLGTNv9cpUqQIly9fxtnZ2dRRTK9MC+i5FsKvw/L2hgWURI7QrVs3jh07xpw5c3j33XdT3aRampvxXafKTOhUmeM3wmk3+xgB9+WeZiG0lpLf6EFAsRf+XhR4mNJjVFX987+hwFYMU4b/Q1XVRaqqeqqq6lmgQIGUpRdCiFdQVRVvb2/Gjh1LcZcCsO7dvxdEkuZUU9euXaNBgwb89ttvxMfHY2VlZbSxNvrdp8McH6Lik1gzpA6967gZbazsxtHRkaVLlzJt2jRTRzG90s3h3fWG/VGXt4NnD0ydSGSQcuXKcfr0afr06YOiKNy5cyfVNXrXcWOjd10Aui04zsoTd3LuStlCGEFKGtTTQBlFUUooimIFvAPs+NcxO4C+z1fzrQM8U1X1kaIoeRRFsQNQFCUP0AoI1DC/EEK81KpVq4iIiGDUkD6GqXw3DkK7n2RBJA2pqsqCBQuoV68effr0YdeuXeTNm9coY8Uk6Bi9IYCPN52najEH9vyvIbVK5DPKWNmZl5cXffv2NXWMzKFkE+i10dCc/twSQi6ZOpHIIDY2NrRp04bIyEi6detGXFxcqmtULebI7v81oGGZAozbfpEP1gfIfqlCaOSNDaqqqjpgBLAPuAxsUFX1oqIo3oqieD8/bA9wC7gBLAbef/54QeCYoijngFPAblVV92r8OQghxD+Ehoby8ccfs2jat1isaAvBF6D7SvAcYOpo2UZwcDDt2rVjyZIlHDt2jBEjRmBmZpxptleCI+kw5xhbzz5gVPMyrB5cB2d7ud80LQoXLoyVlRUjRoxAp5MX05RoCAN/Ndyf/osX3Dlm6kQiA9nb23Pq1CmsrKwYOXIkV69eTdX5jrmtWNLXk4/fKsfOcw/pONeHSw8jjZRWiJwjRa8mVFXdo6pqWVVVS6mq+v3zxxaoqrrg+Z9VVVWHP3/eXVVVv+eP31JVterzj0p/niuEEMY0btw4BvfsiOeZMRAVAn22QoV2po6Vbeh0OkJDQ/Hw8ODEiROUL1/eKOOoqsqak/foOMeHyHgdqwfV5sOWZTE3e9myByKl7O3tuXr1KlOnTjV1lMyhkDsMPgB2hWBlZwjcbOpEIgMpioKZmRkVKlSgfv36TJ06leTk5BSfb2amMLxpaVYNqs2zuCQ6zfVh8e+30Msqv0KkmZIZ58x7enqqfn5+po4hhMiCkpOTibu0H5sdQ7GwyQO9N0PBSqaOlW0sXryYu3fvMmHCBKOOExoVz9jNFzh0JZQGpZ2Y0aMaBeysjTpmTnL37l08PT05cuQIlSrJ9wdg2HZmXS+4dxxafQ/1Rpg6kchgt27dYvDgwcTGxvLLL79QsWLFVJ0fEZPI2C3n2XcxhLol8zOte1VcHHMZKa0QWZuiKP6qqnq+9DlpUIUQ2UXghQt8NKQH+1oHg1MZw/1ljq6mjpXlqarKihUr8PT0xNXVFQsLC3LlMt6Lrl3nH/LltkDiEpP51Ks8/esVx0yummrul19+YcqUKZw8eRJ7e3tTx8kckuJh61C4tB08B4HXD2BhvEW/ROaj1+tZtGgR48aNY8KECQwbNixV56uqyka/IMbvvIiFmcLELu60q+JipLRCZF3SoAohsj01MQ52j+bRsVW4eLaHLgvB2s7UsbK827dvM2zYMB4/fsyKFSuoXLmy0cZ6GpvIuO0X2XnuIVWLOjCtezVKO9sabTwB3t7eBAcHs2XLFqPdQ5zl6JPh4Hg4PguK1YHuK8CuoKlTiQx27949goODqV69OoGBgVSvXj1V598Nj+GD9QGcvfeU9lVd+Lp9RZxsZRaIEH96XYMqv42EEFmeLuI+7T2LcX7fSlzajYUeq6Q5TafExEQmT55MzZo1ad68OadOnTJqc3rgUgitZvzOrxce8VHLsmx+r540pxlg1qxZWFlZ8eCBbLPyFzNzaPUddP0Fgs/DwkZw/5SpU4kM5urqSq1atbh27RozZ84EDFdXU8otfx42DqvL6JZl2Rv4iJbTj7LlTJBsRyNECsgVVCFE1nb/FF8O8OLknRj2bl2HuXtnUyfK8q5evUqHDh0oXbo0M2fOpHTp0kYb6+HTOL7ecZEDl0IoX8iOqd2qUrmIg9HGEy+XlJTE5cuXqVKliqmjZC4hFw17KD97AG0mg8cAUGS6eU4UGxuLh4cHn3zyCf369UvVjIPrIVF8uvk8Z+49pVHZAkzsXJmieXMbMa0QmZ9M8RVCZD/6ZPD5iT0LxzN0VwJnjh3EuXIjU6fK0m7dukV0dDSlS5fm6NGjtG7d2mhj6ZL1LDt+h+kHrqFXVT5sUZaBDUpgaS4Te0zh3LlzzJgxg2XLlpk6SuYT9wQ2D4EbB6B6b2g9GazymDqVMAF/f3/ef/99LCwsmDNnTqqm/er1Kit97zJ57xVU4KNW5ehX1w0L+ZkncihpUIUQ2UvkQ9gylFM+R2i7Xse2bVup38x4zVR2FxUVRe7cudm2bRvR0dH069fPqOOdu/+Uz7de4OLDSJqWK8C3HStTLJ9cTcgM7t27h6Ojoyya9G/6ZDgyCX6fCvlLQZfFUKSGqVMJE9Dr9fz888989dVXtGrVigkTJlCsWLEUn//gaRxfbL3AkathlCtox9cdKlKvlJMREwuROUmDKoTIPi7vgh0juBESS4MViSz6eTkdOnY0daosKTExkUWLFjFhwgTWr19P48aNjTreo2dxTNl3lS1nHuBsZ834DpVoXbkQikyZzDTGjBnD9evX2bx5MxYWFqaOk/nc/gO2ekN0MDT5DBqMNtyzKnKcqKgoJk+eTHh4OPPmzUOn06X4e0ZVVfZdDGHC7ksEPYmjjXshPm9TQab9ihxFGlQhRNaXEA37vwT/pVC4GnFt5uJzNZgWLVqYOlmWo9fr2bBhA1988QXlypVj0qRJVK1a1WjjxSbqWHD0Fot+v4lehUENSvB+k1LY2VgabUyRNomJiXTo0IH8+fOzYsUKzM2l+fqPuCew+yMI3GxY5bfLQshb3NSphAk9efKEhg0bcvbsWSwtU/5zLT4pmcW/32LukRuoKng3LoV341LkspLvO5H9SYMqhMjarh+AXaPh2T3iPN6j6/xzrFm7DgcHWUwntXx8fBg1ahRmZmb8+OOPNG3a1GhjJetVtp59wJR9VwiJTKBtlcJ85lVepvNmcnFxcbRv354iRYrwyy+/SJP6Kuc3GBpVVYWW3xgWUJKtenKssLAwChQowAcffEDFihXp378/VlYp20P3wdM4Ju25zK7zj3C2s2Zk8zK8U7OY3JMvsjVpUIUQWVN0KOz9zHClwqkcavuZKG51OXXqFLVq1TJ1uixl165dtGjRglOnThESEkLXrl2NNrVWr1fZezGYGQeucT00mqrFHPmqXQU83PIZZTyhvdjYWNq2bUvJkiVZvHix7JH6Kk/vwfbhcPt3KFoL2s2AQsbbjklkfr6+vnz99ddcu3aNL7/8kr59+6b4qurpOxFM3nuF03ee4JovNx+1Kkv7Ki6YmcltECL7kX1QhRBZi6rCmZUwpyZc3glNPie69694DR3PyZMnpTlNIb1ez8WLFwE4evQoDx48oFGjRnTr1s0ozanhvqpg2sz6g/dXn0GvqszuWZ2t79WT5jSLyZ07Nzt37iQuLo7Q0FBTx8m8HF2h7w7ovBAibhr2TN0/DhJjTJ1MmEidOnXYt28fq1atYu3atZQrV46FCxcSHx//xnNrFs/HhmF1Wdq/JnmsLRi1LoA2s/7g4KUQ2T9V5ChyBVUIkbkE+cP+L+DeCXCtB+1n8khnR7t27ahevToLFy6UKYdvEBcXx6pVq5gxYwYuLi4cOHDAqAsR6fUqv10JZeah61x48IwSTnkY1bwM7au6YC7v/Gd5CQkJrFixgsGDB8uCVq8TGwEHv4YzK8ChGHj9AOXbyr6pOdwff/zB7NmzWbJkCWFhYTg6OpI/f/43nqfXq+w8/5DpB65xNzyW8oXseK9JKdq6F5ataUS2IFdQhRCZ35O7sGkQLGkG4Teg/Szov5tLYTrq1q1L586dWbx4sTSnrxEcHMxXX32Fm5sbO3bsYM6cOUZtTuOTkll/+h4tZxxl8Ao/nsYlMqVrFQ582IhO1YtIc5pNJCQkcO/ePXQ6namjZG6580GH2TBgL1jZwvpesLQN3D9t6mTChBo2bMiGDRuwt7dnz5497Ny5E71ez+3bt197npmZQsdqRTg4ujHTu1dFp1cZtS6A5tOPsubkPRJ0yRn0GQiR8eQKqhDCtOKewrHp4LsAFDOoNwLqjwJrO44cOUKPHj2YOnUqffr0MXXSTElVVRITE4mJiaFs2bJ0796dUaNGUa5cOaON+Sw2iVUn77LU5w6PoxOoWNieYY1L0sa9sCzqkY0FBwczaNAgFi9ejIuLi6njZG7JSYYrqUd+gJhQqNABmn8NTqVNnUxkAleuXKFBgwbUrl2b999/Hy8vrze++arXqxy4HMK8wzc4F/QMZztr+tZ1451arjjZWmdQciG0I4skCSEyn/hncGoRnJhn2Lahak9o9iU4FPnrkEGDBtGrVy+aNWtmwqCZU0xMDHny5GHWrFmEhYXx3Xff/fWYsQQ+eMbqk/fYHvCA2MRkGpZxYlijUtQvnV+mfuYAqqoyadIk5s2bx5YtW+Re8JRIiIYTc+H4LEiKA4/+0PCjf/ycEzlTbGws69evZ/78+YSGhuLt7c3AgQNxdnZ+7XmqqnL8ZjgLjt7kj+uPsTI3o13VwvSrW5yqxRwzKL0Q6ScNqhAi84gJB995cGoxJDyDMq0MjWnhv/fh/PHHH+nevTslSpQwYdDMR1VVTp48yc8//8ymTZu4cOEC+fLlw8bGxmirrMYlJrPr/ENWn7xHwP2n2Fia0a6KCwPrl6Cii71RxhSZ244dOxg8eDDTpk2TmQ0pFR0KRycb9nFGgao9oP4H4FTG1MlEJuDn58f8+fO5ffs2v/32G9evX6d48eJvXP33Rmg0K0/cYZN/EDGJyVQt5kifOm60cS9EbiuLjAkvRBpJgyqEML3Ih4YrCX6/GK4kVGgPjcb8ozENDg6mUKFCbN26lXr16lGwYEETBs48rl+/zurVq1m9ejVmZmb079+fAQMGUKhQIaOMp6oqAfefsvXsA7adfUBkvI7Szrb0qu1Kl+pFccid8o3oRfZ08eJFOnToQIcOHZg4cSK5cuUydaSs4ek9OD7HMP1XF2/4OdhwNLhUN3UykQno9XrMzMzo3bs3o0aNonjx4ty/f5/q1au/dpZKVHwSW848YPmJO9wKiyGPlTltqxSmq0cxahbPKzNcRKYkDaoQwjRUFe78YbhaemW34TH3rtBgNDiX/+swvV7PzJkzmThxIufOnZP724CQkBDCw8MpV64cNWrUoGnTpvTu3RsPDw+jvdi4Gx7DtrMP2RbwgNuPY7C2MOOtSoXoVduVWiXyyYsc8Q/h4eF88cUXTJo0iTx58mBlZWXqSFlHdBicXPD3TJLiDcFzIJRvBxbydRQGx44do0+fPuTKlYtu3brRtWtXKleu/Mqfxaqq4nf3CRv97rP7/CNiEpNxy5+bt2sUpX1VF0o4Ge8WECFSSxpUIUTGio+Ec+vg9BJ4fBVy5YXqfaDmIMhb/B+H3rt3jwEDBhAfH8+KFSsoVaqUaTJnAtevX2fr1q2MHDmSQ4cOceXKFcaMGYOqqkZrDu+Fx7LvYjC/Bj7izL2nKArULZmfTtWL0LpyIexs5GqpeLOuXbsycuRIGjdubOooWUt8pGHa7+klhqureQoYflZ69PvPz0qRM+n1ek6ePMmmTZvYtGkTuXLlYsCAAXz66aevPS82UcfewGA2+gVx4lY4ABUL29O2SmHauBeWZlWYnDSoQgjjS9bBrcNwfgNc2QVJseBSA2oNgUqdwfKfUwBjYmKYMWMGP/30Ex999BGffPJJjttCRqfT4evry6+//sqOHTt4/PgxnTp14ttvv6VAgQJGGVNVVa6FRLM3MJi9F4O5/CgSMLxw6VDNhQ5VXXBxlOmaInUiIyOxtbVlz5496PV6OnToYOpIWYs+GW7+Bn5L4dqvhtknpZtDlXegXGuwtjV1QpEJqKrK6dOnuXnzJj179mT48OH07dsXDw8PEhMTyZ0790vPe/g0jj0XHrHnguGNSIAKhe3xqlSIZuWdqeRij5lsCyYymDSoQgjjUFV4cAbOr4eLWyAmDGwcoVInqNEXinj85xSdToe5uTnLli1j3759fP/99znqqunDhw9RVRUHBwfc3Nxwc3PDy8uLdu3aUadOHaMsdhQVn4TPjXB+vx7G0athPHgah6KAp1te3qpUiLcqFaJYvpe/sBEiNf744w8GDRqEq6sr33zzDfXr1zd1pKznWRCcWQlnV0FkEFjmhrJehtsjSrcAC9lSRBhcuXKFwoULc/36dZo2bUrDhg3x8vKiefPmVKxY8aUzb15sVs/ef4qqQgE7a5qWK0Cz8s40KFMAW2tZYEkYnzSoQgjt6BIM95Ve3QtXfzW8gDK3NrzLX6X7G19Ade/eHW9v7xyzdcyDBw84evQogYGBTJw4kenTp1OwYEF69epFeHg4+fPn13zMBF0y54Oe4XsznD+uP+bMvSfo9Cp5rMypX9qJxuUK0LJiQZztbDQfW4ikpCSWL1/OhAkTKFu2LN988w1169Y1daysR6+H+75wYRNc2gax4WDjAGVbQ9m3oFQzyCXbigiDp0+fsn//fvbv389vv/1GbGwsTZs2ZcWKFaiqiqWl5X8a1sfRCRy5GsbhK6H8fi2MqAQdluYKVYs6Uq9UfuqUyk8N17zYWOas2U0iY0iDKoRIn2dBcOsoXN8HNw5BYrThXf1SzaBcG6jQzvDC6SWio6NZuXIlW7ZsYc+ePURFRZE3b/ZdVfDRo0fs3LkTX19fjh07RkREBI0bN6ZJkyYMHz7cKFdIYxJ0nLv/FN/bEZy6Hc7Ze09J0OkBqORiT+OyBWhUtgA1XPNiZWGc7WiE+LfExESWL1/O999/z7p16/D09MTc3Dzbfu8bVXKS4Wdw4Ga4thfiIsDMAlzrGprVMq3AqSzI11Y8d/v2bU6fPk337t2ZOHEiqqryxRdfsGTJEipXrkyNGjX+sbBZUrIe/7tPOHI1jBO3wrkQ9BS9ClYWZni45qVmiXx4uOWlWjFHHHLJ2gQi/aRBFUKkTnQo3P7d8HHnD4i4ZXjctpDhSmm5NlCi4X/uK33R5cuXmTdvHqtXr6Zp06YMHz6cpk2bZpsXp3q9nlu3bpGcnEy5cuXo3r0706dP58GDB8yfP586depQr149KleurGlTqkvWcy0kmoD7Tzl3/ykB959yPTQKvQpmClR0sadW8fzULpmPmsXzkS+PrAgqTCsxMRFLS0tWrlyJv78/M2fOJCYmhjx5ZJGWNNEnQ5CfoVG9vh9CAg2P2xaE4g2efzSE/KWlYRWA4d7VpKQkzM3NGTVqFD4+Ply/fp0qVarg4eGBh4cHXl5e/9i6LDI+idO3Izh+M5wTN8O5EhyJ/nnLUMbZlhqueanu6kjlIg6UKWiLtYVcZRWpIw2qEOLVdAkQfMHwgueBn+G/T24bnrO2B7f6UKKR4cO5Irym2VJVldjYWNq2bcuVK1cYMmQIw4YNo2jRommO12PhCQDWDzPtFMGAgAD8/Py4cOECZ8+e5dy5czg6OjJy5EjGjBmDv78/E49HYWFl/Y+sPRae4NKjSCoWtmf9sLp/fT7APx5/mWexSVwOjuTyo0jmHb5BeEwiKoZbfwEcc1tStagj1YoZPjyK58U+havuvvh1/ffX+M/Mf3pdxpfV/Cr8YwAqfX4sxRle9ty/vz7u4/cBcGH8W/+p8af1VhMMjyd+CcEXWO+6/e8nB+z+e8znxzFg90vrpsRL8y9tC8DFR8+AF74Gzx9nwO7/HMuA3YY/B5+HQlX+/vu/j//TN/kM//064tXhXnf+i2P96c/j/nwuIRIUc8MYr8v5p0nFIDEGrPL897nn56uqSlS8jlxDdlOiRAk8nXUMrKyjVQPPv6cQvpjjRf/O9+cYk4oZHn/xc3nd8an9Wr34fPB5w3/H3n/5cSmp9eJx904Yvl6vq/cmS9sa9lOt0Qfu+BjeUIx6ZHjOtiAUrWlYC6BIDTg8yXDV9cXP5WVfl1f9W/331zGln+vLMr/pvFcdk5Yx05ozrTW0GC8DREVFcebMGfz9/fH392f48OEUL16coUOHsmvXLvz9/YmMjKRy5coUKFCA6J87cS7OmTMVPubMvSecvf+Up7FJAFiaK5RxtqOSiz2VizhQrpAdZZxtyW8r90uLV3tdgyp3QQuRk8RGQMjF5x+Bzz8uQnKi4Xm7woYXMx79DVdIC1UF81f/mFBVlXv37uHm5sb06dOJi4vjiy++4PPPP6dx48ZYW2edX04JCQncuXOHmzdvcuvWLXr37s2lS5dYsmQJv/zyC+vXr+fhw4e4u7vToUMHqlWr9o/7Rz08PLDwO/GaEV5OVVWCnsRy+3EMN0OjuRkWw43QaG6GRRMalfDXcRZmCoqi4Gxrzdg25alWzBHXfLmzzRVpkf0pioJ9LkuwtOTy5f+3d+/xUV3HarIAABwpSURBVJT34sc/39l7djebG7kRkkACKCKKykVtEBUsRY9UrK0oKhbrpT+stqfnVPRXa38eBdv6U7G17Wm5lJ6qtQpe0HqptadyrIiggMjFABFIIrkSck929zl/zCYEsoFIFZL4fb9ew+7O88zsM3l4Zuc788w8W3jqO+fy0ze2cc3TrzN5ZAoXj0nnGzPrCIXi3y6geuD02vvsM+fYZ69qdkLJansqfdd+qnpnXp/9ROBwK4hlB7fG6JXWL6BgMMh55513yNBQra2t3H///QBs2rSJxYsX88EHH+DxeBgZaqcwPYFz5kxg6dy5lJWVURdxs6O2jc1lB/igtI6/bq3gT+v2dq4v1e9meEaA4elBCtMD5Kf5yU9NYHCSD6dDbzdRPdMAVamBJtJuj6dXXXzoVPXRwTPrAAmpkDEaJtwUO8t+FoQGH3HV0WiUzZs3s3r1at58803efPNNALZt28bcuXM7H3F/0UUXfW6bd6yi0SjNzc34/X5efPFFxo8fT11dHTfccAM7d+6koqKCIUOGMGzYMAoKCmhubmbMmDHcc889ACxYsODYvtcYolFDfUs7qzaWUV7XTGt7lJZwlIbWMGtLavnSA2905g96nRQMCjBpxCAKBgU4KSvIqKxEbn18PVs+qScvNYEZpx+5npTq64LBIHMnDWHuiFqqAyfxygeVvLSxkkubm/noo49Y+8bH3HJ+Hgea2wl6nWj41EsikFpgT2deZ89rqoGy92DVd6G1HlrqDp6ULH0XFuZC+sl2l+CUYdBYBS4vtDbo8DZfMB6PhzFj7N4Ic+bMYc6cORhjKC0tZfuiyyne19R5UnThwoVMnTqVoqIiFn776xQWFvLVggLShucSSUil3gpSbQLsqGnh2fdKqW8Nd36P0xKGpCSQn5pAdpKP7CQfWSEvmSEv2SEfmSGvPpjpC04DVKX6k2jEHsql/pPYVG4/wGj/bqjbA/v3QH0ZmOjBZbxJkDYchk22u+hmnGIHpoH0I541N8YgIqxcuZKioiL27t3LBRdcQGpqKkVFRUyZMoUf//jHFBYWntCreJFIBMuyqK6upqysjDFjxrBs2TLWrFlDWVkZ5eXllJeXs2/fPmbPns2SJUt47733GD58OFlZWdx9990MGzaMnJwcnM7uu8RAoPsBmjGGxrYItY1t1Da1UdPYRsWBVkprm2mLRJm7bC2fHGhh34EWqhrsA8EPy+uZ9/h7ADgsweO0cIgwKNHDrRcMJz8tgcL0AIMCnrh/T71Sqgaq1ICbqyYO5qqJgyEzk6amJkZk2Pen/ssj6yiuaGTCqpmMHz+e0eX7ONkVJj/doIevvZSQYo+pGhpycF75BjARu9dMwflQsQWK/wIN+w7mWTAY/OkQyoH9H9tXWw+UwZZVdvfh9hZwuPQK7AAnIuTk5JBzchoXnAxc/00AFi1aBNj3mN9///0UFxdTXFzMG6+8yJ49eygtLWX58uUMPXsot9xyC0ufXMHvHv8T76xbh/Gl0NyWyPZ9Qd6JeqnHh+U6tMdVit9NVshLVsgOXrOSvKT5PST73aR0mRK9Tv19HIB6FaCKyDTgEcAB/NYYs/CwdImlTweagDnGmPW9WVapLyRj7DPYLQegudZ+ImNTzRHe77cD08aKQ4NPsO8TCw2GUK7dLTcpF5Ly7KA0tdA+ODmCrVu38uGHH1JSUsKuXbsoKSmhuLiYcePGsXz5crZu3cqYMWMYOXIkmzdvJisr6zP/c7S3t1NfX8+BAweor6+nvr6ejIwMCgoK2Ln6eYacdSEbN25k4cKF1NTUUFNTQ3V1NTU1NdTX17N792527tzJyy+/zJgxY3C73YwePZqpU6eSnZ1NVlYWmZmZnV2O77rrLlrDURpbwxScNoGG1jDrdtfR2BamviVMY2uEhtZ29je1U9vUzv5YEGp/tl/bItG42+K0hLK6FjITPYzJSeLv2yupamglPzWBR2aN5a4Vm3DEuut+WH6A3JQErpqQ+5n/TZXqr4YNG8awUWkA/O0HEyipaubtIVewdu1afv7Xj9myt5ZvnlfMj+bCt5+r5YFpIfbXNLNpbz25KT6GpHjRTsJHIQLitAPUix88OL+1HpZdYgefY66A2hL7JGhbk/2bVbsT/nj1oeu6LwsCg8DfMaXZgW3He28IPEH7mQaeIETCYOnphYHC7XYzadIkJk2aFDe9tbWVhx9+mIxEL+NPGkJjeTGlpbtp+qiUhrIy9ldVkZWdzVMvvcG9P76HpOyhDB0/lV//v++yw+ljq8tPs5VAm9OP5fHjzhiGM5hGe205zqRMnBYk+z2k+j2dQWuy30XQ6yLgcZLodRLwOgl4XAS9TgIeJ0GvszNdn2zfNx01QBURB/ALYCqwF1grIs8bYz7sku0rwPDYNAH4JTChl8sq9fkyxg7qTNS+AmkiB1+N6T4vGoZwG0Ra7e6y4dbD3rfZ05HetzXYDwzpnBq6v4+Gey6zOMCXbAeXvhT7DHb2afbBRCADglm0ewfR5AjSZAXx+gMkJyezYcMGRo4cSV1dHa+++ir796+htraW/fv3U1NTw759+1i2bBmbNm3ikUce4YUXXmDx4sVs376dvLw88vLyKCoqIicnh+HDhwPwrW99C6/Xi9vtprKykt27d9PS0kJzc3Pn68SJE8nIzGLx4sXcePPNvPn3N1m16gWam+305pYWWlpasCzh10v/wB+WL6W6upqbb/0eF5w9lpKdO/AHAiT4A/j8ARISAky7fBbTr5hNTeU+EuoaWVPWSupJE8gJhvD4Q3gDibgDIVzeAH/YdICW9hSiZ36D7z31Pq3mJFr8EVpqIjR/EqGlfTct4V20tkdpbAvT0BImHD36A+IclpCc4CI5wU1ygpu81ATG5iaRlOC25/vdsTQXGYlevvfU+1gi3R6SdKClnaQENydlJup9N0p9CiLC0EEJDJ01i1mzZsHSbfDJRkxGIQBfyvPgcwrvVzWz6C8l7K5uYXdNM3JHkPT0dAZRw9/n+Fm/o5aSJ5/kyiuv5JlnnqGhoYFgMEggECBYXEvA6yCjooL09HTC4XDc3hRfCJ4guAP2NOn7B+cvvdi+6po+CqY/YHcDfnm+/bt48iX258YKOFBq52usPPJvHMB92fb3eWOBqydo3yPr8kLVdvse2Vfusu+xdXnttPpye/6mp+2rt5Yr9urs8tnZZb7LDrZF7KfTd81nOex1iaVXgD9HHo+HESNGADB58mQmT57cY94H7v53XC4XoVCIQZWzqa6upqqqiurqaiqqSqmurWPmjNEMH3s6cy75Dv93+au8+MdlvPCzhbi8fhyeBMTtA5ePqNNL+hU/pnnXeiKNtQRGX0jdmhVEWxsQpxvL6UacbpxuL4nZw0jNH0Vr6Yek5g7H53IQ3v8JPo8bn9eDz+MmwecmweMhMTkZt8OBU6L4vF5cDguX08LtEPt9bHI7D/vssHA5BYcIlhV7FcGy7GONQ+Zb0jlP5ND0L4re7IHHA8XGmJ0AIvIkMAPoGmTOAJYb+5HAb4tIkohkAfm9WLZfeXv5D5l//6PUNnbf8Z5bmMhtFw7m5v/6iH+dOpiaxgg/e7XjZvFDD4YXXpZHdWOYJ9+t4uEr8rln1R427m3qts7cFDeLvp7Pj1bt4Ywhfi4YGWT20p1xy3b9OalMGZnIdct3sfLGQpa8VcmKDfu75XNZwrM3FbD4rUqqGiPcMSWD2ctLqI6zTecVBpg/NYOrf1fC3dMyqGyIcO8r+7rlA8Ojl2dR2RBh2Tv7WTJrMN9/rpz39rZ0y5mX7GLprGy+9+w+JuZ7+cpJAS5dvDfOOuGWc0JMPznAzGWlvH5zDo+uruWpDQ0dX9nxDy4H/OPmQTy8+gBVjVF+8mU/U5bWUtVkOPxvP63AyUPTfExa2sCjX/HySYPhtpe7lxPgyct9fNJoWLSmjZeu9nPNiibWlEa65StItvjzbD9Xr2jm7Dwv00cnceF/foJBiCL2qxEiCDO+NIqxp47gh79cxV3/egMrXnuHdes2EDUQNXZpo6YdkSom/ug37HhiEW11pZx0zY2suXcm4ab6g1dRxUJECBWeyajrF7D2/q8z4qq7aT9QxY6VD9ndXsQCAUEwwJcXvEC4uZ7S7RWcs+B1il/fQOWG1yEaRSwH4nAiloNg/hgKZt/L7lU/xz/0dPzDxlL829uR2E5dHG5wusHpInhGKZ7MQvavfoMH9+bTWrqVlr01iNODOPyIMzn2g+Bj4oLXiTSFwCTy+E/fwFz6AIMdB7voRIEG4OlGeHrZu3D65XzcBPf9rQIotPtoANASm/bhsASv08LnduBxOvC6LLwuBz6XgwS3kxS/hcflwOt0EPA48Huc+GNnUf3ujrOr9ryAp+O9g4Dn03UdsvQgR6njoqNdXnW6fd970YgUXv7eeMDugl8383EqKyupXHYdbuceAjg7H2q2fft2tm7d2tlbo2HXFupbwsxoeYT77ruPc889l8ceewzLspgyZQruSCNup+AmjNsBrj+ezhNPPIFlWTz00EP86le/YtGiRbz22mvI3nftg84XZmJZFoWFhSxcuJDf/OY3FBYWMnnyZObMmYO1YwNWUyOWow2r5CYsy2L27Nmcc8453HbbbSxatIi33nqLp59+Ou62P/jgg7z11luUvVvO187K6hzi6nBnn302X/va13jooYe4ItqMAR55rQQaY8cG/i2w2Q5Eb7/9dowxrHhtF7dNHcrTTz/NO++8Y+fbtBUa68C/g5ymN/nOd77DMw//gJzkAOMv+g/uuOMOIAmwAxGMgXALl0+bxLiT85n/Hw+y8LYreXvtezz7+8fs9LT82MndFiRygAUzclmzuYSy6gYuy6vn0X80UvbCIoi2H3x0OTB+sIPLqufy6Jo2Zp7sxAC/eKct7v+TeePdGODZrWHmlQ5nxZZ21sb5DR+caDFvgpcVW8LkhByMy3Fz51+asH88xQ7EAZYnc9noAONyfdz5cjULLs5kze4Wnv2gPpYX+95dgMczWXDpYNaUNFJW185lpyXz6H9XUHagvdv3j88PcNlpKTz6t33MPD0FYwy/eLMizhYJ8yZnYgw8u6GWeZOzWPF+NWs/ru9M79ymJA/zzs9mxXvV5CS5GZcf5M7nSrrlA7hs7CDG5Sdy58qdLJhZwJpdB3j2/cpDv7qxGoAFkSms2VlH2f5WLjsjnUdf30NZXSuHG5+f2Jk+84xBGAO/+Fv8Y7155+fY2/R+JfMuGMKK9RVsLDn4JPlAbCpK8fDt1l+z4rF7WXl1CuO23cjOXTsYfkE2bZEobeEoreFmWsONTBwW4tvDHuTG1VuZc2420ch/c3/FLupbIoSjhvaIIRw1hCOGG/3ZDC318tNXdnP3zGEsf/sTVq6vIho1RA1EjCEatQcx+P03T+ZP6yr4sKyJBZcP5dbHi9lV1dIZbFoiWAJn5Aa48+JcfvRcCVeOT6e1PcJPXilFiHVgiL26HRbzpw+hviXME+9UsvT6kfzbn3aybV9zl7x2oJqd5ObnVw3njmd2MWlEiPxULz99ZQ9NbQf/T3fkn1uUycRLr+e8a38Y92/e1/UmQB0MdH0G+l7sq6RHyzO4l8sCICI3AjcC5Ob24e5uTg9+n5e2aPcdjMeXQLMzhM/nI+IOIZF2gv6ufeoP7hDa3EmYSAS/v5kGdxoJgTpCwe5fFwj6qHNn4AseQPwhGr0pJIcq4q0SRyCDel8qyaFqqj1DcIUsUpO6d0N0OCwqPfm4Qk58rjYqvENJSa3H8nbfwSckp1LuKyAlrYG6wFDaHGEyBx3c9q6hX21wBC3OdlLT97InYRShdAfZ7V0DZLuwqSkJfOwfQ3LmVqKpSZQF08jJjv/jEh00lD2JaQzOjrAjcCburL3kVu/tsj57cjgs1oWKCOd8DI1t/D35FFLy/oGzqRViASKAEaElfwgr0s4gOPR1VmePo7G5nUEF78S2xwKEqFhEEVblz6C+uY32/e/zs9wrqRn1Cv7EPRgsDBZREYxY1KZlc9vI/8Oe0x+nObeQzYVj8J36wCHbYomAZVF1+lfYVDCaIWcLHxdeQ1rTcEYlFmI5nYhlYTmcWJYDh9vNmXkp5F7yDdpbmsnJTyFt3r2YaASn24vD6UIsO0D1J6eTlJ5K4d2/JpSZg4lGqRt7KiIWYkksn4XD6SSQkg5A+JxxeBOCTPy3+xEROzjtEmB1dEN1jL43tsMVrIkv4ojtgEWk833H5Ji+ABHBkpNwWF/tkgaW1SWfZR9kOWI7dKfVcZbRPuPodIh9trHLe2eX9EPyWtJnrkrGGy7l8HnHOlzOZz3MTtf1ffZlPPLwMr35nnhp8YaB6Z7PHtrhjwCcTexnJU7+g0NAfNrhZY5Uxo6hJU7pYX6P8w5PP9IQFUcaXqY3y3/atCOVs8ORhkrpaZljKePh8+N8r2CHSklJSQy/7y0ARscmgPnz5/f8vcCaNWswxhCJRNi2bRttbW20t7fT1tbWOeXl5REOh5k7dy4A5513HkOHDiUavQFjDNFolGg02vlE4lNPPZW0NLvb8vnnn4+ZPLkzT8eUnJwMQGGhfXXY7/fHHaKrY3hAv99P6KsPwNSpDPr974k3bGDH96empuL68hMYY8g0/xV3u10uF8YYkqfdAddeS+DllzvLzPk3dVtnwiX34c3OBiAlJf6tJO70Qsg5jaShp8GoGXhac0ma4o2/TTfMx7V+Pb6KCpg2Df+SJSTu23ewF1S0HSJhfKeMgMkT8YeewnH+REw4TKLzuVhPqQhEY68miuPiIkykHX9gPUw/G2/wPRI/2m3n6TiCMQZ/sh+KxuJ1bcWdEoChaSTu/B87jzGHvLoL8yA/hcSN78KwM3BF95FYtftgvq6yxuBqqsLnbYbMHPyDtpPobjkk4AaDLy0F0rLxp1o40gZjjCExpaN8h67SkZyLiRr8SU5IGoI35CAxyX3YOsEf8kIgE2/Q4E70QSCRxMTabvkA3AmJ4A2RGPSDNxGXL0pi4LCLJoHYuMWeIC5fBF+7CzxB/H4/iZHu4YTPH+hMd3iDGCCxYx2H6Uj3+5vAE8Sb0EhioPuJBL/f05nu9nnBE+xxnUWj0rG8iRRmJ1M0egjrS/Yz+ZT4tyh995IRrC/Zzw8vCzLp1AyKa4SCzO7/p8fmhZg2JoOaNjc/uzqDqDFcWxQmEgt0I1FD2BgiEcMV47NJDbqZcVaEmRNzeOujGq4Ybz840ZjYAxSNPVzceafmsn5XHdcW+ckYNIiRg2tJDSXY/6U5uMwpOYkkJ6eQO6iK04ZlYICCjP20hqOxIejsujUGhmalkhxKjLu9/cFRx0EVkSuALxtjboh9vgYYb4y5tUueF4EFxpjVsc+vA/8ODDvasvHoOKhKKaWUUkopNTD9s+Og7gW6PPqNHKCsl3ncvVhWKaWUUkoppZSiN/3i1gLDRWSoiLiBK4HnD8vzPHCt2CYCdcaY8l4uq5RSSimllFJKHf0KqjEmLCLzgFewh4pZYozZLCI3x9J/BbyEPcRMMfYjTK4/0rKfy5YopZRSSimllOrXjnoP6omg96AqpZRSSiml1MB0pHtQ+8ajL5VSSimllFJKfeFpgKqUUkoppZRSqk/QAFUppZRSSimlVJ+gAapSSimllFJKqT5BA1SllFJKKaWUUn2CBqhKKaWUUkoppfoEDVCVUkoppZRSSvUJGqAqpZRSSimllOoTNEBVSimllFJKKdUniDHmRJehGxGpBD4+0eU4gjSg6kQXQn1utH4HLq3bgUvrdmDT+h24tG4HLq3bge2frd88Y8ygeAl9MkDt60TkXWPMWSe6HOrzofU7cGndDlxatwOb1u/ApXU7cGndDmyfZ/1qF1+llFJKKaWUUn2CBqhKKaWUUkoppfoEDVCPzX+e6AKoz5XW78CldTtwad0ObFq/A5fW7cCldTuwfW71q/egKqWUUkoppZTqE/QKqlJKKaWUUkqpPkED1F4QkXtEpFRE3o9N03vIN01EtolIsYjccbzLqT49EfmpiGwVkY0islJEknrIVyIim2L1/+7xLqfqvaO1Q7EtiqVvFJEzTkQ51acnIkNE5A0R2SIim0Xktjh5JotIXZf99d0noqzq0zvaflbbbv8lIiO7tMn3ReSAiNx+WB5tu/2EiCwRkQoR+aDLvBQReU1EPoq9JvewrB4r93E91O9xPV7WLr69ICL3AA3GmJ8dIY8D2A5MBfYCa4FZxpgPj0sh1TERkYuAvxpjwiLyAIAx5gdx8pUAZxljdDyvPqw37TB2gulWYDowAXjEGDPhBBRXfUoikgVkGWPWi0gQWAd89bD6nQx83xhzyQkqpjpGR9vPatsdGGL76VJggjHm4y7zJ6Ntt18QkUlAA7DcGDM6Nu8nQI0xZmEs8Ew+/HhKj5X7hx7q97geL+sV1M/OeKDYGLPTGNMGPAnMOMFlUkdhjHnVGBOOfXwbyDmR5VH/tN60wxnYO11jjHkbSIoFPqqPM8aUG2PWx97XA1uAwSe2VOo40rY7MFwI7OganKr+xRjzd6DmsNkzgN/F3v8O+GqcRfVYuR+IV7/H+3hZA9Temxe7rL2kh24Lg4E9XT7vRQ+c+ptvAn/uIc0Ar4rIOhG58TiWSX06vWmH2lYHABHJB8YCa+Ikny0iG0TkzyJyynEtmPpnHG0/q213YLgSeKKHNG27/VeGMaYc7JOJQHqcPNqGB4bP/XjZeawLDjQi8hcgM07SXcAvgXux/+j3Ag9iV84hq4izrPaf7gOOVLfGmOdiee4CwsAfeljNucaYMhFJB14Tka2xM0yqb+lNO9S22s+JSAB4BrjdGHPgsOT1QJ4xpiHWJfRZYPjxLqM6Jkfbz2rb7edExA1cCsyPk6xtd+DTNtzPHa/jZQ1QY4wxU3qTT0R+A6yKk7QXGNLlcw5Q9hkUTf2Tjla3InIdcAlwoenhpmxjTFnstUJEVmJ3U9EAte/pTTvUttqPiYgLOzj9gzFmxeHpXQNWY8xLIvKYiKTp/eN9Xy/2s9p2+7+vAOuNMfsOT9C22+/tE5EsY0x5rOt9RZw82ob7seN5vKxdfHvhsHtcLgM+iJNtLTBcRIbGzhBeCTx/PMqnjp2ITAN+AFxqjGnqIY8/9kAWRMQPXET8/wPqxOtNO3weuDb2RNCJQF1HtyTVt4mIAIuBLcaY/99DnsxYPkRkPPbvXPXxK6U6Fr3cz2rb7f9m0UP3Xm27/d7zwHWx99cBz8XJo8fK/dTxPl7WK6i98xMROR27G0IJcBOAiGQDvzXGTI891Woe8ArgAJYYYzafqAKrXvs54MHuhgDwtjHm5q51C2QAK2PpTuBxY8zLJ6rAqmc9tUMRuTmW/ivgJeyngBYDTcD1J6q86lM7F7gG2CQi78fm3QnkQmf9fg24RUTCQDNwZU9nelWfEnc/q2134BCRBOynt97UZV7X+tW220+IyBPAZCBNRPYCPwIWAk+JyFxgN3BFLK8eK/czPdTvfI7j8bIOM6OUUkoppZRSqk/QLr5KKaWUUkoppfoEDVCVUkoppZRSSvUJGqAqpZRSSimllOoTNEBVSimllFJKKdUnaICqlFJKKaWUUqpP0ABVKaWUUkoppVSfoAGqUkoppZRSSqk+QQNUpZRSSimllFJ9wv8CZ/KxDDfpT74AAAAASUVORK5CYII=\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "fitted_m = [stats.norm(mu, std) for mu, std in zip(mu.data, std.data)]\n", + "\n", + "plt.figure(figsize=(16, 6))\n", + "plt.vlines(x_i, 0, 0.01, color=np.array(['C0', 'C1'])[z])\n", + "plt.plot(x, fitted_m[0].pdf(x))\n", + "plt.plot(x, fitted_m[1].pdf(x))\n", + "plt.plot(x, generative_m[0].pdf(x), color='black', lw=1, ls='-.')\n", + "plt.plot(x, generative_m[1].pdf(x), color='black', lw=1, ls='-.')\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.7.3" + } + }, + "nbformat": 4, + "nbformat_minor": 4 +}