{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "**Chapter 18 – Reinforcement Learning**" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "_This notebook contains all the sample code and solutions to the exercises in chapter 18._" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "\n", " \n", " \n", "
\n", " \"Open\n", " \n", " \n", "
" ] }, { "cell_type": "markdown", "metadata": { "id": "dFXIv9qNpKzt", "tags": [] }, "source": [ "# Setup" ] }, { "cell_type": "markdown", "metadata": { "id": "8IPbJEmZpKzu" }, "source": [ "This project requires Python 3.7 or above:" ] }, { "cell_type": "code", "execution_count": 1, "metadata": { "id": "TFSU3FCOpKzu" }, "outputs": [], "source": [ "import sys\n", "\n", "assert sys.version_info >= (3, 7)" ] }, { "cell_type": "markdown", "metadata": { "id": "TAlKky09pKzv" }, "source": [ "It also requires Scikit-Learn ≥ 1.0.1:" ] }, { "cell_type": "code", "execution_count": 2, "metadata": { "id": "YqCwW7cMpKzw" }, "outputs": [], "source": [ "import sklearn\n", "\n", "assert sklearn.__version__ >= \"1.0.1\"" ] }, { "cell_type": "markdown", "metadata": { "id": "GJtVEqxfpKzw" }, "source": [ "And TensorFlow ≥ 2.8:" ] }, { "cell_type": "code", "execution_count": 3, "metadata": { "id": "0Piq5se2pKzx" }, "outputs": [], "source": [ "import tensorflow as tf\n", "\n", "assert tf.__version__ >= \"2.8.0\"" ] }, { "cell_type": "markdown", "metadata": { "id": "DDaDoLQTpKzx" }, "source": [ "As we did in earlier chapters, let's define the default font sizes to make the figures prettier. We will also display some Matplotlib animations, and there are several possible options to do that: we will use the Javascript option." ] }, { "cell_type": "code", "execution_count": 4, "metadata": { "id": "8d4TH3NbpKzx" }, "outputs": [], "source": [ "import matplotlib.animation\n", "import matplotlib.pyplot as plt\n", "\n", "plt.rc('font', size=14)\n", "plt.rc('axes', labelsize=14, titlesize=14)\n", "plt.rc('legend', fontsize=14)\n", "plt.rc('xtick', labelsize=10)\n", "plt.rc('ytick', labelsize=10)\n", "plt.rc('animation', html='jshtml')" ] }, { "cell_type": "markdown", "metadata": { "id": "RcoUIRsvpKzy" }, "source": [ "And let's create the `images/rl` folder (if it doesn't already exist), and define the `save_fig()` function which is used through this notebook to save the figures in high-res for the book:" ] }, { "cell_type": "code", "execution_count": 5, "metadata": { "id": "PQFH5Y9PpKzy" }, "outputs": [], "source": [ "from pathlib import Path\n", "\n", "IMAGES_PATH = Path() / \"images\" / \"rl\"\n", "IMAGES_PATH.mkdir(parents=True, exist_ok=True)\n", "\n", "def save_fig(fig_id, tight_layout=True, fig_extension=\"png\", resolution=300):\n", " path = IMAGES_PATH / f\"{fig_id}.{fig_extension}\"\n", " if tight_layout:\n", " plt.tight_layout()\n", " plt.savefig(path, format=fig_extension, dpi=resolution)" ] }, { "cell_type": "markdown", "metadata": { "id": "YTsawKlapKzy" }, "source": [ "This chapter can be very slow without a GPU, so let's make sure there's one, or else issue a warning:" ] }, { "cell_type": "code", "execution_count": 6, "metadata": { "id": "Ekxzo6pOpKzy" }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "No GPU was detected. Neural nets can be very slow without a GPU.\n" ] } ], "source": [ "if not tf.config.list_physical_devices('GPU'):\n", " print(\"No GPU was detected. Neural nets can be very slow without a GPU.\")\n", " if \"google.colab\" in sys.modules:\n", " print(\"Go to Runtime > Change runtime and select a GPU hardware \"\n", " \"accelerator.\")\n", " if \"kaggle_secrets\" in sys.modules:\n", " print(\"Go to Settings > Accelerator and select GPU.\")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Let's install the gym library, which provides many environments for Reinforcement Learning. Some of these environments require an X server to plot graphics, so we need to install xvfb on Colab or Kaggle (that's an in-memory X server, since the runtimes are not hooked to a screen). We also need to install pyvirtualdisplay, which provides a Python interface to xvfb. And let's also install the Box2D and Atari environments. By running the following cell, you also accept the Atari ROM license." ] }, { "cell_type": "code", "execution_count": 7, "metadata": {}, "outputs": [], "source": [ "if \"google.colab\" in sys.modules or \"kaggle_secrets\" in sys.modules:\n", " %pip install -q -U gym\n", " %pip install -q -U gym[box2d,atari,accept-rom-license]\n", " !apt update &> /dev/null && apt install -y xvfb &> /dev/null\n", " %pip install -q -U pyvirtualdisplay" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "**Warning**: some environments (including the Cart-Pole) require access to your display, which opens up a separate window. In general you can safely ignore that window. However, if Jupyter is running on a headless server (ie. without a screen) it will raise an exception. Examples of headless servers include Colab, Kaggle, or Docker containers. One way to avoid this is to install an X server like [Xvfb](http://en.wikipedia.org/wiki/Xvfb), which performs all graphical operations on a virtual display, in memory. You can then start Jupyter using the `xvfb-run` command:\n", "\n", "```bash\n", "$ xvfb-run -s \"-screen 0 1400x900x24\" jupyter lab\n", "```\n", "\n", "Alternatively, you can install the [pyvirtualdisplay](https://github.com/ponty/pyvirtualdisplay) Python library which wraps Xvfb, and lets you create a virtual display. Let's create a virtual display using `pyvirtualdisplay`, if it is installed:\n" ] }, { "cell_type": "code", "execution_count": 8, "metadata": {}, "outputs": [], "source": [ "try:\n", " import pyvirtualdisplay\n", "\n", " display = pyvirtualdisplay.Display(visible=0, size=(1400, 900)).start()\n", "except ImportError:\n", " pass" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# Introduction to OpenAI gym" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "In this notebook we will be using [OpenAI gym](https://gym.openai.com/), a great toolkit for developing and comparing Reinforcement Learning algorithms. It provides many environments for your learning *agents* to interact with. Let's import Gym and make a new environment:" ] }, { "cell_type": "code", "execution_count": 9, "metadata": {}, "outputs": [], "source": [ "import gym\n", "\n", "env = gym.make(\"CartPole-v1\")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The Cart-Pole (version 1) is a very simple environment composed of a cart that can move left or right, and pole placed vertically on top of it. The agent must move the cart left or right to keep the pole upright." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "**Tip**: you can use `gym.envs.registry.all()` to get the full list of available environments:" ] }, { "cell_type": "code", "execution_count": 10, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "['ALE/Tetris-v5',\n", " 'ALE/Tetris-ram-v5',\n", " 'ALE/Asterix-v5',\n", " 'ALE/Asterix-ram-v5',\n", " 'ALE/Asteroids-v5',\n", " '...']" ] }, "execution_count": 10, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# extra code – shows the first few environments\n", "envs = gym.envs.registry.all()\n", "[env.id for env in envs][:5] + [\"...\"]" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Let's initialize the environment by calling is `reset()` method. This returns an observation:" ] }, { "cell_type": "code", "execution_count": 11, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "array([ 0.0273956 , -0.00611216, 0.03585979, 0.0197368 ], dtype=float32)" ] }, "execution_count": 11, "metadata": {}, "output_type": "execute_result" } ], "source": [ "obs = env.reset(seed=42)\n", "obs" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Observations vary depending on the environment. In this case it is a 1D NumPy array composed of 4 floats: they represent the cart's horizontal position, its velocity, the angle of the pole (0 = vertical), and the angular velocity." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "An environment can be visualized by calling its `render()` method, and you can pick the rendering mode (the rendering options depend on the environment)." ] }, { "cell_type": "code", "execution_count": 12, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "(400, 600, 3)" ] }, "execution_count": 12, "metadata": {}, "output_type": "execute_result" } ], "source": [ "img = env.render(mode=\"rgb_array\")\n", "img.shape # height, width, channels (3 = Red, Green, Blue)" ] }, { "cell_type": "code", "execution_count": 13, "metadata": {}, "outputs": [ { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAASUAAADICAYAAACuyvefAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjUuMSwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/YYfK9AAAACXBIWXMAAAsTAAALEwEAmpwYAAAGVElEQVR4nO3dzY4bWRmA4a9sd/d0t8RkEpQwAoSQRggh2MEFIHqB2LDOPlJug1vgIlhklQ3bSFmEDdIo7IKIYBDTIWnCQJOQ/nFX1WGRQcLTaTdlV8WfM8+zPGVZZ1F6fapc9qlKKQGQxWjVEwD4X6IEpCJKQCqiBKQiSkAqogSkMrnkuOcFgCFUFx2wUgJSESUgFVECUhElIBVRAlIRJSAVUQJSESUgFVECUhElIBVRAlIRJSAVUQJSESUgFVECUhElIBVRAlIRJSAVUQJSESUgFVECUhElIBVRAlIRJSAVUQJSESUgFVECUhElIBVRAlIRJSAVUQJSESUgFVECUhElIBVRAlIRJSAVUQJSESUgFVECUhElIBVRAlIRJSAVUQJSESUgFVECUhElIBVRAlIRJSAVUQJSESUgFVECUhElIBVRAlIRJSAVUQJSESUgFVECUhElIBVRAlIRJSAVUQJSESUgFVECUhElIBVRAlIRJSAVUQJSESUgFVECUhElIBVRAlIRJSAVUQJSESUgFVECUhElIBVRAlIRJSCVyaonwLujmR5HW09nxkaTrRhvvreiGbGORIlelFLiyce/jr///jcz4ze+/+P4+o9+vqJZsY5EiZ6UaKbH0UyPZkbb+mxF82FduadEP0qJ0tSrngXvAFGiF6WUaFtRYnmiRE+slOiHKNEPl2/0RJTohcs3+iJK9KJtzmL68rPZwaqKra98dTUTYm2JEr0oTR318cuZsaoaxcbuByuaEetKlBhQFaOxR+HoRpQYVDXeWPUUWDOixHCqsFKiM1FiQFWMrJToSJQYVGWlREeixGCqykqJ7kSJXpS2ifKmA1X1tqfCmhMlelHaOuLNWYJORIletE2tSfRClOhFac5CleiDKNGL1j8E0BNRohelqaMUKyWWJ0r0oj49iijtzFg13ojKt290JEr04vgfT6K0zczYe+/fiNHm9opmxLoSJXpy/tJtNJ5YKdGZKDGYajSOCFGiG1FiMNV4ElXlFKMbZwyDqUZjPzOhM1FiMO4psQhRYjDVaBLh8o2OnDEsrZTyxgcnq5HTi+6cNfTioo0oXb7RlSjRg+K3b/RGlFheKVHas1XPgneEKNGLiy7foCtRYmmluHyjP6JEL6yU6IsosbRS2jg7eXlufLy1u4LZsO5EiaWVpo7Tw4MvjFaxc+2bK5kP602UGIYtu1mQKDGYykaULECUGMxoIkp0J0oMxJbdLEaUGEzlnhILECUGY6XEIkSJpZXSvnlvXP8QwAJEiaWVpo6wESU9ESWW9vonJqJEP0SJpbWtLbvpjyixNJdv9EmUWFpp64hoVz0N3hGixNLa5vzlW1VVUdkdlwV4uo25jo6Oommaua85fPpJtGfTmbHJ7tU4qSPql+f/0uS/qqqK3d1dmwswo7rkBqUbBV9yN2/ejAcPHsx9zc9++K249dPvzYz98em/4he/+m28Orn4z9+uXbsW9+/fjytXrvQxVdbLhZ9EVkrM9fz589jf35/7msOP3o/Tdjv+evpR1GUjvrb5SRwf/y3295/Eq5OLNxSYTqfRtu5FMUuUWNpJuxMPX/wk/ll/GBER+yffjTj9LJrWQpvuRImlHUy//XmQXq/IT9rd+PTfP4hWlFiAb98YRN200Xp2iQWIEku7sfnn+GDyLF5/L1Jia/QqvrH5u2jcL2IBcy/fDg8P39I0yKquL9866dOnf4k/fPzLeHLynajLRny49ac4OHh86UPebdvGixcvYjTy2fhlM+8b17lRunPnTt9zYc0cHHxxl5LzHj5+Fg8fP4uIe53e+/T0NO7evRs7OzsLzo51dfv27QuPeU6Jufb29uLevW6x+X9dv349Hj16FFevXh3k/UntwueUrJuBVEQJSEWUgFRECUhFlIBU/MyEuW7duhV7e3uDvPfOzk5sb28P8t6sL48EAKvgkQBgPYgSkIooAamIEpCKKAGpiBKQiigBqYgSkIooAamIEpCKKAGpiBKQiigBqYgSkIooAamIEpCKKAGpiBKQiigBqYgSkIooAamIEpCKKAGpiBKQiigBqYgSkIooAamIEpCKKAGpiBKQiigBqYgSkIooAamIEpCKKAGpiBKQiigBqYgSkMrkkuPVW5kFwOeslIBURAlIRZSAVEQJSEWUgFRECUjlPyRsVw4Q1yV5AAAAAElFTkSuQmCC\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "# extra code – creates a little function to render and plot an environment\n", "\n", "def plot_environment(env, figsize=(5, 4)):\n", " plt.figure(figsize=figsize)\n", " img = env.render(mode=\"rgb_array\")\n", " plt.imshow(img)\n", " plt.axis(\"off\")\n", " return img\n", "\n", "plot_environment(env)\n", "plt.show()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Let's see how to interact with an environment. Your agent will need to select an action from an \"action space\" (the set of possible actions). Let's see what this environment's action space looks like:" ] }, { "cell_type": "code", "execution_count": 14, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "Discrete(2)" ] }, "execution_count": 14, "metadata": {}, "output_type": "execute_result" } ], "source": [ "env.action_space" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Yep, just two possible actions: accelerate towards the left or towards the right." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Since the pole is leaning toward the right (`obs[2] > 0`), let's accelerate the cart toward the right:" ] }, { "cell_type": "code", "execution_count": 15, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "array([ 0.02727336, 0.18847767, 0.03625453, -0.26141977], dtype=float32)" ] }, "execution_count": 15, "metadata": {}, "output_type": "execute_result" } ], "source": [ "action = 1 # accelerate right\n", "obs, reward, done, info = env.step(action)\n", "obs" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Notice that the cart is now moving toward the right (`obs[1] > 0`). The pole is still tilted toward the right (`obs[2] > 0`), but its angular velocity is now negative (`obs[3] < 0`), so it will likely be tilted toward the left after the next step." ] }, { "cell_type": "code", "execution_count": 16, "metadata": {}, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "# extra code – displays the environment\n", "plot_environment(env)\n", "save_fig(\"cart_pole_plot\")\n", "plt.show()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Looks like it's doing what we're telling it to do!" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The environment also tells the agent how much reward it got during the last step:" ] }, { "cell_type": "code", "execution_count": 17, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "1.0" ] }, "execution_count": 17, "metadata": {}, "output_type": "execute_result" } ], "source": [ "reward" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "When the game is over, the environment returns `done=True`:" ] }, { "cell_type": "code", "execution_count": 18, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "False" ] }, "execution_count": 18, "metadata": {}, "output_type": "execute_result" } ], "source": [ "done" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Finally, `info` is an environment-specific dictionary that can provide some extra information that you may find useful for debugging or for training. For example, in some games it may indicate how many lives the agent has." ] }, { "cell_type": "code", "execution_count": 19, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "{}" ] }, "execution_count": 19, "metadata": {}, "output_type": "execute_result" } ], "source": [ "info" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The sequence of steps between the moment the environment is reset until it is done is called an \"episode\". At the end of an episode (i.e., when `step()` returns `done=True`), you should reset the environment before you continue to use it." ] }, { "cell_type": "code", "execution_count": 20, "metadata": {}, "outputs": [], "source": [ "if done:\n", " obs = env.reset()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Now how can we make the poll remain upright? We will need to define a _policy_ for that. This is the strategy that the agent will use to select an action at each step. It can use all the past actions and observations to decide what to do." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# A simple hard-coded policy" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Let's hard code a simple strategy: if the pole is tilting to the left, then push the cart to the left, and _vice versa_. Let's see if that works:" ] }, { "cell_type": "code", "execution_count": 21, "metadata": {}, "outputs": [], "source": [ "def basic_policy(obs):\n", " angle = obs[2]\n", " return 0 if angle < 0 else 1\n", "\n", "totals = []\n", "for episode in range(500):\n", " episode_rewards = 0\n", " obs = env.reset(seed=episode)\n", " for step in range(200):\n", " action = basic_policy(obs)\n", " obs, reward, done, info = env.step(action)\n", " episode_rewards += reward\n", " if done:\n", " break\n", "\n", " totals.append(episode_rewards)" ] }, { "cell_type": "code", "execution_count": 22, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "(41.698, 8.389445512070509, 24.0, 63.0)" ] }, "execution_count": 22, "metadata": {}, "output_type": "execute_result" } ], "source": [ "import numpy as np\n", "\n", "np.mean(totals), np.std(totals), min(totals), max(totals)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Well, as expected, this strategy is a bit too basic: the best it did was to keep the poll up for only 68 steps. This environment is considered solved when the agent keeps the poll up for 200 steps." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Let's visualize one episode. You can learn more about Matplotlib animations in the [Matplotlib tutorial notebook](tools_matplotlib.ipynb#Animations)." ] }, { "cell_type": "code", "execution_count": 23, "metadata": {}, "outputs": [], "source": [ "# extra code – this cell displays an animation of one episode\n", "\n", "def update_scene(num, frames, patch):\n", " patch.set_data(frames[num])\n", " return patch,\n", "\n", "def plot_animation(frames, repeat=False, interval=40):\n", " fig = plt.figure()\n", " patch = plt.imshow(frames[0])\n", " plt.axis('off')\n", " anim = matplotlib.animation.FuncAnimation(\n", " fig, update_scene, fargs=(frames, patch),\n", " frames=len(frames), repeat=repeat, interval=interval)\n", " plt.close()\n", " return anim\n", "\n", "def show_one_episode(policy, n_max_steps=200, seed=42):\n", " frames = []\n", " env = gym.make(\"CartPole-v1\")\n", " np.random.seed(seed)\n", " obs = env.reset(seed=seed)\n", " for step in range(n_max_steps):\n", " frames.append(env.render(mode=\"rgb_array\"))\n", " action = policy(obs)\n", " obs, reward, done, info = env.step(action)\n", " if done:\n", " break\n", " env.close()\n", " return plot_animation(frames)\n", "\n", "show_one_episode(basic_policy)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Clearly the system is unstable and after just a few wobbles, the pole ends up too tilted: game over. We will need to be smarter than that!" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# Neural Network Policies" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Let's create a neural network that will take observations as inputs, and output the probabilities of actions to take for each observation. To choose an action, the network will estimate a probability for each action, then we will select an action randomly according to the estimated probabilities. In the case of the Cart-Pole environment, there are just two possible actions (left or right), so we only need one output neuron: it will output the probability `p` of the action 0 (left), and of course the probability of action 1 (right) will be `1 - p`." ] }, { "cell_type": "code", "execution_count": 24, "metadata": {}, "outputs": [], "source": [ "import tensorflow as tf\n", "\n", "tf.random.set_seed(42) # extra code – ensures reproducibility on the CPU\n", "\n", "model = tf.keras.Sequential([\n", " tf.keras.layers.Dense(5, activation=\"relu\"),\n", " tf.keras.layers.Dense(1, activation=\"sigmoid\"),\n", "])" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "In this particular environment, the past actions and observations can safely be ignored, since each observation contains the environment's full state. If there were some hidden state then you may need to consider past actions and observations in order to try to infer the hidden state of the environment. For example, if the environment only revealed the position of the cart but not its velocity, you would have to consider not only the current observation but also the previous observation in order to estimate the current velocity. Another example is if the observations are noisy: you may want to use the past few observations to estimate the most likely current state. Our problem is thus as simple as can be: the current observation is noise-free and contains the environment's full state." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "You may wonder why we plan to pick a random action based on the probability given by the policy network, rather than just picking the action with the highest probability. This approach lets the agent find the right balance between _exploring_ new actions and _exploiting_ the actions that are known to work well. Here's an analogy: suppose you go to a restaurant for the first time, and all the dishes look equally appealing so you randomly pick one. If it turns out to be good, you can increase the probability to order it next time, but you shouldn't increase that probability to 100%, or else you will never try out the other dishes, some of which may be even better than the one you tried." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Let's write a small policy function that will use the neural net to get the probability of moving left, then let's use it to run one episode:" ] }, { "cell_type": "code", "execution_count": 25, "metadata": {}, "outputs": [], "source": [ "# extra code – a function that creates an animation for a given policy model\n", "\n", "def pg_policy(obs):\n", " left_proba = model.predict(obs[np.newaxis])\n", " return int(np.random.rand() > left_proba)\n", "\n", "np.random.seed(42)\n", "show_one_episode(pg_policy)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Yeah... pretty bad. The neural network will have to learn to do better. First let's see if it is capable of learning the basic policy we used earlier: go left if the pole is tilting left, and go right if it is tilting right." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Let's see if it can learn a better policy on its own. One that does not wobble as much." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# Policy Gradients" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "To train this neural network we will need to define the target probabilities `y`. If an action is good we should increase its probability, and conversely if it is bad we should reduce it. But how do we know whether an action is good or bad? The problem is that most actions have delayed effects, so when you win or lose points in an episode, it is not clear which actions contributed to this result: was it just the last action? Or the last 10? Or just one action 50 steps earlier? This is called the _credit assignment problem_.\n", "\n", "The _Policy Gradients_ algorithm tackles this problem by first playing multiple episodes, then making the actions near positive rewards slightly more likely, while actions near negative rewards are made slightly less likely. First we play, then we go back and think about what we did." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Let's start by creating a function to play a single step using the model. We will also pretend for now that whatever action it takes is the right one, so we can compute the loss and its gradients. We will just save these gradients for now, and modify them later depending on how good or bad the action turned out to be." ] }, { "cell_type": "code", "execution_count": 26, "metadata": {}, "outputs": [], "source": [ "def play_one_step(env, obs, model, loss_fn):\n", " with tf.GradientTape() as tape:\n", " left_proba = model(obs[np.newaxis])\n", " action = (tf.random.uniform([1, 1]) > left_proba)\n", " y_target = tf.constant([[1.]]) - tf.cast(action, tf.float32)\n", " loss = tf.reduce_mean(loss_fn(y_target, left_proba))\n", "\n", " grads = tape.gradient(loss, model.trainable_variables)\n", " obs, reward, done, info = env.step(int(action))\n", " return obs, reward, done, grads" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "If `left_proba` is high, then `action` will most likely be `False` (since a random number uniformally sampled between 0 and 1 will probably not be greater than `left_proba`). And `False` means 0 when you cast it to a number, so `y_target` would be equal to 1 - 0 = 1. In other words, we set the target to 1, meaning we pretend that the probability of going left should have been 100% (so we took the right action)." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Now let's create another function that will rely on the `play_one_step()` function to play multiple episodes, returning all the rewards and gradients, for each episode and each step:" ] }, { "cell_type": "code", "execution_count": 27, "metadata": {}, "outputs": [], "source": [ "def play_multiple_episodes(env, n_episodes, n_max_steps, model, loss_fn):\n", " all_rewards = []\n", " all_grads = []\n", " for episode in range(n_episodes):\n", " current_rewards = []\n", " current_grads = []\n", " obs = env.reset()\n", " for step in range(n_max_steps):\n", " obs, reward, done, grads = play_one_step(env, obs, model, loss_fn)\n", " current_rewards.append(reward)\n", " current_grads.append(grads)\n", " if done:\n", " break\n", "\n", " all_rewards.append(current_rewards)\n", " all_grads.append(current_grads)\n", "\n", " return all_rewards, all_grads" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The Policy Gradients algorithm uses the model to play the episode several times (e.g., 10 times), then it goes back and looks at all the rewards, discounts them and normalizes them. So let's create couple functions for that: the first will compute discounted rewards; the second will normalize the discounted rewards across many episodes." ] }, { "cell_type": "code", "execution_count": 28, "metadata": {}, "outputs": [], "source": [ "def discount_rewards(rewards, discount_factor):\n", " discounted = np.array(rewards)\n", " for step in range(len(rewards) - 2, -1, -1):\n", " discounted[step] += discounted[step + 1] * discount_factor\n", " return discounted\n", "\n", "def discount_and_normalize_rewards(all_rewards, discount_factor):\n", " all_discounted_rewards = [discount_rewards(rewards, discount_factor)\n", " for rewards in all_rewards]\n", " flat_rewards = np.concatenate(all_discounted_rewards)\n", " reward_mean = flat_rewards.mean()\n", " reward_std = flat_rewards.std()\n", " return [(discounted_rewards - reward_mean) / reward_std\n", " for discounted_rewards in all_discounted_rewards]" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Say there were 3 actions, and after each action there was a reward: first 10, then 0, then -50. If we use a discount factor of 80%, then the 3rd action will get -50 (full credit for the last reward), but the 2nd action will only get -40 (80% credit for the last reward), and the 1st action will get 80% of -40 (-32) plus full credit for the first reward (+10), which leads to a discounted reward of -22:" ] }, { "cell_type": "code", "execution_count": 29, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "array([-22, -40, -50])" ] }, "execution_count": 29, "metadata": {}, "output_type": "execute_result" } ], "source": [ "discount_rewards([10, 0, -50], discount_factor=0.8)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "To normalize all discounted rewards across all episodes, we compute the mean and standard deviation of all the discounted rewards, and we subtract the mean from each discounted reward, and divide by the standard deviation:" ] }, { "cell_type": "code", "execution_count": 30, "metadata": { "scrolled": true }, "outputs": [ { "data": { "text/plain": [ "[array([-0.28435071, -0.86597718, -1.18910299]),\n", " array([1.26665318, 1.0727777 ])]" ] }, "execution_count": 30, "metadata": {}, "output_type": "execute_result" } ], "source": [ "discount_and_normalize_rewards([[10, 0, -50], [10, 20]],\n", " discount_factor=0.8)" ] }, { "cell_type": "code", "execution_count": 31, "metadata": {}, "outputs": [], "source": [ "n_iterations = 150\n", "n_episodes_per_update = 10\n", "n_max_steps = 200\n", "discount_factor = 0.95" ] }, { "cell_type": "code", "execution_count": 32, "metadata": {}, "outputs": [], "source": [ "# extra code – let's create the neural net and reset the environment, for\n", "# reproducibility\n", "\n", "tf.random.set_seed(42)\n", "\n", "model = tf.keras.Sequential([\n", " tf.keras.layers.Dense(5, activation=\"relu\"),\n", " tf.keras.layers.Dense(1, activation=\"sigmoid\"),\n", "])\n", "\n", "obs = env.reset(seed=42)" ] }, { "cell_type": "code", "execution_count": 33, "metadata": {}, "outputs": [], "source": [ "optimizer = tf.keras.optimizers.Nadam(learning_rate=0.01)\n", "loss_fn = tf.keras.losses.binary_crossentropy" ] }, { "cell_type": "code", "execution_count": 34, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Iteration: 150/150, mean rewards: 193.1" ] } ], "source": [ "for iteration in range(n_iterations):\n", " all_rewards, all_grads = play_multiple_episodes(\n", " env, n_episodes_per_update, n_max_steps, model, loss_fn)\n", "\n", " # extra code – displays some debug info during training\n", " total_rewards = sum(map(sum, all_rewards))\n", " print(f\"\\rIteration: {iteration + 1}/{n_iterations},\"\n", " f\" mean rewards: {total_rewards / n_episodes_per_update:.1f}\", end=\"\")\n", "\n", " all_final_rewards = discount_and_normalize_rewards(all_rewards,\n", " discount_factor)\n", " all_mean_grads = []\n", " for var_index in range(len(model.trainable_variables)):\n", " mean_grads = tf.reduce_mean(\n", " [final_reward * all_grads[episode_index][step][var_index]\n", " for episode_index, final_rewards in enumerate(all_final_rewards)\n", " for step, final_reward in enumerate(final_rewards)], axis=0)\n", " all_mean_grads.append(mean_grads)\n", "\n", " optimizer.apply_gradients(zip(all_mean_grads, model.trainable_variables))" ] }, { "cell_type": "code", "execution_count": 35, "metadata": {}, "outputs": [], "source": [ "# extra code – displays the animation\n", "np.random.seed(42)\n", "show_one_episode(pg_policy)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# Extra Material – Markov Chains" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The following transition probabilities correspond to the Markov Chain represented in Figure 18–7. Let's run this stochastic process a few times to see what it looks like:" ] }, { "cell_type": "code", "execution_count": 36, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Run #1: 0 0 3 \n", "Run #2: 0 1 2 1 2 1 2 1 2 1 3 \n", "Run #3: 0 1 2 1 2 1 2 1 2 1 2 1 2 1 2 1 2 1 2 1 2 1 3 \n", "Run #4: 0 3 \n", "Run #5: 0 1 2 1 2 1 2 1 2 1 2 1 2 1 2 1 3 \n", "Run #6: 0 1 3 \n", "Run #7: 0 1 2 1 2 1 2 1 2 1 2 1 2 1 2 1 2 1 2 1 2 1 2 1 2 1 2 1 2 1 2 1 2 1 2 1 2 1 2 1 2 1 2 1 2 1 2 1 2 1 2 1 3 \n", "Run #8: 0 0 0 1 2 1 2 1 3 \n", "Run #9: 0 1 2 1 2 1 2 1 2 1 2 1 2 1 2 1 2 1 2 1 2 1 3 \n", "Run #10: 0 0 0 1 2 1 3 \n" ] } ], "source": [ "np.random.seed(42)\n", "\n", "transition_probabilities = [ # shape=[s, s']\n", " [0.7, 0.2, 0.0, 0.1], # from s0 to s0, s1, s2, s3\n", " [0.0, 0.0, 0.9, 0.1], # from s1 to s0, s1, s2, s3\n", " [0.0, 1.0, 0.0, 0.0], # from s2 to s0, s1, s2, s3\n", " [0.0, 0.0, 0.0, 1.0]] # from s3 to s0, s1, s2, s3\n", "\n", "n_max_steps = 1000 # to avoid blocking in case of an infinite loop\n", "terminal_states = [3]\n", "\n", "def run_chain(start_state):\n", " current_state = start_state\n", " for step in range(n_max_steps):\n", " print(current_state, end=\" \")\n", " if current_state in terminal_states:\n", " break\n", " current_state = np.random.choice(\n", " range(len(transition_probabilities)),\n", " p=transition_probabilities[current_state]\n", " )\n", " else:\n", " print(\"...\", end=\"\")\n", "\n", " print()\n", "\n", "for idx in range(10):\n", " print(f\"Run #{idx + 1}: \", end=\"\")\n", " run_chain(start_state=0)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# Markov Decision Process" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Let's define some transition probabilities, rewards and possible actions. For example, in state s0, if action a0 is chosen then with proba 0.7 we will go to state s0 with reward +10, with probability 0.3 we will go to state s1 with no reward, and with never go to state s2 (so the transition probabilities are `[0.7, 0.3, 0.0]`, and the rewards are `[+10, 0, 0]`):" ] }, { "cell_type": "code", "execution_count": 37, "metadata": {}, "outputs": [], "source": [ "transition_probabilities = [ # shape=[s, a, s']\n", " [[0.7, 0.3, 0.0], [1.0, 0.0, 0.0], [0.8, 0.2, 0.0]],\n", " [[0.0, 1.0, 0.0], None, [0.0, 0.0, 1.0]],\n", " [None, [0.8, 0.1, 0.1], None]\n", "]\n", "rewards = [ # shape=[s, a, s']\n", " [[+10, 0, 0], [0, 0, 0], [0, 0, 0]],\n", " [[0, 0, 0], [0, 0, 0], [0, 0, -50]],\n", " [[0, 0, 0], [+40, 0, 0], [0, 0, 0]]\n", "]\n", "possible_actions = [[0, 1, 2], [0, 2], [1]]" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# Q-Value Iteration" ] }, { "cell_type": "code", "execution_count": 38, "metadata": {}, "outputs": [], "source": [ "Q_values = np.full((3, 3), -np.inf) # -np.inf for impossible actions\n", "for state, actions in enumerate(possible_actions):\n", " Q_values[state, actions] = 0.0 # for all possible actions" ] }, { "cell_type": "code", "execution_count": 39, "metadata": {}, "outputs": [], "source": [ "gamma = 0.90 # the discount factor\n", "\n", "history1 = [] # extra code – needed for the figure below\n", "for iteration in range(50):\n", " Q_prev = Q_values.copy()\n", " history1.append(Q_prev) # extra code\n", " for s in range(3):\n", " for a in possible_actions[s]:\n", " Q_values[s, a] = np.sum([\n", " transition_probabilities[s][a][sp]\n", " * (rewards[s][a][sp] + gamma * Q_prev[sp].max())\n", " for sp in range(3)])\n", "\n", "history1 = np.array(history1) # extra code" ] }, { "cell_type": "code", "execution_count": 40, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "array([[18.91891892, 17.02702702, 13.62162162],\n", " [ 0. , -inf, -4.87971488],\n", " [ -inf, 50.13365013, -inf]])" ] }, "execution_count": 40, "metadata": {}, "output_type": "execute_result" } ], "source": [ "Q_values" ] }, { "cell_type": "code", "execution_count": 41, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "array([0, 0, 1])" ] }, "execution_count": 41, "metadata": {}, "output_type": "execute_result" } ], "source": [ "Q_values.argmax(axis=1) # optimal action for each state" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The optimal policy for this MDP, when using a discount factor of 0.90, is to choose action a0 when in state s0, and choose action a0 when in state s1, and finally choose action a1 (the only possible action) when in state s2. If you try again with a discount factor of 0.95 instead of 0.90, you will find that the optimal action for state s1 becomes a2. This is because the discount factor is larger so the agent values the future more, and it is therefore ready to pay an immediate penalty in order to get more future rewards." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# Q-Learning" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Q-Learning works by watching an agent play (e.g., randomly) and gradually improving its estimates of the Q-Values. Once it has accurate Q-Value estimates (or close enough), then the optimal policy consists in choosing the action that has the highest Q-Value (i.e., the greedy policy)." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "We will need to simulate an agent moving around in the environment, so let's define a function to perform some action and get the new state and a reward:" ] }, { "cell_type": "code", "execution_count": 42, "metadata": {}, "outputs": [], "source": [ "def step(state, action):\n", " probas = transition_probabilities[state][action]\n", " next_state = np.random.choice([0, 1, 2], p=probas)\n", " reward = rewards[state][action][next_state]\n", " return next_state, reward" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "We also need an exploration policy, which can be any policy, as long as it visits every possible state many times. We will just use a random policy, since the state space is very small:" ] }, { "cell_type": "code", "execution_count": 43, "metadata": {}, "outputs": [], "source": [ "def exploration_policy(state):\n", " return np.random.choice(possible_actions[state])" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Now let's initialize the Q-Values like earlier, and run the Q-Learning algorithm:" ] }, { "cell_type": "code", "execution_count": 44, "metadata": {}, "outputs": [], "source": [ "# extra code – initializes the Q-Values, just like earlier\n", "np.random.seed(42)\n", "Q_values = np.full((3, 3), -np.inf)\n", "for state, actions in enumerate(possible_actions):\n", " Q_values[state][actions] = 0" ] }, { "cell_type": "code", "execution_count": 45, "metadata": {}, "outputs": [], "source": [ "alpha0 = 0.05 # initial learning rate\n", "decay = 0.005 # learning rate decay\n", "gamma = 0.90 # discount factor\n", "state = 0 # initial state\n", "history2 = [] # extra code – needed for the figure below\n", "\n", "for iteration in range(10_000):\n", " history2.append(Q_values.copy()) # extra code\n", " action = exploration_policy(state)\n", " next_state, reward = step(state, action)\n", " next_value = Q_values[next_state].max() # greedy policy at the next step\n", " alpha = alpha0 / (1 + iteration * decay)\n", " Q_values[state, action] *= 1 - alpha\n", " Q_values[state, action] += alpha * (reward + gamma * next_value)\n", " state = next_state\n", "\n", "history2 = np.array(history2) # extra code" ] }, { "cell_type": "code", "execution_count": 46, "metadata": {}, "outputs": [ { "data": { "image/png": "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sb+29155eSvWretJWVlnPvroeioqamaGzZqtpXv35zjvvJ258MKdq7z3ysvbsm5dV8rKtua6607hsMMG1vn5fPvtt9O/f3/Gjh3Lz362gYUL06f9q6CunqcDBlxD27af0bnzn5kwoRU9ey5nwYIa84DVS7Nma+nQ4UM6d/6EWbNOqLKvpGQmq1dX9msxy3+DUL9+fNPY0a/fH+jWbTyLFh3Oxo2HcfTRfRk6FH7/+z9i9gZvvPF43upItQAXMHcoK+vCmjW9WLt2O9as6cWaNb246KL+/Pzn8PXXhwI1K5DKeeJ7RY+q1qdN9mO2nmbNNmC28ZvldtttTcuWzVi5chlffbUMs3LMyoEKzCrYbbdBNG8On302h6VLPwccswrAad68GcOHD8MMpk37mCVLFqdKg5nTunUrRowYgRm89957LF26BKj8ayspaceIESMAmDTpTb78clkUcxmtWrViyy07MHz4cABeffVVvvpqZZWydenSmb33HgpAaelEVq9eXWV/t25bs+eeIRl44YXxrFtX+S3AzNlmm57sFn2Ffu655ygv31jl/F69erHrrt8B4Omnx9b4t91hhx0YOHAXNm7cyPPPP1djf79+/ejXrz/r1q3jhRfG19i/884D2XHHHVm1ahXjxo2jdeuqt1x/+9u7sv3227NixQpeffWVGucPHjyYnj23ZdmypTU+OAH23HNPunXrzuefL+att96qsX/o0KF06bIVCxbM57333quxf/jw79KxY0c+/fRTPvzwgxr7R44cRfv27Zk1axZTp9bskLn//gfQpk0bZsyYXuODuaxsPUcccQQtWrTg448/Yvbs2TXOP/zw7wPwwQfv89lnn1XZ17x5Cw455BAA3n33XRYurPq7ZuvWbTjggAMAmDRpEkuWfF5lf0lJCaNG7QvA66+/VuODv0OHDnz3u+G9+corL7NyZfX3XheGDh0GwMSJL9Z477Vs2XRm2Woq1qxpziuvTKixvZnubpE0zZuvp6RkDiUlcxg3bgLDhu3Phx++zznnXEfr1ourtJQOG3ZtLeevpaTkM0pKPqNnz9EZv27fvjfRt2/V5ucHHniAli234/77n+eaa7blq6++BcC0aZdVOW5zye/gwTNZuXIcHTpMYcGCH7JkyQF1HltR0Zbly4ewfHnlF+E+febQvft5tGq14ptt6V++Lrjg17z55jss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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "# extra code – this cell generates and saves Figure 18–9\n", "\n", "true_Q_value = history1[-1, 0, 0]\n", "\n", "fig, axes = plt.subplots(1, 2, figsize=(10, 4), sharey=True)\n", "axes[0].set_ylabel(\"Q-Value$(s_0, a_0)$\", fontsize=14)\n", "axes[0].set_title(\"Q-Value Iteration\", fontsize=14)\n", "axes[1].set_title(\"Q-Learning\", fontsize=14)\n", "for ax, width, history in zip(axes, (50, 10000), (history1, history2)):\n", " ax.plot([0, width], [true_Q_value, true_Q_value], \"k--\")\n", " ax.plot(np.arange(width), history[:, 0, 0], \"b-\", linewidth=2)\n", " ax.set_xlabel(\"Iterations\", fontsize=14)\n", " ax.axis([0, width, 0, 24])\n", " ax.grid(True)\n", "\n", "save_fig(\"q_value_plot\")\n", "plt.show()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# Deep Q-Network" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Let's build the DQN. Given a state, it will estimate, for each possible action, the sum of discounted future rewards it can expect after it plays that action (but before it sees its outcome):" ] }, { "cell_type": "code", "execution_count": 47, "metadata": {}, "outputs": [], "source": [ "tf.random.set_seed(42) # extra code – ensures reproducibility on the CPU\n", "\n", "input_shape = [4] # == env.observation_space.shape\n", "n_outputs = 2 # == env.action_space.n\n", "\n", "model = tf.keras.Sequential([\n", " tf.keras.layers.Dense(32, activation=\"elu\", input_shape=input_shape),\n", " tf.keras.layers.Dense(32, activation=\"elu\"),\n", " tf.keras.layers.Dense(n_outputs)\n", "])" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "To select an action using this DQN, we just pick the action with the largest predicted Q-value. However, to ensure that the agent explores the environment, we choose a random action with probability `epsilon`." ] }, { "cell_type": "code", "execution_count": 48, "metadata": {}, "outputs": [], "source": [ "def epsilon_greedy_policy(state, epsilon=0):\n", " if np.random.rand() < epsilon:\n", " return np.random.randint(n_outputs) # random action\n", " else:\n", " Q_values = model.predict(state[np.newaxis])[0]\n", " return Q_values.argmax() # optimal action according to the DQN" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "We will also need a replay buffer. It will contain the agent's experiences, in the form of tuples: `(obs, action, reward, next_obs, done)`. We can use the `deque` class for that:" ] }, { "cell_type": "code", "execution_count": 49, "metadata": {}, "outputs": [], "source": [ "from collections import deque\n", "\n", "replay_buffer = deque(maxlen=2000)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "**Note**: for very large replay buffers, you may want to use a circular buffer instead, as random access time will be O(1) instead of O(N). Or you can check out DeepMind's [Reverb library](https://github.com/deepmind/reverb)." ] }, { "cell_type": "code", "execution_count": 50, "metadata": {}, "outputs": [], "source": [ "# extra code – A basic circular buffer implementation\n", "\n", "class ReplayBuffer:\n", " def __init__(self, max_size):\n", " self.buffer = np.empty(max_size, dtype=np.object)\n", " self.max_size = max_size\n", " self.index = 0\n", " self.size = 0\n", "\n", " def append(self, obj):\n", " self.buffer[self.index] = obj\n", " self.size = min(self.size + 1, self.max_size)\n", " self.index = (self.index + 1) % self.max_size\n", "\n", " def sample(self, batch_size):\n", " indices = np.random.randint(self.size, size=batch_size)\n", " return self.buffer[indices]" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "And let's create a function to sample experiences from the replay buffer. It will return 5 NumPy arrays: `[obs, actions, rewards, next_obs, dones]`." ] }, { "cell_type": "code", "execution_count": 51, "metadata": {}, "outputs": [], "source": [ "def sample_experiences(batch_size):\n", " indices = np.random.randint(len(replay_buffer), size=batch_size)\n", " batch = [replay_buffer[index] for index in indices]\n", " states, actions, rewards, next_states, dones = [\n", " np.array([experience[field_index] for experience in batch])\n", " for field_index in range(5)\n", " ]\n", " return states, actions, rewards, next_states, dones" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Now we can create a function that will use the DQN to play one step, and record its experience in the replay buffer:" ] }, { "cell_type": "code", "execution_count": 52, "metadata": {}, "outputs": [], "source": [ "def play_one_step(env, state, epsilon):\n", " action = epsilon_greedy_policy(state, epsilon)\n", " next_state, reward, done, info = env.step(action)\n", " replay_buffer.append((state, action, reward, next_state, done))\n", " return next_state, reward, done, info" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Lastly, let's create a function that will sample some experiences from the replay buffer and perform a training step:" ] }, { "cell_type": "code", "execution_count": 53, "metadata": {}, "outputs": [], "source": [ "# extra code – for reproducibility, and to generate the next figure\n", "env.reset(seed=42)\n", "np.random.seed(42)\n", "tf.random.set_seed(42)\n", "rewards = [] \n", "best_score = 0" ] }, { "cell_type": "code", "execution_count": 54, "metadata": {}, "outputs": [], "source": [ "batch_size = 32\n", "discount_factor = 0.95\n", "optimizer = tf.keras.optimizers.Nadam(learning_rate=1e-2)\n", "loss_fn = tf.keras.losses.mean_squared_error\n", "\n", "def training_step(batch_size):\n", " experiences = sample_experiences(batch_size)\n", " states, actions, rewards, next_states, dones = experiences\n", " next_Q_values = model.predict(next_states)\n", " max_next_Q_values = next_Q_values.max(axis=1)\n", " target_Q_values = (rewards +\n", " (1 - dones) * discount_factor * max_next_Q_values)\n", " target_Q_values = target_Q_values.reshape(-1, 1)\n", " mask = tf.one_hot(actions, n_outputs)\n", " with tf.GradientTape() as tape:\n", " all_Q_values = model(states)\n", " Q_values = tf.reduce_sum(all_Q_values * mask, axis=1, keepdims=True)\n", " loss = tf.reduce_mean(loss_fn(target_Q_values, Q_values))\n", "\n", " grads = tape.gradient(loss, model.trainable_variables)\n", " optimizer.apply_gradients(zip(grads, model.trainable_variables))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "And now, let's train the model!" ] }, { "cell_type": "code", "execution_count": 55, "metadata": { "scrolled": true }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Episode: 600, Steps: 200, eps: 0.010" ] } ], "source": [ "for episode in range(600):\n", " obs = env.reset() \n", " for step in range(200):\n", " epsilon = max(1 - episode / 500, 0.01)\n", " obs, reward, done, info = play_one_step(env, obs, epsilon)\n", " if done:\n", " break\n", "\n", " # extra code – displays debug info, stores data for the next figure, and\n", " # keeps track of the best model weights so far\n", " print(f\"\\rEpisode: {episode + 1}, Steps: {step + 1}, eps: {epsilon:.3f}\",\n", " end=\"\")\n", " rewards.append(step)\n", " if step >= best_score:\n", " best_weights = model.get_weights()\n", " best_score = step\n", "\n", " if episode > 50:\n", " training_step(batch_size)\n", "\n", "model.set_weights(best_weights) # extra code – restores the best model weights" ] }, { "cell_type": "code", "execution_count": 56, "metadata": {}, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "# extra code – this cell generates and saves Figure 18–10\n", "plt.figure(figsize=(8, 4))\n", "plt.plot(rewards)\n", "plt.xlabel(\"Episode\", fontsize=14)\n", "plt.ylabel(\"Sum of rewards\", fontsize=14)\n", "plt.grid(True)\n", "save_fig(\"dqn_rewards_plot\")\n", "plt.show()" ] }, { "cell_type": "code", "execution_count": 57, "metadata": {}, "outputs": [], "source": [ "# extra code – shows an animation of the trained DQN playing one episode\n", "show_one_episode(epsilon_greedy_policy)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Not bad at all! 😀" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Fixed Q-Value Targets" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Let's create the online DQN:" ] }, { "cell_type": "code", "execution_count": 58, "metadata": {}, "outputs": [], "source": [ "# extra code – creates the same DQN model as earlier\n", "\n", "tf.random.set_seed(42)\n", "\n", "model = tf.keras.Sequential([\n", " tf.keras.layers.Dense(32, activation=\"elu\", input_shape=input_shape),\n", " tf.keras.layers.Dense(32, activation=\"elu\"),\n", " tf.keras.layers.Dense(n_outputs)\n", "])" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Now create the target DQN: it's just a clone of the online DQN:" ] }, { "cell_type": "code", "execution_count": 59, "metadata": {}, "outputs": [], "source": [ "target = tf.keras.models.clone_model(model) # clone the model's architecture\n", "target.set_weights(model.get_weights()) # copy the weights" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Next, we use the same code as above except for the line marked with `# <= CHANGED`:" ] }, { "cell_type": "code", "execution_count": 60, "metadata": {}, "outputs": [], "source": [ "env.reset(seed=42)\n", "np.random.seed(42)\n", "tf.random.set_seed(42)\n", "rewards = [] \n", "best_score = 0\n", "\n", "batch_size = 32\n", "discount_factor = 0.95\n", "optimizer = tf.keras.optimizers.Nadam(learning_rate=1e-2)\n", "loss_fn = tf.keras.losses.mean_squared_error\n", "\n", "replay_buffer = deque(maxlen=2000) # resets the replay buffer\n", "\n", "def training_step(batch_size):\n", " experiences = sample_experiences(batch_size)\n", " states, actions, rewards, next_states, dones = experiences\n", " next_Q_values = target.predict(next_states) # <= CHANGED\n", " max_next_Q_values = next_Q_values.max(axis=1)\n", " target_Q_values = (rewards +\n", " (1 - dones) * discount_factor * max_next_Q_values)\n", " target_Q_values = target_Q_values.reshape(-1, 1)\n", " mask = tf.one_hot(actions, n_outputs)\n", " with tf.GradientTape() as tape:\n", " all_Q_values = model(states)\n", " Q_values = tf.reduce_sum(all_Q_values * mask, axis=1, keepdims=True)\n", " loss = tf.reduce_mean(loss_fn(target_Q_values, Q_values))\n", "\n", " grads = tape.gradient(loss, model.trainable_variables)\n", " optimizer.apply_gradients(zip(grads, model.trainable_variables))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Again, this is the same code as earlier, except for the lines marked with `# <= CHANGED`:" ] }, { "cell_type": "code", "execution_count": 61, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Episode: 600, Steps: 200, eps: 0.010" ] } ], "source": [ "for episode in range(600):\n", " obs = env.reset() \n", " for step in range(200):\n", " epsilon = max(1 - episode / 500, 0.01)\n", " obs, reward, done, info = play_one_step(env, obs, epsilon)\n", " if done:\n", " break\n", "\n", " # extra code – displays debug info, stores data for the next figure, and\n", " # keeps track of the best model weights so far\n", " print(f\"\\rEpisode: {episode + 1}, Steps: {step + 1}, eps: {epsilon:.3f}\",\n", " end=\"\")\n", " rewards.append(step)\n", " if step >= best_score:\n", " best_weights = model.get_weights()\n", " best_score = step\n", "\n", " if episode > 50:\n", " training_step(batch_size)\n", " if episode % 50 == 0: # <= CHANGED\n", " target.set_weights(model.get_weights()) # <= CHANGED\n", "\n", " # Alternatively, you can do soft updates at each step:\n", " #if episode > 50:\n", " #training_step(batch_size)\n", " #target_weights = target.get_weights()\n", " #online_weights = model.get_weights()\n", " #for index, online_weight in enumerate(online_weights):\n", " # target_weights[index] = (0.99 * target_weights[index]\n", " # + 0.01 * online_weight)\n", " #target.set_weights(target_weights)\n", "\n", "model.set_weights(best_weights) # extra code – restores the best model weights" ] }, { "cell_type": "code", "execution_count": 62, "metadata": {}, "outputs": [ { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAfgAAAEKCAYAAAD+ckdtAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjUuMSwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/YYfK9AAAACXBIWXMAAAsTAAALEwEAmpwYAACShUlEQVR4nO19d5wcR5n2887MBu0qp1VOlixZlmTZlqNkeeQANtxh4MgcmTMcmHDAgQkfRzg4ouG44+AMJh7YBAM2tnH2OEi2ZOWcs7S7WoXd1eYJ9f3RXd1V1dU9PWlndrce/VbTXV1dXV3dXW+9mRhjMDAwMDAwMBhciJS7AwYGBgYGBgbFhyHwBgYGBgYGgxCGwBsYGBgYGAxCGAJvYGBgYGAwCGEIvIGBgYGBwSBErNwdKCbGjx/PZs2aVdQ2Ozs7UV9fX9Q2ByrMWMgw4yHDjIcMMx4uzFjIKPZ4bNiw4TRjbIJaPqgI/KxZs7B+/fqitplIJBCPx4va5kCFGQsZZjxkmPGQYcbDhRkLGcUeDyI6ois3InoDAwMDA4NBCEPgDQwMDAwMBiEMgTcwMDAwMBiEMATewMDAwMBgEKLfCDwRTSeiZ4hoFxHtIKKP2eVjiegJItpn/44RzvksEe0noj1E9Mr+6quBgYGBgcFAR39y8CkAn2SMXQTgagAfJqKFAO4E8BRjbB6Ap+x92MfeAuBiALcA+B8iivZjfw0MDAwMDAYs+o3AM8YaGWMb7e3zAHYBmArgNgC/tKv9EsBr7e3bANzHGOtljB0CsB/Alf3VXwMDAwMDg4EMKke6WCKaBeA5AIsAHGWMjRaOnWOMjSGi/wbwEmPs/+zyewD8jTH2R6Wt2wHcDgANDQ2X33fffUXta0dHB4YPH17UNgcqBuNY7DqTxqgawpTh2de6vWmG9U0pXDslBiIq2nicOJ9BR5Jh/tiBLaDKdzw2n0phxsgIRlYT1py0xnfNyRSWT4khGiHtOS+dTOGSiVEwBmxtSWPpxCg2nkrj2in9E9rjVFcGLV0MF4/3f2YdHR1AdT12nk0DABaOjWL32TQuHBPFgbY0Zo+M4HB7BtVRAgEYXUN4qTGFqybH0FBHeOJICqNrCPPGRPD8iRQyylS9eHwUEQK2tKQD+zpzZATTR0Sw+kQK5UoO3tfXh0smDcOIakJbL8PZngxWTLW+o740w5NHkugRbuPKSTGc68lgX2tGaicWAaaPiOBQm1U+c2QEJzoySAnVhlcRVs2IoUp4dxhjeOFECuOGRTCqmjBlOOGpoym09zHEIkB8ehVGVuvftXywtjGFReOt9/PpY0mnf2NrCS1dDNeM78O0ccWbS1etWrWBMbZMLe/3QDdENBzA/QA+zhhrJ/IdVN0Bz/vJGLsbwN0AsGzZMlbsYAomQIOLwTgW777zYQDA4W+8Omvdz/95G36z7ShWXXUprp07vmjj8ZF7N2Ff83k8+vqVBbdVTuQ7Hu++82FMHFGD966YjZ9t342NbXXYfKwLU2ZegPdfN8dTf1djO3786PN41eJJyGSAR3c0YfHUUdh2ogu3rrgcl84Yo7lKcTErxHuTSCTw0/3D8ML+0wCARVNHYvuJLiyZNgpbj3dhzoR6HGzpduq/85qZeODAEdSPn4zFF87AfY+/AAD45M0X4i/790KcKhkDTrERqK2KInGgBX7TKGPA+OE1eN2lk/DAgUO+9UoNxghNqMXmY61O2ZJFC3Hb0qlYc+A0fv/EWgAAkdXnmtEN2Hj0HA60dDp9zsaLivVGTZqOz9yywDn2t22NuOexjc7+6jtvwHsee9rZv2LxArzmyhmF3aSNQ6c78e5HE7hhwUTcumgS/vT0Vk+dldPq+mUu7VcCT0RVsIj7bxhjf7KLm4loMmOskYgmAzhllx8HMF04fRqAk/3XWwMDGc3tvQCAjt5UUdtNpjJIpjPZKw5inDrfi1P2+B450wkAONfVp63b1WeNf2Nbj8MF7Gk+bx8L5mb7G8fPdTnb+0912GUWUT/Y0inVTaYtCtbVm0JvKi2UZ0AEHPoPdzHx9p++hN5kBslIBpfPHIP7//la7fX/7YHteGDLSSTTDKOGVWHLv72iODeWI17z3UeRVkQQ20+04balU537vv+fr8HlM8fium89jXSGobsvjTdePg3ffuMlAIBT53tw5deeAgBcOXssJo2sxYNbLJKw/gs3YfzwGgDAP/1qPf688YRE4Nu6k9K10/Y1P3vrAvzH33YjpYpHCkBP0np2J851O/e85s4bsPNkO97/KyvSakN9/2jH+9OKngDcA2AXY+wu4dCDAN5lb78LwANC+VuIqIaIZgOYB2Bdf/XXwKC/kGGsbKLTSkLGZtH8xPI6xKLWFMYXSGViUD0435PErjNpiBLKlE1UIr5stE3g+9IO0QOAvjRDVDknQoQMY0hnvMdEEBHSGateDsNadBDc58tx6LS1wMlkvOPCAPSmMqip8idR9TWueqS+2uVVp4yqRU8qeKHHvzjnkkVUVTuSBMjf9Yp54zGiNobPvWqB9rxSoD85+OUA3gFgGxFttss+B+AbAH5PRO8DcBTAGwGAMbaDiH4PYCcsC/wPM8Yqa3luYFAEZBg0yqehAdEGiBMAfwIogwBU2wS+DKZEgXjPz1/G+iM9mDKq1injXGLUh2bxe+hOpiWJTl8qg4hCnYkIaQaLwAdQ7miEkMkwZFhwvVIjQt5ndNAm8OmMvLAjEBhjFoGPuUSchOUbAaiziToRUCssBGqqouhNyhIx9fXgfeHvWjFfH95PxtzrWH2MYtuXLG/vROJYEa/oj34j8IyxF+C/wL7R55yvAfhayTplYFARGLocvDjppzWcXLZzqqJK3Qph4dcfOQdATzj87o8vcLr70khlXALVm0p7uPQoWYujdAYSEVQRjRAyzGo77MKpVFA5+JOtlqoirSzsiKxx60mmJcItdp8IqKu27ruuKipJSmpiEfSm0mCMwc/Gi/eEHy/mAtHl4AVJQZleTBPJzsCgzMgwmZMdSshoOPh8RPQDCX6Elg9FV18afSl3XHpTGc+YRLjoncHD3YsgsghoNk6/1NBx8JzoZTwcvCXtSGWYwsHL53IOXr3/mlgEGQZJr65emzmLCnm/GOBtZhiTOPhyYOB9HQYGgwxDWQcv3rfDwWeZlcTJsloh8OXilHKBH6Hl9KgnKXPwfToCb3Pm6UwGqhBDuhZZIvp0JrzqoxQgeOVU/J7SysKOiNBrG6rJHLwgoidZBy+CLwp6U/6Gq7wnpRDRO0sRJkgKitp+eBgCb2BQZmRY5emQ+wsiB8/VzkFGY0AWEX2FQfdc/RhpJhjZpUQjOy0HD4dwRwNWRJaIvvw6eAAeP37+mFXVDMGyQwDgz8GTq4NXwQ3zznX2oamtB4B3ceHq4OX9YkAU0bssfPHazwWGwBsYlBlDVTwPyBNrzkZ2RB4RfZnVzABcNylAb13hJ1IXjez6RCO7dMYzJg7hzjBfoz3AGqNMCGO8UiNCXh08vyePaoaAHttIribmo4MHob7aj4O3znnNf7+Aq//jKZ8ecSv6UhjZ2VcQJHPlkiz1e6AbAwMDGYwNZTM7F3yiJ2eezz4pVlWgDr7lfG/gcT8JBV/odSscfG8q7SHilhW99dYEWtHb10plMmV3k1Nf8YjDwVu/UZGD7+Mieh8regLqanw4eJvrP9fl+r57dfC8D8UfFHHRUG4dvCHwBgZlhmiMM9Qgi+it7Zgtcg6z6KlWRPQVwMBnDZrib0Vv/falM5IUoDeZ0VjRExiz9NfBInq7zVR5OXjScPC8PxnF9oKIHD92kYNXH242Dj4MSmFkp3OtL9fIGwJvYJAjik2LhzKB14rosxAicagq0YpeJWQqfEX0wnZ7j8t99qW9fvAREvzHA4aLJA6+vEZ23nWPj5EdgB4dBy+5yVFWHTyHLkqkamRXTEiBbhyplBHRGxhUNEr1jRYxSuaAg+QmZ8/DYRlNgldEX66JVITIDepovX+gG7dye7cbDrkvlUFMa0VvLQyDFkScaCY1evz+BBEh5SG01v26CxXXD74npdHBi+0huxU9R28q4xvoJmyc+1zA22LGit7AwIAxNmQN7SQ3uRyN7ACviL6/oXtu2RZs2fzgAYWD10Syizjub8GhavmxZLlF9HCJNgcfJ9c9knPw5KgoagLc5IaFFNH3JtMeCs48RnbF+/54S2oku3LAEHgDgzJDXOkPNTBhzue62FwmW1X/3N8LJd3lsorofaOriRy8S+B7U3odfMbWwccCFjn8tGTGu0joTxDJ3gWA+6x0HHxWNzm48eeXTBsltZsTB6/sFwOSBAf8OkZEb2AwJDGkdfDC1Ms5+EyWxHriWKmLgf5Wd2QYQ0SZvMX+67rjG+hGOE/k4HtTaYyolafqSASOm1yQxEMU0atBgfoTBC+B589KZ3vBn7F/qFpCfU0Mf/jgNZg/aYTUrqqDV68rts/Xh8V8bXhbGVEyZ6zoDQyGJjJD2E1OJMick8vGAXNYltlyWX9z8LoFRdj+q5A5eFcH35vy6s+dbHJZAtjwY6k0w7CqclvRy2UZlYMXItlxBCWbAYArZo31XMsjok9lvG5ykNVBpdLBlxtGRG9gUGawoczBa2LR53u+1UbBXcoJuj5LEgZNf/zc6MRiMd1pXyrjEcNHuIg+HUzgObEst5GdjtDwseGSm5hgRc9RE5Bsxg86Eb3ftUuhg+c8vGVFz69TxOZzgCHwBgZlxtC2ohe2M7ws/ICoVfPlnvNFPjp4rzU5b8s9ry8lZpPTcfCwk82ENLLLshAoOTSX5ver5oMXb0d0k8vaoA2tkZ0PShGqVrait435itd8TjAE3sCgzGBDVkDvo4PPMhhBXH+/E3jNk8tO4PXH08KNq1ynPtlM9ixxXO2eTHvj2fcndITGtaK3fl0RvVvHN1RtEAdfpRPRK1b0XAdfAtaaCb+qpKC/YQi8gUGZkclUhr6uHJAC3XAr+rA6eJBGB1+snoWDXgcffE7Kx4pQpPt9KoHX6eAz2Ql8pYjodZd2dPCOe6RdV+B3RcNAnQ5eB9WYsCeZhrqmcnXw9n4RXxzjB29gYODAmuiGJoXXRbLLZa71WtH3t5GdTgcvlnmP++rgM8whOL0pWaysRqONRlw3uTCx6MsuoteADxO/b1JE9LEI5cX5qtENe1MZZ/GoXrsUnDUTePgho4Mnop8R0Ski2i6U/Y6INtt/h4los10+i4i6hWM/7q9+Ghj0N8SAGEMNUix65i3LBq8Ovhi9Cg+mYcazcvABInpOhNUUsSpxJlsHz1iwmFmOZBfcr1JCd21OCNVFCt9SbyusiF5FbyrjSAnca/N+ldaK3tXBD34/+F8A+G8Av+IFjLE3820i+i6ANqH+AcbY0v7qnIFBuZBhQ1kH78INdJP7Oc5+BXDwWXXwviJ6i9Al0wwZBgyvjqKj13KXUwP6RImclLJBnHlEIvDljWSnIiNx8N4aKlGkgGMqqqMRZ3x6U2nJvkGEI6IPbC03OAQeGDocPGPsOQBndcfIkpO8CcC9/dUfA4NKgRQQY4hBJNBh/eCd4+SdmPs9kp2uLJubXBAHL1ACMciLGqxOJIiBBJ5HsiuziD5QB6/aEbj5gpU2yFPFDzdf3OBs9yZ1InrZcr+oHDx3k6uAb7pSAt1cB6CZMbZPKJtNRJsAtAP4AmPsed2JRHQ7gNsBoKGhAYlEoqgd6+joKHqbAxWDeSzC3Nfp0z0AgO3bt6OmZXfRxqOzqwt9STbgxzaf8WjpcrnZ9vPnAQBdXdY4HzlyFIlEk+ecnWcs/XRrayuOZtqlY9u270Dt6T059aEQvPDCaoyskakN7x8A9CX7POf09HnLAOBcaxsyInefdqPZnTt7VhrbY0fdNo4cOogEHde2uavJDZhz5nRL2d6xZDIJlWIzZn13R471gmXSTt/Ot3dbxzMZqb/iwq+lJfhebh3P0DolhtUnU9i5dx9UV/gNGzcCALZt2woAOHT4EBKJE/ndnIIj7dbz70smcfDgQQDA888/hyphEdNfc2mlEPi3QubeGwHMYIydIaLLAfyFiC5mjLWrJzLG7gZwNwAsW7aMxePxonYskUig2G0OVAzKsXj0YQAIdV+/OboeONWMiy9ehPiiSUUbj2HrE+jO9A34sc1nPI6c6QSeSwAAhtXVAx0dqK2tBXq6MXPmDMTjCzznVO0/Dby8FqNHjcbUKSOBI4edYxctXIj4kikF3EVI2O/N1ddeg4kjaqVDsX1W/wCgqqoaUAk6RQF4fbOHjxiBmmQXulMWYR89oh6nuzsAABMnjEc8vsypuzm1Fzhg8UPz5s5FfOUcbTd7dzQBmzcAACY1NCAevzTHGy0OfrfncQBJT/n111+PZ9p2oPrUSefd+c+dq4G2VkSjEel9YowBjz0CAGiYOBHx+GWB13zVTQxzPvcIpk6fZZ27f79z7NJLLwNeWoMlS5YAG17GzJmzEI9fWPB9AsD2E23AmhcQjcYwe/ZsYN9eXL/yelQLLn/9NZeW3YqeiGIAXg/gd7yMMdbLGDtjb28AcABAcUbfwCBPlErAOZRF9Dor+pxE9GWOZJdPoJukTyfTGSalhR0mBHlRxevR0CL6cPVKDb8r6zwBHCM7VQcvWdllv2YkQqiORbRGdly54kayKx4qSQdfCRz8TQB2M8YcGRMRTQBwljGWJqI5AOYBOFiuDhoYlBL9bRhWSZDywYe0opcXBeqxyjey8zP4SivGZiKB96SLDbCwFyF6jFWakR0AO1iP3DfVXS6X9lTUxCLYcOQsth5vk8o9OWCK6QcPl8IPGT94IroXwIsA5hPRcSJ6n33oLfAa160EsJWItgD4I4APMsa0BnoGBgMdmcxQ9YKX75sTvmxzrUhAy+8H7y3L1gU/Ap9RONlaId95TCXwAvULSgMrc/DB/Sol/Ig1z4gn9o2UX107Yf3Xa2JRvHz4nCcyYEbgrEljrFkI9Bz8IHeTY4y91af83Zqy+wHcX+o+GRj0Jxhj+Onzh/CapVPQMLJWOViePpUburCzWUPVCtueDGVZUs0WGzqJgbQAyWHBoVqT18ZEK3qVwLvbKvGX61WIiN7n0oyL6DUW8jqiSLCefy4cvA7cVZFsRUBxrejtX8ZgYtEbGAwR7DvVga89sgsfuXeTVD6k/eBFcXvIULX8OGnqVkayGeF4Dm2pBH5Ytb+IXgqCEyLQDVBeEb0foWHMVk1IOnhbRK+pH0Z8L0KNS8/BpSgWB09FzQbB30mRgy8XDIE3MAiJQr/VHjurVXefbEE9lI3sRGLIQ7hmDXQT4Gfe/7Hos3Hw4dtSjc2qohGHkKlEnPIQ0ZeTwPtBmzDH4eC99YPE9zrUxvTZ6Pi7RkAJOXhBBz/YA90YGAx1JO0AJ6qoNMOGrIRe4pxSoQPdiNuVqIMX1A45mPVnMop1PJEjfvdw8KFF9MI55cwmF6CD94jo+a9ORJ+rDt6Pg+fBhkqgg+fICDGoTTY5A4MBgny/VZ4HvEoJS8YYK7sor1wQdeY8g1o2osgCOOT+dpPTc/Dutl9iGR1UTjYSIWffY2Sn1PNDpYjofXXwgG1kp9PBa9oJEN/r4K+D5xw8edzxCoVkZFfUlnOHIfAGBv0EzsFXKebMYlKKoQbxvjmBzzYSogW0x8iuInTwbqGfxbwOKZXAExCzY9B7k82E08HL7nShu9JvYBnvwiaQiOcoo6/xEdGLOngrnkK49sLBtSVhrHziecAQeAODfkPSZlfVdJaZIczBi/fNk4NkHwt/K/V+j0WflYMPb9afYXKgmwi5HLzKfcuBbvzbDOtOV2r4dTHDGDKMKX7w/FdvRW/9hruXWh8RvWtFzy3zi2lk5/4ysLJZ0AOGwBsY9Bt4kpEqo4N3kE8kuCArdR3DfKq9xwofWgK0nO/FlmOtUpns+he+LdWaPBohR52jEnFZt+4/jas6/XIhyA/ew8FzAh/QTmgreh8OPiPoxon73hUJTPi1OPjyjXslRLIzMBgS4Dr4WFQl8EOXwus4p2xMuC68LYdOJL7qOwl09qVx+BuvzquPQXjbT62Y82Lb+aoJMhmvP3jUx8gurOhdpP2VGKqWAUgz6N3kSqmDTwsiepQo0I3gzlkuGA7eYMiiv8W5fY6RnVcHP1Sh43DDxqInUCgdfGefN7FLKZHv80wzmYOPELk6eE+gm3DGc5XiJufHxTqR7EQvOWc7yIo+3HX9rOhlNzkq6lwg+cHD6OANDMqCsN/0nqbzjg97IeDcpUrgM0LEK47DpzvR1u3NvjXYoJtYs3LwAedXwmIpX0v+lMLBRwOs6MVXKBYkog8Zs77U8OXgmSYfPD+nCN31E9GL3g1UZCM7yQ+ehbcXKAWMiN5gyCLMN93WncQrv/8c/m7JZPe8fCdwHz94wV3WQfw7CcwaV4fEv67K72IDBPlw8MFucuWn8IWI6EX1DZGrzvGI6CXjOf82Kz1ULfeD1yab0bXj/BZmZJe2pWlEbvjbYkEKxARWVhm94eANhizCiOWS9kSw5sCZgr9TbkWv+sH7hao9fKarwCsOBOis0F0RvPYMdQKVzi1ez/JFLuJekeiqhC5C5ERiCxLRhw1VW05RcRAH7/GD5786HXyuoWqzcvBkhaotKgcvW4EaHbyBQYWCi0aTUjaq/GaDVJAffAVwnuWAnoPPdo5rIKV6oZWLg8/Xcl5c7DEmi+KjRA4HGsTBq0abcj13u2Kt6JmfFX2Am1zIW6n2MbKTYtGjyHEoFC8Po4M3MCgDwnzSfN7uTWc8ZbmCSwNUnalJNpPfOYx5CXq5FkpBlv1BuGDCcGlfNrJzE86o4vWwed4rRkQvbK/7/I34j9cvBuBy8Lp70N5WgAFetuuKEI3sih3oRrURKacO3hB4gyGLMB81r9IncPD5zgVuJDuNiH6IUvh8OG7ms221V1B38kY6Rw5+XH01Ep+KY8m00VJ5TOJkCcOq9CJ6Ckm4KzFU7cQRtai2VyhaDl75ldrRtBf2uiJcDr745FdNhjTgOHgiGkZENxHRzGJ3yMCgvxCGb87HytsPfn7wQ5S2A8hvLEURfbnTxXKI/vdhpAixKGHW+HpPuRropqbKh4PPw02uUjh4wDUMtKzooTey03L1ufnB+0FykysyBRbnlXJ/26EIPBH9gog+ZG9XA1gH4HEAe4jo1hL2z8CgZMiFg5fL8vtsk/akIoroxUQzQ1EPn9c9S+Jw+VC5OHhxYREmg5yfPlwm3HA5eE+gG3c7UAcvivIrKJscJ+iOH7zQz2AjO/9juSCdEazoNQvFQuDh4IvWcu4Iy8G/EsBL9vZrAIwAMAnAl+y/rCCinxHRKSLaLpR9iYhOENFm++9VwrHPEtF+ItpDRK8M2U8Dg6JC990XqoMXuRV1MhhqyOeW5XzrlaGDFzn4MIsMP2IrpUUXRPTqfYW2oq+UULXqvkPg4W9kpyPwzm9h9yJnkyuym5y0zcoaqjYsgR8D4JS9fQuA+xljpwDcB2BhyDZ+YZ+r4nuMsaX23yMAQEQLAbwFwMX2Of9DRHp/BwODPBGKg9eJ6PO8HicCogSgEvy2y4lCdfDlzibnXFew5g/TBz9xuapb50Z2PSnZXSBsEhlZRJ+1W6UD6XeZzcHLagYuhg8Q0RfKwQuhaovuJqfEaRgIHHwTgEU2kX0lgCft8uEAQoXbYow9B+BsyOvdBuA+xlgvY+wQgP0Argx5roFBKITSwevK8pwNkppsaUGJU4YCgobS7/lIOnjPsSJ1LEdklEk9G/wJvLsdIaDW5uC7lXC7kptcEIGvECM7ldDwvjBY3HQsZw4+HBpG1mrL06rkp5jZ5NSCMlL4sJHsfgbgdwBOAkgDeMouvwrA7gL7cAcRvRPAegCfZIydAzAVrkoAAI7bZR4Q0e0AbgeAhoYGJBKJArsjo6Ojo+htDlQMtrHoSbmfot99netxOafTp08DAHbu3IVRrftyHo8jx3oBAIcPH0YicRKAq5fnfVAn/oE03vm8H1tbUr7Hjhw5ikSiyVO+56jFU5w7d84zd/qdA5R2LJ9/YTVG1li92XeoTzp22cQoTnRk0NzlPuue7i4kEgk0nuyV6jY3NTvbBw8cRMomRHsPuu8MAOw64xL8dWvX4lCdnlfrFt7xvXt2I9FxINdbKwp6e3vBKV0ikcDOJuu5r133Mjq7etByqs95PmdO9wAAerq7Pc8smbTG9sSJE0gkTme97kjGcMfSGvz3Znmcjx47DgDYsGE9ksk+nDhxEonEmXxvT4L4Th87fhzpVMpzH/01l4Yi8IyxrxDRDgAzAPyBMcbf4BSAbxZw/R8B+CqsRc9XAXwXwHuhX/Nol1iMsbsB3A0Ay5YtY/F4vIDueJFIJFDsNgcqBttYdPamgCcfAwDf+2ps6wYSTwMAxo8fD5xqxkUXXYT4pVNzHo+/nd4KHD2GmTNnIh6fDwBWjPvHHwUArLz+ejcIzqMPB/arEpHP+8H2nAI2vKw9NnPmDMTjCzzlx148DOzcgTFjxlgFZ9yJedr06YjHL5JPKMVY2m1yXH3NNZhoc4u7cADY4/I9KxbNxo6T7WjefcopGzl8OOLxlXjs7Dbg+FGnfMrkScBJi/hcOG8uiIA/7t2JiZOmIB5f5NSrPXgGeNnigZZfew2mjB6m7WZXn/uOX7xwIeKXavmkkmP1iScAWGQjHo+jZ3sTsHkDLr98Gaq3v4wpk8cjHr8EAHDvsfXAqWbU1dV5nln1C08Cfb2YNm0a4vGLQ117FYD/3iw/r4bJU4CjR3HFsitQs3UtJk+ZhHh8caG3CQDI7G4GNqwHAEybOhVVLSc999Ffc2noWPSMsfs1Zb8s5OKMMWe5SkQ/AfCQvXscwHSh6jRY0gMDg6Ihl0A38nkFiuiFslxFu4MN+ag75EAi8rEwFuylgOwHrxjERcjzxviJy31F9EqyI1HSw+voEFZXX2qohmZ8V5sPPiAlbNGs6NPiEym2Dl7YRnn94H0JvC02DwXG2K/yuTgRTWaMNdq7rwPALewfBPBbIroLwBQA82C55hkYFA1hiIvOYCrfyaAvqw5+6FH4vPzgBQvoNJONz8oW6Cbgwjpi7pcgRiXIY+qrAQB11TGlnrs9LIDAS9nkKsiKXrzPjJIm1znUH1b0xK83ON3kgjj4Hyr71QCqAPAvKgLLwK4XQFYCT0T3AogDGE9ExwH8G4A4ES2FNbqHAXwAABhjO4jo9wB2wlIDfJgx1r9JnQ0GPfLm4At0k/Ozoh+KHHw+BLncVvS6haFkRa90Khrx5hv3I7YyB0+4+aIGfOnvF+KNy6ZL9UQCWeMTb12tV04revV2IyoHT14CX1IOPqNkkysmBy9tl9dNzpfAM8ZG8G0iejUsf/ePA1hrF18F4C5YuvOsYIy9VVN8T0D9rwH4Wpi2DQzyQb4fdb5zAQ93K63wMz6VhwjyEdFn5BkUEXLL+sMPPluKW/V4hLwiev9JX7Z6j0QI714+21MrvJuc/pz+hh8Hn2HefPCOiF4XyS5AfJ8LJD94KozAf+J3mzFrfD1OnOvGhBE1WDJtlHOskjl4Ed8B8F7G2ItC2Woi+jgs//aHdCcZGFQ0QvnBu9t8vsnfTY77wYtdMBx8rmCKvjsWjTiLp2KJ6H/w1D6c70ni86/2hvnQSQmCdPDRiPfZ+rnJyQTZv39hw86GjVlfanhodYAOnh8rJgf/32+7FHf8dpOznxL94EEFqcf+tOmEtP+/77jc2S63Dj6s0GYWgE5NeRcsy3oDgwGHcH7wxQt0w3Xwftwev9bQClmb/V6//+RePLDZnUT58HA/+CqBOBRLRH/XE3vxk+cPaY/pLiGK5XVR5zyGdz6TviSiDyDI+RCNshrZKfuOHzyzXEXFcLuOnj1IB5/jAPzdkinSvhNLwec6hcAbnbJy4g/4YS2AHxCR42Nhb38Psr+6gcGAQRhaIBJgJ2NsnjTEMcSSjOyKZ8Q3EBGG4/7zphN4cpfrYqbaMFQJOuig9vwWTpuOnsOn/rAltAV+dg5ePqY1srPL1CA1kug9KARtHsS6sozsrF/GGFLpDKoEq0M3oUzp+psRFonF1sGrMrqBwMG/H8A4AIeJ6DARHYZlFDcRwD+VpmsGBqVFOCM7t1afxkgup+sxr4heZ2Q3hOh7qIk1nWGKWB7Stpq8J9drvfOedfjjhuM43+sfdCdbO3Iseq+RnQpOvD/1ivmSzpakOv59yEefPmpYVc7nFAteIzurIJVh1jMMy8E7xL8wuM+IrFC1Weo/s/sUfvjM/lBtDxQrehEnAVwGK2bAAlh93gngSTa05IkGQwziy91r+yIXapynxqoOOj7YEUakzphO7OnuVAnEIai9DGOIaKbb3rRrUR0GumvIsejlY5GI18+ar0lG1VXhq7ctwm0/XG33IZzOPB8CP2NsXc7nFAvqrfBd7lmiD1UbcI8FUk0x3DGQ/Zt+zy+sYEwfXjU3a9vK61lWZCXwdvz5NgCXMMYeh5Um1sBgwCMMIRWr9Ka8gWpyu563TXnby+EPdoS513SG+boWqtxfoIjep5wb6MnBT/yhJfABGe6i5DXi8hPFizQtiMDlo04fXVdGDl7dt+/NIfCCD1+AG7zgQlcYhXdE9PZ+UWPRK3Y1FS2it/3Pj8DygzcwGDQI90m7tbr6LBFu3hx8NhG9pmywI2ywoYyPO2GGMTe8L4LHLtulUqF18N6yICt60Q2LE2Y/oi4Tfv8+5KODL6c/tgrefb64kjl47ibnPa9YfvDM4eAtN7lc6fv2E234+WofI0zFM6aUtgTZEFYH/1UA3yCi8aXsjIFBfyJXI7vOXltEn68OXnNdrQ5+6ND3kM+AKZOmPGbV0Yi073utLM8t7MJKH+gmyMjO7RfnVHX5zwGZaw0yiiunT3s+UNcj3KKfS8WqdBy81oq+uDp4bkWf6yf3d//1Ar78153aYwMiVK2CTwGYDeCEHYVOcpljjC0pdscMDEqNUG5yQpX2nqSnLKfrOUZ0eh38kJLN2wjDcWeYuiiSz4+GdJMrKQcfYGRHgog+FiH0wT8ATWgRfQ4c/FuvnI6l00eHrl8K+LjBO7EhRDWL6wfvvcfiRbJzdfAEb6TBQqDq4AeCkd0fS9oLA4NyIMQ3LRLjDtvKOt+pgE/8vhw8vMcHO4I5bgtp29La75yYRODz70shOvi0IlUQIbph8cUI+ejgw4ro+bGgMLUc//H68vNfKkFWdfBVmuD8gX7wRdLB8+sU85NTFwsVGapWBGPsy6XuiIFBfyPMR601iMuTArsieD0x0HH4gx1Bd+py8Eyq6VpAkydRSSEcfDrkc81uRe81qOMlnMBH/Qi5sB3Gir46BIGvBKgEWdXBh88m56+fzwViwqLi+8G7KPe3PDDeDgODIiOTYfjN2qNZ6+k+/Hw/Wab8Anoju6HEwQcSZHtEMioHz3+ZVS4SyyBRazYde9rPkk/tl6aZoKRBOiM6kWH1N7Lzp2L8SE3MP5NcJcHPD94xshP94AOU8EEW9tnw1dcucrZFN7kwfvC5QFW7VbQVPQAQUTURfZmI9hJRDxGlxb9Sd9LAoNj448bj+MFT+7LWK2akOceK3kefzI8PJSv6YBbe+rF08F4jO2aXSxx8AI3ONqphdfDaQDcBVvQRQQast6IXuVcI5f594MZpYUT0lQCvm5z1y4NHaY3sghrKg2q+4+qZWPe5GwEoInoUN/aEZGODAUDgYVnRvwvAd2Gli/1XWOlkzwD4UGm6ZmBQOrR3J/M+N9/JQG9kp1lA5NX6wEQwB28hzfQ6eAYGxoAxgn93sIg+GwdfiIheJPDyMSL3HIeDD6GDDxLRjx9eAwD4+E3zQvW53MjKwWsD3WjaUX5z74d1phTopsgEWI1tMRDc5N4E4IOMsf8FkAbwAGPso7Byut9cqs4ZGJQbxRXRZ+HgA645WBGsg2fOr06twZi1XROL4vA3Xo2Fk0fmFeiGoxACL56rM7Ly6OAjIlEX60Io9ycMw6qte1bzxFcqcuPgs7vC5csV8/NEO4483OAdaBfoyjc9EDj4BlihaQGgA8Boe/tRAK8ocp8MDCoG2mxyeYvoeZsutLrbAgj8sbNd2H/qfP4N9DPCGMWpsejFhRCDIPaOBHPp2sWaUFiIiF6OrqcQeOE6nGjLvu8+4vqB5eoeCI8fPLeiD9DBB1mf58sV8+vyxFHEr1PgNy2VKcfL+RjDEvijAHi+vf0AXmlvXwOgO0wDRPQzIjpFRNuFsm8T0W4i2kpEfyai0Xb5LCLqJqLN9t+PQ/bTwKCoKCYHr3OTk1f7TPrNB9d96xncdNdzeZ/f3wjjJuf1g3dtFTKMOYRAl5ZV26CApOAaV1A2uaBY9Bqi7ev7LpxXzuxvpQa/Ne4mpwv8UxIO3v51I9nZC7ACg1dJZcL7kRbez3IgLIH/M4Ab7e3/BPBlIjoE4BcAfhqyjV8AuEUpewLAIjtQzl4AnxWOHWCMLbX/PhjyGgYGoRCWC9cb2RU6Gfhwe5zDH0oi+iwcNye62nGy64gcXxCN1j3L7j7XRriQQDeBHLzAIHLCLrnJ+US1K2f+9mJD1as7OniNiJ6T4VLkmvGI6O2W8v3mtPODeDzDKj/QDWPss8L2H4noGIDlAPYyxh4K2cZzRDRLKRMT17wE4A1h2jIw6C+4E3NhQVTExkRLbw3dGlJW9OqdVkXJ4aoZWHBwIJuzdw3XwhntiehOugTeTwefyTDsbGzHoqmj5OuLdQLc5MRQtZxTldzkpLp63fxAB79dfkv83noDjewCRPR56+C5kZ3bjpgrIFdozxPKwi4aS4WwkewkMMbWAlhb5L68F8DvhP3ZRLQJQDuALzDGntedRES3A7gdABoaGpBIJIraqY6OjqK3OVAxmMZi/yHZit7vvvafswiAOJ/s338AifTRnMejs6sLAHCysRGJxFkAwME2l8CsWbMGY2ojaO91J4V8x7sczymf92PPEfk5kDBjHj9+HM88ewoAcPbcOafto8d6AQCtba3o7mFobmpCInEO59u70Rf1v/cXVq/GyGqZMjR3uqutTZs3I3lcnhKfeeYZPHIoiT/sTeILV9Vi7pgoTnZ4ffG279iJUa2W22VjU490bMeOHWhrt+6zp9t6B5qEd+Bcj9ve4cOHnO3Nmzbh/KGB4eeeDd3d3QCstLmJRAKN9hgeP9kEANiyaSPaDlr32njSer5tra2eZ9llf0OHDh1CInEi5350Ja33q6PTirb+4po16OrsQQu6te9NZ5KhN+3/PSaefdZzzu49u53tUy2n0dWd8ZzXX3NpKAJPRHsBPAMgASDBGGssZieI6PMAUgB+Yxc1ApjBGDtDRJcD+AsRXcwYa1fPZYzdDeBuAFi2bBmLx+PF7BoSiQSK3eZAxWAai32Rg8CeXc6+332NOHIWWPsiYtEI0ja3ccEFFyC+ck7O41H78jNAVxcmTZqEePwSAMCoo+eAF9cAAK6+5hpMHjUMLed7gWeeDOyXLx59OL/zioB83o9Dqw8Bu9ykHdVVMfTZIYGnTp2G665bADz+KEaNHo14/BoAwHPndwKHD2HEyFFoT3djyuQJiMeX4Ie71yAWiWDWosWYNb7evYg9Jtdee63jXsZxoKUDeN6apC9etATxBROlc65beT3+3LQFwElMmL0A8aVTsbf5PPCCbOdw4fwFiNsW7fc3bgIaTzrHFi9ahGdb9gNtbRheXw90dmDa1KmIx63AK6fae4DEUwCAC+bMAfbtAQAsu/xyXFLmGPLFwuEHngLQAyLr3TzY0gG88CzGjBsPNDXj6quuwIJJIwEAT7ZuA44dxZgx7jPnGLYhAXR2Ys6cOYjHs+dmV9HRmwKeegy1tcOAzi5cu/xaDN+9DuPG1iEeX+apf8mXH0eb4FLrvN/2+7Fy5UrgiUelc+bPnw9s3wYAGDN2LDrQ5fku+msuDauD/zaAegDfAnCciPYQ0f8S0VuJaHIhHSCidwH4OwBvZ7ZCjjHWyxg7Y29vAHAAwIWFXMfAIB+oolWgAIMcjRW9anFbSPsDEaoEUxpnxhyxuWxF75ZZRnZWORHhxYNnEP9OApuPtXqulc2KXieiTzPmiI+56iCbiF6XbOb6CycAABpG1gJQXeP08uaBljEuCKrY3bGi58lmtKFqi3//vEX1Uft9cW1Z4mVkC4SVzgwAIzvG2E8YY//IGJsOYD4sgj8awC8BHMv34kR0C4DPAHgNY6xLKJ9ARFF7ew6AeQAO5nsdAwMVYYhoJsNwuqMPgBoOtbBrqoEw3OPqxuCHamQXkxZSwZ4H1nGRaLh1tp1o815LM7DiRK/Tl2Yy7qKDh7LVRrKT7CoUAg/g4zddiBc/ewOmjLYJvJ9hnWR8573OQAUpv95AN4IfvGKQp22vWH7wICtOQRF18JKRHRsARnYAQEQRAFcAiAO4AZaR3QlYYvsw599rnzveTjn7b7Cs5msAPGF/pC/ZFvMrAXyFiFKwAut8kDF2NmxfDQyKge89uRf/9fR+APKEnC/95cZ1IqHR2eAMIfrumSBlDt4dM9mITST6TBv+9ay9MJMv5i0SuXZfDt628A7NwWdkw61IxLqvyaOGZY1kFzbQzUCDysU6gW50fvBKHW17BfrBO8lmiF9Pt7gLwQRk4eD5u1AuhNXBPwxgBazQtM8CuBfA7YyxI2EvxBh7q6b4Hp+69wO4P2zbBgalwKPbm5xtkTss2MhdmgC8hGtoWdHL9yq6SzEwJ8a7zBXZx+0Qtjrf8nNdXgKfzb1Nl00unWGoipKznc4wx/Lbr50MY4gSIaW4YgFuX/0i2fnliR/oUIl2YCQ7HgwogIgXOjSOFT38rejPdGoWiQr0RvTyO1XOULVhOfibAbQC+BtsYzvG2OlSdcrAoBIgTtrF0cH7EyvruPw7FBCsgxeD2rh13IBA1pjqosOd1UzO2aIS6rLJZTLM6VMyncFb734J6w57hYki959htsRH4BJdePsqJ5txt6ODSUSv0LigWPR+50jH8uyHE8lODFVLekLd1NajKZXBNMmNZA6elZWDD/sKjQLwNgDnAHwclqHdNiL6ARG9rlSdMzAoJ8QPVeSm8g+KwX+9BmPSdfNrfkBCHUuPDj7jXfWIC6EM0ydw0RL4LBx8Ku2tkGbM4S7TGaYl7vyYcCXJZkMk4Pz25OPw2R6EHDzkZ8U5+FjUq4MPbK9AHbwTyQ7+koJNx855ylT7imzfr04q1J8IG+imG8CT9h+IaC6AzwP4ZwAfBjA4nDUNhgzCfHdilaDMXqGvqTWy824XM3VlpUNVR3g5eHtbOoeXMel88RG1nO/1XEs3qiJd9ssSx/sUFLREFtFnTybjr4PXlw90kLLBx4SHqtVa0QcFusmTh1et6N1ANwrhZgzfe2Kv53wxcqLYjqeScLycC7WwOviJsAzkVtm/FwI4BUtP/kyJ+mZgUFbIxEMkPPmK6O1fn2voFgBDDfJCytXBy8TXLstYmzoOPpn2yk51z03i4H2M7Ko4gddw+E49KRY9k4k6vETbT+8u3v1gikXvuRVO4IOSzeTSXki4yWZc+wiCd/HXk8zgXFcSM8fV4cgZx8HLU29QhKoF0GT/PQcrFn2CMbY7+BQDg4ENicALyqz83eT4+fIKv9B2BzJUS2Vxores6L2LHtcbAR4/eKdOFutm3fW1VvQZhmiEi+g1ClfN9YI4eKcs4iX6at1BRN99s8k5Rnaimxz/1dx/oUOiusnxBtV3o6vPCrY0uq5aIvAZxhAVeqGztPf6wRfY6QIQlsAvNATdYKhBnM8lP/g82+OE/aGtjWg5/yJ+94FrFA7evu4QovTqnUaFiT6rkZ1tRc+Jx7DqqFBHcy2tDt7d1hH4TMZddCSDRPSKN0TUhy13XOd8Zn1JRD+YgtHb4HfE7783lUGE9PcazMHnKaLXuMmByPO+dNlJiMbUVUnl6juk07HLC3imNSDsL4QNdLMbAIhoGRG9mYjq7f16Isornr2BQaWDSRx84UZ24nlrD531XEP27x4aUBczMcVbQXSJc8+BVIcTi+E1UaGOTnRqlf3kuYNY+pXHPfV0BD6VyTh9SmnE/s65yqTup2PnfYiG4OAHlYie/yo6+L5URjKwE+sE6+AL6AspbnLwqm94EqIxddVSuWpUp3tnVBVcxbvJEVEDgAdhBbphcCPL3QWgB8DHStVBA4NyQfx2o5pJOldk4ypZQL3BikAregYhVK33nIzNwfP5s7465qmju9bXHnFzEGTTwWeEQDeBRnYZhrOdfbjum08jmWEYV+8SBsmqQDDu4pAYPB9iP9Ch3gsnesl0BsOqZBttXWRCFYWsfSydO+fgSduWy8ErBF55BXRaG0mdxArra6EI6yb3PVg6+HEAuoTyPwB4RbE7ZWDQ39AZYImEvDhucjoCEq4vgxWeULWiDl44Lj4LSdIhGNnV12Qh8Nrru9t6HbxLoP3SyQIWB7/lWCs6+9LoS2WUkLNe9Y4fhx8mRv1gANmUR7VXAMQFUWk4+AiRQ5hdDl6u02UnPMpLRC9sh4mGV0qEFa/fCOBGxtg55aU7AGBG0XtlYFBiqJ+d6v4CyMS3GKFqs/lh66zsBzsYeB53a1/VwbtW9PI5/Fe0WK8XRPTaBZumLGuo2oy7tEhmsaIfK3DtItHScfC+fvBSoJvBQ+D5rah+8IAcxc6uZP0EcvD5j40lomfCPnmkcpyDH12fh4heVPuwgWFFPwyALm7fBFgiegODAQ09dydy8NKB/K6RlegMTR08CbFCRRH9/RuPo842nFMNl3iZqOMUOfiwMf7DiOj5tYN08KphnUTgJWIkGHdpjvuK7gc4/HTwgCy1seqSdI62vUJE9ERI2Sw8j0XvqH0yDO/42VpMGTUMgJeDV1+RbAaxGR3n0I8IS+CfA/BuAJ+z95md7e0zAJ4qQb8MDPoV1iRufYgbjpzFjxIHJI4tWgwOXlOmD1U7dCg8Y/JErloc//qlI0498Rz+yyUAADBcFNFnCUtr7TNPWFEV6YxbJ1BEn5Hb8nN3czh4H+o9WEX0nmQzwlNfPne8Ulf+1bZXSF8g2EKApFj0HX0prN5/xqk71qODD8PBu9uZTGF9LRRhCfynATxLRFfAyv72XQAXwwphu7xEfTMw6DeIn+kdv92ERiUOdTF08EGGX2Ifhg555wSawO9a5ebEehwOBw97/LgOvjoLB688gAwLF+iG1wkyshPrAf5W8lnd5AapiF69E/H2379ijrZuoPV5gSJ6cZvgiujVVkd7rOhl6K3oZWlTxRvZMcZ2AlgMYA2AxwHUwjKwu5QxdqB03TMw6B9kI9rFTDbD8ek/bpEiromc6VBBRmHh/QhfULwAVwcvGtkFGz/x82U/eH2yGV4nFRToJqOGzdXr4NU+qxi0InpHB29BHJ/xw6v1dUvEwXvesQCpyVhVBx9CRC9b0Ve4Dp6IqgC8AOCdjLF/K32XDAxKD4+4Vpj+dR9ktBgcvLL/+/XHJR9gN0vaEKLwLFyKVFlEb+1w7sn1g/da0f/wmf3aNgBO4EUjO+91LSM7q06gkR3zJ/C6e/ILYjPYY9HrXOBGKXpuNxZ9QHuF6OCVdkSRvWp3M6JWJpGhRPTS8fKqWrJy8IyxJIDZGFqSQ4MhhmxEW9Kj5nmNbKv9ocrBy7Ha/etxiAZRgDth12sC3Xz7sT3uecqTY0wNVZuxy2Ur6HA6eFktsLOx3dnWvTt+xHvQ5oNXmWahoCam+sHbv5qlNh+/QoLHyNIVOV2s+Azrq2OoickkMlcOnpWZgw/rB/9LAP9Uyo4YGFQKdCtuNctZPsh23lAk8CwPDp5PqtyFjnPDspFdcBu8HXFC5zp2KcNcxl0EqDr4S6aNEtpmoXyedW5yIgariJ7DFdFnr1MyyqgzgNRw8MOqo54oe14dvLd5cSGZHgg6eAD1AG4nos1EdI+dB975C9MAEf2MiE4R0XahbCwRPUFE++zfMcKxzxLRfiLaQ0SvzO22DAxyQzZ3l6Lo4LOU8naHUix6TzpNn8mQaTh4Prny0+tEN7ks1s382nKSGO/4v7D/NB7Z3gTA6yb3yVfMx3XzxqMqSkgLuvql00fjkzdf6NTThar1m/SzifYHCwLF1lRiNzllWzSyE18b7qL5pmXTcN288fbxECJ6Jh8vZ6jasAT+IgAbAZwDMAeWwR3/WxSyjV8AuEUpuxPAU4yxebDc7e4EACJaCOAtsCz1bwHwP7ZbnoFBSZCNpkaKIaPXWnaH78NgBANTuNYwVvT8l4vouRV9FMvnjsPs8fV6Dl4pVXXwPB2sWPbjZw9gly1uVzn4yaNq8ev3XYWJI2ptUb51/LO3LsCbr5zu1NO5yYUh3oMx2UwYWqfq6/NsxhcRJUaB6CYnPnuuOvjWGy7BKxY2AAgnohcheN+WBaHc5Bhjqwq9EGPsOSKapRTfBiu/PGCpARKwfOtvA3AfY6wXwCEi2g/gSgAvFtoPAwMdstHWSBHouz5UbXZOczBD9YMPo4PnT8A1srNKiQi/ef/V+Mpfd+L3649pr6XuS9wWd7/zGX81xzwnQNEISdb2kQhBlwNePld/jcHk+54vwgxBUTl4SQcvGNlpghnkHMlugOSDLxUaGGONAMAYaySiiXb5VAAvCfWO22UeENHtAG4HgIaGBiQSiaJ2sKOjo+htDlQMprE4cFAOzPj8889jWMz6FHt6vMEZz50962wfPXoUiURzzuOhI+aNjU3O9vr163F6XxSH2tJOWb7jXY7nlM/7cex4L9LplLPf1NSkrdfb2+e03XLaej59ySQA4ODBg0gwl6CfONGLVCrl6QsfX47nn38BO1qsaxOAk41NSCQS6E3pKfzZ1nZpf/3L63C8PoLenm40NvVi8xYrQMrmTZvQWBcR6r2MxhER+/6svu/evRuJ9v1QsXvnTmd7sHxrAJDu6cS42gjeND/quS91/8hh69s81dzsOdbVZaVC2bNnDxKdB/PqSyqVdLaffTaB1nM96E1b/TjX4y7iujrd93n/UeucNavXYHSt+2w3b9niaf/goUPutdJptLW1eu6jv+bSchN4P+gWPdqvjjF2N4C7AWDZsmUsHo8XtSOJRALFbnOgYjCNxU7sB/a6FtbLV6zAyFrLXaf2paeBnm6p/oQJ44GWZgDAtGnTEY8vzH08HnvYU9QwaRJw4jgA4PLLl2HxtFEYc6wVeHE1AOTU/l+3nASwKefzioV83o+nWrej+vRJdNrEeuqUycBxL/ddVV3ttP3LQ+uAlhZEIlEAacybewHi17nBUtZ07QKdOILrr78eePQRp/yyyy/HkmmjgUet53Dt8uXo3tUMbNuKqlgE4yZMRDx+GTp7U8CTj3n6UDusHmg/7+xffdVVmDW+HsM3JDB+wkgsWjwNWP8yLr/8MswcWwc88yQA4KqrrsDciSMAAH9u2gQ0nsTCiy5C/FKBZ7H7dPHFFwNbNgIozzMsFRKJBDZ8KS6VzXr5GbzzmlmIr5gtlW9N7wP278XEhgbE45dKx+o2JIDOTixYsADxZdORD2peeALn+6xFxKpVq/Czg2vR0ZtCPL4cTW09QMIKzjpq5AjE4ysAACfXHgV2bsPV11yLSaNq3ee1aDGwYb18X7NmA/v2WjtEGDN6DOLxqz3j0R/Pt9wEvpmIJtvc+2QAp+zy4wDEpzcNwMl+753BgEFbdxKr95/GqxZPzuv8bGLxWBFC1eqjqwnbjh987jjd0YuP3Lspv46VEWI+d8BfRC0Z2dm/XKTuDYPqtZC32pD3M4ILXHU04hjm+elVVRE973eESGorQqT0yeuBod5mVZSQTLNBaTnvh8S/6jW/pPyGPRYeGvc7jQ5efi/teh47Dm/rHiO7AWBFXyo8COBd9va7ADwglL+FiGqIaDas/PPrytA/gwGCf/ndZnzoNxtx5Eynb51jZ7uw/rAlavfM4cK+7oOMFMFNTgc5Dar1m48VvUp8BgrUfNl+7mOym5z9K6T8FGFlB/OOozqqopFdVZS0bnIi1NSgvKvRCLeid20C/OwK/J5tte2OZVTwYXXwhfjBe9tiAJ7e3YxzXa7qTg43bP2qj8+SmsmQQ9Xm3c2iwJfAE9HTRDTa3n4nEdUUciEiuheWkdx8IjpORO8D8A0ANxPRPgA32/tgjO0A8HsAOwE8CuDDjLG0vmUDA4t4A0BP0p/QXfetZ/CGH+vtNKVIdjoCr3F1ygW+CWSYd3PIGdmRdyJVIQe6sY3sfMK+WlbRzEvgPfvuBByLRhyDKb9npbbHF32cg3eM7GzLbLc/OiM7uaw6FnHK37t8tqf+UAIfm1KFqlVD4RKAQy0deO8v1uPzf3a8uOXEP/YV1XfgQR2BV16fci7agkT0ywHUAWgF8HNYhPZUQP1AMMbe6nPoRp/6XwPwtXyvZzC04CdCC4tsRFXMgZIPAfZbyUu24U7D+Swg1H02ICyy1Uhffq5h8jhZv5wgVyuR0CLktZAH9Kk++YRdHY04UhC/Z6WGouddVTl4nsBErSfeh3qXDoEH8MW/X4gv/v1CfScMABRGNPli3XXHA9p7LGPLjt6Up55YOcy3r1Yppx98EIHfDeDrRPQMrNt7ExG16yoyxn5Vis4ZGIRFoR9Rdje5Atv3mRlEN5ticvAZJi9KKhVWJDvC9RdOwLN7W3xF9BlpnOQBmjZmmLRPIKg+7vxMqU3mcmTDa2Lo7kvb5dmfFSDo4COENHP7GOEBzoX+qF1Qb5MT+MEc3CYs+stNjhRCDwCzx9dj/6kOALKIPqfL+ahyyoEgAv/PAP4Tlk86gyU+1735DIAh8AZlBeWwwtYhWw52WQefB4ftUy4ReBZcN6frlTvCRkjwdJq/fO+VAICvP7JLW08cE5WTnjG2TtqP2H7N2YzsxPCy9TVRdCctAr/9RJu2Dx4dvP0bdVQC9n5EFdGL92Fz+cqzqTI6+JxQyIJeJeyipGvUMDfxjS6qYD4cfDnhS+AZY2sAXAEARJQBMIcxlreI3sCgP5BvmNdsZ0nZ5PJp389wS6JCLLBuYPvKfrmNe3TY23wes8bVO9wqACEfvIVQ2eQUe4kpo2UOHkS2fj3YyE7UwdfXxNDa1Y1T53vw7p+/rO2DGv7WzYwWbGQn3lIm4y0D3KhphsCHI94FcfCKDl6E+D3KEe+s3zDzi1cHX76HGtaKfjaAllJ2xMCgEOT6EamTtfhR6iaYQq3o/SYGNfxpUN0geAzIKoqPAE619+AV33sOX3xgu1Su3mvUZ0YS708csimjhkkLBsDVeafT/s+YX5tfv746hu5kGp29/ra8KgfPrxPx6OBlNzltLHqlbdHIbqij1EPgGtd5RfTi9yiquFwbn+xQv71yPtGwoWqPEFEDEX0YwEJY97kTwP8wxppL2UEDg1wQljZ6tbNZRPQaMWsxkBbkzY6IPp8FhCK2rjRL/PYeK5DNy4fPygcYEBHosx8HrxF0AACmjK711OVtqIsndRGUEQzx6mti6OpLB07Gfjr4KBFSmYzsBy/Uk0T0Pjr4mqhrZDfUEWYMCnOTE8znIT8L8XvUi+jz4eDz62cxEIqDJ6LlAPYDeBuAbgA9AN4OYB8RXVO67hkYhEOu35CHS85mRV8gB+93TkpnZJfHAsLrEpZzE2WBNx+8nxW9yMG728OqvTwKb0ElyF41BnO4cq6DDzJyS6V9CLzOD5689eQ+yNcxHLyLUEZ2hbTvacPdEp+xzqMjjOrLa0VfPoSNZPcdAPcC+CBjLAMARBQB8GMA3wVwbWm6Z2AQDrnOix4DrCz19ZN0LtcLYUXvUviC2x8oKWctHby7H/VxkxOfl3hn1RpXAT4xqyJ1nV+8I6KviaEvlQkcN0+ymYh7vbSgz7c4eL0FdlAkO8CbknYoovQ6eJLaENuSRfTkOSfMx1lJOviwBH4pgHdz4g4AjLEMEd0FHvzawKACEJquBXC8uu+xYA7ep1wm8CywbhCyGZRVIhhjaO1Khgp0I96QeK+q/l2EqoNXB0UU0Q+3c8lzS3odVJG/K6KXFwukcPDyBB+sg+9LGQIfjoMvxIpebsNPBy+qjhzyHoqDH2A6eABtsAzt9ijls2EFwjEwKCtyDXTj5eD9hKcWZM6ycCM4jmL5weuCuFQ6Xth/Gs/ulW13/QLdyJHs3PIqjVUeJ7wqB68T0TtuctWWFfvZzj6EhWNkZ1vRM0dEL9+DXgeviuit6/cZDj4Q/BkWxw/e25YoQdHq4MNcoIJ08GEJ/H0A7iGiTwNYA+sWVsDyjb+3RH0zMMgZoXRkjHkWAtnooW6SzgV+p6Q0Ivp8iLNH31z59B2Nrd60vL6x6MVtkYPXEHjeRFqxPPT6wctucgDw9p+uzdJrF1Kgm0xAqFrNfXg4ePs+eg0HX3KRtmcBJurgRRF9nm5y3jqVL6L/NKxe/kw4JwngRwDuLEG/DAxygsO1haDwGZa7Dl7yg8+HwPvM2zIHX0QR/QCg8Fwsffc7LnfK/K3oRSM7t7xKI6Ln87LHit4TyU7WwecK3tUoyZHzLD94Hzc5QYwvwojoXYSyoi+kfdmIPhQHn4uIXp1bKp6DZ4z1AfgYEX0WwAWw7nc/Y6yrlJ0zMAgL9wMMt8LWRTVz2tJ8kX7GX2HhpzpIa6zH8oqUp+FOKx2cIM6fNMIp841FL9yPOGZaDh7cYC1YqsGD4RABw6rlePZh4LWit6+vcvCi9EdTBgA1hsA7UAlwUJ282ue6d8XYDlAC3WiM7MJ8V2GYjP5CTuliGWNdjLFtjLGthrgbVCLCfFyivpQj24erC1by7kc78dWHdobqV5hIdgUY0XvueyDo4EWRNkdQ/Hz+zLIZ2fmJU7U6eMYQJcKwqtwJPO9qJEKWVMiJRa9GsvNKf1Qjsel2uN3RdVUY6ghHu4thZMd//UT03nPCRbKrHCO7cueDNzAoDnwMq3TQhTHNhoiPiP6eFw6FOt/XTU5XnpeRXWVb0etuU7Q65/Dj4MU2JAIfYGSniui9roTWX4QIdYVw8CSL+61Y9F79LSA8F+U233PtLPzo7ZfhdZdOzbkfgw1BOnidWD3v9l0K78CXg8+hfY8GvtJF9AYGlY5cdGRpjYg+G8EX6Ug+xNPvHH2ymdyvUOl+8DrBipR9zUZQoBnehDhmOit618gu2NCCE2UioDYfDl6xopdE9EI9rQ5eaSsSIdy6eHLOfRiMKHWgm4hC30XIbnLFEdGXM12s4eANBhXCGdkxD8GR/OA15xQai94/kp0QqtamQGrY2TDw3HZl0XftgkPMvsYRZOvA2xCb0ono/QwuvZ4TzElXm0+aVifZTISQkdzkFD94zbkmLaw/QhnZFTB+rnscea4nGtlFpYWn9RvOil5/vXLAEHiDQQGHawvzAWY0bnJZzpGzyXl1+Nnga2QnGIK5HHzuUJPnVJCdDwA/Aq8R0Qfq4K1f8RlXaZT2fhw8Y/I4ZZhVJ0LA3InDcfWcsdluQ4soEdKSFb1/spnRddUA8pMYDBmEoIgFWdE7Rnb8cuHd5MJ8Vh4d/EAQ0RNRNYBFACZCWRgwxh7JtwNENB/A74SiOQC+CGA0gH+Cm8Xuc4Vcx2BwIzcrep1FdTYRvaxIzZWL9+fgNUZ2+fjBe3TwlUXhtaYGmsAwQZwtJ6CSFb3WyE6vg2dMLsvY8eP5Nd965Qy8dFBJhhMClh+83mjQ6o+7/bXXLcKymWNwxawxOV9nqCAcB59/+6qIXubg3fdDlsJwEX04I14R5RTRhyLwRHQzgF/DIu4qGIC8l6OMsT2wQuGCiKIATgD4M4D3APgeY+w7+bZtMPTgFwhM/DDFxCDOcXFH8z1KltDwEtTfvXwUj+1oxs/efYXP9fX9kiO0MW9fQsJrU5BHIyWEOt7/+eQ+fO/JvQAUK/oQ7ojZItnxFjyBbgB89N5N0j5jrvolX7F5NCIb2anNiPsja6vwrmtn5XWdoYJQOviCWHh/Nzn/WPTWb5jPyvPtDQAO/ocAHgLwVQDNKJ2G70YAB+z0tCW6hMFgRLZAN3LEOJ0fvLute/NESbAYd5zjM/dvC+yfH0et5+ADm9LCK46uLAqvPhZO3AFZLJ8rBx/TLAjcd8F7/qM7mqR9i4O39vONdcAD3fAhD4qUZpAdoZLNFDCmQRy8uCiMao3ssn9XleQmF5bATwbwdcbYkVJ2BsBbIIe+vYOI3glgPYBPMsbOqScQ0e0AbgeAhoYGJBKJonaoo6Oj6G0OVFTyWLS3dwMAtm3fjtrTuz3HewXR2wtr1uD4iaR0fN26dTg+3OIGu7q8IR7279/vbDc1NyPx7HPOvjgmfuNzplsvWujtc/uxdetWUGMM25tSWdtTsbUlJe2/+OJLmFDXvyY2Qe/H/lYriUtXV5enzprVq1FXZU2DuxtT6qkOnnvuedTGCN29vU7Zvr17kOg4INXbe8wa0y1b5UXXtm3bpf3Nm7fgeFMKqVQKiUQCu5r9r60Dv4+TJ3vR25fCgYMHAQDPP/esRBzU/aGIXOYO/vyaTzV7zuHf5rZtW0FN+TmBnbfnimSyD4lEAs2n3JDJPcL3eOzYMSQSzQCA7aetd2Pjxk04fyhYYH2yqUnabzl1ynMf/TWXhh2hh2ClhD1Yqo7YOv7XAPisXfQjWBIDZv9+F8B71fMYY3cDuBsAli1bxuLxeFH7lUgkUOw2ByoqeSx+uHsNcO4cLlq4EPElUzzH23uSwBOPAwCuuvoarO/eDxw76hy/4oorMK/BiqhWtyEBdHZK5y+YfyGwyyIQEyc2YMWKxcATjwGANSaPPuxua3D8XBfw7DPeAxQFYBG/xYsXI76gAV3bGoHNGwPbU8F2nwI2vOzsX3XV1Zgxri7UucVC0Psx4shZ4KUXUVdXJ40XAKxceZ2Tza1zayOwZaO2jeUrVmBEbRWqXngC6LWSwixZ5H3ezS8fBXZsw0ULL3bGEQBmzp0PbN7q7C9esgTHI02oOdeMeDyO5M5mYNP60PfL7/X5jp2INB7FzJmzgX17sSoet8T+wjsx1Al8LnNH0zrr+U1qmIR4fKl0jH+bS5YsQXy+TmOcHf+1aw3Qeg7V1TWIx+N4sHkzcPKEdVD4HmfPmoF4fAEAILbvNLB+LZZeeimumDVWen9VTJjYADSedPYbGhoQj18q1emvuTQsgf8ggN8Q0eUAtsOKQ++AMfarIvTlVgAbGWPNdpvN/AAR/QTWIsPAQAsusvMV0QscvOjSxJHVil50k0M4a32pfZ/qaUkHH1w3CJUeyS7IJkAW0fvX401k94PnRnay1KStW5ba8OhzblY4/2sHIRqRrehVLcMQp+0lQSEqXM/zEPbTWXTwqreKDuq3NxCs6F8JSz/+KgBdUJI7ASgGgX8rBPE8EU1mjDXau6+DtbAwMAiEr7W6oJDVx6J3t7Wx6JVgJX7JY3JFJqMh8EUIdFNZ5D14YpSs6IMi2dljLhN4jZscvPUAoLVLJfB2qFpuZJcnJY4QoSeZwX8+tc/OBa9a0RsKnwtKHejG4yYntJYUFoVSNEL7Ny83ubx6WRyEJfDfAfDfAL7EGOvMVjlXEFEdgJsBfEAo/hYRLYU1poeVYwYGMnx8nzmSQrneij74042E5OAzGaYlFH4cterKBeTHwVd6JLsgiYc4ofuliwWEbHtCU7FI+EA3rd1yrndmBzxyQ87mb0XvbBtiXjBCGdkVMMyeSLWSAa27LalVyHvcDx43uTK+E2EJ/GgAPy4FcQesJDYAxill7yjFtQwGJ/gn5EtIJQ5eky42y4cr0Wzmv5BIM4aIZoIKMzEw5TcX5Ho//Y2g/kgRwwLsAvk9iouFWA6Bbs6pHHzGzSYHFOAmpxHlGhQAhQDrq+Q/0G6Am+DriASevxthpGueSHa5drCICGtmez+Am0rZEQODYiAMp5zNTU4HWQfvH8nOj/DnItrLx8Wt0vPBu/ppf7c2dVuFNptcDslm2hQC7/jBOyFn5XbCGsbpssUZ5I8wo14QB89F9FmupAs3HGqhLrhelhthOfiDAL5GRCsBbIXXyO6uYnfMwCAXuFyb/rhoZGclm/EX0eu+TTWbnJ/I2Y/Ah0ozKbTvXouFEvF5465XFoJskyQRfWAsevtXeMaxHJLNeI3smBOqFvCK12N2nvdsEPtcaaqRgYig952PbiH0ky/kVE5ehSyZ4X7w2dtPZyy7jgyfcwaAkd17AZyH5Sp3rXKMATAE3qCs4Ktxvwk2KYroM14CKBvZec9XCbzfvO9H+MOt/O1foXeMheNWvJHsKovQZHykE6pRWnA2OetcSUSvWRDw9sLp4N1Qteri4jO3LMBXHtrp2x8OmcBnrW6QBaWmhy4HL++rkEX01m9YEb31DrLA9vsDoQg8Y2x2qTtiYFAIHDeWECJ6MaxoWMih6JmvVbiYPEZGKCG99T9TS7JDl1ilkuCnMlAJerCI3voVn11wqFr5mh09ciAbnpOAG0WqnOPlM8fg+29eio//brNvn7L12aBEKIaRnSZUrVxP4ybHsqu/MoxVjF2GySZnMCjgJ5blUN3kcjVKUy1t/RYIvtb1uXDwiog+DCrdit4vBa7KgAeJ6Bnz2k/o3OQcK3plDJJp7xgFhaq1pAu+3RH6nL2OQXFRmJGd9znrIL9aXETvtd9RIbpeumeWB2GTzfwg6Dhj7KPF6Y6BQX5wRfT64+LkntYGugn+aj3JZvw4eD8juzyt6MOKfHM1Guxv+C04vBx8cBt8fC+YUI8DLZ2YPGqYpk3rV30WfSl5lZGxF2p+bnJh88QbDr7/oHNtK7yN7CJ6Xpch++I5k1EM9AaADn6xsl8FYIF9vj6upIFBGeAnOhejmunTxbrbOu7Aq4PP1Yo+hJGdw8ELOviQQnpPutiKI/D6cg+BD+LghXZef9k0fHjVXG093mRK4dj70hlMHT0Mv37flbjhu886fvB88aZa0ROFs6Q3BL7/UZCRneomF0JEHxEofLZFt5eDr3wd/Cq1jIhqAdwD4Plid8rAIFc4IvqQOniVcO5qbMfY+mpMH6uP3y5/ol4RP0dhHLxGBx+SUOcauKe/4a+Dl/cDA90EhIMV4RrZefUCsSg5xzOMKaFqdRy8/3WcPleKT9QQQiHBYxzdexbCqxOz6+YOFaLrpXW9/PpZDOStPWKM9QD4GoDPF687BgaFwZezVmLRq3P/nX/ahuu+9YxvuyJ3x1juIvogsZ46AeQVqtYTiz7nJkqK0Bx8FiM7Pr5BCwF+RBclMBZxiTaXxPCJXCXUEaJQhCTfELcG+aMQoqk+Lr9PU5sPXiP9U5EW1D7iueVAoeYhEwAML0ZHDAyKAX8RvaCDD7EKVyGu9oP0cDqiAoSL5KY3sgvXP6/RYGVReL/x8iRmCZiRRNVI0ELAz8gOsKzuIw4HD1lEr7EHCCN+N+Fp+x+FjbhsPe8rXdJGssv+TVqLRu/1yoGwRnafUItg5Yh/O4BHit0pA4NcQcKkrYPIWQf5sVttBZcx5pUAcORjvR6JEJBhWiO7sAsRrxV9zt0oKfzGReWagwPduOMexDU76hqNy6IlohfaY/7Z5CwdvO9lhD5nr2NQXBQzFr3fJ6t7xcK42Ir5DcTrlQNhjew+ouxnALQA+DmA/yhqjwwMCkBQjHixThCHqzukWtH7x7zPXUTvcvBeHXxYQu2978qi8H6hanMS0cN9jhrvOE8bOg4+FnE5eO7y5BfohsKK6A0HXwbkP+aukR3nyrMvPkURfXYrekVEn3dPC4cJdGMwqOBv3R6cLjZbG1KgGxbk7567iN6jE5Qi2YUj1N5IdqFO6zf4STw8IvoAYilyT4F6bx83OcDymxdF9OkAIzvK0p8wfTbIHWFe3eLEorcQxj7EVdFll6l5rOgHmg6eiGJEZHTvBhUDXSISESJnnU3Mpjum6uD9CK+vDt73aoJ+j/HrhztPROW7yfl1KLyInjHXxiKMDl5vZBdxCDp/D8iHg8+wcPp1Y0VfImRfw+UFx85D4Mq19UQ3uYhbl/ksVjksEb27X043uUACT0Q3EtGblLI7AXQAaCWiR4lodAn7ZzAIcaq9J1QSj1zACYhfshmRwOhi0YvQffAyB898r+PvJud/Rc6NOryB6Acf0NFUOoNT53sAVH4ku7DdCaKV3G8dCCaqTqAbXx28y8EzgYiri4awWcGMFX3/oyA3OYWD9/s2RdsKMZBWNh4+k2HSO1HJHPydAKbxHSK6EsDXAfwawKcBXALjJpc3uvvS6O5Ll7sb/YpT7T248utP4a4n9hS1XS4CDmPdnmb+fux+bagTSu5ucv7X48TKsaIXDwac95fNJxH/dgLdfekBE8nOO5nK+2F18MESen8OvioakaynM4w53JlqwS9a2AfBWNH3PwoacY8O3qeazk0ODO3dKZ8zLGQYK6veXUQ2Ar8YwLPC/hsBrGGM/ZOdIvajAF5TaCeI6DARbSOizUS03i4bS0RPENE++3dModepNCz60mNY+G+Plrsb/YqWjl4AwFO7ThW1XU5AfJPAePLBB4novWVqLPpc88EHUWpVRC+5yQWc19TWja6+NDr7UppkM5VF4cMKbLJb0YcR0bv1VVh+8O54B4WqzYTk4I0VfXHB390g0XZhfvDhOHj5HF4XWPntZwLrcrWPY8yXb0eLgGyv5mgA4ky8HIBIkV4GMLVIfVnFGFvKGFtm798J4CnG2DwAT9n7gwqWNXe5ezE4wMcxTJ72dCaYw9Ub2bmfaV8q46trT2UyWqlMoB881+85dcOJ6LuTaac/3kh2lYWwxofZAt3wdgL13vYhPw5e1sH7+8HzvN7ZYIzs+h8FJZvhvw5XHlxP3Auj+mLMqu1mq6tQHTyARgAXAAAR1QC4FMCLwvERAHpL0zXcBuCX9vYvAby2RNcx6EeUyuAkFw4+m5Gd3k3O3V53+Cy+8JftbntC2++4Zx0u++oTmv75Xk5y2wLUZDP+J3b3WXqJZDqjiWRXWSQ+rEQhKNCNmGwmjJGd7l1QdfCSH7xCzEfWVpV1cjbwRzEi2fG5KMyrmcv10oyBKFiN1F/IRuD/BuBbRHQDgG8C6IQce34JgP1F6AcD8DgRbSCi2+2yBsZYIwDYvxOLcB2DMkP0Jy0mHALv064nFn3OHLy8f/Rsl7OtSg04Zy0i0MjOIxoWzvPvpsLBq9cLOLEMCC2iD8nBBwa6sX9Tulj0ghU918Hza4rc+h8/eA1mjKsLNUlX2mLKIBhqHvgwT88V52eva+ngyTXmKyOhz+YH/0UAfwLwJCzL+XcxxvqE4+8F4GVXcsdyxthJIpoI4Aki2h32RHtBcDsANDQ0IJFIFKE7Ljo6OorepopSt18sFGMsjp23Jt2OzuKOa2tbt9X+iRNIJE57ju8/4L62O3buwtlzSW07iUQC3T1eodSmjZt8r/104llPmXpvu89axJjgnVD6ei1L+N27dyPRcQD7D7t9W716DUbV6GeIw8es89asXYfDTfKiYvOWLcicDBvHqjgIej/22vfU1dUl1elL9kn7HX3+M+j69etRZVPc3bt2YuS5vfprnbPGovmU9z1oOdWE1S+cBQDs238A7e0pVCU7kUgk0CtY3Z8/tAWJw4RDbf5GsLzfW5tS2nK//aGIXOaO3cetd6WpqQmJxDnpWGeXtbDesGE9Tu+L5tWX5mbr++7stJ57c7P1Hanf5o4d21HdYpGi5k5r3tqxc2fW9ru6esBi7qL+xPHjSCRapDr9QVeALASeMXYawEoiGgWggzGmvu1vhEX4CwJj7KT9e4qI/gzgSgDNRDSZMdZIRJMh2wKI594N4G4AWLZsGYvH44V2R0IikUCx23Tw6MMAULr2i4xijMX2E23A6hcwrK4e8fj1xekYgO/tWA20tWLSpMmIx5d4jm9N7wP2WQRh/vwF2Nx+DDh31lMvHo+jevWTQK9M5C+//DJg7Rrtta9dvgJ44nGpbOXK6yUus+bAGWDdS1oKP7y+Di3dnZg/fwHiV0zH/ucPArt3AQCuufYaTBxRq73uvcfWA43NuOTSy3FyeyNw8KBzbPGSJYjP71+hV9D7ceCFQ8Dunairq7Pq2O9+VVW1dE5bdxJ4+nFtG5ddfjmqohFg9fNYfPHFiC+erK03/PBZYO2LGD12LNAiT6wzpk3B9SsXAk8+it/tsRZ986c3IB5fhp5kGnjCMjFatWoVAGD8iTbgxRe01+H9bt9yEti8yVM+0L7vUiKXuaNl/TFg+1ZMmjQJ8fgl0rG6DQmgsxPLli3DxVNG5dWXv57aApw8jvr6esTjK/GHExuBpkZUxSLoS7lSn0WLFiO+sAEAcORMJ/B8AgsWXARs2xLYfnVNDYYPq8KZ3i4kM2lMnz4d8fhCqU5J6YqAUPafjLE2DXEHY+yswtHnDCKqJ6IRfBvAKwBsB/AggHfZ1d4F4IFCrjPY0NjWjVl3Poxn97Zkr1xB4DrUYlt5Zw10k0OyGb0Vvb+cTWc5n1TEw65lsK5tu44mXWyQ/LA7aV2jL5XRuMlVltjYzzZChc6oLRZxdeaODj4wFr11LLHH+23EIhGPyLTatnLUXTuMeDXsvRkUDwUZ2Xnc5KznFwtU+wS71IngVvRqzPtyoBIcPBoAvEBEWwCsA/AwY+xRAN8AcDMR7QNws71vYGPLsVYAwH3rjpa3IzmCE1rxQ3lubwtm3fkwWs7nb6+ZNdCN4iYXNCfriGOQLjapCajicVvzP93rJieGqg04r8e21k+mMxo3uYAT+wm/XXsUs+582DIC5AscIsVLQO6obpzdOAGu7UQYNzkdqoRkM2IZoNf/h7GQL3bQJgN/qBbw+UB1X+PvlErgxT0nQVGIZ51hcpjjSg50U3Iwxg4yxi6x/y5mjH3NLj/DGLuRMTbP/vXKU4cQDp/uxKw7H8bupna7JLwFaCXBmQyFft/zwiEAtvg+T3CGOUwIWctNLoiDD3aTU6Gb4FUXrSDC5CSbUer69YWjK2npfnVucsWkOZkMw+IvPYbfvZzbYvIbf7PUDF29aak/QQRRNz4SB++4yflfN0jaEhPSxXJU2Y3ppAJ8cRE0SRsC3/8oSix6wV0SsN6NbNfr8+MgBGQylhW9uxipXDc5gwrBYzuaAAD3bzguleea17zc4JbNOlewQr4Dh4P39YOXk834zcn//H8bcK5Lb4DnB521tppVTr3H1y6d4mw7oWoZr+ueF+gHb3PwfenSiuh7Ummc70nhiw/syOt8BtktMUxUP31ZWDc5//arhEA3TlnMfxr0S0Qjwu+dMygdiiOit375+xgoouf5DcIQeNtNzojoDUJDzIAFlM7dLAy++/gefPRef6vyIHDCxxjDukNnsfwbT6Oj1+JECwkY4gS68fWDd7czzH9Z9LftTdryoL7pUsSqRF+t8Q+XT8PEETUAxEA3TPrVnSeix9bBf+DXG/DcPlnfXEymMpkqbAGWTMuRA4OkEloO3h4gK3Z8dgIfNPnHhEA3HNWBnBvZ1/OtEni+Qe4I5bZWCAfvRLKTF9ZVAc+RP3+/AFciLBE9uRKhoSyiN9Dj3T9fhwe3nHT2VXGSy9P0P/7r6f1S33KBSIC/+ehunGjtxo4TltqhEALvxjr3u67AwWfJB69DUNd0H3220LEEl5N088FD+gWAlvO9uOG7CcuKV4Hob3+wRT1evDejN81d/Ahv+8lLeHhrY07nWzp4d18k8Govg3Xw7rgGRZgLelZioBuOqoDk8vzZBIlZb1s6BR9edYH/RQ3yQtBzLIRmqhw8fwvVd0q8Pl8M5CWir9RscgblQ2JPi8Qlq4ZYjgXoABMPikZ2/LUPk0AkG1wjO38dPJ/I0yz34CRBi4/P/Xmb93oKV8/3+MceESYAN5ucFw9sPoGDLZ34xZrDTtnq/afx7p+vQ2evf9KLYnLwouvQmgNn8OHfbgx1nivWlEX0QTprHSGNCUZ2/NRADj5QRO+d8oI5N38DPKd/0Qg+euM8/4saFB0lMbILWOjx6+mkdSp4shljZDfI0HK+F++4Zy3OdubmOahOeLoJ0BXJM+U3j46WEZyTzmhEtmHEX37IFos+w5gzkYvW2GER9JGuO+S1//Qa2fGVGW+PBPEv6etCn//8g/+3AYk9LehN+XMTxXwvOIHPVdfM7yOZcTl4K2FMbtePCkZ2mRCLwSDir5vEgwi8l9vTQ7dwMKhMEOSHyt/qYDc5C+F08FLzRgc/kPHQ1pP4UeIAAMsa/Pl9p3Gv7brW2ZvCh3+7EafaezzniZN4Unlp1H3Aq4PnBKQvncHH79ukFeHy63zpwR3YcKQynBAcDp557Qh09x0WrgW6DwefZqi2janSmWA3OR1ylS6kPX7w3vY4TYgqAyHWTWW8BC1MApRihk/lYskwk5sOKUEHL4abDQuHgxeM7PIX0XunvOogIzvFADJbPYPKh0p4+bsZUxZpkoje3kmGmDgYrMmtEvIYGAKfB060duMzf9yKvlQGd/x2E775qBXOUDUAenDLSTy8tRF3PeENqSn6Toch8KoOntdZd+gs/rL5JK7/dgJ/2XTCc14qw/CLNYfxDz960XOsHEhnvESMQ+dPHhbZRPTpjMvBi8Za4ZHbx6rei8LA2+kkbQ7e/gr/3wM70JNMa/XVIlcaJv94MQU7nIPPV8Ai+sFnGJMkAWEeg6iDDxOLPoiDr9KcF2QkJ471J26+EL9+35VZ+2tQ2VBF5/y9Fm0x3nnNTFw3b4Kzz+smA6RmHJkM94OXzy0HDIHPA1/48zb8bv0xrN4vx7p29KwhHqhIiFS9jo7QOdbnAXU+/rvNnrJCuOJSQLxX1fikkL66bnL642nGnIk8W7IZHXLn4OULqG5yRO5EIxKkh7Y2Slb0vB2RGwjDGRTTNqMvxKSmg8P1pBURfc4cPFet6Bc8KoKelY6DDzKycxLTgOGjN87D0umjs3fYYEBANVTmC8kRNTF85bZFkurGEdGHsqLnRnaytX45YAh8HuATV29Kjt6b0YhT/SCGMlXDmupEoVxMyhQOPhvynZzzxa9fPKzVSXMEharl99TWncSXHtyhzavuhzCBbvhEnsnkTmRytfD36ODtX/Fj502K4maCzNXyxyyL6LNfvxQ6+HyRyjDn28hkIOngwyxEXB08c8YjWIoRwMHrdPABInrXmFXeNxi4cDl42VDZWUgGnBNm3nWN7GBfp7D+FgJD4PMA1wkeP9ctlesmcT+InKzKwetcMbhoiE80YfWhpSTwOnH4/3tgB970v/7qAClUrTJMfBx+vvoQfrHmMH714uHQfeEfqa+IPu2K6NMBfvB+yPaRfv5VF0n76vNR6ZhsZSsTfbFqviL6YurgewuUAokieqaI6MOAG8YxhAuKFMjB52hFr+r6jap94MPv3eGvhm7R6YjoQxrZiUa0xshugIFPOAdPy4Zt7io/extiIJQgET1/2TjR58f4r99E/sK+03h8R1Mov00/MMbww2f2o1ljJGj1Ife2ufGZrtu8r/XVVpLDxjb9dXXgdN2XwDMmBUwpNgdfUyV/Sn5W9LKI3toWmUpSWPi0RioUxqCrkjj4ZJoJIvrs8bxfd+lU3LjAzYQncvD83GAju9ys6IN08OplConVYFAZIOU3E4KD50xbGDc53rbzqphQtQMDTW09+OID2/HkLitzbbNCgMSEGtkgviiqiF4knF08HKk9yXK1QFIh+Cr+8Z61uP3XG6TJWVUpZMOOk+349mN78Infb9YeD1o8/FEJqcuRdGwJmGdly+9pRK1F4Fs69MlnHt/RhA1Hzkll2QPdMMQihGjETnZSTCs0eLlAv2Qz4j07PtYKFRHP1Ong+92KPm8dvPWbUozssvXte29einvefQW+9Q9W2t+YqwgXYtHnp4PXiuhDRLLLxb7GoLLBF8iOkZ39egf5wfMP18+KXn3nTKjaAYgndjXjVy8ecSa8tm43Zrk4oT+2owl7ms4HthUoohcm1PM9dkIRm/jx8KRhfcZFInymw/LPf2jrSew/1ZH13B47UlqXjy48yKL0U3/Yoi0PsqLn48D9u/2yy93+6w34hx/Judn5cDS2d+NnLxzyENhUhiESIUSIu8llH793XzvL2c7GNatEQpVueC+n94MnkDYojFgnDBdZCiv6XOG6P7pGjZb0RKgTcL5qoyDmEAh6HIGharUi+hCLBS6dK+t0bVAMuBw8X7zZi0bF3kJERFisattUvkmy/1nHCuxwATAEPgd09MiRw852uQFtkumMI4Zdd+gsXvn95wIjdoki+iA3ufYeaxGhcvBhJ12xHg/Ac8dvN+Gmu571PYcxht+uPYrTNgftx+GoHHyYgD1SJDvlxeft8RCsp7Okj31gs+sWyMf+2NlufOWhnfjbdjmcasbm4CNElptcYMvAR2+Yiy+95mJnP9s3qhIJLwcv70sietHIjhQjO81sE0YPXFQr+gJ18KmMooMPuTjlCxnJij5EspnASHY6K/oAIzujgy8DiixdU0EKa80/lTBqHz+1pOdMUe1mrOgHBtTQoGLEuj4l3jYQTIRFDpy/NLsa27Hu0FnpGE/Ewtt6ft9p7D91XpvBDLAm0D+sP+Zpm7cVZuLfeLQVn/vzNnzsvs0AgBqfCfA3Lx0NDNgjxkrnCNLBcw6eW8+3dgdndfvYfZvR1WeNj9rcU7YaxWk7k0HUIfDZOXhVFJeNa1b1uKqExY1u5Rre8CbFtntTGfzuZff5cY5BfN5hRPSVpYPPTUTPoefgw+jg/dusq456yoJ18CqB92/80hmjJamPQWHQjTR/cwp5vz2BbuzfwHfK/tWpRMfUVWnrh42CWEoYAp8DOhQC3yqkFU1qcnIHcT4iMeTE4Nb/fB5v+t8XJdH3M7tP4URrt9TWTXc956t7/9nqw/jXP2519sVwpp29KUfEHwRONPm5fhz8fz+zH0/vdgmper/3rj3qIQ4u4WO+fvCuasA/1joHXwyoY7/zZLu0n84wRMnSwWcy2cOlqqK4rKFKVQLvCXRj69KFMjfQjVv6g6f24YywcOTPQHzeYUT0pYpFnwtcy2PFyC7k7Oxy8K4ePFy6WP9jwzQEPkyoWi6BCRr6P39ouST1McgPpU6B7bF9Uzh43fX5O8UX2vf/8zXOsU1ffIXnvbD84OXrlQOGwOeAoOQeyTQL1KWrSGs4eOc8Yf+/nt6Pm777bKhodwDwe4H7U/vQ0ZtCZwiiqXKfovj5mT0yZ9wp6OdVnfzXHtmF/3p6n1TG71tnQ6AS+J5kJqs7ILcPUC2z2xTuP51hdiaxcDHV1QVUVgIfUzl4n35LFvNcB++Wqa6XnMCL4xBOB19BInohVG1GFdEHdFPl4JnAwecbyW5YlY7AZ2/L+MFXBophmO64pyo6+OB88NYvT50czZJ7QBfvohwoO4EnoulE9AwR7SKiHUT0Mbv8S0R0gog223+vKndfg4hjMp3xWKlz4qonZv5Gdipx6U6mPYuFFw+c0fbj1HnZsr9P4uDToYLHtCvEkX8Q3SmG9/z8ZemY+FHoCMHJVrk/fCxSaa8/9OoDp3Gus08S7Xdm6S9/JirNPtclJ/xJZxiiEUJVNCKJjP2gEuhsRLUqSqiORnDFrDHO9USoaX6tULXWdpBfO1/siO+QKEpcOHmk9rxicvBBSW3CIJXJOBITK1VvuPM4MeWLJ1ESEDRmQY8qVw6eX8dki+t/lIowqqJz550SbD38wD2e1MWAKo20rOi5kd3Q1sGnAHySMXYRgKsBfJiIFtrHvscYW2r/PdKfnWrvSeLedUfR1ClywP7EpjeV8RA47sql4+RTkog+O3euTrK7faz0z3XJxFkilr0pX4t4ESqB522c7fa++SKx4atbEarOnxO+ZDrjuc/tJ9rx9p+uRbegRlDF9Cqn3tnriujFpCG9qYy0mEnZIvq66ii6etNZiYy66Mr2iVZHI9j7tVvxvTcv1Z4fFOgmiBt1RfTumIjzxSMfuw6vuWSK98QKcJMTz3d18PLiJ6iXfFhG2m6TXX0pbVwAFTnr4LMkmzn8jVcbAj+I4BJea5/PUdXOQtI/Fwj/rj36eo2IvhJQdgLPGGtkjG20t88D2AVganl7BbR2JvHZP23D/laZQPohmc6gV9Fvv3jQ4rJ1E6Qsolc5eE0kuzzFpO2C5X9nX8pDMFu7+rCrUdZXq+JtTijP9nj7wBjD6Y5e7Gs+r+Xg1QmcfyCpDNPe087Gdokwq2OuXoPfT4a5hICjtdvl4jkHP7wmho7elL8I3Yb6TDgxHlkbw0dvmOupz7lAbvHtDXRj/Yqr+TAcPJcKSXETlL7pCFQl6OA5UhlRBx/eyM4dc8uIqaM3HUpEH2S1XBvLjYM3GHxwdeOubQcAjKuvBqD/dtRQtZyDv/aCcdprRKgyHCpj2av0H4hoFoBLAawFsBzAHUT0TgDrYXH55zTn3A7gdgBoaGhAIpEoSl9ae60Heb6r12mz+UyXb/0nXliHLUf0eeAbT7V4+rWtxSVcD7ywFTUtu539Tdt2eto4fbY1ZM9lbNm5x9nevf8QqttcHX0ikcDnnu/CyU6GX9xS75Rv3yu7p50604pEImFHlpNf201bd+Bff9eL80ngq8uHea7f1NTk3Pv+1jQOHrfuO51h2N/U7qkPWOPF8dyadTg+2p2UuxUpwbqNW5A+EUMqnUZUIdpPPLsGM0Za57Z3dOEs60Kql+F4cydau4KJ1snGRiQS7uu2evVqAEAqlcKxo0c89bds2oBzB6Jo77X6t2vPHiS6DzrHd51I2udbvxs3bkB7m/W+NDU1wg/nOy0Vx/GTjUgkzgIA2trd9zCRSOB0s9edcO++fUj0HQ68x7A4fNTbvu476+jokMqTSete9+4/gEZbEpZOZ7B+w0anTiqV8v1mdzRZ70pLo/XObt+9D3VV1vv30po1GF6tn0Lb+9x35KYZMTx51P3WnnvuWU/9DS+vxZFhMpEPM4+EnWuKNScNZKjvRhB2H7fem8bGJukbBICuLuvdX7fuZRwfnt/C7Ig9T589dxaJRAJtbZbdy7nGo04dta+cIWs7b8UP2bD+Zfz8lXUAuq26ytzT1X4OXd1W2aFDB5EgOfBXLuNRCCqGwBPRcAD3A/g4Y6ydiH4E4KuwFlhfBfBdAO9Vz2OM3Q3gbgBYtmwZi8fjRelPe08SeOZxUKwGTptrnwbQra1/1wZ/n+0Ro8YgHr9KKkvvagY2rAcAPHIoic+8YTnwaAIAMHnGHGDHbql+bf1wrGqowchhVXhg88nQ9zFhygxgr5WvfszEKZi3YCLwsnXdeDyOk48+DAC4/OrlON3Rh9nj6/G301uBw+5CIFZbh3j8evxl/+MAZO5+zrwLcX7rNgDARYuXAqvlOPTpmlGYf+lSHGzpxL8/ulY61uOjLagdPgrVrW3oS2cwf9ElWD53vHPsTEcv8OSTzv7seQsQv2wa6Im/YeKYEWjuanOOzV14Ca61z61dn8CkhpGo60mh5XwvUhn94oJj7ISJiMcvA+zxuW7FCuDpxxGNxTBv7hxg/x6p/rVXX4m5E0egtasPeOYJzJ4zF/EVs53jp9YfA7ZtRVVVFZBMYtnly/BY807g3FlMmzoFOH4UOrBIDEAS4yZMRDx+KQCg6uVngE5roovH43iqdTtwXF50XHCBfP1C8MjpLcAxeYLSfWeJREIqjz37OJBMYvqMWUif6QROngSIcMnSS4G11nsSi8W0bQFAz/YmYPMGLJh3AaoP7cXEKdMxcWQtsGsnrluxAqM07kmA7b769BMAgOnTpwFHD3v7bT9XAFi5/FqrXaE8cB4JU8euN66+Onu9IQD13QhC88tHge3bMHnyJMTjl0jH6jYkgM5OXHnlFZg7cURefdma3gfs34vRo8cgHr8a39uxGmhrxVWXXozf7N4EwPts0xkGPP4IqmuHAZ1duPbqqzFjXJ1zPPrUo0DGndBmTp2E1mOtQGcnLphzAeLxC6T2chmPQlARsikiqoJF3H/DGPsTADDGmhljacZYBsBPAPRrImYuyusT5DWdvSmMqMl9TaTVwStyoKNnXa6MB7cR0dWbRk0silHD9JOaH3hwnrH11bYO3tpXJZxv/+larPpOAowxj4i+yxHRe2VXom2AagEOAOsOn8U1//E03v7TtZ5jfujuS2P8cEtcpromqiL6TsFNbniNKqK37qO9J4mTbd2IRQjDa6JoatMv0kR4rPeF8dJZ23IxL9fNeYK5qDp48g9VK8IR0QfkLtCFIC6mo5Hu/T3Rmn0MRXsLPxF9UFwGPiwRclUrTqCbgJlLHM4wglJVRF+sYDY/eUUdXvzsjcVpzKBo4N+bk4Lbfgf5nKODG8nO1sErnhevvVS2g6mvjnl0/eVA2Qk8WaNwD4BdjLG7hPLJQrXXAdjen/2qilo+06JNWmdvGuOUl0AlKjrosnGpk/RhQfzf3u3V9R883YnqWERrBRyE8/ZiYUxdFTp7U45+Ww3ZufW4xfl29qUlAh+NkGPJfU5D4NsEoz5xkVIIOvtSGD+ixtpWCbxCbLp63UA3IxQdPLekf9V/Po+eZAbRSAT11TGPIaIOvtHWWHBGMv7rTRcb4AcfaEXv9YP32iFoCHwBRnZtXUnpuepsK5Z/4+ms7XB9ZUoIDRwm2QyHGMq3viaKzt5UqHzwYVyUdnz5lc626OK46yu3YMeXb8naNz/dq4iqCAUa8BnocWGDxZlfMWtsSdrnhPxMpyV15e9U0FzO38U+RQfP8dXbFuGPH3R94+tq3Hl6qPvBLwfwDgA3KC5x3yKibUS0FcAqAP/Sn50iItTGIs7E2mdbyY8bXiPVC0NwT5/v9Ri3qUZeh4XMdOc1HDwAnO7o1frxBoHHsh9TV40OwYrej2s835OUCPziqaOcc85pjOz2t7gx7YtF4BtbexyDl7OdfXLEwJSXgz/fk0Q643LwY+urQQQ0t1sfMJcsRAioD/iI4/MnONtBfvBBCUtc7kDupxrJTmwzTGQ6sT1OOHk/ejQRAwsxor/kK4/jkq887uz7BUfye085UgIHLy44RPfIMFb00QihvjqGjt60a+QU4LtOwqzmV6u+Jua0Lz7PYdXRrN/0xv93M37+nisC6xjkj0tnjMFLn70Rb1w23XPs+gutLIOjhvlz29kwwWYeTtu5ORwD2FBpvq33T/1mY9EIRgsqo/rqWFF89gtF2Qk8Y+wFxhgxxpaILnGMsXcwxhbb5a9hjPlbIpUItVVRnE9aImM+mXHCwxHGwvhEazduvus5qczDwQsE/rCPMd+kkbVaNx8VE0e4i5DzPSlECBg5rAqdfSnH5c0vqMP5npREUBdNHYnuZBqMMa2IXkxaczTACFFFUEjPvnQG4+2F1L8/vAuXffUJ6ZiIzt4UFn/JIkYjbfXFKxY2YN7E4dh2vFWq29qdDFyl/+Ctl+Jbb1gCwD9QDQOctLMiqh0repvA+1nRC2W6QDd+ENtLpRlef9lUbPh/NwPQhwQuRja5M3YuAlVlwxGUsEiMOZ9Ky5EDw6bcjAjjM7wmhs7eFM509mF4TQw1Gmt49bxsuGFBAwCgKkvQEhVj66sDr29QOCaNqtWWf+5VC7D6zhscIp0PJgy32ubvddg030Tuu6ufP92yuuqoEBJ3aPvBVyxqq6JYczKFq77+pMMFzpkwXKqj4550ONHaLemTOQH5zfuvwqhhVTh0xiXwm4+1Sud+8x8W44XPrMKXb7s4Kwe/dPpoaSV5vjeF6lgEI2pjaO9OOSJvPwLQ3p3E2c4+vG/FbCQ+FceU0ZZl/JnOPnRpvATFhUkuHPyiqaMCj48fUSMRvm4lbS6HKBkZU1eNxKfi+Mpti3Dp9DHYdKxV4hxbzvcGcvC1sSgumzEGALBk2mjpGO8KY0yvg4+5QS2iEcop2UwYgpRSRPQTR9Q67mO64EXF0MFf/u9P4siZTk/QII59AQQ+Kbn1yYGFwkRTBOAMeiRCqK+JobPPMpCcmGVyDzud/vfbLsXzn16VNVOgQeUgFo1g6mivt04uUBcHYb+VCJET6EYndROLxHlmSHPwlYzaKmt42ntSOGITrwsbZAKfS5QvMYwsnwDnTRyOyaNqJUKp4pLpozFtTB1G1FahNoDA3/tPV+MPH7xGIhjne5KojkYwedQwNLZ1OwS+TxGbcpxs60FfOoNJI2sxa3w96qutF/WAz2Te2ZdGhIDpY4ehqb1HW0cHXYIGEcsvGI8RtW4d3rZK4MXgQxECZo2vR3UsgstmjkZrV1IiQhaB9x+/WIQwd+JwPPrx6/DJmy+UjnER/JWzx+ozkgll0Yg7EXBwInypvYAYNazKWSiEITDdybTAEWcksTJfLDWMdCcukaD2pTKh9d7qO/HEzma0diW1kqMDgnpGDGYDqNkSmeRbfMdvN4Xqi2ijMLwmhrOdfWhq63HsM7KdBwDzlO9VRG1VFNPH1vkeNxicUO2omGDXsf4LN+ElH8NIgjtv6+xwRPVbXXU0VN6EUsMQ+ACIxDRhx2CfF+CaoY0oZiNCwHcf3+MQKFePGsGEETWBgUnE4Bx+L8sjH70O11wwDlXRiPSine+xOPgZY+uQTDMctBcSyTTTinaP2MfH2qoILg1Qg+GImDiiFpNH6lfVj318Je7/52s95SLxFjHJdle6as5YaTHVaFu+qyJ60SJeJJTx+RNBBDy01dXstJzvdRYsIi6ZPlo6f8GkkY4Y/qXP3og1d96A2qooHv34dfjh2y/Trt5Frj4WIaQFDraprQf//vAuAMBXbrsYD31kBaaNqXPEkEGBbgCL49h8rBVv+8lLdi57eUHx+VdfhIc+sgLTx7jESqTTF37hb1ICoiCoXgtP7TqF1q4+NIz0ikxPn3c5+wu/8Dd8X3AVFaMapjL6xaTaTxViIKD6miiOn+vG+iPnsopnxeF807Lp+POHvO+fwdCFukAXRfTjh9f4qgeIXONb3RwgltRXxxyJ5owyLiINgQ+AKA7/08YTGFdfjbH26o+7y81vcAk+JxQA8Kv3yl59H7vxQnT2pXHYFsW3nO9FLEIYNawK114wHkEQFxp+iVIWTnFjkovvXkdvCtXRCKaPtQjwpqOtzrEzHV7RK1cV8PvkhH6HnZ1NJx6dNKoWE0bK5dfNG491n78R8yeNwOUzx3jO4Zz0iNoYnv3XuFP+wB3L8fi/rERVNIJpAsFqarM4eDX63Zbjrt+7OLE3jKzFsplj8LMXDjll8xqGa0X0v37flXjoIys85fzeuJpiwaSRqKuOablZcVEVi5CkMz8kSGeqYxGH4+YEOZvIerFdf+2hs9LCkKMmFsWiqaOk++cTEXehu3+j7MeuA2NMsr8AgD3N55FhwIJJ3oXt2U459sPW00LiIcWtLx+bAK67JAJOnXevNWF4eAJPRI7UJB8XV4PBjzCZAq3j8jeuQmS+6mqirpQ2QIpUahgCHwB1lTZjXJ1rTBUl/OlD1+Kedy9zjosTyHXzZKJ9vW2hva/ZEms2tfWgYWQtIhHCqxZPAgBc5JM4hKsKAFecdMm0UVhz5w3a+uKLls4wh4MHZA6tpcMbnOeIbSjHjQlVAs/b+eTNF2KKvdKdMrrWM+nOnTgcE0foV8IAHCO6a+aMw8xx9Vh95w144l9WomFkreMmc8k0V0/f2KYX0Yv7Kg352I0XOvf7vhWz8ev3XSXZJ3CMrK3KahMgYsW88bjrTZfg7+bopRCxaEQSUYtEU3w2fAFzQhM/gOOS6aOlc1QLehGiMc9pbiAX4BJ46HQnZt35sJMh8J9+tQHXfzsh1eF9F20SfvXeK7HywgnOMZ0fvmgz0NGbyit0rmhFL0qxfF0YbeiMmh76yAo8/al47p0wGJR48hPX4/lPrwLgSmV10j0RolW8Tq0mSu3FtkRGpb9hlrQBULnFd1w9EzU2sZ07cTgumzFGMrIbXisaVhD+eofFFXYn01gwaQSILI7oV/97GGsPncUym7OdOa4ev3jPFZg7cThWfPMZTz9EDn5MnUVwVy2Y6HCWKtR3rzoWwZTRwxAhOc7y6/9njefcQ4qIfly9RYh3NrZjRLW1CFl/5ByunTseT+5qxkl7oTJeIfDqJPvox69DbSyK+HcSACwO+zfvvwpLbCKuM5x55zWzMGnUMHz6j1scDj7I5kE1NlshLLJWXjgBY+ursWzmGHzrDUswbfQwvC2H4DsiamJRvP6yaTiyf7f2+NnOPvzfS0fx6sVTcM0F4xz1AiCL8aaNse5ZFyCI48YFE7H2kJs5kHMF2eKn8wVRkM//RjsZ0gObTmDV/Il4clezc+wjN8wFAfjB0/sBWLYiHCsvnIA/bzqBg7YOvlVzDfHbeXZvi+d4GIh+8F9//WLMmVCP/0kckL4zHXQmDbks4AwGP+YK7/O33rAEb71yRlZ7DL7O9vNAmiSosURbnzBusKWCIfAB4JPp//u7hWgYWYNXL54MIsIv3nMFltri+Gphoh1eE5MsqBdPkyeVGWPr8IOn3Pzooq4nPn+ib+5z8Ro3L2zAD992GV5xseXi89c7Vnj8dmeMq5dE19PH1KEqGsH0sXU4cqYL44dXOz6gqjiZc2WcsI8V3ALH1kbw+VdfhOVzx+HymWOcSHFzxtejRjH+m6iI7BdM8konxBC0OkQihFsWTcL3n9yLxrYeHD3ThY/dt9k5TiRz7TpR9+svm4o/bTyB4fYHF4tG8CaNf20+yPbZ/ujZA7jmgnHO4gSQxYBcGjJymPwZPvSRFejqS6O5vQevWjwZTwmEl7sM6vzAp44ZBhy2AnnsamzH8m88jatmu8FCGGP46fOH8NMXDuLFO2/0iM3rqqNOzIPblk7BlmPuOzRGcQ8dV1/tqHh0VvbcVuJtV83Ab9fqw/ACwXnr+VhFIoSx9dX411fOx6Kpo7Bq/kTfc6zzjFW8QXjU18QkZsAP2SJPiu6zddUxPPbxlVmlTaWGIfAB4FzI9DHD8IqLJznlcWGCEUU1I2pjSHwqjmM+7mJff91iKWSr6g8ci0Zwz7uWod5eKLzxxy96rkFEePUSN8ifuogAgP94/WK88uIGfOWvO3HqfC/m2jqgiSNqcORMF6aOHuYQ+Cc/cT1WfTchEcpvv2GJs2jgLnbne1IYU0OorYrilkXW9bkRydyJI9AjiGm/88ZL8NqleoPDB+9YrrVADcLkUbVoau9GYu8pqfyKWWOx7tBZZ79Lk873669bjGsvGO+4v5UCNy7QE5zNR8+hrSuJRsG7QJRsjKmvxk/fuQyXTB+N7Sfb8J6fvwzAiuQlRkA7r8liqOPg//21i3DDgolYc+A07l1neWz8adMJ5/hNdz2LAy2WhGbO5x6RnlFPMi1FxBtTVy0Zs6leD2OHV6M7mUZ3XxrnOl0OftV3EvjAyjm4809WfoLbLpmC9YfPYm+zv0udH0Q/eMB691+1eHLAGfy8nC9lYJAV/LUKmr/mTRyOfac6UF8d85Ww9icMgQ8A50JGZon//v03L0VTew8WTx2FmM0p67B87njMbxiBPc1WLnddxKwbL2oosNeWJOHvlkzBD585gFPnex0dE4/+ZCXWaMPyueMwa3w9fvKOZdjV2I55DSMwZXStxwd8XH01zvekMLZWnjn5ouDChuHoEUTnb7h8mm/f1LbDYNKoYXhmTwu2n9jhlH321gV4xzUz8ZdNJ9GXSuNLf92p5eBrq6KB/SkEC8dF8e+vXeRp/9fvuxIt53vxr3/cirue2BMogr9pofW8Ra5UDW/a0eO9r2oNga+vieHvL5mCvfb7pYITd46/2EmLuvrSjuTmU6+4EFNGD8O44TUSgZ8xtg6Pfvw6h5hzG41n9pzCh37jZoc7dLrTIe6AtViZN3GEL4EPa0WfCwwHb1AK8LwXQa/Xfbdfjef3nfZNhNTfMAQ+AJyDV2Ocq3jtpeHT1//ivVfg2T0tSDOGWxdl50YKwbyJw7Grsd3R9c4eby08uN0Ad326aWGDQ2h0GFVXDZzpwpha/Zs9bnhNQbHPs2Gyxm3l7VfPRF11DG+7agae3GmJsHUx2YOgqidyRXWU8I9Xz/SUXzfPMqh8bm8LfvniEQDAW6+cjstnjs3rw1fj8QNWhEE/8Kd0ybRRjqrmEzdfiL9uOYl9pzowfngNqqLk6Okf39nsLI7mNYzAK21pFSfwE0bUIBaNSGoWrsIRibsOY+qrJX1nLiCBczcwqBTceesC32PjhtfkRA9KDUPgA8B9eUf6+Gzng8mjhuEtV84IVfeRj16HY+fyj+/+ldsuxqKpI3GlnbThX26+EOOHW5P18/tOY9a4+iwtWPjkzRfimT2ncHGsWSp/8I7ljn65lJNww0ivW5TIwfLEDqoPdzY88YnrsVUJZ1tMvGrxZIdLfsfVsyRXxlzQqVm4BKXKfN+KORheG8NNFzXghu8+C8AymjvY0oF9pzrw/utmY9LIWnz8d5udc1bvtwz5xFDM44fX4Cu3XayVKl19wTh84Po56E1m8Is1hwP7/8Zl09Dek8Ql00bj6Nku3PXEXtTEIuhNZRyjUR0oi84zG0TvEwODYuHtV3kX9ZUKQ+ADwC0hg6LHlRILp4zMmygAwOi6aty+0s1DXFcdwweuvwA9yTQ6e1O4feWcUO2svHACVl44AYmEbA29ZNpoLBGk0w99ZIWveLgQcJH12PpqR5QsuonxBZifdasfZo+vx+zx4RY5+SA+fyI+cP0cjKiJ4aLJ2XNX/+XDy3FSk4a1OhZBXyqDT9x8IRpG1mS19h1VVyU9d8AilrPse62JRXDDRRNRHY14AgeNVYzp3nnNLO01htfE8NlbLwIALYGfMqoWd715KQDLTejf/v5i51hddRSvvHgSntvXguvmTvCcy6Hq4HPBN/9hMZaVKBuZwdDEt9+wxNeVuVJhCHwAfv7uK/HDB1cXlNigElFbFcVHb5xX9HYXTR1VEnekWxdNxv5THfjg9Regqa0Haw6ckSQGF08ZiU/fMh+vv7Q0uvZ8UR2LOEQwDJZOH+14Z4h48I7lWH/4nFYdkA333X61YwNw+8o56Etl8OYrpqOuOoavvW4RelMZdPWl8PVHLJc/LnrPBQ/esRwbj5zD+h37cOnCefjqQztx6+LJuHqOPqXq+6+zFpbZOKGLp4zER2+Y69tOEN58RTgpmYFBWOiy21U6DIEPwIxxdbh1dmUYSwxl1FZF8a+vtPReI2qrMK9B5oaJCB+Kzy1H1/oFCyaN1LoZhoFIHOuqY/j0La7+UJywVs2fiEe2NXlc9sLAkuSMxqzkEVx91Qw0t/fgg9dfkP3ELKiKRvCJV8wvuB0Dg6EKQ+ANDAwwr2EEPtaQXY2QDbVVUXzuVeGlFgYGBqWDsUIxMDAwMDAYhDAE3sDAwMDAYBCi4gk8Ed1CRHuIaD8R3Vnu/hgYGBgYGAwEVDSBJ6IogB8CuBXAQgBvJaKF5e2VgYGBgYFB5aOiCTyAKwHsZ4wdZIz1AbgPwG1l7pOBgYGBgUHFg0oZYrRQENEbANzCGHu/vf8OAFcxxu4Q6twO4HYAaGhouPy+++4rah86OjowfHh+oTYHG8xYyDDjIcOMhwwzHi7MWMgo9nisWrVqA2NsmVpe6W5yuhhW0oqEMXY3gLsBYNmyZSwejxe1A4lEAsVuc6DCjIUMMx4yzHjIMOPhwoyFjP4aj0oX0R8HIIYPmgbgZJn6YmBgYGBgMGBQ6SL6GIC9AG4EcALAywDexhjb4VO/BcCRIndjPIDTRW5zoMKMhQwzHjLMeMgw4+HCjIWMYo/HTMaYJ7FDRYvoGWMpIroDwGMAogB+5kfc7fr+mSvyBBGt1+k2hiLMWMgw4yHDjIcMMx4uzFjI6K/xqGgCDwCMsUcAPFLufhgYGBgYGAwkVLoO3sDAwMDAwCAPGAKfHXeXuwMVBDMWMsx4yDDjIcOMhwszFjL6ZTwq2sjOwMDAwMDAID8YDt7AwMDAwGAQwhB4AwMDAwODQQhD4H0wFLPYEdHPiOgUEW0XysYS0RNEtM/+HSMc+6w9PnuI6JXl6XVpQETTiegZItpFRDuI6GN2+VAdj1oiWkdEW+zx+LJdPiTHA7CSYRHRJiJ6yN4fsmMBAER0mIi2EdFmIlpvlw3JMSGi0UT0RyLabc8h15RlLBhj5k/5g+VzfwDAHADVALYAWFjufvXDfa8EcBmA7ULZtwDcaW/fCeCb9vZCe1xqAMy2xyta7nso4lhMBnCZvT0CVsClhUN4PAjAcHu7CsBaAFcP1fGw7/ETAH4L4CF7f8iOhX2fhwGMV8qG5JgA+CWA99vb1QBGl2MsDAevx5DMYscYew7AWaX4NlgvK+zf1wrl9zHGehljhwDshzVugwKMsUbG2EZ7+zyAXQCmYuiOB2OMddi7VfYfwxAdDyKaBuDVAH4qFA/JsciCITcmRDQSFrN0DwAwxvoYY60ow1gYAq/HVADHhP3jdtlQRANjrBGwiB6AiXb5kBkjIpoF4FJYXOuQHQ9bJL0ZwCkATzDGhvJ4fB/ApwFkhLKhOhYcDMDjRLTBzvIJDM0xmQOgBcDPbRXOT4moHmUYC0Pg9ciaxc5gaIwREQ0HcD+AjzPG2oOqasoG1XgwxtKMsaWwkj5dSUSLAqoP2vEgor8DcIoxtiHsKZqyQTEWCpYzxi4DcCuADxPRyoC6g3lMYrBUnT9ijF0KoBOWSN4PJRsLQ+D1MFnsXDQT0WQAsH9P2eWDfoyIqAoWcf8NY+xPdvGQHQ8OW9yYAHALhuZ4LAfwGiI6DEt9dwMR/R+G5lg4YIydtH9PAfgzLDHzUByT4wCO2xIuAPgjLILf72NhCLweLwOYR0SziagawFsAPFjmPpULDwJ4l739LgAPCOVvIaIaIpoNYB6AdWXoX0lARARLh7aLMXaXcGiojscEIhptbw8DcBOA3RiC48EY+yxjbBpjbBasueFpxtg/YgiOBQcR1RPRCL4N4BUAtmMIjgljrAnAMSKabxfdCGAnyjEW5bY2rNQ/AK+CZTl9AMDny92ffrrnewE0AkjCWlW+D8A4AE8B2Gf/jhXqf94enz0Abi13/4s8Fitgicm2Aths/71qCI/HEgCb7PHYDuCLdvmQHA/hHuNwreiH7FjA0jtvsf928DlzqI4JgKUA1tvfy18AjCnHWJhQtQYGBgYGBoMQRkRvYGBgYGAwCGEIvIGBgYGBwSCEIfAGBgYGBgaDEIbAGxgYGBgYDEIYAm9gYGBgYDAIYQi8gYFBIIiIEdEbStj+Mvsas0p1DQODoQhD4A0MBjGI6Bc28VT/XsqhmckA/lqqPhoYGJQGsXJ3wMDAoOR4EsA7lLK+sCczKzKXgYHBAIPh4A0MBj96GWNNyt9ZwBG/30FEDxNRFxEdIaJ/FE9WRfRE9EW7Xi8RNRHRr4RjNUT0fSJqJqIeInqJiFYo7d1CRLvt488DuFDtMBFdS0TP2n06QUQ/stNwGhgYhIQh8AYGBl+GFQ97KYC7AfyKiJbpKhLRPwD4FIAPwYqZ/XeQ42Z/C8CbAbwXVordbQAeFZJsTIcVuvMJ+3r/ZZ8jXmMxgMftPl0C4PV23Z8VdpsGBkMLJlStgcEgBhH9AsA/AuhRDv2QMfYZImIAfsoY+yfhnCcBNDErgQrsOm9kjP2RiD4B4AMAFjHGksq16gGcA/B+xtiv7LIorJwO9zLGvkBEXwfwBgDzmT35ENEXAHwVwGzG2GFbIpBkjL1PaHsprFj4DczKVmZgYJAFRgdvYDD48RyA25WyVmH7ReXYiwBe7dPWHwB8DMAhInoMwKMAHmSM9QK4AEAVgNW8MmMsTUQvAlhoF10E4CUmcxbq9S8HMJeI3iyU8ZzZF8BNs2lgYBAAQ+ANDAY/uhhj+4vREGOMp8G8EVbK2O8C+DciugouEdaJBXkZaY6piAD4KYDvaY6dyK3HBgZDF0YHb2BgcLVmf5dfZcZYD2PsYcbYvwC4AsDFAJYD2A/LOt8xqrNF9NfAyocN+/cqIhIJvXr9jQAuZozt1/x153F/BgZDEoaDNzAY/KghoklKWZox1mJvv56IXgaQgKUfvxHAVbqGiOjdsOaNtQA6YBnUJQHsY4x1EtGPAHyDiE4DOATgXwA0APgfu4kfA/gkgO8T0f8AWAzgg8plvgngJSL6MYD/BXAewAIAf88Y+0Dut29gMDRhCLyBweDHTQAalbITAKbZ218C8A8AfgCgBcB7GGMv+7TVCuAzAL4DS9++E8DrGWOH7OOfsX9/DmA0LMO4WxhjjQDAGDtKRK8HcBcsY70NAO4E8H/8AoyxrUS0EsC/A3gWQBTAQQB/zu22DQyGNowVvYHBEIZoIV/uvhgYGBQXRgdvYGBgYGAwCGEIvIGBgYGBwSCEEdEbGBgYGBgMQhgO3sDAwMDAYBDCEHgDAwMDA4NBCEPgDQwMDAwMBiEMgTcwMDAwMBiEMATewMDAwMBgEOL/A0kXeQvtuzigAAAAAElFTkSuQmCC\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "# extra code – this cell plots the learning curve\n", "plt.figure(figsize=(8, 4))\n", "plt.plot(rewards)\n", "plt.xlabel(\"Episode\", fontsize=14)\n", "plt.ylabel(\"Sum of rewards\", fontsize=14)\n", "plt.grid(True)\n", "plt.show()" ] }, { "cell_type": "code", "execution_count": 63, "metadata": { "scrolled": true, "tags": [] }, "outputs": [], "source": [ "# extra code – shows an animation of the trained DQN playing one episode\n", "show_one_episode(epsilon_greedy_policy)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Double DQN" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The code is exactly the same as for fixed Q-Value targets, except for the section marked as changed in the `training_step()` function:" ] }, { "cell_type": "code", "execution_count": 64, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Episode: 600, Steps: 200, eps: 0.010" ] } ], "source": [ "tf.random.set_seed(42)\n", "\n", "model = tf.keras.Sequential([\n", " tf.keras.layers.Dense(32, activation=\"elu\", input_shape=input_shape),\n", " tf.keras.layers.Dense(32, activation=\"elu\"),\n", " tf.keras.layers.Dense(n_outputs)\n", "])\n", "\n", "target = tf.keras.models.clone_model(model) # clone the model's architecture\n", "target.set_weights(model.get_weights()) # copy the weights\n", "\n", "env.reset(seed=42)\n", "np.random.seed(42)\n", "tf.random.set_seed(42)\n", "rewards = [] \n", "best_score = 0\n", "\n", "batch_size = 32\n", "discount_factor = 0.95\n", "optimizer = tf.keras.optimizers.Nadam(learning_rate=1e-2)\n", "loss_fn = tf.keras.losses.mean_squared_error\n", "\n", "def training_step(batch_size):\n", " experiences = sample_experiences(batch_size)\n", " states, actions, rewards, next_states, dones = experiences\n", "\n", " #################### CHANGED SECTION ####################\n", " next_Q_values = model.predict(next_states) # not target.predict(...)\n", " best_next_actions = next_Q_values.argmax(axis=1)\n", " next_mask = tf.one_hot(best_next_actions, n_outputs).numpy()\n", " max_next_Q_values = (target.predict(next_states) * next_mask).sum(axis=1)\n", " #########################################################\n", "\n", " target_Q_values = (rewards +\n", " (1 - dones) * discount_factor * max_next_Q_values)\n", " target_Q_values = target_Q_values.reshape(-1, 1)\n", " mask = tf.one_hot(actions, n_outputs)\n", " with tf.GradientTape() as tape:\n", " all_Q_values = model(states)\n", " Q_values = tf.reduce_sum(all_Q_values * mask, axis=1, keepdims=True)\n", " loss = tf.reduce_mean(loss_fn(target_Q_values, Q_values))\n", "\n", " grads = tape.gradient(loss, model.trainable_variables)\n", " optimizer.apply_gradients(zip(grads, model.trainable_variables))\n", "\n", "replay_buffer = deque(maxlen=2000)\n", "\n", "for episode in range(600):\n", " obs = env.reset() \n", " for step in range(200):\n", " epsilon = max(1 - episode / 500, 0.01)\n", " obs, reward, done, info = play_one_step(env, obs, epsilon)\n", " if done:\n", " break\n", "\n", " print(f\"\\rEpisode: {episode + 1}, Steps: {step + 1}, eps: {epsilon:.3f}\",\n", " end=\"\")\n", " rewards.append(step)\n", " if step >= best_score:\n", " best_weights = model.get_weights()\n", " best_score = step\n", "\n", " if episode > 50:\n", " training_step(batch_size)\n", " if episode % 50 == 0:\n", " target.set_weights(model.get_weights())\n", "\n", "model.set_weights(best_weights)" ] }, { "cell_type": "code", "execution_count": 65, "metadata": {}, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "# extra code – this cell plots the learning curve\n", "plt.figure(figsize=(8, 4))\n", "plt.plot(rewards)\n", "plt.xlabel(\"Episode\", fontsize=14)\n", "plt.ylabel(\"Sum of rewards\", fontsize=14)\n", "plt.grid(True)\n", "plt.show()" ] }, { "cell_type": "code", "execution_count": 66, "metadata": { "scrolled": true }, "outputs": [], "source": [ "# extra code – shows an animation of the trained DQN playing one episode\n", "show_one_episode(epsilon_greedy_policy)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# Dueling Double DQN" ] }, { "cell_type": "code", "execution_count": 67, "metadata": {}, "outputs": [], "source": [ "tf.random.set_seed(42) # extra code – ensures reproducibility on the CPU\n", "\n", "input_states = tf.keras.layers.Input(shape=[4])\n", "hidden1 = tf.keras.layers.Dense(32, activation=\"elu\")(input_states)\n", "hidden2 = tf.keras.layers.Dense(32, activation=\"elu\")(hidden1)\n", "state_values = tf.keras.layers.Dense(1)(hidden2)\n", "raw_advantages = tf.keras.layers.Dense(n_outputs)(hidden2)\n", "advantages = raw_advantages - tf.reduce_max(raw_advantages, axis=1,\n", " keepdims=True)\n", "Q_values = state_values + advantages\n", "model = tf.keras.Model(inputs=[input_states], outputs=[Q_values])" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The rest is the same code as earlier:" ] }, { "cell_type": "code", "execution_count": 68, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Episode: 600, Steps: 190, eps: 0.010" ] } ], "source": [ "# extra code – trains the model\n", "\n", "batch_size = 32\n", "discount_factor = 0.95\n", "optimizer = tf.keras.optimizers.Nadam(learning_rate=5e-3)\n", "loss_fn = tf.keras.losses.mean_squared_error\n", "\n", "target = tf.keras.models.clone_model(model) # clone the model's architecture\n", "target.set_weights(model.get_weights()) # copy the weights\n", "\n", "env.reset(seed=42)\n", "replay_buffer = deque(maxlen=2000)\n", "rewards = []\n", "best_score = 0\n", "\n", "for episode in range(600):\n", " obs = env.reset() \n", " for step in range(200):\n", " epsilon = max(1 - episode / 500, 0.01)\n", " obs, reward, done, info = play_one_step(env, obs, epsilon)\n", " if done:\n", " break\n", "\n", " print(f\"\\rEpisode: {episode + 1}, Steps: {step + 1}, eps: {epsilon:.3f}\",\n", " end=\"\")\n", " rewards.append(step)\n", " if step >= best_score:\n", " best_weights = model.get_weights()\n", " best_score = step\n", "\n", " if episode > 50:\n", " training_step(batch_size)\n", " if episode % 50 == 0:\n", " target.set_weights(model.get_weights())\n", "\n", "model.set_weights(best_weights)" ] }, { "cell_type": "code", "execution_count": 69, "metadata": {}, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "# extra code – this cell plots the learning curve\n", "plt.figure(figsize=(8, 4))\n", "plt.plot(rewards)\n", "plt.xlabel(\"Episode\", fontsize=14)\n", "plt.ylabel(\"Sum of rewards\", fontsize=14)\n", "plt.grid(True)\n", "plt.show()" ] }, { "cell_type": "code", "execution_count": 70, "metadata": { "scrolled": true }, "outputs": [], "source": [ "# extra code – shows an animation of the trained DQN playing one episode\n", "show_one_episode(epsilon_greedy_policy)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "This looks like a pretty robust agent!" ] }, { "cell_type": "code", "execution_count": 71, "metadata": {}, "outputs": [], "source": [ "env.close()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# Exercise Solutions" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## 1. to 7." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "1. Reinforcement Learning is an area of Machine Learning aimed at creating agents capable of taking actions in an environment in a way that maximizes rewards over time. There are many differences between RL and regular supervised and unsupervised learning. Here are a few:\n", " * In supervised and unsupervised learning, the goal is generally to find patterns in the data and use them to make predictions. In Reinforcement Learning, the goal is to find a good policy.\n", " * Unlike in supervised learning, the agent is not explicitly given the \"right\" answer. It must learn by trial and error.\n", " * Unlike in unsupervised learning, there is a form of supervision, through rewards. We do not tell the agent how to perform the task, but we do tell it when it is making progress or when it is failing.\n", " * A Reinforcement Learning agent needs to find the right balance between exploring the environment, looking for new ways of getting rewards, and exploiting sources of rewards that it already knows. In contrast, supervised and unsupervised learning systems generally don't need to worry about exploration; they just feed on the training data they are given.\n", " * In supervised and unsupervised learning, training instances are typically independent (in fact, they are generally shuffled). In Reinforcement Learning, consecutive observations are generally _not_ independent. An agent may remain in the same region of the environment for a while before it moves on, so consecutive observations will be very correlated. In some cases a replay buffer (memory) is used to ensure that the training algorithm gets fairly independent observations.\n", "2. Here are a few possible applications of Reinforcement Learning, other than those mentioned in Chapter 18:\n", " * Music personalization: The environment is a user's personalized web radio. The agent is the software deciding what song to play next for that user. Its possible actions are to play any song in the catalog (it must try to choose a song the user will enjoy) or to play an advertisement (it must try to choose an ad that the user will be interested in). It gets a small reward every time the user listens to a song, a larger reward every time the user listens to an ad, a negative reward when the user skips a song or an ad, and a very negative reward if the user leaves.\n", " * Marketing: The environment is your company's marketing department. The agent is the software that defines which customers a mailing campaign should be sent to, given their profile and purchase history (for each customer it has two possible actions: send or don't send). It gets a negative reward for the cost of the mailing campaign, and a positive reward for estimated revenue generated from this campaign.\n", " * Product delivery: Let the agent control a fleet of delivery trucks, deciding what they should pick up at the depots, where they should go, what they should drop off, and so on. It will get positive rewards for each product delivered on time, and negative rewards for late deliveries.\n", "3. When estimating the value of an action, Reinforcement Learning algorithms typically sum all the rewards that this action led to, giving more weight to immediate rewards and less weight to later rewards (considering that an action has more influence on the near future than on the distant future). To model this, a discount factor is typically applied at each time step. For example, with a discount factor of 0.9, a reward of 100 that is received two time steps later is counted as only 0.92 × 100 = 81 when you are estimating the value of the action. You can think of the discount factor as a measure of how much the future is valued relative to the present: if it is very close to 1, then the future is valued almost as much as the present; if it is close to 0, then only immediate rewards matter. Of course, this impacts the optimal policy tremendously: if you value the future, you may be willing to put up with a lot of immediate pain for the prospect of eventual rewards, while if you don't value the future, you will just grab any immediate reward you can find, never investing in the future.\n", "4. To measure the performance of a Reinforcement Learning agent, you can simply sum up the rewards it gets. In a simulated environment, you can run many episodes and look at the total rewards it gets on average (and possibly look at the min, max, standard deviation, and so on).\n", "5. The credit assignment problem is the fact that when a Reinforcement Learning agent receives a reward, it has no direct way of knowing which of its previous actions contributed to this reward. It typically occurs when there is a large delay between an action and the resulting reward (e.g., during a game of Atari's _Pong_, there may be a few dozen time steps between the moment the agent hits the ball and the moment it wins the point). One way to alleviate it is to provide the agent with shorter-term rewards, when possible. This usually requires prior knowledge about the task. For example, if we want to build an agent that will learn to play chess, instead of giving it a reward only when it wins the game, we could give it a reward every time it captures one of the opponent's pieces.\n", "6. An agent can often remain in the same region of its environment for a while, so all of its experiences will be very similar for that period of time. This can introduce some bias in the learning algorithm. It may tune its policy for this region of the environment, but it will not perform well as soon as it moves out of this region. To solve this problem, you can use a replay buffer; instead of using only the most immediate experiences for learning, the agent will learn based on a buffer of its past experiences, recent and not so recent (perhaps this is why we dream at night: to replay our experiences of the day and better learn from them?).\n", "7. An off-policy RL algorithm learns the value of the optimal policy (i.e., the sum of discounted rewards that can be expected for each state if the agent acts optimally) while the agent follows a different policy. Q-Learning is a good example of such an algorithm. In contrast, an on-policy algorithm learns the value of the policy that the agent actually executes, including both exploration and exploitation." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## 8.\n", "_Exercise: Use policy gradients to solve OpenAI Gym's LunarLander-v2 environment._" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Let's start by creating a LunarLander-v2 environment:" ] }, { "cell_type": "code", "execution_count": 72, "metadata": {}, "outputs": [], "source": [ "env = gym.make(\"LunarLander-v2\")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The inputs are 8-dimensional:" ] }, { "cell_type": "code", "execution_count": 73, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "Box(-inf, inf, (8,), float32)" ] }, "execution_count": 73, "metadata": {}, "output_type": "execute_result" } ], "source": [ "env.observation_space" ] }, { "cell_type": "code", "execution_count": 74, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "array([ 0.00229702, 1.4181306 , 0.2326471 , 0.3204666 , -0.00265488,\n", " -0.05269805, 0. , 0. ], dtype=float32)" ] }, "execution_count": 74, "metadata": {}, "output_type": "execute_result" } ], "source": [ "obs = env.reset(seed=42)\n", "obs" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "From the [source code](https://github.com/openai/gym/blob/master/gym/envs/box2d/lunar_lander.py), we can see that these each 8D observation (x, y, h, v, a, w, l, r) correspond to:\n", "* x,y: the coordinates of the spaceship. It starts at a random location near (0, 1.4) and must land near the target at (0, 0).\n", "* h,v: the horizontal and vertical speed of the spaceship. It starts with a small random speed.\n", "* a,w: the spaceship's angle and angular velocity.\n", "* l,r: whether the left or right leg touches the ground (1.0) or not (0.0)." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The action space is discrete, with 4 possible actions:" ] }, { "cell_type": "code", "execution_count": 75, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "Discrete(4)" ] }, "execution_count": 75, "metadata": {}, "output_type": "execute_result" } ], "source": [ "env.action_space" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Looking at the [LunarLander-v2's description](https://gym.openai.com/envs/LunarLander-v2/), these actions are:\n", "* do nothing\n", "* fire left orientation engine\n", "* fire main engine\n", "* fire right orientation engine" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Let's create a simple policy network with 4 output neurons (one per possible action):" ] }, { "cell_type": "code", "execution_count": 76, "metadata": {}, "outputs": [], "source": [ "np.random.seed(42)\n", "tf.random.set_seed(42)\n", "\n", "n_inputs = env.observation_space.shape[0]\n", "n_outputs = env.action_space.n\n", "\n", "model = tf.keras.Sequential([\n", " tf.keras.layers.Dense(32, activation=\"relu\", input_shape=[n_inputs]),\n", " tf.keras.layers.Dense(32, activation=\"relu\"),\n", " tf.keras.layers.Dense(n_outputs, activation=\"softmax\"),\n", "])" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Note that we're using the softmax activation function in the output layer, instead of the sigmoid activation function \n", "like we did for the CartPole-v1 environment. This is because we only had two possible actions for the CartPole-v1 environment, so a binary classification model worked fine. However, since we now how more than two possible actions, we need a multiclass classification model." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Next, let's reuse the `play_one_step()` and `play_multiple_episodes()` functions we defined for the CartPole-v1 Policy Gradient code above, but we'll just tweak the `play_one_step()` function to account for the fact that the model is now a multiclass classification model rather than a binary classification model. We'll also tweak the `play_multiple_episodes()` function to call our tweaked `play_one_step()` function rather than the original one, and we add a big penalty if the spaceship does not land (or crash) before a maximum number of steps." ] }, { "cell_type": "code", "execution_count": 77, "metadata": {}, "outputs": [], "source": [ "def lander_play_one_step(env, obs, model, loss_fn):\n", " with tf.GradientTape() as tape:\n", " probas = model(obs[np.newaxis])\n", " logits = tf.math.log(probas + tf.keras.backend.epsilon())\n", " action = tf.random.categorical(logits, num_samples=1)\n", " loss = tf.reduce_mean(loss_fn(action, probas))\n", " grads = tape.gradient(loss, model.trainable_variables)\n", " obs, reward, done, info = env.step(action[0, 0].numpy())\n", " return obs, reward, done, grads\n", "\n", "def lander_play_multiple_episodes(env, n_episodes, n_max_steps, model, loss_fn):\n", " all_rewards = []\n", " all_grads = []\n", " for episode in range(n_episodes):\n", " current_rewards = []\n", " current_grads = []\n", " obs = env.reset()\n", " for step in range(n_max_steps):\n", " obs, reward, done, grads = lander_play_one_step(env, obs, model, loss_fn)\n", " current_rewards.append(reward)\n", " current_grads.append(grads)\n", " if done:\n", " break\n", " all_rewards.append(current_rewards)\n", " all_grads.append(current_grads)\n", " return all_rewards, all_grads" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "We'll keep exactly the same `discount_rewards()` and `discount_and_normalize_rewards()` functions as earlier:" ] }, { "cell_type": "code", "execution_count": 78, "metadata": {}, "outputs": [], "source": [ "def discount_rewards(rewards, discount_factor):\n", " discounted = np.array(rewards)\n", " for step in range(len(rewards) - 2, -1, -1):\n", " discounted[step] += discounted[step + 1] * discount_factor\n", " return discounted\n", "\n", "def discount_and_normalize_rewards(all_rewards, discount_factor):\n", " all_discounted_rewards = [discount_rewards(rewards, discount_factor)\n", " for rewards in all_rewards]\n", " flat_rewards = np.concatenate(all_discounted_rewards)\n", " reward_mean = flat_rewards.mean()\n", " reward_std = flat_rewards.std()\n", " return [(discounted_rewards - reward_mean) / reward_std\n", " for discounted_rewards in all_discounted_rewards]" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Now let's define some hyperparameters:" ] }, { "cell_type": "code", "execution_count": 79, "metadata": {}, "outputs": [], "source": [ "n_iterations = 200\n", "n_episodes_per_update = 16\n", "n_max_steps = 1000\n", "discount_factor = 0.99" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Again, since the model is a multiclass classification model, we must use the categorical cross-entropy rather than the binary cross-entropy. Moreover, since the `lander_play_one_step()` function sets the targets as class indices rather than class probabilities, we must use the `sparse_categorical_crossentropy()` loss function:" ] }, { "cell_type": "code", "execution_count": 80, "metadata": {}, "outputs": [], "source": [ "optimizer = tf.keras.optimizers.Nadam(learning_rate=0.005)\n", "loss_fn = tf.keras.losses.sparse_categorical_crossentropy" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "We're ready to train the model. Let's go!" ] }, { "cell_type": "code", "execution_count": 81, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Iteration: 200/200, mean reward: 139.7 " ] } ], "source": [ "env.reset(seed=42)\n", "\n", "mean_rewards = []\n", "\n", "for iteration in range(n_iterations):\n", " all_rewards, all_grads = lander_play_multiple_episodes(\n", " env, n_episodes_per_update, n_max_steps, model, loss_fn)\n", " mean_reward = sum(map(sum, all_rewards)) / n_episodes_per_update\n", " print(f\"\\rIteration: {iteration + 1}/{n_iterations},\"\n", " f\" mean reward: {mean_reward:.1f} \", end=\"\")\n", " mean_rewards.append(mean_reward)\n", " all_final_rewards = discount_and_normalize_rewards(all_rewards,\n", " discount_factor)\n", " all_mean_grads = []\n", " for var_index in range(len(model.trainable_variables)):\n", " mean_grads = tf.reduce_mean(\n", " [final_reward * all_grads[episode_index][step][var_index]\n", " for episode_index, final_rewards in enumerate(all_final_rewards)\n", " for step, final_reward in enumerate(final_rewards)], axis=0)\n", " all_mean_grads.append(mean_grads)\n", " optimizer.apply_gradients(zip(all_mean_grads, model.trainable_variables))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Let's look at the learning curve:" ] }, { "cell_type": "code", "execution_count": 82, "metadata": {}, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "plt.plot(mean_rewards)\n", "plt.xlabel(\"Episode\")\n", "plt.ylabel(\"Mean reward\")\n", "plt.grid()\n", "plt.show()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Now let's look at the result!" ] }, { "cell_type": "code", "execution_count": 83, "metadata": {}, "outputs": [], "source": [ "def lander_render_policy_net(model, n_max_steps=500, seed=42):\n", " frames = []\n", " env = gym.make(\"LunarLander-v2\")\n", " tf.random.set_seed(seed)\n", " np.random.seed(seed)\n", " obs = env.reset(seed=seed)\n", " for step in range(n_max_steps):\n", " frames.append(env.render(mode=\"rgb_array\"))\n", " probas = model(obs[np.newaxis])\n", " logits = tf.math.log(probas + tf.keras.backend.epsilon())\n", " action = tf.random.categorical(logits, num_samples=1)\n", " obs, reward, done, info = env.step(action[0, 0].numpy())\n", " if done:\n", " break\n", " env.close()\n", " return frames" ] }, { "cell_type": "code", "execution_count": 84, "metadata": {}, "outputs": [], "source": [ "frames = lander_render_policy_net(model, seed=42)\n", "plot_animation(frames)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "That's pretty good. You can try training it for longer and/or tweaking the hyperparameters to see if you can get it to go over 200." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## 9.\n", "_Exercise: Use a Double Dueling DQN to train an agent that can achieve a superhuman level at the famous Atari Breakout game (`\"ALE/Breakout-v5\"`). The observations are images. To simplify the task, you should convert them to grayscale (i.e., average over the channels axis), crop them and downsample them, so they're just large enough to play, but not much more. An individual image does not tell you which way the ball and the paddles are going, so you should merge two or three consecutive images to form each state. Lastly, the DQN should be composed mostly of convolutional layers._" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "TODO" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Check out the [State-of-the-Art for Atari Games on paperswithcode.com](https://paperswithcode.com/task/atari-games)." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## 10.\n", "_Exercise: If you have about $100 to spare, you can purchase a Raspberry Pi 3 plus some cheap robotics components, install TensorFlow on the Pi, and go wild! For an example, check out this [fun post](https://homl.info/2) by Lukas Biewald, or take a look at GoPiGo or BrickPi. Start with simple goals, like making the robot turn around to find the brightest angle (if it has a light sensor) or the closest object (if it has a sonar sensor), and move in that direction. Then you can start using Deep Learning: for example, if the robot has a camera, you can try to implement an object detection algorithm so it detects people and moves toward them. You can also try to use RL to make the agent learn on its own how to use the motors to achieve that goal. Have fun!_" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "It's your turn now: go crazy, be creative, but most of all, be patient and move forward step by step, you can do it!" ] } ], "metadata": { "accelerator": "GPU", "interpreter": { "hash": "95c485e91159f3a8b550e08492cb4ed2557284663e79130c96242e7ff9e65ae1" }, "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.9.10" } }, "nbformat": 4, "nbformat_minor": 4 }