|
4 | 4 | "cell_type": "markdown",
|
5 | 5 | "metadata": {},
|
6 | 6 | "source": [
|
7 |
| - "## LSTM state encoder [TEST]" |
| 7 | + "## LSTM state encoder" |
8 | 8 | ]
|
9 | 9 | },
|
10 | 10 | {
|
11 | 11 | "cell_type": "code",
|
12 |
| - "execution_count": 26, |
| 12 | + "execution_count": 1, |
13 | 13 | "metadata": {},
|
14 | 14 | "outputs": [],
|
15 | 15 | "source": [
|
|
23 | 23 | },
|
24 | 24 | {
|
25 | 25 | "cell_type": "code",
|
26 |
| - "execution_count": 27, |
| 26 | + "execution_count": 2, |
27 | 27 | "metadata": {},
|
28 | 28 | "outputs": [],
|
29 | 29 | "source": [
|
|
84 | 84 | },
|
85 | 85 | {
|
86 | 86 | "cell_type": "code",
|
87 |
| - "execution_count": 28, |
| 87 | + "execution_count": 4, |
88 | 88 | "metadata": {},
|
89 | 89 | "outputs": [],
|
90 | 90 | "source": [
|
|
99 | 99 | },
|
100 | 100 | {
|
101 | 101 | "cell_type": "code",
|
102 |
| - "execution_count": 29, |
| 102 | + "execution_count": 5, |
103 | 103 | "metadata": {},
|
104 | 104 | "outputs": [],
|
105 | 105 | "source": [
|
|
123 | 123 | },
|
124 | 124 | {
|
125 | 125 | "cell_type": "code",
|
126 |
| - "execution_count": 30, |
| 126 | + "execution_count": 6, |
127 | 127 | "metadata": {},
|
128 | 128 | "outputs": [],
|
129 | 129 | "source": [
|
|
173 | 173 | },
|
174 | 174 | {
|
175 | 175 | "cell_type": "code",
|
176 |
| - "execution_count": 31, |
| 176 | + "execution_count": 7, |
177 | 177 | "metadata": {},
|
178 | 178 | "outputs": [
|
179 | 179 | {
|
180 | 180 | "data": {
|
181 | 181 | "application/vnd.jupyter.widget-view+json": {
|
182 |
| - "model_id": "8dddbfd676c741e68c5262a8972e5013", |
| 182 | + "model_id": "c2bde4576a804b8aa3efc5609b2235fb", |
183 | 183 | "version_major": 2,
|
184 | 184 | "version_minor": 0
|
185 | 185 | },
|
|
216 | 216 | },
|
217 | 217 | {
|
218 | 218 | "cell_type": "code",
|
219 |
| - "execution_count": 37, |
| 219 | + "execution_count": 8, |
220 | 220 | "metadata": {},
|
221 | 221 | "outputs": [],
|
222 | 222 | "source": [
|
223 | 223 | "def ddpg_update(batch, params, nets, optimizer, device, debugger=False, learn=True, step=-1):\n",
|
224 | 224 | " batch = [i.to(device) for i in batch]\n",
|
225 |
| - " state, action, reward, next_state, done = batch\n", |
226 |
| - " reward = reward.unsqueeze(1)\n", |
227 |
| - " # done = done.unsqueeze(1)\n", |
| 225 | + " state, action, reward, next_state = batch\n", |
| 226 | + " # reward = reward.unsqueeze(1)\n", |
228 | 227 | "\n",
|
229 | 228 | " # --------------------------------------------------------#\n",
|
230 | 229 | " # Value Learning\n",
|
|
280 | 279 | },
|
281 | 280 | {
|
282 | 281 | "cell_type": "code",
|
283 |
| - "execution_count": 38, |
| 282 | + "execution_count": 9, |
| 283 | + "metadata": {}, |
| 284 | + "outputs": [], |
| 285 | + "source": [ |
| 286 | + "class ReplayBuffer():\n", |
| 287 | + " def __init__(self, buffer_size):\n", |
| 288 | + " self.buffer = None\n", |
| 289 | + " self.idx = 0\n", |
| 290 | + " self.size = buffer_size\n", |
| 291 | + " self.flush()\n", |
| 292 | + " \n", |
| 293 | + " def flush(self):\n", |
| 294 | + " # state, action, reward, next_state\n", |
| 295 | + " self.buffer = [torch.zeros(self.size, 256),\n", |
| 296 | + " torch.zeros(self.size, 128),\n", |
| 297 | + " torch.zeros(self.size, 1),\n", |
| 298 | + " torch.zeros(self.size, 256)]\n", |
| 299 | + " self.idx = 0\n", |
| 300 | + " \n", |
| 301 | + " def append(self, batch):\n", |
| 302 | + " \n", |
| 303 | + " state, action, reward, next_state = batch\n", |
| 304 | + " lower = self.idx\n", |
| 305 | + " upper = state.size(0) + lower\n", |
| 306 | + " self.buffer[0][lower:upper] = state\n", |
| 307 | + " self.buffer[1][lower:upper] = action\n", |
| 308 | + " self.buffer[2][lower:upper] = reward\n", |
| 309 | + " self.buffer[3][lower:upper] = next_state\n", |
| 310 | + " self.idx += upper\n", |
| 311 | + " \n", |
| 312 | + " def get(self):\n", |
| 313 | + " return self.buffer\n", |
| 314 | + " \n", |
| 315 | + " def len(self):\n", |
| 316 | + " return self.idx" |
| 317 | + ] |
| 318 | + }, |
| 319 | + { |
| 320 | + "cell_type": "code", |
| 321 | + "execution_count": 11, |
284 | 322 | "metadata": {
|
285 | 323 | "scrolled": false
|
286 | 324 | },
|
287 | 325 | "outputs": [
|
288 |
| - { |
289 |
| - "name": "stdout", |
290 |
| - "output_type": "stream", |
291 |
| - "text": [ |
292 |
| - "1000\n" |
293 |
| - ] |
294 |
| - }, |
295 |
| - { |
296 |
| - "data": { |
297 |
| - "image/png": "iVBORw0KGgoAAAANSUhEUgAAA6UAAAF1CAYAAAAQgExAAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADl0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uIDMuMC4yLCBodHRwOi8vbWF0cGxvdGxpYi5vcmcvOIA7rQAAIABJREFUeJzs3Xt8VOWdP/DPkwBJSEgCCZCEAOEmKipXKaxXvOO1ttZq67brzxa1au26/lrbbe1r3frbbtu1ra3Wuq3d7dZLrVqvWG94WxUkICooCOGWQIBwCwmE3Hh+f3zzeE4mZ2bOzJyZc+bM5/168Tpzy+QkTGbO53y/z/MorTWIiIiIiIiI/JDn9w4QERERERFR7mIoJSIiIiIiIt8wlBIREREREZFvGEqJiIiIiIjINwylRERERERE5BuGUiIiIiIiIvINQylRQCmlTldKNfm9H0RERCSUUlopNbnv8n1KqR/4vU9EYTDI7x0gIiIiIso2Wuvr/N4HorBgpZSIiIiIiIh8w1BKlGZKqduUUo9F3PZLpdTdSqmrlVIfK6XalFIblVLXxnieT1uG+q7/l1LqR7brFyqlViml9iul3lZKnZCen4iIiCi7KaU2K6W+q5T6SCm1Tyn1B6VUYd99X1dKbVBK7VVKPa2UqonyHJGfw5f0fQ4fUEo1KKXOU0p9QSm1IuLr/kkp9WR6f0Ki7MJQSpR+DwM4XylVCgBKqXwAlwN4CMAuABcCKAVwNYCfK6VmJfoN+r7mAQDXAqgA8FsATyulCjz5CYiIiMLnywDOBTAJwFEAvq+UOgPAv0E+p6sBbAHwSLwnUkrNBfBHAP8XQDmAUwFsBvA0gAlKqWNsD78KwP949lMQhQBDKVGaaa23AFgJ4LN9N50B4JDWeqnW+jmtdYMWrwN4EcApSXybrwP4rdZ6mda6V2v93wA6Aczz4mcgIiIKoV9rrRu11nsB3AngSkhQfUBrvVJr3QnguwDmK6Xq4jzXNX1f95LW+ojWepvWem3fc/wZEkShlJoGoA7As2n5iYiyFEMpUWY8BPmwA4Av9V2HUmqhUmppX4vQfgDnA6hM4vnHA/invtbd/X3PNRaAY8sRERERodF2eQvkM7Om7zIAQGvdDmAPgDFxnmssgIYo9/03gC8ppRSAvwfwaF9YJaI+DKVEmfEXAKcrpWoBXArgob7W2scB/AzAaK11OYDFAFSU5zgEYKjtepXtciOAO7XW5bZ/Q7XWD3v+kxAREYXDWNvlcQC29/0bb25UShVDhsVsi/NcjZA24AG01ksBdEE6ob4Etu4SDcBQSpQBWusWAK8B+AOATVrrjwEMAVAAoAVAj1JqIYBzYjzNKsiZ1nyl1HkATrPd958ArlNKfUaJYqXUBUqpYen4eYiIiELgBqVUrVJqBIDvQdpsHwJwtVJqRt/J4/8HYJnWenOc5/p939edqZTKU0qNUUodbbv/jwB+DaBHa/2/3v8oRNmNoZQocx4CcFbfFlrrNgDfBPAogH2Qs6dPx/j6mwFcBGA/ZMzLpzP3aa3rIeNKf933XBsA/IPXPwAREVGIPASZy2Fj378faa1fAfADSCdTM6T6eUW8J9Jav4u+CQsBtAJ4HbaKK6Q6ehxYJSVypLTWfu8DEREREVHGKKU2A/ia1vrlDH2/IsiM+7O01usz8T2JsgkrpURERERE6XU9gOUMpETOBvm9A0REREREYdVXlVWwloYjogiu2neVUv8I4GsANIAPAVyttT5su78AMoB7NmTa7C+6GBBOREREREREOS5u+65SagxkMpY5WuvjAORj4IDvawDs01pPhgzw/nevd5SIiIiIiIjCx+2Y0kEAipRSgyDrJG6PuP8SyMLAAPAYgDP7FggmIiIiIiIiiirumFKt9Tal1M8AbAXQAeBFrfWLEQ8bA1k0GFrrHqVUK2Sh4d3RnreyslLX1dUlu99ERET9rFixYrfWeqTf+5HN+NlMRERecvvZHDeUKqWGQyqhEyDrI/5FKXWV1vpP9oc5fOmAwapKqUUAFgHAuHHjUF9fH+/bExERuaKU2uL3PmS7uro6fjYTEZFn3H42u2nfPQvAJq11i9a6G8ATAP4u4jFNAMb2feNBAMoA7I18Iq31/VrrOVrrOSNH8mQ2ERERERFRrnMTSrcCmKeUGto3TvRMAB9HPOZpAF/tu3wZgCXazbS+RERERERElNPihlKt9TLI5EUrIcvB5AG4Xyl1h1Lq4r6H/R5AhVJqA4BbANyWpv0lIiIiIiKiEIk7phQAtNY/BPDDiJtvt91/GMAXPNwvIiIiIiKirNbd3Y2mpiYcPnzY711Jq8LCQtTW1mLw4MFJfb2rUEpERERERESJaWpqwrBhw1BXV4ewrpiptcaePXvQ1NSECRMmJPUcbtcpJSIiIiIiogQcPnwYFRUVoQ2kAKCUQkVFRUrVYIZSIiIiIiKiNAlzIDVS/RkZSomIiIiIiEJo//79uPfeexP+uvPPPx/79+9Pwx45YyglIiIiIiIKoWihtLe3N+bXLV68GOXl5enarQE40REREREREVEI3XbbbWhoaMCMGTMwePBglJSUoLq6GqtWrcJHH32Ez372s2hsbMThw4dx8803Y9GiRQCAuro61NfXo729HQsXLsTJJ5+Mt99+G2PGjMFTTz2FoqIiT/eToZSIiIiIiCjNvvUtYNUqb59zxgzgF7+Ifv+Pf/xjrF69GqtWrcJrr72GCy64AKtXr/50ltwHHngAI0aMQEdHB0488UR8/vOfR0VFRb/nWL9+PR5++GH853/+Jy6//HI8/vjjuOqqqzz9ObK6fberC3jhBaC52e89ISIiIq/t2QNs3er3XhARhcfcuXP7Ldty9913Y/r06Zg3bx4aGxuxfv36AV8zYcIEzJgxAwAwe/ZsbN682fP9yupKaVMTcN55wF13Af/4j37vDREREXnpwguBpUuBffuADA5tIiJKi1gVzUwpLi7+9PJrr72Gl19+Ge+88w6GDh2K008/3XFZl4KCgk8v5+fno6Ojw/P9yupK6cSJwPHHA8895/eeEBERkZd6eiSQAsCyZf7uCxFRtho2bBja2toc72ttbcXw4cMxdOhQrF27FkvNm64PsrpSCgBz5gB/+5vfe0FEREReamy0Lm/YAJx7rn/7QkSUrSoqKnDSSSfhuOOOQ1FREUaPHv3pfeeddx7uu+8+nHDCCZg6dSrmzZvn235mfSidMgX4wx+AtjZg2DC/94aIiIi8sHGjdXnDBv/2g4go2z300EOOtxcUFOD55593vM+MG62srMTq1as/vf3WW2/1fP+ALG/fBaSFF+BECERERGFi5tHIywN27fJ1V4iIKM2yPpSaCvTOnf7uBxEREXln+3bZHn88sHevv/tCRETpFZpQumOHv/tBRERE3tmxA6ioAKqqZGkYIiIKr6wPpVVVsmWllIiIKDyam+UzvqKCoZSIKOyyPpSWlwODBgEtLX7vCREREXmluRmormYoJSLKBVkfSpUCSkuBAwf83hMiIiLyyo4dVqW0tVXWLSUionDK+lAKSChtbfV7L4iIiAgAenuB7u7kv15rq1I6YoTctm+fN/tGRJRL9u/fj3vvvTepr/3FL36BQ4cOebxHzkIRSsvKWCklIiIKgnXrZGjNk08m/xytrUBnp1UpBdjCS0SUjGwJpYMy8l3SrKyMlVIiIqIgmDBBqqTLlgFf+EJyz2GWg7FXShlKiYgSd9ttt6GhoQEzZszA2WefjVGjRuHRRx9FZ2cnLr30UvzLv/wLDh48iMsvvxxNTU3o7e3FD37wA+zcuRPbt2/HggULUFlZiVdffTWt+xmKUFpaCjQ1+b0XRERENGQIMH06sHJl8s/R2CjbsWOBwkK5zFBKRKFw+unxH3PhhcCtt1qP/4d/kH+7dwOXXdb/sa+9FvOpfvzjH2P16tVYtWoVXnzxRTz22GN49913obXGxRdfjDfeeAMtLS2oqanBc889BwBobW1FWVkZ7rrrLrz66quorKxM8IdMHNt3iYiIyFMTJrg7Waw18MorwN69/W83X1tbCwwfLpfddkQ1N1uVViIisrz44ot48cUXMXPmTMyaNQtr167F+vXrcfzxx+Pll1/Gd77zHbz55psoKyvL+L6FplLK9l0iIqJgqKkBnnlGQqdS0R/3hz8A11wDzJoF1Ndbj21slMs1NdZJ5/3743/flhbgmGNkoqX33gMmT079ZyEi8lScymbMx1dWJv71NlprfPe738W111474L4VK1Zg8eLF+O53v4tzzjkHt99+e9LfJxmhqpRq7feeEBER0ZgxwKFD8U8Ym7k3Vq4E3nnHur2pCRg9WlqBzQl7N6H0iSfke7a3A//6r8ntOxFRmAwbNgxtbW0AgHPPPRcPPPAA2tvbAQDbtm3Drl27sH37dgwdOhRXXXUVbr31VqzsG39h/9p0C0UoLS2VSRUOH/Z7T4iIiGjMGNlu2xb9Mbt3AytWyLCpvDxg8WLrvsZGad0FgMGDgeJid6H08ceBKVOAG28EHn5Y2ngbGoDZs2UYVirL1BARZaOKigqcdNJJOO644/DSSy/hS1/6EubPn4/jjz8el112Gdra2vDhhx9i7ty5mDFjBu688058//vfBwAsWrQICxcuxIIFC9K+n6Fo3zVnUVtbgaIif/eFiIgo15lQun07MG2a82OWLZPtxRcDS5dKKP3Rj+S2xkbg6KOtx5aXO4fSp56SFt8TT5SJkJYsAb79bWkJvuce4Je/BF5/XSqxK1cCf/yj3EdElEseeuihftdvvvnmftcnTZqEc889d8DX3XTTTbjpppvSum9GKCqlJpRysiMiIiL/1dTINlaldPlyqZDOnAksXChjQHfsAHp6pLo5aZL1WKdQumwZ8NnPAnPnArt2SUDt7ZWK6KRJwKWXAj/5iTzu4YclHN93n/c/KxERpS4UldLSUtlysiMiIiL/uWnfra+XSYlKSoALLgD++Z9lcqRTTwW6uvpXWMvLB37GP/aYdfnuu6USWlcnIRcA7rpLQu/8+cAVV0hwvflmYPVq4LjjPPkxiYjII6GolJpQykopERGR/woLJUju2OF8v9ZSKT3xRLl+wgkyU+6jjwLvviu3mXAJSEeUU6X07/5OqqV33gk8/zxw+eXWDL7jxwN/+Qtwyy1y/YtflJD6yCPe/ZxEROSNuKFUKTVVKbXK9u+AUupbEY85XSnVantMRucQLimR7cGDmfyu/nrrLZnZkIiIKIiqqqKH0qYmqVzOmSPXlZJq5pIlEjArK4Hjj7ceH9m+qzXwwQfA9OnAD34A5OcDQ4cC118ffX9GjwbOPFNaee2z9ff2Al/+MnDOOe4mUyIiSpTOgSVCUv0Z44ZSrfU6rfUMrfUMALMBHALwV4eHvmkep7W+I6W9SpAJpX2zG4feli3AyScDX/+633tCRETkLFYoXb5ctiaUAsANN0jn07p1wLXXSlXTiAyle/ZIO+/UqbLG6YcfWu27sVxxBbBxo7QOG3/7G/DQQ8BLLwE//GFCPyIRUVyFhYXYs2dPqIOp1hp79uxBYWFh0s+R6JjSMwE0aK23JP0d0yDXQumrr8rWPn0+ERFRkFRXW+EzUn09MGiQVDqNqipp3V21SiYpsjOhVGupqm7pOwoZP162xxzjbp8+9znguuukWmpahx9/HBg+HLjoIpkI6dZbgbFj3f+cRESx1NbWoqmpCS0tLX7vSloVFhai1qzllYREQ+kVAB6Oct98pdT7ALYDuFVrvSbyAUqpRQAWAcC4ceMS/NbR5VoobWyUrRk3Q0REFDSxKqXLlkl7buRJ9SlT5F+k8nJpsz14UD7zI0OpW+XlMtPvn/8M/OxnUo19/XXgtNOAO+6QsHrnnZyll4i8M3jwYEyYMMHv3Qg81xMdKaWGALgYwF8c7l4JYLzWejqAXwF40uk5tNb3a63naK3njBw5Mpn9dZRroXTfPmvb0eHvvhARETmpqpLP5cjP5t5eqYjOn+/+ucrLZWtaeLdulW0y57evvFLWT33zTRnbunGjhNLx44FFi4Df/15uIyKizElk9t2FAFZqrXdG3qG1PqC1bu+7vBjAYKVUpUf7GFd+PlBUBLS1Zeo7+mvvXuuy+WAmIvLatm1AZ6ffe0HZqqpKtjsjjho++kiC6rx57p/LrEduloXZsgUoLgZGjEh8vy66SCZFeuQRmVgJAE4/Xbbf+560Fd+R0ZkxiIgokVB6JaK07iqlqpSSZlKl1Ny+592T+u65V1KSe5VSwGphIiLy0tKlQG2tHKQTJaO6WraRa5UuXSrbREKpU6V03LjkhrEUF8u6qE88IXMzjB4tS9IAQE2NjDn9n/8Bdu9O/LmJiCg5rkKpUmoogLMBPGG77Tql1HV9Vy8DsLpvTOndAK7QGZ5iKpdC6d69wKRJcpmhlIjS4cMPZfvyy/7uB0WnlDpPKbVOKbVBKXVbjMddppTSSqk50R6TDma8Z+Tn1DvvABUVsi6pW5GhdMuWxMeT2n3+87IkzZ//DJx9dv+Zfq+8EjhyRGblJSKizHAVSrXWh7TWFVrrVttt92mt7+u7/Gut9TSt9XSt9Tyt9dvp2uFocimUHjgAHH20tC1v3uz33hBRGJkJ1bq7/d0PcqaUygdwD2RozbEArlRKHevwuGEAvglgWWb30Brvaf+c0lpmkD/ppMSqnNEqpcm68EKr9feqq/rfN2cOMGoU8NxzyT8/ERElJpH23UDLpVB66BAwbJiM19m+3e+9IaIwMqGU7zGBNRfABq31Rq11F4BHAFzi8Lh/BfATAIczuXOAzKw7Zgywfr1129q1ElLPPz+x5zKhdN8++QxsaUmtUlpcLEvP/O//Auee2/++vDzgnHOAV16REO3koYekxZeIiLzBUJqFOjpkYqfqaqC52e+9Ib+8+KJMGEKUDmY8XWsr0NPj776QozEAGm3Xm/pu+5RSaiaAsVrrZ2M9kVJqkVKqXilV7/U6eiecALz/vnX9qadku3BhYs9TUSFhcefO1GbetRs7Viq2Ts44Q4LvmgGL2wGrVwNf/jLwla8A69altg9ERCQYSrMQQymtXi1n9z/3Ob/3hMLKPqFaa2v0x5FvnJpfP63rKaXyAPwcwD/Fe6J0LdcGALNnS7DbvBn405+An/9cZrpNNFDm50tLbXOzNUa1rs7TXe1nwQLZmtl57V54wbr8xBMD7yciosQxlGYhhlJavly269blzuueMsuM3QP6B1QKjCYAY23XawHYm62HATgOwGtKqc0A5gF4OtOTHV16qaxLOmEC8Pd/L9XOX/0queeqqekfSlNp342nrk7+vfrqwPvef1/25dhjZdImIiJKHUNpltFaQunQoTKmtKWFE5HkInvbbkODf/tB4bV/v1SmzGUKnOUApiilJiilhgC4AsDT5k6tdavWulJrXae1rgOwFMDFWuv6TO7krFnA/fcD118PvP22tN4ed1xyz2VOxG7eLGuJ1tR4uqsDnHEG8PrrEqrt3n9f2pJPOAH44IP07gMRUa5gKM0yZiF7UykFZFp7yi07dliXGUopHfbvl+oWwEppEGmtewDcCOAFAB8DeFRrvUYpdYdS6mJ/966/r38duPdeYP58YPDg5J+nulom3tqyRdbQzc/3bh+dLFggr337mNiuLuDjj4Hp0yWUbtnC9nYiIi+EKpQePhz+CTk6OmRrD6Vs4c09u3YBU6bIZS4LRF7r7gYOHrTaI1kpDSat9WKt9VFa60la6zv7brtda/20w2NPz3SV1GvV1fLe19CQ3tZdw4wrtbfwbtokfx/TpkkoBaw1fYmIKHmhCqWAHEiFmT2UVlXJZXvVjHLDrl3AUUcBQ4bIbJREXjJdJ2P65nJta/NvX4iM6moZwrJsGTBxYvq/35gx8j5rD6XmJGBdnYwpBaRySkREqQldKA17C689lFZUyOW9e/3bH/JHS4uM9xs9miclyHvmfdR0YzCUUhDYZ9udPj0z33PBAuCNN4AjR+S6febf2lqZuKmxMeqXExGRSwylWeZw3/Ln9lC6Z49/+0P+2L8fGD5cquWslFKiDh2KPUGa6Tgx3RgMpRQEJ55oXZ47NzPfc9Ysef2btVHtkywNHixbcx8RESWPoTTLdHXJtqAAKCuTs7SslOaW3l4JDaWlUi3lRFeUCK2B4mLg8sujP8a8jw4fLu81DKUUBJWVwHXXyay48+Zl5ntOmybbNWtku3kzMHasNcnSuHEMpUREXmAozTImlA4ZIoF0+HBWSnONeY0PGyb//5yEhhKxcaNsn3wy+mPMa6ykRF5nDKUUFL/5DfDKK4BSmfl+JpSuXi3bLVv6txGPH2+19BIRUfIYSrOMPZQCwIgRrJTmmgMHZDtsGFBezlBKibFPymLeTyKZ99HiYoZSym3l5dKiayqlmzb1D6XjxsmYUjPmlIiIksNQmmUiQ2lFBSulucYEhNJSOWBqbeUBEbm3e7d1OVrrtxlTykopkVRL16yRsdjNzcCkSdZ948bJ+GyO7SciSk1oQumwYbLNtVDKSmnuMQHBVEqPHAn/656809JiXY42czPbd4ks06ZJh0FDg1y3L0djlk3ieuFERKkJTSg1ldKwHzyxUkqR7bsAW3jJPXulNNqBNNt3iSzTpslybK+8ItftlVKzbNL27ZnfLyKiMAlNKC0ulm3YK0adnbJlpTR3mdbK4mKGUkqcPZRGO6HFSimRxUx29MwzsrVXSmtqZMtQSkSUmtCE0iFD5F/YQ6lT+25bW+w1BylcOjpkO3QoQyklrrXVWn+0tdX5MQcPyhqMQ4YwlBIde6xslyyRsfxmjXAAGD1aZgJm+y4RUWpCE0oBOaufa6G0tFS2PGjMHSaUFhUxlFLi2tqscXDRXjft7daQiGHDrJZxolxUViZrkwLArFn9l6MZPBgYOZKVUiKiVDGUZpnIUGomeGIozR2HDsmWlVJKRlubvG6Ki6NXStvbrSERpaVyXevM7SNR0JiW3VNOGXhfTQ1DKRFRqhhKswxDKbFSSqlob5f3jbKy2KHUXinV2hrLTJSLfv5z4EtfAr75zYH3VVdHb9/dsQPo7U3vvhERhQFDaZZhKCV7KC0rk8sMpeRWW5s1c7PbUGq+jihXzZwJPPggUFk58L5oldK33pK236uuSv/+ERFlO4bSLMNQSocOyf9/fj4waFDsNkyiSG1t8l5ZVhb9ZMbBg1b7Lt9jiGKrqQF27hxYEb3nHqCnB3jkEWDXLn/2jYgoWzCUZhkTSgcPli0PGHNPR4dUSY2SErZWknumUppI+675OiIaqLoaOHKkf/DUWmbrnTxZrr/1lvPXHj4sX0tElOsYSrNMV5cEUjP7Hw8Yc09kKC0uDv/rnrzR0yPvIcXFDKVEXnFaq3TLFqmeXn89kJcHrFw58OsaG4G6OuDsszmRGBERQ2mW6eqSlk2DB4y559AhmXnXYKWU3LLP3MxQSuQNE0rtkx2tWSPbz3xGZu795JOBX/fb30pwXbIEWL48/ftJRBRkDKVZpqfHat0FrAPHsP/cZOnsBAoKrOuslJJbZpIss5wQx5QSpa66Wrb2SunHH8v2mGOkGrp588Cve+EFuR8AXn89nXtIRBR8oQulBw+Ge3xGZCgtLJQJb3jAmDu6uqyJrgBWSsm9yEppV5eMabPTmpVSokSMHi1Dauyh9KOP5PYRI5xDaWcn8N57wKWXAuPGAStWZHKPiYiCJ3ShFLAOvMKop6d/+65SctDIA8bcERlKWSklt5yWE4ps4e3slFlEGUqJ3Bk8GBg5sn/77scfW1XQujqZBMn8/QHAhg3ydzZtGnDssXKdiCiXxQ2lSqmpSqlVtn8HlFLfiniMUkrdrZTaoJT6QCk1K327HF0utLJ2d/cPpQBDaa7p7mallJJjr5SWlsrlAwf6P8a8f5r2XbPlewxRdPa1SrWWUHrssXK9rk62W7ZYjzdjTKdOjd7eS0SUS+KGUq31Oq31DK31DACzARwC8NeIhy0EMKXv3yIAv/F6R93IhVAaWSkFGEpzDSullCynSmlkKDUnOEwYzcuT91a+xxBFZw+lzc3SgWCvlALApk3W49etk+2UKXL/nj38GyOi3JZo++6ZABq01lsibr8EwB+1WAqgXClV7ckeJiBXQql9TCnAUJprzLJABiul5JabSql5LzH3A/IeE/k4IrJUV1vtu/ZJjgCgtla227ZZj1+3Tr6mtBQYP15u2xJ5ZEVElEMSDaVXAHjY4fYxABpt15v6butHKbVIKVWvlKpvaWlJ8FvHlyuhlJXS3OZUKQ37BF/kDXulNFooNdfNWFJAHsv3GKLoampkeZeeHiuUmvbdqirZ2secNjQAkyfLZVNJzVQL7/33Az/6EddGJaJgcR1KlVJDAFwM4C9OdzvcNuDtTmt9v9Z6jtZ6zsiRI93vpUvmICrModRpTCkrZbnFaUwp0H8SDSInqVRKGUqJoqupkRODu3bJGqVlZVYYLSgAKir6z87b1CSz7gKZDaWdncC11wI/+IHMEExEFBSJVEoXAliptd7pcF8TgLG267UAtjs8Lq3MwXmYD56cKqW5sD4rWSLbd83YP74GKJ5kK6UMpUSxmbVKm5uBlSuBmTNldnz7/aZSeuSItPKatt5Ro+Q9vakp/ftpqrgAUF+f/u9HRORWIqH0Sji37gLA0wC+0jcL7zwArVrr5iiPTZtcad+NHFNq2jcpNzitUwqE+3VP3mCllCg9xvQNWGpoAN5/H5gzp//99omQdu+W93ETSvPyJLRuz8CpfHt1dPXq9H8/IiK3BsV/CKCUGgrgbADX2m67DgC01vcBWAzgfAAbILPzXu35nrqQCwfnrJRSZPuuqZTyxATFY6+UFhTICS5WSolSd8wxEi4ffFBaZCNDaXW1FQhNRXSMbeaNMWP6T4SULg0NsrWHZCKiIHAVSrXWhwBURNx2n+2yBnCDt7uWuFwIpdHGlB46JC1BeYlOXUVZx2n2XSDcr3vyhqmUFhVJa2FpafRKKUMpkXvFxTKx0dNPy/V58/rfX1MD7Nhhte4CVqUUkFD64Yfp38/t22V868SJmQnBRERuhSrCFBQA+fnhPjiP1r4LWAecFG5Os+8CrJRSfIcOAYWF1skrp1B64IA8xv4b3xYVAAAgAElEQVQ+w1BKFN8XviDbefOsZV6M6mr5/N6926qU2kNppiqXzc2yL5mqzBIRueWqUpotlAp/K2tPj4wHs7NXysxlCq9os++G+XVP3ujokCqpEa1Sah9PCkgoPXzYefgAEYlvf1v+di69dOB9NTWy3b4daGyUv6NRo6z7x4yRv722tv5dCl6zh9JnnpFlYZTT+glERBkWqkopkBuh1Kl9Fwj3z00WVkopHq2B+fNl2Qe7Q4f6n9SKVimNPCg211ktJYqusBD41rcGVkmB/rPzNjZKKMzPt+4340vTXb00obSmRt4PWlvT+/2IiNxiKM0yTmNKuSRI7jhyZGALN09KUKTVq4GlS4Ef/UgCquGmUnrggHOlFGAoJUqWqZSaUDp2rPP96WzhPXJExrXW1GQuBBMRucVQmmWcxpSaUMJKWfh1d8uWlVKKxb7Uw44d1mU3lVKn9kGGUqLUVFXJ1rTvRobSTITEPXvkM8S075r9ISIKAobSLMP23dwWK5Ty/58M+4Ht+vXWZVZKifxRWAiMGCF/m01N/oTS5r7V46urgdGj5fLOnen7fkREiWAozTJOoZShJHd0dcnWXi3Pz5cDHlZKybAf2G7dal0+dMjdREfRKqWRjyUi96qrgQ8+kPfxyFBaXAyUl0sVNV2cQqm9k4KIyE8MpVkm2jqlAENJLjCh1F4pBcL/uqfENDfLWoSALEFhHDpkncQCJJQePmy9rgBg3z5g+PD+z2cqp6yUEiWvpgZ45x25HBlKAWDyZGDDhvR9f3soLS2Vk5mslBJRUIQulBYXhzucxRpTylASfk7tu4C87vn/n34bNgDXXts/xAXR/v3AhAlSRY8MpZFjSgErbPb2Sig1gdZg+y5R6qZMsSYeO/po5/vXrUvf97eHUqWkWspQSkRBEcpQGuaDc7bv5jan9l1AXgOHDmV+f3LNF78I3H8/sGyZ33sSW2urtAJWVLgLpaYtd/9+OWhmKCXy3vHHW5cnTx54//TpwJYtwBtvAMuXe//9m5vlb968BzCUElGQhC6UlpRIpdS+DEKYOIVS8wET5goxiWjtu0OHMpRmghl/9cEH/u5HPPv3SygdORJoabFud2rfBay1CvfskW06Q6nWwIMPWlUbolxx/vmyPe20/muUGqeeat0/d6737zNNTUBtrXW9qopjSokoOEIXSouLJbgFvb0uWU5jSvPywl8hJhGtfZehNDPMgWQ6JyPxQmsrUFYGVFbGrpSOGCHbvXtla0Kpud0oKJDqvBehdNky4KqrgAULUn8uomwybpwEzSefdL5/3jzpxjj2WLn+4IPunvfwYVmDNJ7IUMpKKREFSehCadgn/XEaUwpwoptcwUqpf7S2qgomxAWVad+trLQqpVoPDKWmImrCqPm5IiulgDyfqaim4s03ZbtuXXg7WoiiOf54+VtyohTwyCPAmjVSKV26NP7zbd0qkyZ99avxH+sUSltaZCw5EZHfQhdKTWtamENpZKUUCP8ET05+/nPgxhv93ovMijamlKE0/czC8+ZyUHV3y2uhtFTad02l9PBh2cYKpdHadwE5kN6/P/X9s88uun176s9HFEazZwPvvx//xM0jj8jf+J/+BOzaFf1x3d1yUi2yfffIkWC/nxFR7ghtKA1j1VBr5/ZdIDcrpbfcAtxzD9DZ6feeZA4rpf6xt8EGuVJqXgclJVIp3bNHDjzN7cmG0rIyb0KpvfU56G3QRH6ZMkU6E+zvO07eftu6vGRJ//s2bgQuvlgmTmpulmOIyEopwHGlRBQMoQulYW7fNWNGGEr7S+cU+kHDMaX+MYGsoCDYlQV7+KyslPeNffus90R7KC0okBN59lCalycBNJJXldKtW4GJE+VyU1Pqz0cURlOmyHb9+tiPa2gAFi6UNUfffbf/ff/8z8AzzwBf+5p1AsgplHJcKREFQehCaZjbd3t6ZOs0pjSXJzoyy1nkArbv+mffPtnW1XkztjJdzHtfcbE1YdG+fc6VUkCqovZQOmKEBNNIXoXSXbukNRFgpTRVSqnzlFLrlFIblFK3Odx/nVLqQ6XUKqXU/yqljvVjPylxbkKp1lINPfpoYMYMoL7euq+7G3j2WfmsWL8eePRRuX38eOsxVVWy5UzYRBQEoQulplIaxoBmQmm0SmkYg7gbuRhKo1VKOXFM+phQOmZMsE8A2MPn8OFyee9ed6G0udk6UI3kxURHWsu+TJ4MFBWxUpoKpVQ+gHsALARwLIArHULnQ1rr47XWMwD8BMBdGd5NStKECXJyyD4GO9LOnfJ3PXEicOKJwMqV1qRF770nx0H33CPB9O675XPDhF1AZgNWCti0Kb0/CxGRG6ELpWGulJrWTbbvWpO2AN4sU5EtYrXv9vZa95P3TCitrQ32+0sylVIzbq2pSWbydOJFpbS9XV6nFRXye2QoTclcABu01hu11l0AHgFwif0BWmv7KbtiADxtlSWGDJGujFiV0oYG2U6aBMyZI3/7a9fKbWaW64suAs49Vy5Pn96/y6agQP4OzfMQEfkptKE0jAEtVqU019p37UE0l0JprPZdINgVvGxnAllNDdDR4W5dQD+kUiltbOw/5syuvFyeI5U1oM0EUSNGSPhl+25KxgCw/wab+m7rRyl1g1KqAVIp/WaG9o08MGVK/1BqPxkL9A+lJ54ol5cvl+2bb0pHQlUVcPPN0plw/fUDv8fUqbIEDRGR30IXSsM80VGsMaW51r5r/3Bm+y5DaSa0tcnv3QS9jg5/9ycae/h0UymtrJRKaWenjPeMVSkFUmvhNaF0+HAJvwylKVEOtw2ohGqt79FaTwLwHQDfd3wipRYppeqVUvUtZmFb8p0JpVrLhEWlpcB991n3b9wo7bd1dRIuS0oklHZ1yUy8Z5whjzvrLDk+uPrqgd9j7lxZeuaXvwR+8hN22xCRf0IXSsPcvhtvTGlHR+4sgs323f63M5SmX1sbMGyY9R4T1N+1vX3XTaV0zBipApuxa9EqpWZG3lRaeCMrpdu3W+9rlLAmAPZTCLUAYq38+giAzzrdobW+X2s9R2s9Z+TIkR7uIqViyhR539m1C/jVr+T9/z/+w7q/oUH+joYMkfGnc+YA77wDvPWWfN3ChdZjldMpDAAXXijHDd/6FvCd7wA/+1l6fyYiomhCF0oLC+XNN4ytrLHGlIY5jDvJ1VDKSql/2tv7h9Kg/q2Z10BRkbxOiotjV0pNCH3nnf7XI5lKqZeh9MgRzvyZguUApiilJiilhgC4AsDT9gcopWzT2uACAHEWGKEgMZMSvfce8NprQH6+nDzatk1ub2iQ1l1j4UJ57D/9kxwLnXlm/O8xfz7wX/8l/846C/jd7zhhHhH5I3ShVKnwtrLGa98FwvlzO+nstC4HtY0yHTim1D9tbfJ3Zn7XQf1bM38bhYWyHT48dqXUtOu+9Vb/65HSUSkF2MKbLK11D4AbAbwA4GMAj2qt1yil7lBKXdz3sBuVUmuUUqsA3ALgqz7tLiVh6lTZ/uIXclL6hz+U6++/L9uNG/uH0quvlpNH770H3HCDnERz46tflX9f/KI856pV3v0MRERuhS6UAuFdszFe+y4QzgqxE3ulNBdDKSulmZct7bsmlBYUyHbECAmDJkRHhlJzUPvEE3Kyw36Qa2cOcFMJ42YG4+HDZTkKgKE0FVrrxVrro7TWk7TWd/bddrvW+um+yzdrradprWdorRdorTmlTRaZMEHGfL/wgpwU+sY35PZVq+SzfudOWQ7GGDkSWLoUeOQR4Mc/Tvz7XXKJnNh/+un4jyUi8looQ2lRUTiDCkOpxR5KI2ckDDPTws1Kaea1t2dXpdSE0uHDJQy2tUn7n6mgGrW1MoHKgQPA0Uc7d2IA3sxsvnevfP+iIlZKieJRCjjvPLl82WUyU/aECVIp3bhRbo88iTR1qlQ8nY4T4hk5Epg9G3jppdT2m4goGQylWSTeOqWA8/hKrWVGvjD9TnK5UpqXJ+HCjqE0/bKlUhpZTTeV0gMHpNoSOeGJUjKuDLBm63TixRCBvXutGYHLyiQMb9mS/PMRhd2//Rtw++3Av/+7XJ8xQyql9uVgvHTWWVJtzaVZ7YkoGEIZSsPevutUyYg1Cclbb8m0707TwWcrE0qLi3MvlEa27gIMpZlgxpQGfaKjzk45cWFOXo0YIZXS1lZrXGik738fuOgi4B//MfrzelUpNaEUkKrORx8l/3xEYVdbC/zLv0iVFACmT5dlYj74QK7b23e9cPbZMhvv6697+7xERPGEMpSGtVIaq33XHOiZiUTszKQI9fXp2S8/mFBaXh7O/+toursZSv1iZt8Nevtu5IkLM9HRgQNSmXRy8skyjmz8+OjP60UYjwylJ5wg709HjiT/nES5ZMYM6X565BFg9Ghr2SevnHSSHEOxhZeIMs1VKFVKlSulHlNKrVVKfayUmh9x/+lKqVal1Kq+f7enZ3fdycVQaj6YzEQidmvXyjZMgcWMmxs+PJz/19GwUuqfbGnf7ey0xpMCEgIPH5ZJUaJVSt0w41FTqZTu29c/lJ55JrBnjzXzLxHFNmOGbNeulaqp1woKgFNPZSglosxzWyn9JYC/aa2PBjAdMv18pDf7ZvibobW+w7M9TEJY23djjSk1Y8WcQun2vuXUm5ut58h2plKai6HUqX27qEi2YXzdB0FXl/ztZMtER/ZQak5Ybd4cvVLqVnFx6pVSe2XnoouAyy8fOCMwETkbN846uXTaaen5HmedJaG3qSk9z09E5CRuKFVKlQI4FcDvAUBr3aW1TmGluvTLxUppXp7VpheppcW6nMoag0FiKqVlZeH8v44mWvvuoEFyO0NpepgJxOztu0H9XUdW001lcufO1Fv9Ul0DOrJ9t6QE+POfZcZPIopPKeBnPwMWLAD+z/9Jz/c4+2zZvvxyep6fiMiJm0rpRAAtAP6glHpPKfU7pVSxw+PmK6XeV0o9r5Sa5u1uJibsoTTakg1m6YdI9lDqFFqzkfldlJaG8/86mmjtu0B4OwSCwITSkhI5AVRUlD2V0poa63JVVWrPXVycfPvu4cPy+rSHUiJK3Ne+BixZkvrfczTHHw+MGsUWXiLKLDehdBCAWQB+o7WeCeAggNsiHrMSwHit9XQAvwLwpNMTKaUWKaXqlVL1Lfak5LGwHpzHqpQC1tIPkVpagLo6uRyWUGrakEtLc2ud0mjtu0B4X/dBYILYsGGyHTo0e0Jpba11OdWD2FQqpeaEGUMpUbDl5cl475dflkmViIgywU0obQLQpLVe1nf9MUhI/ZTW+oDWur3v8mIAg5VSlZFPpLW+X2s9R2s9Z+TIkSnuenRhr5RGC6VOldLeXgmiRx0l18MSSs3voqQknP/X0bBS6g97pRSQ33VQX3eRrxF7pbS6OrXnTqVSylBKlD3OPhvYtQv48EO/94SIckXcUKq13gGgUSk1te+mMwH0W1lOKVWllCzJrpSa2/e8ezzeV9dMKA3bGb5kKqV798rvYepU63oYdHfLbKBh/b+OJtqYUoChNJ3M79XMvFtUFNzfdWSl1P56MSenkpXKREfmvcfrJSyIyHtnnSVbtvASUaa4nX33JgAPKqU+ADADwP9TSl2nlLqu7/7LAKxWSr0P4G4AV2jtX0wwE5GEra3ThNL8fOf7nSqlpks6jKF08GBr1lkz8VHYxWrfLS4OblDKdqYqal5v2VQpBYBbbgEqK4FZs5y/xq2SkuQrpea9h5VSouAbO1aOGzjZERFlSpSaW39a61UA5kTcfJ/t/l8D+LWH+5USc+DY0WFdDoN4ldLKSjnw6+21gqsJpVOmyDYsobSnR34P9v/rwkJ/9ykT2L7rD/N7NSe8gjxEoLPTquga//EfMmOn9LMkz4tKKUMpUXY4+2zg978f2H1BRJQObiulWcUcOAb1oDFZ8UJpTQ1w5Igs/WCYUFpVBZSXhyeURlZKw/Z/HQ3bd/0RWSnNpvZdI9VACrBSSpRLzjhD3vtWrPB7T4goF4QylJoDx6AeNCart1e2sUIpAGzbZt1mQunIkXIw6LRkTDZyqpTmAlZK/RFZKc229l2vmEppMoMz9u2TDo7SUu/3i4i8N3++bJcu9Xc/iCg3hDqUBvWgMVnxKqVjxsi2qcm6zYTSykoJpXt8m37KW7laKeWSMP5wqpQG9TWXzla7oUPl5FhXV+Jfu3evdGt4UbElovSrqpLl5BhKiSgTQhlKc7V9d8IE2TY0WLe1tMiB4ODB0dcxzUa5Will+64/nMaUBvV3nc5QmsrEYnv3snWXKNvMmwe8+67fe0FEuSCUoTSsQcXNkjCVlcC6ddZtu3dL6y4AVFSEJ5SaSqmZ3ChsMy1Hw/Zdf3R0SOupqVIHuVKazvbdVP7eGEqJss8JJwBbtgAHDvi9J0QUdqEOpWE7QI8XSgFg2jTg/fet6zt3WqGUldLsF699t6NDJrsibx06ZFVJgWCPKU1npZShlCi3HHecbD/6KPbjiIhSFcpQmqvtuwBw0knAypXA/v1yfds2a6ypmejITJiUzXJ5TGmsSimQO1XjTIpcXirI7btBrZTu28dQSpRtTCj98EN/94OIwi+UoTSsQcVNKP3c5yR03nuvzJAZGUq1Blpb07+v6ZarldJ4Y0qB4IalbBZZKS0qkr+z7m7/9imaIFdKhw/3dn+IKL3Gj5dZt1ev9ntPiCjsQh1Kw3Zw3tMjM1fmxfhfmz1bgukdd8iMeQcPWqG0okK2YWjhzeVKaaz2XcC/131DAzBpEvDEE/58/3SKrJQGtRvjyBF5nwhaKO3tle4NVkqJsktengwLYiglonQLZSgN6gFjqkx1MJ5775XfwcUXy/WpU2VrDgjDEEp7enI3lAa1Uvraa8DGjcDtt/vz/dPJqVJqbg8Ss1RL0Np3W1ulS4OVUqLsc9xxbN8lovQLZSgNa1BxG0pHjwZuvFFm3gWA6dNla0JpGNYq7e7OvfbdI0ek4hTUULpmjWyD2NKaqmihNGivO7NUS7orpYn+3GbIAEMpUfY54QRZXm7HDr/3hIjCLJShtKBA2lyDVsVIldtQCgA33SRtu2efDYwdK7eFqVIauSRM0MJBOpiwF9RQag5YNm0K3wzA2dK+ayqlQWvfNaG0tNTb/SGi9DMntu0z+xMReS2UoVSpYK8jmKxEQunIkcD69cBzz8nvAwhXKDW/i8GDZcxLLsw4awJHUMeUHjwo2+5ua/bnsMiW9l1TKQ1i+y4AlJV5uz9ElH4mlK5a5e9+EFG4hTKUAgylgPwO7AFmxAggPx9obvZ+3zLNVErDegLCSbzxgn6H0vZ263JLiz/7kC5OS8KY24MkqGNKDxyQLSulRNln+HCZhXflSr/3hIjCLNShNGhVjFQlGkoj5ecDtbXA1q3e7ZNf7L+LXAmlQW/fbW+3ZoYOWyjNljGl5jUSrZqeKlZKiXLTKacAL78cjjkpiCiYQhtKhw4N3gFjqlINpQAwblw4QqmplAK5E0qD3r7b3g5MnCiXwxZKo40pDdqJr6CGUlMpZSglyk5f+YoM/amsBK691u+9IaIwCm0oZaXU2eTJwNq1sjxDNsvFSmk2tO9OmCCXd+3qf5/W2f2ay5b23Z4e2ab6PhGN+bk50RFRbjn7bODRR4FzzwXuvx/45BO/94iIwia0oTSsldL8/NSe48QTpYq1ebMnu+SbXKyUZkP7bl2dXI6slH7jG8BnPpOdwVRrmUDIPqNtUENpuiul5neQTKV0yBCr0kpE2ecLXwB+/3u5/OST/u4LEYVPaENpGIOKF5XSU06R7csvp74/frL/LgoLw/d/7SRe+67fSyG1twMVFVINs4fSw4eB++4Dli8HNmzwZ99S0dMjwdQeSv0+ARBNukNpXp6Ey2QqpaySEmW/MWNkNt7Fi/3eEyIKm9CG0qFDg3fAmCovQum0aTKL3rPPerNPfsnFSmm89l2l/AvoXV3yr6REliOyh1J7m9cHH2R+31Ll9HsPaqU03e27gLzGkgmlHE9KFA4LFwJvvWWNFSci8kJoQ2kYg0pvb+oHm0rJB8qSJdnZSmlEjinNhXVK47XvAv6FUrNGqVMoXbfOupyNk2yZtT/ZviuSCaUHDrBSShQW558vn8FuO65eeQW47jprbDkRkZNQh1JWSp1Nmyatljt3pv5cfmGl1JlfAd2sUVpcLLMz7t5t3bdtm3V5y5bM7pcXnH7v+fny+gvae0xQQykrpUThMX++/D0vXiyfvdddB1xyCdDYOPCxO3YAF14I/Pa3wN13Z35fiSh7hDaUhnWiIy9C6aRJss3G8X1GLs++Gytw+PW7MKG0pERCqX0tux07ZJ+POgrYvj3z+5Yqp0opEMz3GNO+G7RQykopUXgMGiSz8T75JHDZZRI4n31Wwmmku+6Sk2Xl5dk/lwURpVdoQykrpdGZGVKdzmpmC1ZKnQUllNorpTt2AFVVcvvevZnft1SZ33tkKA3i685USoM2prS9HRg2LD37Q0SZd8klcvJx8WIJpT/8oVy2d8McPgw88IA89u//Hqivz+5hQ0SUXqENpUGsYqTKq1A6cqRsI5ftyBZay8F3rlVK3Y4p9bN9t6REZuDt6LBOCu3YAVRXAyNGZGcoNZXSyN97EE98Zap9N9G/t4MHrRmLiSj7felLwO9+BzzzDLBoEXD55XL7Cy9Yj3n8cQmu110nnTKHDmX3sCEiSq/QhtKiIpkYyBykhYFXoXTECFnaIdlQ+pe/+Ds25MgR2ZoDby4JYwlKpRSwqqXNzVIprajo39abLdi+218yJz4OHpTxxkQUDnl5wDXXyHhRAJg6FaipkUmNjMcfB2prgTPPBCZOlNs2bsz8vhJRdghtKA3qOoKp8CqU5uVJcNi1K/GvbW+XM6I339x/qY9MimxRLCqS4GDCalgFuX3XPvuuCaUmgJr23REjsjOURvu9Dx1q/dxBkYn23YICK6i7oTVDKVHYKSXh89VX5W++sxN46SXgggvkmMMMG8rGye6IKDNCG0qDumRDKrwKpcDAZTvcWr3auvzaa97sS6Iiq0FmrFrQAoLXgrwkTLRKaU+PvM6qq6VSevBgYoEmCKJVSktLgba2zO9PLJlo3000lJoTRgylROF2+unyfr92LfDmm/K5cMEFct/o0bJl+y4RRRPaUMpKaWxlZcktfL1mjXW5vt6bfUlU5IF3ebls9+8H3nkHePBBf/Yr3dy27/o9ptQeSnftkrPmo0dLpRTIvnGl0SqlpaXBWzw+iKHUnCxiKCUKt1NOke0bb8hsvAUFwBlnyG3Dh8vxSzIdWkSUG9LY5OUvVkpjGzYM2Lcv8a9rapI2nVmzgIYGb/YlUaZSan4XJpRu3w783d/J5eOOA6ZPz/y+pVOQ23cj1ykFJJTu2CGXq6ut/d+7V65ni1iV0qCF0si/jXRgKCUiJ5Mny1CNJUuAt98GzjnH+rvPywNGjWKllIiic1UpVUqVK6UeU0qtVUp9rJSaH3G/UkrdrZTaoJT6QCk1Kz27654JpayUOkv2gLq5WULH1Kn+hdJoldInn7Qe89RTmd2nTHDTvutnKC0okP+T4cPlxEVkKK2okMvZNq402pIwQQylrJQSkV+UAs4/H3j0UTmB/YUv9L9/1ChWSokoOrftu78E8Det9dEApgP4OOL+hQCm9P1bBOA3nu1hkkz7LiulzpI9oDaT1kyaJOucmgP2TIqsBg0fLtslS2RbVydnacPGTaXUzyVhSkrkcn6+/J/s2WOFUjPREZB9oTTakjDmbyhI6+5lKpQm8hpjKCXKHd/4hoTTqipZn9Ru9GhWSokourihVClVCuBUAL8HAK11l9Z6f8TDLgHwRy2WAihXSvnaoOe2Uqo18Pzz2TFJjtftu8lM0rJzp3ywTJokk5ds3uzN/iQiWqX03Xelfeikk4CPI0+bhEDQl4QxoRSQavru3VJZB8IxptSpUnrkSLBOfLF9l4j8NHu2THS0Zo28R9oxlBJRLG4qpRMBtAD4g1LqPaXU75RSkYcXYwA02q439d3Wj1JqkVKqXilV35LsIpkuua2UPvigtJvcc09ad8cTXldK29oSX0altVWqYJMmyXU/WngjD7xraqz7Zs4Ejj4a2Lo1O040JKKrS6qQeTH+av1anzdaKN2xQ04aFBZaFe3W1szuW6piVUqB5Ft4P/tZ4Oc/T36/nGSiUlpYyFBKRNEddZR1EtJu9Ghr8jsiokhuQukgALMA/EZrPRPAQQC3RTxGOXzdgLcdrfX9Wus5Wus5I0eOTHhnE+G2UrpihWz9qPglyutQClgT1Lh14IB87dixcn3bNm/2JxGRB95FRdbl2bMllALA+vWZ37d06u6O3boLSGAAMl+9cwqlLS0SSs2kRiUlEqj3R/ZZBFysiY6A5Nvgn3oKuOUWb9fX7e6WExfK6R3ZIwUFcoLE7YElQ2n6KKXOU0qt65vPIfJzGUqpW5RSH/XN9fCKUmq8H/tJBMiY0sOHg7eUFhEFg5tQ2gSgSWu9rO/6Y5CQGvmYsbbrtQC2p757yXNbKW3sq+9mQ4Dp6ZEDTi+YtT0T/XBobZWD8aoquW7aMzPJqUXRVG4XLLBC6dq1md2vdOvqil8BMydjMj2uNDKU1tTICQszBhmQQFpamn2hNNaSMEByofS996zLTU3J7ZeTnp70VkkBK5y7HU/OUJoeSql8APdA5nQ4FsCVSqljIx72HoA5WusTIJ/dP8nsXhJZTC1i925/94OIgiluKNVa7wDQqJSa2nfTmQA+injY0wC+0jcL7zwArVprH+KKxW2l1ITSbBjnkI5KaSIH1L29Ej5KS+XAdMQIf0KpU4viiy8CDz8MnHiiv63F6dTVFb9S6tdSSJGhdNw4mdDo44+BMbZG/vLy7Aul6aiU2v9u1q1Lbr+cdHendzwpYP0e3LbwMpSmzVwAG7TWG7XWXQAegczv8Cmt9ataa/MpuBRywpjIFyaUpnn0FhFlKfF2NXIAACAASURBVLeHLzcBeFApNQTARgBXK6WuAwCt9X0AFgM4H8AGAIcAXJ2GfU2I20qpCaPZMPmK1xMdAYkdUJtWX3MwXlPjbyi1/y7GjgWuuEIuFxVJ+PFj39LJTfuun6HUHjrG9zUJ7tkDTJli3Z6NoTTaBFOptu8aGzcmt19OurszVyllKPWd01wOn4nx+GsAPJ/WPSKKwaxhzVBKRE5cRRyt9SoAcyJuvs92vwZwg4f7lTIzti5epdQcIGfDMhW9vd5XShNp3zUH3+Zrq6uB7T40aZv23VgH39XV/Q/8w8BNpdS87v1u3502zbqc7aG0s1N+75HjNFMJpTt3Skjr7AS2bEl9H41Mtu8mGkrNCRPyjKu5HABAKXUV5DP8tCj3L4Is54Zx48Z5tX9E/bB9l4hicbtOadZRSg7QY1WMjhyRA8rBg+UgPl6A9Zvf7buRoTRIldJI1dXhq5QmMqY005XSgwejh9JTTrEuZ2Mo7eoa2LoLWH8HycwmvGuXvEbHjfN2krWgtu8OHRp71mhKiqu5HJRSZwH4ZwAXa60d/9cyOQkh5S5WSokollAfJgwdGjtotrXJDJJmDGKQq6Vae1spTaZ916lSumOHt7OHuuGmUlpVFb5QGtT23SNHBobSQYOAZ5+VJU9qbaPYsjGUmkppJLM+bjLvGwcOAGVlQF2d96E0iJVStu6mxXIAU5RSE/qG1lwBmd/hU0qpmQB+Cwmku3zYR6JPlZTI+0e8SumuXcBPf5odc30QkXfSfE7dX0VFsQ/OTYWjtlZmak10eZRM6u2VbZAqpVVVchC8bx9QUeHNfrmRSKVU6/Quj5FJibTvZjKUdnTI79keSgHgggsGPjZbQ6lTpXTQIHnd70riUN8srTR+PPC3v6W+jwZDae7QWvcopW4E8AKAfAAPaK3XKKXuAFCvtX4awE8BlAD4i5I3wq1a64t922nKaUpZy4XF8vWvA08/LbOUP/RQZvaNiPyX05VSeygFgr12ltMyKKkwAcKM93IjMpSaVpxMV5jdjik9fDi51sqgCuqSMOZkTmQodVJeLn9n5iRLNoh1MmD06OTO5re1SbdCXZ2cPHEb8OLxssU/GhNK3b7GGErTR2u9WGt9lNZ6ktb6zr7bbu8LpNBan6W1Hq21ntH3j4GUfDVyZOxK6d69wHPPyeUnn0zuBOu6dTKE5A9/SG4ficgfoQ6l8SqlpmJjQmmQK6Veh9KCAlnzNJGfOVoozfSkBW4rpUC4WniDuiRMoqEUSG5yIL9Eq5QCshh8KpXSujq5vnVr0rvXT1ArpWY2dCLKbfZK6aZNwPnnA088Yd3/xhty0vK22+RzrL4+8e/xgx8AH30EfOc7mR9eRETJC3UoHTrUffsukFuhVCkJEdkYSt1USk07cTYs9eOWmzGlfrTvJhNKs6mFN92VUkDGlXpRPQ5qKGWllIiA/vM9fP/7wPPPA9dcY3W1vfOOvIdde61cX7Eiseffvh3461/l86ilxdvZzYkovUIdSouKYrfvmgPjMWNkm0uhFEg+lJpJkrwIpW+/DXzySWJf46ZSasIP23fTL5FQWlYm27CEUq8qpb/4BTBiBLBkSdK7CSAz7bvmxAdDKRElaswYCY69vRJIJ0yQzwPTsvvOO8DMmfLeOGKEtOIm4ne/k/fBe++V6x9+6OnuE1EahTqUuq2UMpS6094uoSc/X66nGkq3bQNOOknadxLhplJqwk/YQmlY2nezKZTGqj6OHi2vsUROAnR2yv9laal0aZSVAYsXS1C97774X5/svnqFlVIiSlZNjbxPLVkikyTefrt0Nj31lLwv1tcD8+fLYydNAhoa3D93Tw9w//3AOecAF14otyXy9UTkr1CH0niVUobSxH7mQ4es0ANI6C8sTD6Urlwp24YGmb3VLVMpjXXwnY3hJx627/ojXigFElt3z0yoNmyYrN35ta9JO31eHrBhQ/r21SsMpUSUrLF9K+v+93/L9swzJUA+9xywdKl8dpm1rSdOBDZudP/czz4rJ7uvv14+a4YOBRobvd1/wDoeIyJvhT6UxpvoqKDAGn/IUBpbR0f/CUvM9O7JhlL7+oyJhBQ3v4tcrZTm50soYSj1TqyWWBNKd+xw/3wmlJqx2T/9qYyxuvFGYP36xE7QOO0rQykRBdXUqbJ98EGphI4dC1xyiXwm3Hmn3HfqqbKdOFHGhLoNgfffL90nF14oxye1tUBTk7f7f9NN8h740596+7xEFPJQ6mZJmPJyOZAvKmIojaejo3+lFPAulCYyWYybSmlhoQS4bAo/8bgZUwrI/1FQx5RmYyiNVX1MZpbnyLHZSkm4HTtWfpepvA91d2duSZhEQqmb1wYRhd/kydblM86Q7TnnyPvKiy/KUi4jR8rtkybJsY+bamdnJ/Dqq8DnP2+9B44d620o3bwZ+PWv5cTht78N/OlP3j03EYU8lMarlLa2WhW1RANapgUhlB46NHBph1RCqX2CmGRCaazfhVLyfxumSmmspUns4r3uvZZIKC0tlf+bsITSmhrZbt/u/vkiK6XGiBGyTWXG6KC173Z1yT4xlBIRICeLTRi98krZFhcDX/6yXP7mN63HTpgg202b4j/vu+/KydgFC6zbvK6UPvOMbNesAU47TdqEw3SMQeS3UIfSeJXS/fsZSv2slO7dax3gJtL+6GaiI0CqctkUfuJxG0oLCzMfSvPyrPGsseTlSRjLpv+XWO27o0ZJyE4klEZWSg0vQmnQ2ncTOWFBRLnhf/4HeP31/gHyvvuA1auBRYus28xJPzfHB2+8Ie/FZjwqIKHUzPTrhaVLZQ6SY46R9t329v5rrBJRakIdSouK5M3IVNYimfZdQA4QTQUjiMIYSvfsscaXJPIcbiqlQPgqpW7GlAL+tO8WF8sBgRvl5dn1/xKr+jhokLTeJtK+m+5KaZDadxlKiShSTY01btQYPFhad+2qqmTrJpSuWWMtI2PU1soxYCLvz7EsXw7MnSuX58wBhg+XZe2IyBuhDqWm1TRatTRT7bs9PcDVVwMvv5zacwDeHnAWF8t4L7cTq0Rr3923L7nZ6PbulYkMgMRCSk+PBCCzNE00uVopzXT7bqJjBrPt/yVeS2xNjTeVUjPhWtDbd/Py5H3IzYkPhlIiSlZZmXzmuQmln3wCHHVU/9vMygrbtqW+L/v2yUR0J54o15UCZs8G3nsv9ecmIhHqUBpvzcZMte8+/TTwX/+V+Hqcdib0xQtiiSgpkbOIbicsiVYpBZI7kN6zRyaKGTIksVDqthqUbRW5WI4ckddAEENpe3tioaOsLLtCaaz2XUBew16MKTVdG/v2JbZ/dpkIpYC8DlkpJaJ0UkqqpfFCqdbpD6UffijbmTOt26ZMcTfelYjcCXUodVMpNQeC6Qylr78u2+5uacFMRrradwH3P3e0SimQ2DqNgHyIHDggv/+yMqt65IbbcXPZFn5iMQEgqGNKc71Smszsu5G/s0T/Hp3EC9BeYSglokxwE0p37pSTfekMpevWyfboo63bJk6UE/LZ9HlGFGQ5EUoPHhx4X3e3hKxMVEpXrLAub9iQ3HMEIZQ6VUrN+I1EqztdXfIzlZQkPvbTbaW0tDSxsBtkiYRSP8aUhjmUxjsJUlMjM0lHG7se6cAB+X3lRbz7mrU8nd6v3MpUpbSw0F0oNT8L1yklomS4CaWffCLbKVP63z5ypLwfehVKCwuBceOs28aOla0Xz09EIQ+lZsyW0wRGJgSZSqkZX5kOa9daA/i3bk3uOczscUENpYm279orKImGUreV0mHD5P/0yJHE9i2ITABwO9ERK6XeiXcSpLpaKv9ulzVqaxs4nhSQ71FQkPo6pWzfJaKwqK52H0ojK6V5efL1XoXSKVP6n0w066km2ilGRM5yPpSaSmlxcXoqpXv2yL/TTpPriazHaReESqlT+64XobS0ND2V0pISCQuxlgXKFqbtO4jtu21tiYfSAwey52SBm/ZdwP240gMHBo4nNVLt2GD7LhGFyejREvpiTaa4fr2csLVXMY0xY7wLpWa1AIOhlMhbORtKTaXG3r7b0eHdelaGGYdgQmki63Ha+R1Ku7vld5OuSmk6xpSa//8grz/rVpDbd+2zWLtRXm6NKc4G8V5v1dWydTuuNFqlFEi9Y4OVUiIKk1GjZLtnT/THfPIJMHmy80SQXoTSri5g48aBlViGUiJv5UQodQolTu27gPdVtbVrZTt7tnyPbA2lpvIWWSktLZUPgky27yZSKQWCvf6sW4mG0kxWSltbo1f+nJi/uWxp4Y33egtKpVTr4IZSjiklomSY4LdrV/THOM28a5hQ6nbpOycbN8pJ+chKqVnGK9m12omov5wIpW7ad02A8Xpc6bp10lZSVydvrrHO9sXidyg1YT2yUqqULCAd1DGl9u+VzYIaSiMnDHPDhNJsWK5H6/ivt1GjZJyR21Aaq7KcSig17dBBa98tKMhMUCai8DGV0mjVyN5emUAycpIjY8wYOa5LpTPHTFAZGXwHD5bPM1ZKibyRs6HUnNkyS5qYM/mRB4Rap3aGbd06q60klQle/A6lJuREhlJAWnhTHVOayBhDVkpjKyyUdiOvW9GdmA/6ZEJpNlRKze8wVqgaNEgOnNyG0v37rd9BpFTad83sv0GrlLJ1l4iSFa9Sum6dfN4dd5zz/V4sC2MmqHQaszpyJEMpkVdCHUrNGXqnUGLe4MwbntNyDL29wMknA5dfnvw+fPKJ1fKRzaHUVEoj23eB1ENpWZkEf7cH425bFMNUKTUTHbmdfRdwFxpSFdlx4IZ5bDaEUhP04v3dxVqr9JlngBtusAJurEppYWHy44GDGkrZuktEyYpXKV21SrYzZzrfP368bDdtAr73PXlcogG1qUk+A0aPHngfQymRd0IdSgEJJk6htKVF7jOVJ6f23dWrgbffBh57zAoFidBa3ggnTpTrQQulJmD6XSk1B+hu2zndtu/maqXU/B9looU3mVCaTZVSt0GvpiZ6pfTii4F77wWWL5dg2tYWO5QmezLBvEdkKpS6Cc+slBJRKkaMkOER0Sql770n70dHH+18v1mO7/nngX/7Nwmxv/1t9O/n1BnX2CgVV6eJlCorOaaUyCuhD6UlJdFDqTkDBzi375ozcIBMOZ6oXbvkwK2uTq57EUqd3hSTlZ8vwTSViY4Ab9p3AfdjPty274apUppo+y7AUOoFt0EvWii1n0F/+23rNR6tfdeLSmmQxpTu22fN0E1ElKi8PAl+0aqR9fXSuhvtPbq8XAoD99xjVTtfe835sd/7HnD88QNDZmMjMHas89cwlBJ5J/ShNFqldPt2oKrKuu5UKTUz5wLul3uw27xZtl6E0kTaNxPhdmKVaBMdATIDXbKhtLjYCqVuK5qslMZm/o8ysSxMMqHU/H9nQyh1G/Sqq+WgyTzeMEtCAfJ+EO/3Fbb23b17ZSI0IqJkjRrlXCk9cAB46y3gzDNjf/0Xvyjbq6+W4VgrVgysiO7fL5XUNWuAhx7qf1+sUFpenh2T9hFlg5wNpRs2AJMmWdedKqVbtliXvQqlbW2xF4GOJl0HnG5DabxKaWtrYj9Xe7s8V36+VdH0ulKayJjZoAtT++6gQfJ/nk2h1E2lFBi45JOpnublyfuB+ZnTUSnNdPuu21DKSikRpSLauM2XXpL36AsvjP31P/wh8OSTwC9/CRxzjJxkj+xsef116/KSJdblI0dkTGm0UDp8uBQzIk9IElHiXIVSpdRmpdSHSqlVSql6h/tPV0q19t2/Sil1u/e7mpxhw/qHkqeeAj73OXmTcQql9krpli3AnDlyOZVQagbamwPRZKYm97tSGm9MKZBYyGhrs0JjrFmSnbitlA4eLAfPYaqUJjLRUVBDKZBa10AmuR3LHW2tUnP9pJMyVynNRPuu27GvDKVElKpoldIXX5T30vnzY399QQFwySXy2WiWdfnkk/6PWblSTh5ecIFUS42WFjn+qq11fu5sGo5CFHSJVEoXaK1naK3nRLn/zb77Z2it7/Bi57xgr5RqDVxzDfDXv8r1k0+2HudUVdu2Tc6qFRQkt77o1q1yFs2ELtPGlsybl9+V0ljtu+agM5EWXvsEKIm277qtlAKprfsYJOakRBjGlALZE0rd/t1VV8s28uTV9u3yfzZzZv9KaS6073Z2ykk+tu8SUSqiVUpfew045ZTETsSZ9UwjQ+l778lkSXPmABs3Wp+fjY2yjdW+C2TH5xlR0OVE+66pTDY0SLi84AIZ0H766dbjTFuqqZRqLa141dXWOpqJam62DlaB1N68/A6l8dp3gcRDqalOJ9q+67ZSap47TJXSII4pLSxMvIKfLeNwEm3fdaqU1tQAEybI63DTJrk9Vvtud3dya8z6EUpjreFsfhfmd0NElIxRo2TSNPsqCM3NEiztx3Fu1NbK+6xTKJ0xAzj2WGnZNfczlBJljttQqgG8qJRaoZRaFOUx85VS7yulnldKTfNo/1Jmn4THzKZ7xx3AnXdKq4aRny9vVCagtbbKQVdVVfKhdNeu/utapfLm1dUl++vl7LuAt+275vd8/vnAaafFfz4TcBNt383FSmlQx5QmO5FNtlRK3bbvjholf5+xQikgLWJA7EopkNyyMOlYNioa8zqMNY7KjMk3wxeIiJJh1pO3z3K7YoVs581L7Lny8qRaag+lu3fLkK6ZMyWUAlYLL0MpUea4DaUnaa1nAVgI4Aal1KkR968EMF5rPR3ArwA86fQkSqlFSql6pVR9S4ZWG66slOpnR4dVpTDrhkYqKbEqpWbCktGjkw+lO3c6h9J9+xJ/ru5u78eTAt637+7dK+uBvfFG7AWlOzqs5yookJ+NldLogrokTEuL84Li8WRLKHVbfczPlxNYkaG0uVlCqXnPcRtKnarca9daf4ep7KsXzOswWnju7JT3AIChlIhSY5bvsx9TmFAZbX3SWKZM6b/Mnwm4s2fLfXl51szpjY3yfmeCcaRsCKUffCC/w7vu8ntPiGJzFUq11tv7trsA/BXA3Ij7D2it2/suLwYwWClV6fA892ut52it54yM9hfuMfsZtk2b5A0kWutccbEVSnfulG0qldLIUGoORJOd6CgdB5v29uZYOjrkjTnv/7d35vF1lPX+/zxJ96Rp0qZp0jZtaZPupQstUBCsFJBNQGUpiIqC4EURvXr9AYqXy+WyeEVR8aqAoCxiRaqyI0tZBbqvdEmabumS7ntLk/T5/fE9jzNnMmfOzNlmTvJ5v155zTkzkzlzJpN5ns/z+T7fr8sdYxel9tqu9mQBbsezC9wg4rGjOqUFBf6+dy7Dd7dti6/365devaLdiBuCCL2qquRO6fLlEr2R6HhG7Dn/dmZ+u1fpgyiJ0ksukYyXPXta350QQlLB9OPsyY5Wr5a+R58+wY83fLjMGzXRJfNi6TsnTZJn25AhluhtbJSQX6Xcj2UihVIxG3LFgw+KoP/e9/Kj3SUdl6SiVClVpJTqaV4DOBvAMsc+lUrJv6xS6sTYcVNIDZR5ymPSeMcOSTTi1UGyCxjjlKYqSg8fFpFl77CbhD6piNJsOaVmbt+xY977HTrk7pICIjCUElG6Zo21fsOGxMdzitKSksxn3wXaj1N69Kj/v38uw3e3bUs8guyF3/subIKExA4aFF9G6sAB+V/v31+eLWaAasCAxMdI5JSakfwPPkj8u1ERpYcPA88/L6/vuy834cSEkPaLm1NaV2dl0g1Kba08L83zev58WWeMg+HDLVG6YUPi0F0gP5zSDz8U8aw18OSTYZ8NIYnx45T2A/CuUmoxgDkAXtBav6yU+rpS6uuxfS4BsCy2zy8AzNDaKwVG7jCidPt2cUq9RKndKU1XlJoRPbtTGjShj51sOaVlZSIMkrmJ9jmgTgoL5cG8a5dVBgdwT+FuP57TKc10nVKgfTmlfkJ3gdyL0lSc0tJSf/dd2AQRerW1MvpukhSZTLwm0Y8J4U1UWgBILEo/+sh6nSihmDnXbAxeOfESpctiQ5bPPAN87WvZPxdCSPsmkVOajigFRNg2NwOzZwOnnGJtN6JUaxlot5cPdNKjh/RHoipKW1vlmfyVr0h48m9/652gjpAwSdq111o3ABjvsv43ttcPAHggs6eWGczDbPt2EUznn59436KieKe0c2cRbamIUhP+axelnTrJAyxqTikgoSfGyXXDyykFJIRm+3ZxpIcMkesXVJQGCd/taE5pEFGaqzmlhw7JIE6qohSQhtzrvguboKL06FGZgzRkSNvss05x6kYiUWp3CDZudK/9aTJT5tIpdQsR37RJlgzbJYRkgtJS6T+Z5+DBgxJWm6ooHTFClh99JP2qPXuAiy+2tg8fLn3B+nrpy3mJUqWinSOhqUme0zU1wNixwFe/CvzkJ8B//EfYZ0ZIW9p9SRjjlC5bJv+YQ4Yk3tee6MjMB1UqPVHq7LCnOj81W06p39CTgwetEi5uVFWJM9TQIA/wRMWuDemE7wYR6E6ndMMG4J57oh826uTIEf+itHNnmX+a7TmlpoOQriiNMkHCd2tqZGkSaDQ2ytKI0auukuVnP5v4GIlEqT3rZKIEYlFxSs25lrfJKkAIIcEpKBCDwfQp6utlmaooraiQ6RZz5gCPPCJmwVlnWdvNcV9+WZZeohSItii1Zw+++mrg0kuB//f/4qNvCIkK7V6UlpXJA23uXHmfLHzX7pRWVsrrkhIRhUHKNOyMzah1dsxSFaXZckrNJP1kD9RDh/yJUhPqYm9A3EgnfDeIQO/ZU/Y3LtJZZwG33CKNUT7hFT7tRCm5ttl2Ss3fN9U5pUB0G3JDUKcUsESpmVM9aJAsL75YrtkZZyQ+hpcoNf8viURpLp1Sr9I1RpSmkoCEEELc6NvXevaZ+Z7mmZsKp58OzJwpcyxvuCG+f2NE6YsvyjKfRalph6qrpW/wy1/K8umnwz0vQtxo96K0oEA6R35EqbMkjAm9TSVBkcnE5qzhWFIiCV6Ckm2nNFnmOD9O6erV0iEdNky+d6JjHjsmndl0wneDOKWANdhgRg3fesvf70cFp4hPRrduuROlHcEp9fO/17+//H+bOZUbN8qzxz6YkEzAe4lSUz8v0WBPLp1Scy+6lajZsUO+s99BFEIISYY9+ioTovS666R/OHAg8P3vx2+rrpbnl1+n1Ku/EzbOOqv9+gFjxkjyI0KiRrsXpYA8dPbtkweQ13wuZ6Iju1MKBBOle/bIaJSzHmG+OqUHD3p3Mo0bBMg17t078UPadLid4bt+rsuxYyIU/F4Lk1zqwAGrXi0Qn5ApHwgqSrt3z374bjqi1MyJ3BmJHN2JMULPT/iuUpJIwmTKTZa10Y1EDuSOHVb9PHsor51cOqVmgMo8L+3s2MHQXUJIZqmqsqZErF4t/TqvgfJknHaaDCAuXtx2sLCgADj5ZHk9dGjiMoKGKDulGzdK381ukEycGF++j5Co0CFE6ahRsqypsTp9bhi3rrlZ5oSmI0pN4iBnXc+ozilNNsqXLHzXXsA6mVNqhKHTKT1wIPlcz6BlL4xTun9/fLkOr3I1USRZoiknuQjfTWdOqT0BWZQJer9NniyNvUl4ZB+s8YOXU1pR4f38yKVTav6vKEoJIblg+HB5ph46lF7mXTujRrknjQOk1jIAnHde8uNEXZQOGhRfZ7WmRqZb5aKWOSFB6BCidOJEWdqFkxumjtOaNSKOTIKSVEq57N7dNnQXEOc0Sk6pqTGarlM6bpz1esQI+e67drmnHk8kSs3neBG04213Sk3yqZKS/BOlQeaUApkTpbfeKn9Pt5DRbdvkc1IZrS4qkmQ5iVy/qBAkfBcQUXr0KLBkSXpOqb2zcPSoPDPKy71FKZ1SQkh7xWTMravLnCj14vrrgVdflVrLyUhHlB48KNOJUinT0toKPPQQ8MYbifdxa4fMe+M8ExIVOoQovf56yXx5773e+xkRuXy5LJ2iNEhNxUSiNGpOaUGBnFO62XerqyWB0J13injq3Vs69G6dVjdR6teNNh3voHNK9++3hNXYsdEXQ06Chu/ak3Y58dv4tbYCd98tHYBXXmm7PdUapYAMhNgTV0SVIOG7gCTPACSJxJ49wODBwT7PTZTak6Z5JQTLpVNKUUoIySVGhL77rgx4Z1uUFhQAZ57p73laWirP7FScx6uuAqZNAx5+OPjvPvCAzI2dPt3qtzrZuLGtKDURPGa+KSFRoUOI0p49gccf9+eUAlaq7KoqWTqT5fghmSgNOiqWLacUkAfqrl3e+yQL3wWAu+4CfvADeW2+u9txTXIUN6c0WbKjoG6QfUDBiNJRo6TjnE8FpIOG7yYqsbN5s/xtbrst+THso6gffNB2e7riI59Eqd/7rbJSIjN+/GN5P2FCsM9zE6X2bLZ+wndz6ZS6PRMpSgkhmcYkNXriCVlOmhTeuTgx06CCJrHcswd47jl5/etfB/vdnTuB22+X9qZrV+DBB9vuc/SoRIglckopSknU6BCi1C+JnNJMi9LW1uChldlySgFxu7zEQXOz/AQJHzXzNNzmlXo5pclEaVA3yOmUFhTICGtLi/9sv1EgaPhuIvEye7Y0nHfemfwY9gZrzZq223fvTjwfxw99+0bfsQ4avgsAF1xgvZ48OdjnuYlS09EpK/MXvpurOqUFBW2d0uZmOV+KUkJIJunRQ4yFDz6Q5/EJJ4R9Rhamrxc0A++cOdIfnDYNWLgwuTlg5wc/kLbg8celzfnTn6z2ytDYKIPvTlE6cKAs820aE2n/UJTaMA8WU9LBJDry6+LZ8RKlQPAQ3mw6pf36SbbhRBhnM8jcQS+n1EuUJhtpTDV818wp7dvXCjmNuiCyEzR8N5F4WbzYep3sfjaidMyYxKLU7R73Sz45pX7DdwHgm98Epk6VAuVBr4+5r+2DVmYwrLg4uVOqFFBYGOwzU0Gp+GzlhkT1mQkhJF0uvVSW559vte1RINUSm6b4BAAAIABJREFUZyZT+3e+I8t33/X3e88+C/z2t8C3vy3t8xVXyKD722/H77d2rSydpRC7d5dnNJ1SEjUoSm0YEbp8uXSYjTviFaqWiN273dOIpypKs+mU9utnJQFyw3Q8g4jSoE6p35HGVMN3jVNaUSFhkED0y5EYtM6cKN282XqdbJTUhO+ecgqwaVPbcOdduzqOKA3yv1dRAfzzn8A99wT/PKXEhbSXhPErSrP5jHDDXtfZYAZ6KEoJIZnmBz8AHnkE+N3vwj6TeFIVpStWiGt59tny3HeKSjcOHABuuAE4/njJ+QAA55wj/YNnnonfN5EoBeRzN20Kdr6EZBuKUhvl5VanbsAAa32XLvLjV5QeOSKdSi+nNOjcg2w7pdu3Jy7HYjqeQcJHvUSmlyhNFr4SNHy3Rw/p6Js5pRUVVoc5X0Rpc7OE+AQRpb16yXdubY1fbxelyRqkjRvlfq2pkb+Z/f7XOn2ntLxcBguinJY+lfDddOnWzVuUJnK4s/mMcMPNKaUoJYRki65dga98Jb1pI9nAiNIg4bcAsGqVZBXu1k3Ckd9/P/nv/P3v0nbff7/1vC8qAs49F/jrX+P7cWvXSuSMWxb4qiopC0NIlKAotVFQYIlRk37cUFzsX5QaIZbJ8N1suiCVlSJeEom0XITvejmrdoKG7yolfzvjlPbrZzml+RK+a65X0DmlQFsBs2WLNRcnWTp4k7WvXz95b3fTDx4UwZaOKDXzWurrxVVMlD0wTMwgiLPecDbp2jVeqLuJUrcBpFw7pW4ZnilKCSEdDdNGupVOS4TWligFZMrH/PlWHycRs2dLH+aTn4xff8kl0r7by8OsXSttuNv0E4pSEkUoSh0YweLM1NuzZ3wHrLnZmnvqJBuiNNtOKRA/r3TxYuv7phK+W1wsD0K/Tmn37tIZz3T4rjkXM6c0H8N33a5XMowocArvzZstUerHKR040L3B9brH/VJTI8vvf1/KCZ1xhiUCo0Jzs9xr9sLj2cbplJqBBSNKAfcBMjqlhBCSe8rKpJ3wys3hZNs2iZgzovTkk+W5v2iR9++tXAmMHt12oPSznxWD4e67rak2a9cCQ4e6H6eqSvpEzmgqQsKEotTBZZfJ8pJL4tcbt83wwx8C48YBr7/e9hheHfZevWQZJafU6YT97W9SyuL88+V9KuG7Ssn39+uUAon3t5NKLcaePaUBOHBARGlpqTzQ88UpdSuhkwyTzMkuJA8dkvvuuONENPgRpYmcUnOPpxNGZVL8v/SSda7mdVRoacmt+wi4O6UFBSJWvQa1wnBKE4lSM/BDsotS6hyl1CqlVL1S6maX7acrpRYopVqUUpe4HYMQkh5KiSAMIkpXrpSl3SkF3Muv2Vm1yr1Ga7duklzvjTeAP/5RomlWrLDaWSf9+8s+ucrr8NJL8S4uIW5QlDr47nclrHHs2Pj1zvDdZ5+V5csvtz1GvjmlJsGTeaDee68s334bqKtLLXwXEMHi1yn12t9OKmUviouBhgZ5XVEhcyzKytq3U+omSk2oTlWVhKl7idKPP5bfra62jmUXpWbwIB2ntKLCajBnzZL78JFHUj9eNmhuDpZ5NxO4zSnt2VM6Pl7Pj6g4pSUluT2PjopSqhDArwCcC2A0gCuUUqMdu20AcDWAP+b27AjpWFRWBksc9NFHshwzRpYDBkhkkplXOmsWcNVV8W34rl3yjHVOLzPceKMkJvzmN4E33xQndsoU932rqmSZixDe7duB884Dpk+nM0u8oSh1UFgYn+TIYBelx44B69fL6yVL2u7rJUpNNtgoOaVmEvy6dSLIP/hAHoaAPCBTcUqB7DilqYTv9uxplTQxrl+fPvknSoNcfzchaZIc+RGlZlsiUZqJ8F0AmDkTePpp4OKLgS99CXj++WCjzdnGhO/mEjen1JQ/SCZKw8i+e/iwZMPct086TAzdzRknAqjXWjdorY8C+BOAi+w7aK3Xaa2XAEiQxo4QkgmGDrUGv/2wfLk8z+39zalTpc/V1ARceSXw5JPxNcVXr5ZlIlFaWAj84Q/SFkyfLus+9Sn3fXMpSu1T3cx3IMQNilKf2EXp5s2WUDApt+2YDrtbSZguXcQJCSJKW1tFCGfLfejRQx6M9fUSugvIHL+iImDBAitTsAk99ouXU9qlS9s5EWVl2XFK+/Sx/l7GFc5HURrUKe3cWQYaDEZUVlYmTwdv6pdVV8txevfOjiidOFFC5ZWSrIqtrRJ6FBVaWqLhlBpR6jWodfRo7p3SAweARx8Frr0WuOkmGRGnKM0ZAwDYKw02xtYFRil1nVJqnlJq3vao12kiJILU1kp7myxRkWH5cpkbas9XcMopYnhcd520PccfL46pmSO6apUsE4lSQHI1PPmkPJ+/+lXvOaVAbkRpXZ312q3mOSEGilKf2BMdGZd09Gj3+o1eohTwrjXoRiq1EoNSWyvzD555RpI8jR4t8xZWr07+fRKRSGQmqrnpJ3w3lTml9pHIwYNlmU+iNJU5pZ07y9/PntHWOJCVlXJNtm2LFz927KIUEJGb6URHTkaOlEb4+eczd8x0iZpTapbOsFkg9+dqROmrr8r7N9+UDo7p7JCs45Z+S7usS4rW+kGt9WSt9eS+ffumeVqEdDzGjRPzYN685PtqLW2zCd01fP7zIlKffRb44heBf/s36WMaIbdqlQySJhKahosukj6mVz1XM0Cfa1FaX5/9zyP5C0WpT+xOqencT5kigsFZMHnPHtk/UQcxVVGaTRdkyhRgzhzpWF56qawzonTPHnFvunULdszevROH77oJrGyF7/bvb702Lk4mROnRo8BvfhO8NllQUgnfBYATTwSeew546il539Qk7nSfPlY5FhPS67wWRpSa/crL4/fZvVtChUw4aaaYPl3Cl0x90LAJQ5R265ZclLpl3821U1peLvemmQO1bh2wdKn79AeSFRoB2CsQDgSwOcG+hJAsMn26CMZTT5X5k06zws6aNRJVMnly/PrqaokUuvZa4L77pA0HgIULZblqlQhSP21SsjJmXbtKHy0XorS+Hhg1Ss7bHnFFiBOKUp/Ys+8aUTppkiw3O7oBu3d7O0glJVZIrB9SEWJBOfNM6/WMGbIcPlzCk5uaUnPEysrkezonticSpX36yDX2Cn9JJXzXuKOAFSpTXh48+66zkXnqKRnJvOaaYMcJSipOKSAZokeMkLmamzbJ37FvXxGTRmxu2gTccYdcj7fftn5340b5+5nkVs7rtXu3OOeZLpUyZYoIMpMEImyiFr5r/h5RcErNSHtTU/zzg6I0Z8wFUKuUOk4p1QXADADPhnxOhHRI+vSRQeBzz5VMs6+9lnjf2bNl6Tbfc8YM4KGHRDCOGSPtj12UeoXuBiVXtUrr6iQaL5V+F+lYUJT6pLhYxFRrq+U4mVqmTpfJjyiNWvjuWWcBN98MPPywhO4CIkqPHZOCzqmKUq3bCvBEotRPAepUXOOzz5bl5Zdb68w8U+NCetHSIp3uL3whfr1Jb24PkfXD3r1yLL8T/s1gSFBXcuhQCcduaQH+8Q8ZTDFCwgiHxkbgt7+V148+av1uY6MVugu0dZZ37cps6K7BZL026fLDJgrhu/v3R9MpNfcSIKFmhmShZSQzaK1bAHwTwCsAVgD4s9Z6uVLqDqXUhQCglJqilGoEcCmA3yqlAj6tCCF+OeccaXO7dQNeeCHxfm++Kc9Pt9Iudrp2lf7YwoXS96yvz6woHTDAiorKFseOiTNMUUr8kGMPIH+xz+XaulUcJ5OV1PlP5keUmnmpfkjFHQyKUlJ02Y55YC5fLiEpQTE1LHftiq9nmUiU2suYGCfPSSqucZ8+IgDtDo6po7hzZ+LPMixcaNWj/dnPLPFs5knU1cW7Wcl46CEJ0Wlq8h5NNZgBjFRCZUeNkvnQCxbI55lzN995zhzL6X/vPev3TI1Sg2lMtJZ7Jdk9nipG0ERl3klY4btuJWEAK4TbTZQ2N1v75QL73NFTTrFep/KsIKmhtX4RwIuOdT+yvZ4LCeslhOSA7t0l7PbDD923ay2idNo0f5FGEydK6cH166VdyKQorakBnnjCatezwaZNMshaWyv9EIpS4gWdUp+Yzt6BA5bjZOYnujmlXkmBevUK5pSaDmqua//Ziy7bBYpfTKfVmeX18GH3+ZFutTWdpCrQa2vjP9MuSpOxYIH1evFi63V9vSUUg6SCN6E4y5d7zzsx7NsnDUbQOrGAOPoTJ4rbbRelJSUiop94Qt5fdJF8HxMWumFDW6e0udkSQ9kSpUVFMgc4KqI0jPBdr0RHBQVWgiEnuXZK7Uk6TDmEZ55J7VlBCCHthQkTZH69W03OdetkIPj00/0da+JEabvfekveZ1KUjhgh/YvGxnjHtKkJuPVW9+oSQTGD9zU1dEpJcihKfWIPmzOiNJGw2b073hl0EjR813RQg84pTJeyMus72udl+mXYMFk6BUay8F2vifCZSvoURJTaM8eZuY5790qignPOkfdB0pyb67F1q79i2/v2yT2T6kjmpEkihDdtsq6xUiIqtm+XAZerrrIyAu7cKe62fVDCDMCYBiVbohSQxisqojRsp1Trti68PemanVyfa+fOkiXy9ddFLB93HPC5z+Xu8wkhJIqMHy8DvG79gvnzZTllir9jTZwoS1MqzUwbywQnnSTLQYPk58kn5f2NN0rk3Pe+l/5nmP4Tw3eJHyhKfWI6hfv3W6K0e3f5SSV8d98+fy4ZkFqdykxhqgOkMk9s0CDpuJraWoYgTmlzs5XoB8hc0qcgonTDBgllLi+35o+aB20qonTdOmm0AAmfTYYRpalywgkysNHSYg0UADKaC0jjaF4vXWp9N/t8FzdR6jXwkg41NfEDAWHS0hLunNLDh+U5YRelRUWJEx3lOpriM58Bzjgjt59JCCFRxrSn9sgqw7x50qaMG+fvWKav8NprEkWUyYpNkyfH9+1++ENp4//6V3n/j3+knwm/vl7atIEDpR+xa5e7g0wIQFHqG7sotYdBOktlfPyxiKhkorS5OXGNSCdhitK77wamTo1PEuSXTp1kboUJOzEcOuQuSouL5Tsap/ToUalbeeqp1kPs6FFxZQoLg5+PnSCi1MyvHDOmrSidMkXEmV9ReuyYPPTPPlu+x6JFyX8nXVFqskQDVhIrAPj2t2Xbf/+3NEw9eogoNQmY7KLUfr20zq5TOmyYDPzYByPCork5nOy7zc1yrxhH1I9TevRo7gU0IYSQeEaPlvZ96dK22+bPF0Hatau/Y/XqZbXFxtnMFIWFkktiwQJg5kwZML/uOhGi3/2utDMrViQ/zsMPA0uWuG+rq5M2vaBA+svHjrUto0iIgaLUJ2ZO6caN0vkz8yX79GlbKgNILkoB/yG8RpQGrROaCS6+GPjnP+XBmArnnSduoF20HTrkLrCVErfUOKXvvitZWBctsgpSZ8oNCiJKN2+WJEmjR8sDWmsrvHTYMPnxK0p375aH8sCBEu7odJHdSFeUjhplvTYjuICEAc2fL0lqCgpEdBtRWlgo52ewO6X798sgQbZEqRm5zcR8lnQJK3wXkEGrIKI0DKeUEEJIPN26ScSPW2b+FSusLPN++cY3pI2+9trMnJ+dykoJEb74YjFb/vpX6TNccYVsTzaV5v33ga99zXJ0nZhyMEDbiCtCnFCU+sR0Co2LZBeldmFjRGmyOaWAf1Ea1pzSTHDllbJ87jlrXSKnFJCHoqmbZa+bOXeuLDPlBnXtKn/TZKJUaxHJFRUi4vbsESe3rk6EZffuwUSpeRiXl8vx/JQ+SVeUKiVic8EC7+OMGyf7LV/etkC3XcT7GXhJByNKgySPyhZhhe8CwUUpnVJCCIkGY8e2FaWHD0tuh5qaYMf61rekPTjvvMydn5MuXYB77hGR+tOfJs4J4uSVV6zXGzbEb7OXgwGsfgRFKUmEL1GqlFqnlFqqlFqklJrnsl0ppX6hlKpXSi1RSk1yO04+Y0SmCWVIJkq9OuzGdfQbwhBm+G66DBkiIsNebsRLlA4aZD3Yli6Vh1lJieUoZjLDqPNv58bBgzIo0Lev5TiuWBE/+jdsmKRrN0mYvNi+XZbl5ZL5bvVqeXB7ka4oBaSBNAkTEjFlipzf3/4WX+IDkGzSBQXSmOzaJeuyNac0SqI0rPBdQO47U6M2iomOCCGEuDNmjPQT7JnUTfSPPbeDX3LRDl19tZgC55wjbX6fPm0H3A8fBv7v/yzzwJ4Xwxmu3NgoYtqIcFOVguG7JBFBnNJPaa0naK0nu2w7F0Bt7Oc6AL/OxMlFCdMBN/90pnC8M5uYH1FqjuUndBTIb1EKSNircZhbWkRYJhKlQ4aIKNVarvW4cTKfs7FRtmcyRLGiwjvTL2CFEldUeIvS1lZ/tWfNw7i0VJzSI0eS/14mRKkfTNImQBLY2CkslHt6x454tzcb9Okj4fJREaVhOaVHjlji015/NFGio1yXhCGEEOLOmDEy4GyfomMEXiqiNAzcMuHffbeEE19/vfTT5s4Fzj1Xtjn7MvbMu4DVL6YoJYnIVPjuRQAe08IHAEqVUlXJfimf6NxZHE638N3du61EPMZF8hKlJoTB7JsMM9IWxpzSTFBbKw8nrS2BnUiUDh4s33fdOnkYOkVpJkMUBw6Mr83lhnE2+/aVeaU9e0pY8c6dVvIB08D4CeE1YqK42HIEoyJKhwwB7r9fEhxcdFHb7SaplxlMyZYoVUquTZCMxtkin+aUUpQSQkg0MPNG7SG8+SZK3aYmzZolyxdflJwUO3bIIHbXrtJvs2MErRGldEpJMvyKUg3gH0qp+Uqp61y2DwBg7943xta1K0wnvEcPq5PYp4+ILfNP5mdOaUdzSqur5Tvs2WNlVPVySgHgpZfkuo4dK+IxG6K0utpyZRNhF6VKSQr1mTNl3eRYzEAQUWrERFGRfC/Au1Zpa6v8TqqJpoJy003AT37iHipkogKy7ZQC4kovW5a94/slKk5pMlHa0iI/+TpwRQgh7YnaWmlH7e3YmjUywGyMiagzeLD0vYzpsn+/1Gq/8EJZd9ttsv6kk2Rfpyitq5M2aUBMDRhRavrJhDjxK0pP1VpPgoTpfkMpdbpju3L5nTZdfaXUdUqpeUqpedtNbz+PMPWhKitFoABts7iafzbzz+dGRxOl9oxrfkWpSYw0bpyIt6YmEaRHjmTuOgweLJ17r7+DPXwXAKZPt7adcIIsq6qkoVm4MPlnGqe0qMh6UBvB7YYRH7lwSpNh5uDu2CH3f7YSHQFSCmj9+vAbr6g6pYcPx9d6M+Wl8vUZQQgh7YkuXSSayumUDhtm9R+jTnW1DHZu3Srvly2TQfxrrpH8Hy+/LH2ZceOk7+YmSk05GECuSY8edEpJYnyJUq315thyG4C/AjjRsUsjgGrb+4EANrsc50Gt9WSt9eS+mawAnCNMCEKi+o2AdKJ79vSelN6pk4gMv+G7hw/LP3WuE65kCvOn3r7dvyh9+WUrrXp1tTwIN2/2TpIUFBNe4+XI2Z1SQFKfT5kC/M//WEKhoAA480zg+eeTJzuyh+8WF4sD6iVKzT3iNciRK+xOaVlZdu/HqVNl+c472fsMP0TVKQXi55WGWTaKEEJIW5wZeI0ozRcGDZKlmeZk5oiOGAF84Qvy+jOfkTZyyJC2Zdzq6uL7y4D0HcIebCbRJakoVUoVKaV6mtcAzgbg7MY/C+BLsSy8JwPYq7XekvGzDZkRI2Q5cqS1zk2U+nGQ/GR+NRh3MF9G15wEEaXFxdZ1PvFESbBjwlw3bpTOd6ZEqamr9f77iffZtk2ufVGRvK+okGxzt94av98118ho4p//7P2ZBw6IiDXCwx6anOjzASmVEzamJu/27dkPP5o6VQZunnkmu5+TjCg4pUrFO6DmXrSL0nyfd04IIe2NMWMkYd+hQ9KWNDRY5kY+UB2zmuyitKBAapjfdhvw4IOSiRcQAbtjhzVA2toqc0qdorS0lE4pSYwfp7QfgHeVUosBzAHwgtb6ZaXU15VSX4/t8yKABgD1AB4CcENWzjZkvvAF4IYb5MfgFKW7dvkrlRFElB4+nN9heUHCdwHgjDNkaTLAmqRSW7fK72fqWvTrJ+Lnpz8F3nrLfR9TozQZ55wjyXmeeMJ7v4MHRXibAYYBA7znlJrswH7OIduUl0sI9fr12Z1PCohonzED+MtfrLIoYRCmKDVOqf1+ASyn1D6vlKKUEEKixdixEuX10Uci0FparCz++YARpaZMX12dCNIuXaQf9rWvWSaMM0eGKZNHp5QEIako1Vo3aK3Hx37GaK3/J7b+N1rr38Rea631N7TWw7TW47TWbWqZtgeGDAF+9av4ka5UndLevYOF7+ZzZzOIUwoAP/4x8OSTUjAasMrvGFGaKacUkJG+nj2Byy6TBsNJU5M/l7KgQITpO+/Ez/VzcvCg5XQB/p3SqIhSQBrYbItSQGqmHToEPP109j8rES0tuQ+bNy76xx+LILeXgwHcRWm+zzsnhJD2xqRJspwzB1i5Ul7nkygtLZX+inFKV69O7PQaUWr6M6ZSBZ1SEoRMlYTpsPTqJSGmuQjfzVd69JAfv6K0uBi48kqrvEWfPnKNt27NbPguICOZP/mJiL/33mu73a8oBYCJE0V0mlFFNw4ciBelffuKg5woA7ApUB0FUWrml+zfnxtRevLJ4iS/8Ub2PysRUXFK7dApJYSQ6DN4MNC/v/QtVqyQdfbpX1FHKXFLN26UPoq9PrsTv6K0rIyilCSGojRNlBLX05TJ8CtKy8utJDrJyPfwXcBKkuNHlDopKBBhmOnwXcMnPiHL+fPbbtu2zb8oNY2NGRF1w4TvGvr0EeHjVncSkGx2lZXREBvHHWe9NjVWs4lSMu93yZLsf5Ybx47JT1iJjoxTSlFKCCH5h1LAKaeIKF22TASe83kedQYNElG6dau0OU6RaXBWE1i9WkwbZ07T0lKG75LEUJRmAON6HjvmX8T07w/s25dYjNhpD6K0b1//TqkblZXZcUoBcSGrqtqKn2PH5Jz9upRGqDnTottxOqVm/nGiUO516+LFYJhU2/Jr5ypZw+jRwKpV3rVks4XJpBymU7p/f9tyQG6Jjph9lxBCoscZZ8j8yqeeEoGab5h67ibzbiJRWlwsgtMuSocPb5ugs6wM2LtX+leEOKEozQBGlO7cKfMJzRxIL5yTwr04ciT/O5vpOKWAJUozPafUMHSoNBx2zN/Tr1Par5+EGXv9TZ1zSp1zkp2sXCllcaJAly7W+Z7oLAqVJaqrJbmSiUTIJWGJUrtTum+fvzmldEoJISR6fP7z1uvPfja880iVQYNkGtPixfI+kSgFpF9r5p8uX+4eqlxaKoPM+/Zl/lxJ/kNRmgGMKDUFhoOIUq8kN4b24JSaa5SqKK2qktG6lpbsXItBg9rOBTWZb/2K0sJC+dtvblOh18ItfBdwF6WbN8vPCSf4+/xc8PrrwLPP5s69DfJ/kmmi6pR6JTqiKCWEkOhQUQHMni1JMi+9NOyzCY4p0ffCCzJgao+YcjJ0qNRi3bpV+i4m0ZMdM72N80qJGxSlGSAVUeqMv/eivYnSgoLgHf3KSsst8zNnNyhm3oQ9pCSVGqH9+3uL0iDhu2aO6+TJ/j8/24wfb5XqyQVBIgoyTViitHNnCXk6csS/U2peO/clhBASLtOmSSnBgjzscRu385VXxCUtLEy8b02NiNJ5sfobbqK0tFSWnFdK3MjDf5HoYQSXyZQaRJT66Wzne0kYQK7R3r0ivkpK2s4zSIb9mvqpAxuU6moRIUaIApa49PP3NJSXe2dVDhK+O2+eNGITJvj//PaGSZLQkcJ3lZIRaZPoyOmUdu0qHQO7KDW1XClKCSGEZIpRo6w2cOpU731HjpTB1GeekfdufRc6pcQLitIMUFkpHUiTdbWqKvnv9Ogh4sqPU+pWFiLfMOJr3TrJyBaUbItSU+7EHsLb0CDLIUP8H6eszLv+rDN818spXbhQQmfsIrajYUrPdCRRCsgg1L598lxxCk2l5J6wi1IzP4eilBBCSKbo0gU480x5bZ8f64aJ6vr974Fx49oOqAKWKPVbEpF0LChKM4CJsZ87VzqLfgXk4MES6pCM/fvzv7NpxNfatdEWpfZkRw0N4mgHcal7904cltLaKq63XWR26SL3i9sDevFiCZftyBQXyzXqiKLUlIxya9iLi+Oz7+7fL7/TqVNuzo8QQkjH4OmnpazN2Wd77zdunNW/S5TUyfTlzHQ3QuxQlGYAM+/tww+DhXqOH29lNEtEa6vMw8x3UWqc0oaG1ESp3X3Ohih1m7u4dm3wepy9e0tYSmtr220myZPT+TTh33Z27xbXtqOLUqXcr08uaGmRZRhCr6jIarTd/veLi9uG7+b7M4IQQkj0KCryV86mUyfgd78DrroK+M533PcpL5f9zHQ3QuxQlGYAk4l0/34rU5kfJkyQDK9eI0btJYGJEaXNzamJUnu218GDM3NOdnr3lrl69iRFDQ2piVKtZf6sE+NsOZ10N3d16VJZdnRRCoQnSsN0SouLrQGSRE6pU5S67UcIIYTkis9/Hnj8cSuhkZOCguRVCkjHhcFeGaCyUoTW3r0yKdwvZhL4okXAOee479NeEpgYUQqkJkoLCoBbbpFlNpwrpeIz5x45IqIgaOkTM19i9+62jq4REU6ntLS0rSg181lra4N9fnukpMT6P8glYYrSnj2BFSus127b7XXe6JQSQgjJB6qq6JQSd+iUZgClLIfUTAj3gxGlc+cm3sd0xvPdBbGL0lTDb++6C7jzzsycjxv9+1vu1NKl4niOGRPsGF6Ji4xT6hSlZWVtM9GZAtQmrLgj4xRguSJsUXr0qLx2+98vLY1347dtszIVE0IIIVGFopQkgqI0Qzz3HPDYY8kngtvp1UtEz/vvJ96nvTil9vP3Kr4cJgMGWE6pqRF6wgnBjuFHlDrDd8vxGFrbAAAgAElEQVTK2jqljY0iMvK9FFAm6KhOqSGRKLUPZGzZ4i/rNyGEEBImyeq5k44LRWmGqKgAvvjF4MWRTz1VROmxY+7bjRuS706pUta1iar7Z5xSrUWUlpUFKwcDWOG7bqI0UfhuIlEa1euUazqqU+r22mAXpVpTlBJCCMkPqqoko76JBiLEQFEaMiefLJ3Lujr37Ubc2MNf85Vp02QZJBlULhkwQNzM/ftFlJ5wgojpIBin1K0sTKLw3dJSKRXz8cfWuo0bKUoNJSUdT5Ta3XQz0GGntFSuybFjkiytuVkGVQghhJAoY3JlrFoV7nmQ6EFRGjImMdLq1e7bjbjJRhmUXPPQQ8BLLwGTJoV9Ju6YsOLVq4Fly4KH7gLeTqlX+C4QH47Z2BjdMOdcU1IiLnOiaIJsEaYoNf/vnTu71z0uLbWyPM+ZI+ui+n9FCCGEGEw+lXnzwj0PEj0oSkPGjBglc0rd3JJ8Y+jQxFmGo4Ap/zJrlgiSyZODH6NLF5kH6jYH0it8F7AGIA4elNd0SoWePUWAGVGfK8IUpeZvn0iIm8iJHTtkoKd799QGUQghhJBcMmKEtHG/+hXdUhIPRWnI9OkjroiXKO3RQ2pokuwybJgsH3pIlqedltpxSkq865QmE6UmAzBFqWDmU+c62VEURGlrq/v2fv1kuWEDMHMm8LnPiTAlhBBCokxBgVRTWLxYBlPXrw/7jEhUoCiNALW1icN3d+5sH6G7+UDv3hIyu2OHhFWbjn9QEs2B9JpTCljhu6YcDMN3BZPoJ9fzSltaZJmNurjJqKmR5TXXuG839+Yzz8hgxowZuTkvQgghJF2++EUpvXfoEPDII2GfDYkKFKURoLYWWLPGfRuzauaWU06R5VlnpX6MXr3cBdSBA+J4O0WO0yltbJQlnVIhHaf0gQeA22+X8N+ghOmUDh0KrFxpufZOjCidNUuScaXq6hNCCCFhMHKkJPt89dWwz4REhRA8AOJkwAARn1q3zfa6ZUvwsiQkdf73fyWL6a23pn4Mr/Bdp0sKJBalAwakfg7tiVSd0sZG4MYb5fWnPw1MnRrs98MUpYB3luq+fWWAo6kJGD9eBkIIIYSQfOITnwB+/nMpD9OlS9hnQ8KGTmkEqKyUf0i3jK2bN9MpzSXV1cBPfwqUl6d+DK/w3USZVAFLlG7cKJ/POYKCcUqDitI337Rez5oV/HPDFqVeFBZag1V0SQkhhOQjkyZJ/3fFirDPhEQBitIIYETn1q3x6/fskfmNgwfn/pxI6niF77o5pV26SDIrM6e0sZGhu3ZSDd9duVLE25lniigNGsIbZVEKiPsLcD4pIYSQ/MSUh1m0KNzzINGAojQCGFG6ZUv8evNPOnFibs+HpEfQ8F1AQnjt4bsUpRaphu+uWyfXccYMoKEheE20qIvSn/1Mvtepp4Z9JoQQQkhwamslKmzx4rDPhEQBitIIkEiULlwoS4rS/MKE7zqduUThu0C8KN24kZl37RghH7RO6fr1EmXwuc+JG/3YY8F+P+qitKAAOO64sM+CEEIISY3CQmDsWDqlRKAojQCVlbJ0E6X9+6demoSEQ0mJ1Jc8fDh+faLwXcASpYcOydxiOqUW3btLArCgonTdOpl3WVYmbunDD1tJpPwQdVFKCCGE5DsTJohTqjXw3nvAtGnA+++HfVYkDChKI0DPniJWnHNKFyygS5qPmEyozhBer/Dd8nJg+3aWg3FDKbluBw74/52jRyVJmJmPffvtwMcfB6uHZkRpYaH/3yGEEEKIf8aPl8H4TZuk8sFbbwF33RX2WZEwoCiNCJWV8U7p4cOSqIWiNP9IlC3WK3y3slLKe5h6tcOGZe/88pHi4mBO6aZNwLFjlig97jjgxBOBV17xf4zmZnFJnWWaCCGEEJIZxo+X5auvAu+8I6/fekvacOKPI0fCPoPMQFEaEfr1A7Zts94vXSohoBSl+UciUeoVvtuvn2RaNmnRa2qyd375SFCntKlJlvZySpMny/+V3yy8LS1AJ1ZyJoQQQrLG8cfL8p57pH3+1rck2/7q1eGeV75w110ycP/aa2GfSfr4FqVKqUKl1EKl1PMu265WSm1XSi2K/Vyb2dNs//TrZ3WkAWbezWdM+K6bU5pIlJp5xe+9J+HcFRXZO798JKhTumOHLPv0sdaNHSsN3caN/o7x8cdA167+P5MQQgghwSgpAYYOFRHavz9wxRWyvq4u3PPKB5qbRZS2tgK//GXYZ5M+QZzSmwB4lbedqbWeEPt5OM3z6nA4RWldHdCtG2uU5iPGKbXPKT16VJy3ROG7gwbJ8rXXxCVlyGg8QZ3SnTtlWV5urTOZatev93cMilJCCCEk+xgD5sILrUixhobwzidfWLhQBux79QLefjt4Pfao4UuUKqUGAjgfAMVmlujXTzrSLS3yvqFBOtEFDLDOO9zCd42gSuSUmofwvn2cT+pGUKfUiFK7U2rK7NApJe0FpdQ5SqlVSql6pdTNLtu7KqVmxrZ/qJQakvuzJIQQb+69V8J2/+u/pN3u2dPKsWGnoQG47DLghRdyf45R5N13ZXnjjcCePZLg0Y1jx/JDsPqVPPcD+D4Ar2nHn1dKLVFK/UUp5VplUSl1nVJqnlJq3vbt24Oea7umXz+5YcxlaWiQcAaSf7iF7xpBlUiUDhlivZ48OSunldcEdUp37JCsueZvAaQmSrt08f+ZhOQSpVQhgF8BOBfAaABXKKVGO3a7BsBurXUNgJ8BuDe3Z0kIIckZNgz4+c9l6pJS8t7NKf3614GnnwZuuCE/RFa2eecd0Qqf/KS8d5uHu3OnXM+LLsrtuaVCUlGqlLoAwDat9XyP3Z4DMERrfTyA1wD8wW0nrfWDWuvJWuvJffv2TemE2yumFmlTk/yjGaeU5B89e8rSHr67f3/8NiedOwMXXyyvL7wwe+eWr6TilPbuHR8GbUov2cPkvaBTSiLOiQDqtdYNWuujAP4EwNntuAhWe/wXANOV4uQAQki0GTasrVO6ZIlk6B02DNiwoePMOd21C3jxxbbZiLUWp/S004Dhw2Wd2zWZNUvqtj/3nP/pS2Hhxyk9FcCFSql1kEbvDKXUE/YdtNY7tdYfx94+BOCEjJ5lB8AuSnftEpeNTml+0rkz0L17vFOaTJQCwKOPymDEqFHZPb98JJU5pfb5pIa+fa0kSMmgKCURZwAAu+/fGFvnuo/WugXAXgB9HPswiokQEimGDgXWro0XYn/4g0QvPfqovJ83L5xzyyVaA2efDZx/PvDf/x2/beVK6c+cdprUtu/Wzd0ptV8nE+4bVZKKUq31LVrrgVrrIQBmAHhDa32VfR+llK3wAi6Ed0Ik4oJdlK5dK68pSvOXXr3cRamZb+pGaSnd8USk4pT2adP1FqFKUUraCW6OpzOgzc8+jGIihESKwYOlDTalErUG/vpXYPp04ISY7dUREiHNny8/AHDffVZfEpBaroCI0oICyU3iJkpXrgSmThXRumBB9s85HVJOo6OUukMpZQINv6WUWq6UWgzgWwCuzsTJdSTsotT8o1GU5i8lJfHhu0agejmlJDFFRcChQ/6Lae/YkViU+jWCKEpJxGkEYM/fMBCAM83Fv/ZRSnUC0AvArpycHSGEpIjJs7FunSxXrhTD5uKLgR49pAZ5RxClr78uy7//XQTpk09KP+jtt4Ff/AKorZUfQEwNt/DclSuBMWOAESOAFRG3DAOVhtdavwngzdjrH9nW3wLglkyeWEejuFhCPpuapN4QQNcsnykpCR6+SxJjSukcOpS4rI6dnTuBk05qu75vX3lA++HjjxMnpiIkAswFUKuUOg7AJkgk05WOfZ4F8GUA7wO4BBLpxPQghJBIY0Tp+vXAyScDc+fK+1NPlaXbnNP2yLJlEpr7mc8AEyYA//u/Mq921ixxR5980sqdMWiQJD6ys2uXuM0jR8oUqA8+yP13CAILjkQEpaxapQ0N0nn20/km0SSRKPUK3yWJMeLQz7xSrTMTvnv0KJ1SEl1ic0S/CeAVyJSZP2utlzuimH4HoI9Sqh7AvwNoUzaGEEKixuDBsjRO6bx54pCOHCnvhw7tGE7pypWSZ0Qp4Oab5TvPmgXceaeUf5kxw9p30CApC2Pve5pB+JEj5Tjr18vgflQJ5JSS7FJZCWzdKp1qhu7mN716xWdBo1OaHmaAxo8oPXhQBGUiUXrgAHDkiMyv8ILhuyTqaK1fBPCiY509iukIgEtzfV6EEJIOxcXShttF6aRJUuoNEKf08cf9teX5itYiKr/6VXl/+eVWDVe3SLBBg2S5caOE6wLxovTgQTnm6tXiukYROqURYvBg+QdkjdL8x+mU7tsHdOpEkZMqxin1k+zIOKFuotTkcPHjllKUEkIIIeEwZIj0iVtagEWL4mu4DxokAmvTptSPv3Qp8Jvf+K93euAAcOWVwAMPuG9/4w2pFzpnTurnZKexUT7TuMMAcOaZ7oIUcK/FvnKlZCweMsSq7BDleaUUpRFi6FCgvl4mc5uJyyQ/cQvfLSmJr5tJ/BPEKd25U5ZuJWHMOj/JjihKCSGEkHAwonTFCuDw4XhROnCgLBsb43/n/vuB224TIZuM448H/u3f/IvI3/8eeOop4MYbgVWr4rcdOgRcfbUkILrxRn/HS4aZM+tXDxindMMGa93KlVLDtLBQlgUFFKXEJzU11mtjvZP8xJSEMSNw+/czdDcdgjilRpQmCt8F6JQSQgghUWbIEJkDaZLzTJlibTOuoF2UzpkDfOc7Mt/ykUe8j20Xbm+84e98Xn9d+nbduwP33BO/7ac/FYfy/PPlPNJxcA2bY7nUjQBPRlWViE+nKDUOadeukkDVKaijBEVphDjxROu1qcNE8pOSEknbbUTUvn0UpekQxCnNVPjuwYPMvksIIYSEQW2tOKR//jNQVhbvGBqhZg9VnTVLpkkNHSohtl5huYsWWa/9Oof19RKee911Mp/1z38GbroJ+NKXgLvuAj73OeBHsRn9mchya0Rp//7+9u/UCRgwwBKlR46I22oP/x0+3L2WaVSgKI0Qo0cDZ50lP8OGhX02JB1Mll0TwmvCd0lqpOKUphO+29oqD3SKUkIIIST3mGQ8r70m8yjt05+KikSo2p3Sd98Vc+f735f5ogsXJj62EaKTJ8cnpUyE1la+l//4D0mudPnlwIMPAv/4BzB+vAjhCRPEkcyUKC0qCmZoDBpkCfVVq8QcGTvW2l5bK983qoXBKEojREGB3NyvvBL2mZB06dVLlnv3ypLhu+mRypzSsrK228rKpGFL5pSalOkUpYQQQkjuGT/eem3qk9oZONASYK2tVjKkSy6RMNann5Zts2YBF14o+VoMK1dKuOuoUcCWLcnPpalJ+gXDhokbOX8+MHOmVMzYuhV4/305XpcuEun4/vupf2/D5s1yzCC5SKqrLad02TJZ2qcDDh8ug/t+vnMYUJRGECbDyX/cnFKK0tQJ6pSWlkooi5PCQgnrTeaUms/p0SPYeRJCCCEkfbp1A+6+W4TUNde03V5dbTmlGzZIuz1unLTx06eLKN22TcJrn3tO6nwaVq6UsNaqKhFoyZxDk3TIRDGOGAFcdpllQNg58URgwQJ/yZYA4Oc/B669VkrZ2dm82X/orsE4pceOiSjt3Dk+7Hn4cFlGNYSXopSQLOAUpbt3i1AiqWHEod85pW7zSQ0VFdJQeUGnlBBCCAmXm2+WMNSqqrbb7E6pvR4nIIJxzRqZA3rkiEyLe+45SWCotYTvjhwJVFaKGNy92/s8jCj1U65xyhSZC7t8efJ9V6wAvv1t4He/Ax56KH7bli2pidLmZnF2lywREdqli7XdCFQ/IcthQFFKSBYwAnTXLnkA7tjhPseR+KOwUDLe+XFKm5qkoUlEZaWE27ixdi1wxx1W+AtFKSGEEBI9Bg6UqKcjR6yMsiNGyPKKK0TQrVwpZV9uuEGE4pw5Ivb27pU8LkbsJuoTGBoaJIpxyJDk52WSlvopNTNrliwrKiRxkkHr1JzSwYNluWaNhBCffHL89upqmfNKp5SQDoQRRU1NErrb0uLt3pHkFBf7c0qbmoB+/RJv9xKl994L/Od/Av/3f/KeopQQQgiJHqYszObNIj7LyqzB/x49JPHR448D990njqlSwOzZwEcfyT5jxliiNNkcyzVrLEGXjGHD5Fzmzk2+73vvSSKiL3xBRKwJ4d23TyK2gopSM3905kxxf087LX57YaGUn6RTSkgHondvieXfssVKqkOnND2Kivw5pVu3+hOlbnNITGNl6pZRlBJCCCHRw14WZtUqcUntOVmOOw646ioJXy0rk8y4b75ptfOjR1sGQjJRajLv+kEpSbjkxylduFASI02dKo7v4sWyPmg5GMPgwTLP9YEH5P0nPtF2n9paOqWEdCgKCkQYbdliZYOlU5oefpzS5mYJmfYK3+3XT0Yg3Y5lRg/N34xlfAghhJDoYZzSjRulBIy99Ikb06ZJSOvChWIcVFT4D99dsyZYqcbTTpM5nUZcurFli3zuxIkiSgEra2+qolQpmT8LiGvqJqSHD5fv09pqrWtujkaZGIpSQrKEyepmRuC8hBJJjh+n1CQwSuaUAhLma+fYsbZZefk3I4QQQqKHcUrnzpWB5OOP997fJD36/e9FCColVRG6d/cWpQcOSH8hiCi9/HJZfu978plumDqqkybJdykvFyELAJs2yTKoKAWAH/1IRPEvf+lezaO2VsKETe6Md9+VAfg77wz+WZmGopSQLGHCRM3DZcCAcM8n3ykqSu6UGqHpR5Q6G6Fdu2Tk0J4YoG/f4OdJCCGEkOxSVCSD/yZBUDJR+qlPWa8//WlZKiWOqVeZOFPfNIgoHT4cuP124KmngPPOi3clDQsWyHLCBFmOGWNl7E2n3zhuHPD22/Hf147JwFtfL8sHHhDhfN997ueZSyhKCckSxindtEkml3sJJZKc4uLkTqkRmsmy7wJt55AYQTttmrWusDDQKRJCCCEkR0yYYLX748Z571tSIqVXLrgAuP56a32yMnFBysHY+dGPJGni7NnAyy+33b5woQhEU8N+zBiZ76q11F8tK8tOrfSaGlkaUfrBB7LcuxeYPz/znxcEilJCskRVlYy+1dXJaBcFTnr4cUr9iFKTMr2hIX69aZROP10aiU9+MrXzJIQQQkj2MYPIw4bJPNFkfPWrUq/Uni/CrygN4pQarr1WxKUp/WJn7lxJiGQYM0ay7jY2yo8JT840VVUSslxfLxl6168H/v3fZdurr2bnM/1CUUpIljCjan/7m2R5I+lRUiIPbC/q64FOnbwf5r16SViuMyW6cUoHD5bECa+/nt75EkIIISR7XHMN8MUvAo89lvox+vb1FqUNDSIsy8qCH7tzZxngfvPN+PVNTdLPmDLFWmfKuSxfLhF22RKlBQUisOvqrDmsZ50lrvM//pGdz/R9buF+PCHtl4kTZXn0aPKwEpKc0lJgzx7vDHGrV8tgQKdO3seqrbVCVwz2JEm9etHZJoQQQqJMnz4iSE85JfVjGKc0Ud9izZrgobt2pk0TYWsSCwFWDdNEojSbTilg9YEWLZL348fLPNt//hPYvz97n5sMilJCssTo0VaIyIUXhnsu7YHSUklbfvhw4n0WLEieFh6QB7KbU1pYmNpoKCGEEELyj4oKMQ8SibH6+tRCdw0mxPjtt611b78tLqoxLwDJvltRIUJx27bsJsesqRGxvWCBfGZlpYjSlhb3+a+5gqKUkCxRWCihEDNnuhcwJsEwYnHPHvftc+dKlrzTT09+rJoaqQNmT5y0bZs8nAv4VCSEEEI6BBUVsnQL4T10SFzOdKZgjR0rBsW771rrXnhBwnqLiuL3HTMG+PvfxbVNx51NRk2NCPHnnhOXVCkpIzN0KPDjH4dXs5TdL0KyyEknAZddFvZZtA9KS2W5e3fbbS++KMK/vBy46qrkxxo1SpYrVljrmpqsxokQQggh7R8vUWqy4aYzBauwEDj1VOCdd+R9XZ0c94IL2u47dqzl2GZz2pcpn7N7t1UGr1Mn4Ic/BObNkzIxYUBRSgjJC4xT6hSlWgO33gocdxywdKnMMUmGCfFdtsxat20by/YQQgghHQlTj9xNlJpEQOkKxNNOEyG6cyfw61+LALz00rb7nXGG9doMnmeDE06wXp95pvX66qtFLH/ve1KyJtckSQdCCCHRoLxcljt2xK+fPx9YvBj41a+8S8HYqakBunaNF6VNTVZRaUIIIYS0f7yc0iVLpHxKuqG0ZgrXn/4EPPywCNL+/dvud+65Eu01YYL0UbJF584SYTZvnghmg1LAo49KSO/ll0v/ytRRzQV0SgkheUFVlSy3bhW3dOZM4OOP5QHfvTtw5ZX+j1VYKHNEli611tEpJYQQQjoWXk7pm2/KNKx0s/GffLL0Yb75Tem33HGH+35duwKPPw5897vpfZ4fzj0XuO02EaJ2ysuBP/5R5tLmOukRRSkhJC/o21cenlu3yjzdGTOAiy+Wh+ell1pzTv0ydqzllB44IAkNOKeUEEII6Th07Spl4EytcsPy5RKFdf756X9G587Agw8CkybJQHpNTfrHzCaf/KSU2HMLMc4mDN8lhOQFnTqJMH3nHeCNN8QdNaN4N90U/HjjxsmI5K5dVkZfOqWEEEJIx6J/f2DTpvh1v/kN0KUL8OUvZ+YzLrjAPblRVMlm9t9EUJQSQvKG2loRpICE3s6eLSExkyYFP5Y92VHnzvKaTikhhBDSsRg6VMJVDYcOAY89Jk6hCe8l2ce3KFVKFQKYB2CT1voCx7auAB4DcAKAnQAu11qvy+B5EkIIxo0D3ntPstING5ZeQWu7KDVFqumUEkIIIR2LoUOBt9+WbP5KAX/5C7BvH3D99WGfWcciyJzSmwCsSLDtGgC7tdY1AH4G4N50T4wQQpxcfbWUhrn99vSPNXCgzCNZtswK2zHJlAghhBDSMRg6VOqD7twp7//+d+kjmKy5JDf4EqVKqYEAzgfwcIJdLgLwh9jrvwCYrpQznxMhhKTHSScB27dLoqN0UcpKdrR+vcwdoVNKCCGEdCzM/MmGBqC5GXj1VclOSyWTW/w6pfcD+D6AYwm2DwCwEQC01i0A9gLwUcKeEEKCkW5qdjvjxsnc1PXrgepqoID5yAkhhJAOhRGldXXAu++Ka3ruueGeU0ck6ZxSpdQFALZprecrpaYl2s1lnXY51nUArgOAQYMGBThNQgjJPGPHSubd2bOlWDQhhBBCOhYjRwI9egBz5sjAd5cuwFlnhX1WHQ8/iY5OBXChUuo8AN0AlCilntBaX2XbpxFANYBGpVQnAL0A7HIeSGv9IIAHAWDy5MltRCshhOQSk+xo2zaKUkIIIaQj0qkTMHUq8NJLQEsLMH06UFwc9ll1PJIGq2mtb9FaD9RaDwEwA8AbDkEKAM8CMJV8LontQ9FJCIk0J51kvT7ttPDOgxBCCCHhceWVEr67di3wpS+FfTYdk5TrlCql7gAwT2v9LIDfAXhcKVUPcUhnZOj8CCEka3TrJqnf33wTOP/8sM+GEEIIIWHw5S8Dq1YBRUWZSaZIgqPCMjQnT56s582bF8pnE0IIaX8opeZrrSeHfR75DNtmQgghmcRv28xck4QQQgghhBBCQoOilBBCCCGEEEJIaFCUEkIIIYQQQggJDYpSQgghhBBCCCGhQVFKCCGEEEIIISQ0KEoJIYQQQgghhIQGRSkhhBBCCCGEkNCgKCWEEEIIIYQQEhoUpYQQQgghhBBCQoOilBBCCCGEEEJIaFCUEkIIIYQQQggJDYpSQgghhBBCCCGhQVFKCCGEEEIIISQ0lNY6nA9WajuA9Rk6XDmAHRk6VnuG1yk5vEb+4HXyB6+TPzJ1nQZrrftm4DgdFrbNOYfXyB+8Tv7gdfIHr5M/cto2hyZKM4lSap7WenLY5xF1eJ2Sw2vkD14nf/A6+YPXqX3Cv2tyeI38wevkD14nf/A6+SPX14nhu4QQQgghhBBCQoOilBBCCCGEEEJIaLQXUfpg2CeQJ/A6JYfXyB+8Tv7gdfIHr1P7hH/X5PAa+YPXyR+8Tv7gdfJHTq9Tu5hTSgghhBBCCCEkP2kvTikhhBBCCCGEkDwkr0WpUuocpdQqpVS9UurmsM8nTJRS1Uqp2UqpFUqp5Uqpm2LreyulXlVK1cWWZbH1Sin1i9i1W6KUmhTuN8gdSqlCpdRCpdTzsffHKaU+jF2jmUqpLrH1XWPv62Pbh4R53rlGKVWqlPqLUmpl7L6ayvspHqXUd2L/b8uUUk8ppbrxfhKUUo8opbYppZbZ1gW+f5RSX47tX6eU+nIY34UEg22zBdtm/7Bt9gfb5uSwbXYn6u1y3opSpVQhgF8BOBfAaABXKKVGh3tWodIC4Lta61EATgbwjdj1uBnA61rrWgCvx94Dct1qYz/XAfh17k85NG4CsML2/l4AP4tdo90AromtvwbAbq11DYCfxfbrSPwcwMta65EAxkOuGe+nGEqpAQC+BWCy1nosgEIAM8D7yfB7AOc41gW6f5RSvQH8J4CTAJwI4D9Ng0miCdvmNrBt9g/bZn+wbfaAbbMnv0eU22WtdV7+AJgK4BXb+1sA3BL2eUXlB8DfAZwFYBWAqti6KgCrYq9/C+AK2/7/2q89/wAYGPunOwPA8wAUpDBwp9j2f91XAF4BMDX2ulNsPxX2d8jRdSoBsNb5fXk/xV2LAQA2Augduz+eB/Bp3k9x12gIgGWp3j8ArgDwW9v6uP34E70fts1Jrw/bZvfrwrbZ33Vi25z8GrFt9r4+kW2X89YphXXTGRpj6zo8sdCDiQA+BNBPa70FAGLLithuHfX63Q/g+wCOxd73AbBHa90Se2+/Dv+6RrHte2P7dwSGAtgO4NFYONXDSqki8H76F1rrTQB+AmADgC2Q+2M+eD95EfT+6XD3VTuAf7MEsG32hG2zP9g2J/2KfCYAAALBSURBVIFtc2Ai0y7nsyhVLus6fCphpVQxgGcAfFtrvc9rV5d17fr6KaUuALBNaz3fvtplV+1jW3unE4BJAH6ttZ4I4CCskA43Oty1ioWrXATgOAD9ARRBwl2c8H5KTqJrw2uWf/Bv5gLb5sSwbQ4E2+YksG3OGDlvl/NZlDYCqLa9Hwhgc0jnEgmUUp0hjd6TWutZsdVNSqmq2PYqANti6zvi9TsVwIVKqXUA/gQJE7ofQKlSqlNsH/t1+Nc1im3vBWBXLk84RBoBNGqtP4y9/wukIeT9ZHEmgLVa6+1a62YAswCcAt5PXgS9fzrifZXv8G/mgG1zUtg2+4dtc3LYNgcjMu1yPovSuQBqY9m0ukAmMT8b8jmFhlJKAfgdgBVa65/aNj0LwGTG+jJkPotZ/6VYdq2TAew19n17RWt9i9Z6oNZ6COR+eUNr/QUAswFcEtvNeY3Mtbsktn+HGD3TWm8FsFEpNSK2ajqAj8D7yc4GACcrpXrE/v/MNeL9lJig988rAM5WSpXFRr/Pjq0j0YVtsw22zclh2+wfts2+YNscjOi0y2FPuE3nB8B5AFYDWAPgB2GfT8jX4hMQ+3wJgEWxn/MgcfGvA6iLLXvH9leQDIlrACyFZCkL/Xvk8HpNA/B87PVQAHMA1AN4GkDX2Ppusff1se1Dwz7vHF+jCQDmxe6pvwEo4/3U5hr9F4CVAJYBeBxAV95P/7o2T0Hm8zRDRlavSeX+AfDV2DWrB/CVsL8Xf3z97dk2W9eCbXOw68W2Ofk1Ytuc/BqxbXa/LpFul1Xs4IQQQgghhBBCSM7J5/BdQgghhBBCCCF5DkUpIYQQQgghhJDQoCglhBBCCCGEEBIaFKWEEEIIIYQQQkKDopQQQgghhBBCSGhQlBJCCCGEEEIICQ2KUkIIIYQQQgghoUFRSgghhBBCCCEkNP4/p/Hnc7YcOeIAAAAASUVORK5CYII=\n", |
298 |
| - "text/plain": [ |
299 |
| - "<Figure size 1152x432 with 2 Axes>" |
300 |
| - ] |
301 |
| - }, |
302 |
| - "metadata": { |
303 |
| - "needs_background": "light" |
304 |
| - }, |
305 |
| - "output_type": "display_data" |
306 |
| - }, |
307 |
| - { |
308 |
| - "name": "stdout", |
309 |
| - "output_type": "stream", |
310 |
| - "text": [ |
311 |
| - "\n" |
312 |
| - ] |
313 |
| - }, |
314 |
| - { |
315 |
| - "data": { |
316 |
| - "application/vnd.jupyter.widget-view+json": { |
317 |
| - "model_id": "8609121ed2dc44eb99bc54732f41cde9", |
318 |
| - "version_major": 2, |
319 |
| - "version_minor": 0 |
320 |
| - }, |
321 |
| - "text/plain": [ |
322 |
| - "HBox(children=(IntProgress(value=0, max=2036), HTML(value='')))" |
323 |
| - ] |
324 |
| - }, |
325 |
| - "metadata": {}, |
326 |
| - "output_type": "display_data" |
327 |
| - }, |
328 |
| - { |
329 |
| - "name": "stdout", |
330 |
| - "output_type": "stream", |
331 |
| - "text": [ |
332 |
| - "\n" |
333 |
| - ] |
334 |
| - }, |
335 |
| - { |
336 |
| - "data": { |
337 |
| - "application/vnd.jupyter.widget-view+json": { |
338 |
| - "model_id": "154eb3b49e9640cda42b47428b31498f", |
339 |
| - "version_major": 2, |
340 |
| - "version_minor": 0 |
341 |
| - }, |
342 |
| - "text/plain": [ |
343 |
| - "HBox(children=(IntProgress(value=0, max=1977), HTML(value='')))" |
344 |
| - ] |
345 |
| - }, |
346 |
| - "metadata": {}, |
347 |
| - "output_type": "display_data" |
348 |
| - }, |
349 |
| - { |
350 |
| - "name": "stdout", |
351 |
| - "output_type": "stream", |
352 |
| - "text": [ |
353 |
| - "\n" |
354 |
| - ] |
355 |
| - }, |
356 | 326 | {
|
357 | 327 | "data": {
|
358 | 328 | "application/vnd.jupyter.widget-view+json": {
|
359 |
| - "model_id": "6a2cd11c60c7403b86562503cef16981", |
| 329 | + "model_id": "a67b0c82425c418aa3e0998f55bdf8d1", |
360 | 330 | "version_major": 2,
|
361 | 331 | "version_minor": 0
|
362 | 332 | },
|
363 | 333 | "text/plain": [
|
364 |
| - "HBox(children=(IntProgress(value=0, max=1922), HTML(value='')))" |
| 334 | + "HBox(children=(IntProgress(value=0, max=5340), HTML(value='')))" |
365 | 335 | ]
|
366 | 336 | },
|
367 | 337 | "metadata": {},
|
|
373 | 343 | "text": [
|
374 | 344 | "\n"
|
375 | 345 | ]
|
376 |
| - }, |
377 |
| - { |
378 |
| - "data": { |
379 |
| - "application/vnd.jupyter.widget-view+json": { |
380 |
| - "model_id": "1cc030e1f1e04fedb0e9db92b1116f7a", |
381 |
| - "version_major": 2, |
382 |
| - "version_minor": 0 |
383 |
| - }, |
384 |
| - "text/plain": [ |
385 |
| - "HBox(children=(IntProgress(value=0, max=1858), HTML(value='')))" |
386 |
| - ] |
387 |
| - }, |
388 |
| - "metadata": {}, |
389 |
| - "output_type": "display_data" |
390 |
| - }, |
391 |
| - { |
392 |
| - "name": "stdout", |
393 |
| - "output_type": "stream", |
394 |
| - "text": [ |
395 |
| - "\n" |
396 |
| - ] |
397 |
| - }, |
398 |
| - { |
399 |
| - "data": { |
400 |
| - "application/vnd.jupyter.widget-view+json": { |
401 |
| - "model_id": "8a836ab60e7149c28c137ef19affe353", |
402 |
| - "version_major": 2, |
403 |
| - "version_minor": 0 |
404 |
| - }, |
405 |
| - "text/plain": [ |
406 |
| - "HBox(children=(IntProgress(value=0, max=1790), HTML(value='')))" |
407 |
| - ] |
408 |
| - }, |
409 |
| - "metadata": {}, |
410 |
| - "output_type": "display_data" |
411 |
| - }, |
412 |
| - { |
413 |
| - "name": "stdout", |
414 |
| - "output_type": "stream", |
415 |
| - "text": [ |
416 |
| - "\n" |
417 |
| - ] |
418 |
| - }, |
419 |
| - { |
420 |
| - "data": { |
421 |
| - "application/vnd.jupyter.widget-view+json": { |
422 |
| - "model_id": "2eecd903abbb44a392a091b589bc5342", |
423 |
| - "version_major": 2, |
424 |
| - "version_minor": 0 |
425 |
| - }, |
426 |
| - "text/plain": [ |
427 |
| - "HBox(children=(IntProgress(value=0, max=1743), HTML(value='')))" |
428 |
| - ] |
429 |
| - }, |
430 |
| - "metadata": {}, |
431 |
| - "output_type": "display_data" |
432 |
| - }, |
433 |
| - { |
434 |
| - "name": "stdout", |
435 |
| - "output_type": "stream", |
436 |
| - "text": [ |
437 |
| - "\n" |
438 |
| - ] |
439 |
| - }, |
440 |
| - { |
441 |
| - "data": { |
442 |
| - "application/vnd.jupyter.widget-view+json": { |
443 |
| - "model_id": "f6c9109064ef422886dbf0b04b7f0d61", |
444 |
| - "version_major": 2, |
445 |
| - "version_minor": 0 |
446 |
| - }, |
447 |
| - "text/plain": [ |
448 |
| - "HBox(children=(IntProgress(value=0, max=1712), HTML(value='')))" |
449 |
| - ] |
450 |
| - }, |
451 |
| - "metadata": {}, |
452 |
| - "output_type": "display_data" |
453 |
| - }, |
454 |
| - { |
455 |
| - "name": "stdout", |
456 |
| - "output_type": "stream", |
457 |
| - "text": [ |
458 |
| - "\n" |
459 |
| - ] |
460 |
| - }, |
461 |
| - { |
462 |
| - "data": { |
463 |
| - "application/vnd.jupyter.widget-view+json": { |
464 |
| - "model_id": "f06b638e6e3d400d9b232d12c95e4c22", |
465 |
| - "version_major": 2, |
466 |
| - "version_minor": 0 |
467 |
| - }, |
468 |
| - "text/plain": [ |
469 |
| - "HBox(children=(IntProgress(value=0, max=1675), HTML(value='')))" |
470 |
| - ] |
471 |
| - }, |
472 |
| - "metadata": {}, |
473 |
| - "output_type": "display_data" |
474 |
| - }, |
475 |
| - { |
476 |
| - "ename": "KeyboardInterrupt", |
477 |
| - "evalue": "", |
478 |
| - "output_type": "error", |
479 |
| - "traceback": [ |
480 |
| - "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", |
481 |
| - "\u001b[0;31mKeyboardInterrupt\u001b[0m Traceback (most recent call last)", |
482 |
| - "\u001b[0;32m<ipython-input-38-f3509c411a24>\u001b[0m in \u001b[0;36m<module>\u001b[0;34m\u001b[0m\n\u001b[1;32m 14\u001b[0m \u001b[0mbatch\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;34m[\u001b[0m\u001b[0mstate\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0maction\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mreward\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mnext_state\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mtorch\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mtensor\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;36m0\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 15\u001b[0m loss = ddpg_update(batch, params, nets, optimizer,\n\u001b[0;32m---> 16\u001b[0;31m cuda, debugger, step=step)\n\u001b[0m\u001b[1;32m 17\u001b[0m \u001b[0mdebugger\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mlog_losses\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mloss\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 18\u001b[0m \u001b[0mstep\u001b[0m \u001b[0;34m+=\u001b[0m \u001b[0;36m1\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", |
483 |
| - "\u001b[0;32m<ipython-input-37-575344a6946c>\u001b[0m in \u001b[0;36mddpg_update\u001b[0;34m(batch, params, nets, optimizer, device, debugger, learn, step)\u001b[0m\n\u001b[1;32m 21\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0mlearn\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 22\u001b[0m \u001b[0moptimizer\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;34m'value_optimizer'\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mzero_grad\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m---> 23\u001b[0;31m \u001b[0mvalue_loss\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mbackward\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mretain_graph\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;32mTrue\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 24\u001b[0m \u001b[0moptimizer\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;34m'value_optimizer'\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mstep\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 25\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n", |
484 |
| - "\u001b[0;32m~/anaconda3/lib/python3.7/site-packages/torch/tensor.py\u001b[0m in \u001b[0;36mbackward\u001b[0;34m(self, gradient, retain_graph, create_graph)\u001b[0m\n\u001b[1;32m 116\u001b[0m \u001b[0mproducts\u001b[0m\u001b[0;34m.\u001b[0m \u001b[0mDefaults\u001b[0m \u001b[0mto\u001b[0m\u001b[0;31m \u001b[0m\u001b[0;31m`\u001b[0m\u001b[0;31m`\u001b[0m\u001b[0;32mFalse\u001b[0m\u001b[0;31m`\u001b[0m\u001b[0;31m`\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 117\u001b[0m \"\"\"\n\u001b[0;32m--> 118\u001b[0;31m \u001b[0mtorch\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mautograd\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mbackward\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mgradient\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mretain_graph\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mcreate_graph\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 119\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 120\u001b[0m \u001b[0;32mdef\u001b[0m \u001b[0mregister_hook\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mhook\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", |
485 |
| - "\u001b[0;32m~/anaconda3/lib/python3.7/site-packages/torch/autograd/__init__.py\u001b[0m in \u001b[0;36mbackward\u001b[0;34m(tensors, grad_tensors, retain_graph, create_graph, grad_variables)\u001b[0m\n\u001b[1;32m 91\u001b[0m Variable._execution_engine.run_backward(\n\u001b[1;32m 92\u001b[0m \u001b[0mtensors\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mgrad_tensors\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mretain_graph\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mcreate_graph\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m---> 93\u001b[0;31m allow_unreachable=True) # allow_unreachable flag\n\u001b[0m\u001b[1;32m 94\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 95\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n", |
486 |
| - "\u001b[0;31mKeyboardInterrupt\u001b[0m: " |
487 |
| - ] |
488 | 346 | }
|
489 | 347 | ],
|
490 | 348 | "source": [
|
| 349 | + "max_buf_size = 100000\n", |
| 350 | + "buffer = ReplayBuffer(max_buf_size)\n", |
| 351 | + "\n", |
491 | 352 | "step = 0\n",
|
492 | 353 | "for batch in tqdm(train_dataloader):\n",
|
493 | 354 | " batch = [i.to(cuda) for i in batch]\n",
|
494 | 355 | " items, ratings, sizes = batch\n",
|
495 | 356 | " hidden = None\n",
|
496 | 357 | " state = None\n",
|
497 |
| - " for t in tqdm(range(int(sizes.min().item()) - 1), ):\n", |
| 358 | + " for t in range(int(sizes.min().item()) - 1):\n", |
498 | 359 | " action = items[:, t]\n",
|
499 | 360 | " reward = ratings[:, t].unsqueeze(-1)\n",
|
500 | 361 | " s = torch.cat([action, reward], 1).unsqueeze(0)\n",
|
501 | 362 | " next_state, hidden = state_encoder(s, hidden) if hidden else state_encoder(s)\n",
|
502 | 363 | " next_state = next_state.squeeze()\n",
|
| 364 | + " \n", |
503 | 365 | " if np.random.random() > 0.95 and state is not None:\n",
|
504 |
| - " batch = [state, action, reward, next_state, torch.tensor(0)]\n", |
| 366 | + " batch = [state, action, reward, next_state]\n", |
| 367 | + " buffer.append(batch)\n", |
| 368 | + " \n", |
| 369 | + " if buffer.len() >= max_buf_size:\n", |
505 | 370 | " loss = ddpg_update(batch, params, nets, optimizer,\n",
|
506 | 371 | " cuda, debugger, step=step)\n",
|
507 | 372 | " debugger.log_losses(loss)\n",
|
508 | 373 | " step += 1\n",
|
| 374 | + " debugger.log_step(step)\n", |
| 375 | + " buffer.flush()\n", |
509 | 376 | " \n",
|
510 |
| - " if step % 100 == 0 and step > 0:\n", |
| 377 | + " #if step % 100 == 0 and step > 0:\n", |
511 | 378 | " # debugger.test()\n",
|
512 |
| - " clear_output(True)\n", |
513 |
| - " print(step)\n", |
514 |
| - " plotter.plot_loss()\n", |
| 379 | + " #clear_output(True)\n", |
| 380 | + " #print(step)\n", |
| 381 | + " #plotter.plot_loss()\n", |
515 | 382 | " \n",
|
516 | 383 | " state = next_state\n"
|
517 | 384 | ]
|
518 | 385 | },
|
519 | 386 | {
|
520 | 387 | "cell_type": "code",
|
521 |
| - "execution_count": 17, |
| 388 | + "execution_count": 31, |
522 | 389 | "metadata": {},
|
523 | 390 | "outputs": [
|
524 | 391 | {
|
525 | 392 | "data": {
|
526 | 393 | "text/plain": [
|
527 |
| - "RAdam (\n", |
528 |
| - "Parameter Group 0\n", |
529 |
| - " betas: (0.9, 0.999)\n", |
530 |
| - " eps: 1e-08\n", |
531 |
| - " lr: 1e-05\n", |
532 |
| - " weight_decay: 0.01\n", |
533 |
| - ")" |
| 394 | + "tensor([[ 0.0014, 0.0003, 0.0042, ..., 0.0018, -0.0047, -0.0153],\n", |
| 395 | + " [-0.0002, -0.0059, -0.0043, ..., 0.0009, -0.0029, -0.0116],\n", |
| 396 | + " [-0.0011, 0.0041, 0.0024, ..., -0.0014, -0.0010, 0.0091],\n", |
| 397 | + " ...,\n", |
| 398 | + " [-0.0025, -0.0010, 0.0020, ..., -0.0037, 0.0020, 0.0047],\n", |
| 399 | + " [ 0.0011, -0.0007, -0.0060, ..., 0.0007, -0.0012, -0.0131],\n", |
| 400 | + " [ 0.0012, -0.0020, 0.0003, ..., 0.0020, -0.0009, 0.0033]],\n", |
| 401 | + " device='cuda:0')" |
534 | 402 | ]
|
535 | 403 | },
|
536 |
| - "execution_count": 17, |
| 404 | + "execution_count": 31, |
537 | 405 | "metadata": {},
|
538 | 406 | "output_type": "execute_result"
|
539 | 407 | }
|
540 | 408 | ],
|
541 | 409 | "source": [
|
542 |
| - "optimizer['policy_optimizer']" |
| 410 | + "list(state_encoder.parameters())[0].grad" |
543 | 411 | ]
|
544 | 412 | },
|
545 | 413 | {
|
|
0 commit comments