diff --git a/1.dqn.ipynb b/1.dqn.ipynb
index b3f33f4..9db68b0 100644
--- a/1.dqn.ipynb
+++ b/1.dqn.ipynb
@@ -2,7 +2,7 @@
"cells": [
{
"cell_type": "code",
- "execution_count": 1,
+ "execution_count": 19,
"metadata": {},
"outputs": [],
"source": [
@@ -14,13 +14,17 @@
"import torch\n",
"import torch.nn as nn\n",
"import torch.optim as optim\n",
- "import torch.autograd as autograd \n",
- "import torch.nn.functional as F"
+ "import torch.autograd as autograd\n",
+ "import torch.nn.functional as F\n",
+ "\n",
+ "import os\n",
+ "import logger\n",
+ "from common import monitor"
]
},
{
"cell_type": "code",
- "execution_count": 2,
+ "execution_count": 20,
"metadata": {},
"outputs": [],
"source": [
@@ -38,24 +42,48 @@
},
{
"cell_type": "code",
- "execution_count": 3,
- "metadata": {},
- "outputs": [],
+ "execution_count": 21,
+ "metadata": {
+ "scrolled": true
+ },
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "cuda\n"
+ ]
+ }
+ ],
"source": [
- "USE_CUDA = torch.cuda.is_available()\n",
- "Variable = lambda *args, **kwargs: autograd.Variable(*args, **kwargs).cuda() if USE_CUDA else autograd.Variable(*args, **kwargs)"
+ "device = torch.device(\"cuda\" if torch.cuda.is_available() else \"cpu\")\n",
+ "print(device)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
- "
Replay Buffer
"
+ "Replay Memory\n",
+ "-----------\n",
+ "\n",
+ "We'll be using experience replay memory for training our DQN. It stores\n",
+ "the transitions that the agent observes, allowing us to reuse this data\n",
+ "later. By sampling from it randomly, the transitions that build up a\n",
+ "batch are decorrelated. It has been shown that this greatly stabilizes\n",
+ "and improves the DQN training procedure.\n",
+ "\n",
+ "For this, we're going to need:\n",
+ "\n",
+ "- ``ReplayBuffer`` - a cyclic buffer of bounded size that holds the\n",
+ " transitions observed recently. It also implements a ``.sample()``\n",
+ " method for selecting a random batch of transitions for training.\n",
+ "- ``ReplayBuffer.buffer`` - a deque where each entry is a tuple containing (state, action, reward, next_state, done). ``state``, ``action``, and ``next_state`` are numpy arrays, while ``done`` is a bool"
]
},
{
"cell_type": "code",
- "execution_count": 4,
+ "execution_count": 22,
"metadata": {},
"outputs": [],
"source": [
@@ -88,20 +116,22 @@
},
{
"cell_type": "code",
- "execution_count": 5,
+ "execution_count": 23,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
- "\u001b[33mWARN: gym.spaces.Box autodetected dtype as . Please provide explicit dtype.\u001b[0m\n"
+ "Logging to /tmp/RL_Adventure-2019-02-08-10-15-46-153322\n"
]
}
],
"source": [
+ "logger.configure()\n",
"env_id = \"CartPole-v0\"\n",
- "env = gym.make(env_id)"
+ "env = gym.make(env_id)\n",
+ "env = monitor.Monitor(env, logger.get_dir())"
]
},
{
@@ -113,7 +143,7 @@
},
{
"cell_type": "code",
- "execution_count": 6,
+ "execution_count": 24,
"metadata": {},
"outputs": [],
"source": [
@@ -126,27 +156,29 @@
},
{
"cell_type": "code",
- "execution_count": 7,
+ "execution_count": 25,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
- "[]"
+ "[]"
]
},
- "execution_count": 7,
+ "execution_count": 25,
"metadata": {},
"output_type": "execute_result"
},
{
"data": {
- "image/png": "iVBORw0KGgoAAAANSUhEUgAAAXcAAAD8CAYAAACMwORRAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAGZ9JREFUeJzt3Xt0XeV55/Hvc87R0f0uIVuyfOWSOCYGIxyTpAkJk8Sw\nhrjpZFaBpiRMM5QZaDtt15qQ1TUzTbramSSTWSkNwWEYwjTthJKUJE5iYiYXYBIuQYABG9sgG4xk\nW1i+ybZkWbdn/jhb5liWrGP5SFtn799nLS3ts/d7dJ7XJD+9eve79zZ3R0REoiURdgEiIpJ/CncR\nkQhSuIuIRJDCXUQkghTuIiIRpHAXEYkghbuISAQp3EVEIkjhLiISQamwPrihocEXL14c1seLiBSk\n55577oC7N07VLrRwX7x4Me3t7WF9vIhIQTKz3bm007SMiEgEKdxFRCJI4S4iEkEKdxGRCFK4i4hE\n0JThbmb3m9l+M9syyXEzs7vMrMPMXjKzVfkvU0REzkUuI/cHgLVnOX4tcFHwdStwz/mXJSIi52PK\ncHf3J4BDZ2myDvh7z3gaqDGz+fkqcLwd3cf4yqbtHO4bnKmPEBEpePmYc28BOrNedwX7zmBmt5pZ\nu5m19/T0TOvDXj/Qx92/3MmeIyem9X4RkTiY1ROq7n6vu7e5e1tj45RXz06oviINwCGN3EVEJpWP\ncN8DtGa9XhDsmxF15Qp3EZGp5CPcNwA3B6tm1gC97r4vDz93QvVBuB9UuIuITGrKG4eZ2XeAq4EG\nM+sC/gtQBODu64GNwHVAB9AP3DJTxQJUlRSRTBiH+k7O5MeIiBS0KcPd3W+c4rgDt+etoikkEkZt\nWVrTMiIiZ1GQV6jWl6c5eFzhLiIymYIM99ryIo3cRUTOoiDDvb68WOEuInIWBRnudeVprZYRETmL\ngg333hNDDI2Mhl2KiMicVJDhPnaV6pH+oZArERGZmwoy3HWVqojI2RV0uB/UhUwiIhMqyHCvLy8G\nNHIXEZlMQYa7pmVERM6uIMO9tqwIQFepiohMoiDDPZVMUFOmq1RFRCZTkOEOmakZhbuIyMQKNtzr\ny9NaLSMiMomCDXeN3EVEJlfA4a6bh4mITKZgw72+PM3h/iFGRz3sUkRE5pzCDfeKNCOjzpETur+M\niMh4BRvuDRWZq1QPHNdJVRGR8Qo23Bsrg3A/pnAXERmv4MO9RyN3EZEzFGy4j03L9GjkLiJyhoIN\n96qSFOlUQuEuIjKBgg13M6OxoljTMiIiEyjYcIfMvLtG7iIiZyrocG+oULiLiEykoMO9sbJY69xF\nRCZQ8OF+qG+QEd2CQETkNIUd7hVpRl0PyhYRGa+ww71Sa91FRCYSiXA/oGepioicJqdwN7O1ZrbD\nzDrM7M4Jjleb2Y/M7EUz22pmt+S/1DM1VpQAGrmLiIw3ZbibWRK4G7gWWA7caGbLxzW7HXjF3VcC\nVwNfNbN0nms9Q0Nl5iMU7iIip8tl5L4a6HD3Xe4+CDwIrBvXxoFKMzOgAjgEDOe10gmUpVOUp5MK\ndxGRcXIJ9xagM+t1V7Av29eBdwJ7gZeBP3H30fE/yMxuNbN2M2vv6emZZsmn01p3EZEz5euE6seA\nzUAzcBnwdTOrGt/I3e919zZ3b2tsbMzLB+sqVRGRM+US7nuA1qzXC4J92W4BHvaMDuB14B35KfHs\nGit18zARkfFyCfdngYvMbElwkvQGYMO4Nm8C1wCYWRNwCbArn4VOprGymP1HB2bjo0RECkZqqgbu\nPmxmdwCbgCRwv7tvNbPbguPrgb8CHjCzlwEDPufuB2aw7lOaqko4OjDMwNAIJUXJ2fhIEZE5b8pw\nB3D3jcDGcfvWZ23vBT6a39Jy01SVWev+1tEBFtWXh1GCiMicU9BXqAI0VWWuUu3u1dSMiMiYgg/3\necHIvVvz7iIipxR8uDdVvz0tIyIiGQUf7pXFKcrSSbp7tRxSRGRMwYe7mTGvqkQjdxGRLAUf7pBZ\nMaM5dxGRt0Ui3OdVa+QuIpItEuHeVFXC/qMncdezVEVEICLhPq+qmMGRUQ716YlMIiIQkXBv0lp3\nEZHTRCPctdZdROQ0kQj3U1epaq27iAgQkXBvrCzGTNMyIiJjIhHuRckEDRW6r7uIyJhIhDtkpmY0\nchcRyYhMuDdVlei2vyIigciEe0tNCXuPnAi7DBGROSEy4d5cU8rRgWGODQyFXYqISOgiFe4Ae49o\nakZEJDLh3lI7Fu6amhERiU64ByP3LoW7iEh0wr2xopiipGnkLiJChMI9kTDmV5ey57DCXUQkMuEO\n0KzlkCIiQMTCvaWmTOEuIkLkwj1zC4KhkdGwSxERCVWkwr25ppRR133dRUQiFe5ja911UlVE4i5S\n4X7qKtVehbuIxFu0wr1aI3cREcgx3M1srZntMLMOM7tzkjZXm9lmM9tqZo/nt8zclKaT1Jen2aP7\ny4hIzKWmamBmSeBu4CNAF/CsmW1w91ey2tQA3wDWuvubZnbBTBU8leaaUroO94f18SIic0IuI/fV\nQIe773L3QeBBYN24NjcBD7v7mwDuvj+/ZeZuYV0ZXZqWEZGYyyXcW4DOrNddwb5sFwO1ZvaYmT1n\nZjfnq8Bz1VpXRtfhfkZGPawSRERCN+W0zDn8nCuAa4BS4Ckze9rdX81uZGa3ArcCLFy4ME8ffbpF\n9WUMjTj7ek+woLZsRj5DRGSuy2XkvgdozXq9INiXrQvY5O597n4AeAJYOf4Hufu97t7m7m2NjY3T\nrfmsFtZlAv3NQ5p3F5H4yiXcnwUuMrMlZpYGbgA2jGvzQ+D9ZpYyszLgPcC2/Jaam1PhflDhLiLx\nNeW0jLsPm9kdwCYgCdzv7lvN7Lbg+Hp332ZmPwVeAkaB+9x9y0wWPpn51SWkEqaRu4jEWk5z7u6+\nEdg4bt/6ca+/Anwlf6VNTyqZYEFtKbsV7iISY5G6QnVMa10ZnQp3EYmxSIb7ovoyTcuISKxFMtwX\n1pVxpH+I3hNDYZciIhKKyIY7oKkZEYmtiIZ7OQC7tRxSRGIqmuFerwuZRCTeIhnuFcUp6svT7D7Y\nF3YpIiKhiGS4AyxpKGfXAYW7iMRTZMN9aWM5u3oU7iIST5EN9yUNFRw4fpKjA1oOKSLxE9lwX9qY\nWTGj0buIxFFkw33ZqXA/HnIlIiKzL7LhvrCunGTCeF0nVUUkhiIb7ulUgtbaUk3LiEgsRTbcAZY2\nVrBT0zIiEkPRDveGct442MeoHpYtIjET7XBvrGBgaJS9vSfCLkVEZFZFPNy1HFJE4ikm4a55dxGJ\nl0iHe2NFMVUlKV7br3AXkXiJdLibGZfMq+TVt46FXYqIyKyKdLgDXNxUyY7uY7hrxYyIxEfkw/2S\neZUcHRjmraMnwy5FRGTWRD/cmyoB2KGpGRGJkciH+8Vj4d59NORKRERmT+TDvbY8zQWVxezo1ooZ\nEYmPyIc7oBUzIhI7sQj3i5sqeW3/MUZ0jxkRiYlYhPslTZUMDI3Seag/7FJERGZFLML94nmZk6rb\nuzU1IyLxEItwv6SpkoTBtn1aMSMi8ZBTuJvZWjPbYWYdZnbnWdpdaWbDZvbJ/JV4/krTSZY1VrB1\nb2/YpYiIzIopw93MksDdwLXAcuBGM1s+SbsvAY/mu8h8WNFSzZY9GrmLSDzkMnJfDXS4+y53HwQe\nBNZN0O6PgH8G9uexvrx5V3MV3UcH6Dmm2xCISPTlEu4tQGfW665g3ylm1gJ8Argnf6Xl14qWagBN\nzYhILOTrhOrXgM+5++jZGpnZrWbWbmbtPT09efro3CxvrgJg615NzYhI9KVyaLMHaM16vSDYl60N\neNDMABqA68xs2N1/kN3I3e8F7gVoa2ub1SuKqkqKWFRfxpY9GrmLSPTlEu7PAheZ2RIyoX4DcFN2\nA3dfMrZtZg8APx4f7HPBiuZqXtpzJOwyRERm3JTTMu4+DNwBbAK2AQ+5+1Yzu83MbpvpAvPpXS1V\ndB46QW//UNiliIjMqFxG7rj7RmDjuH3rJ2n7mfMva2asaM6cVN2yt5f3XdgQcjUiIjMnFleojlm5\noAaAzZ2amhGRaItVuFeXFbGssZzndx8OuxQRkRkVq3AHWLWwlhc6j+iB2SISabEL98sX1nKob5Dd\nB3X7XxGJrtiF+6pFmXn359/U1IyIRFfswv2iCyqpKE7xwps6qSoi0RW7cE8mjJWt1Rq5i0ikxS7c\nAS5vrWV79zH6B4fDLkVEZEbEMtyvWFTLyKizWVMzIhJRsQz3tsW1JAye3nUw7FJERGZELMO9sqSI\nS1uqeUrhLiIRFctwB1izrJ7NnUc4MTgSdikiInkX33BfWs/QiGvVjIhEUmzDvW1RLcmEad5dRCIp\ntuFeWVLEipZqhbuIRFJswx1gzdI6Nnce0Xp3EYmcWIf7+y9sYGjENXoXkciJdbhfubiO0qIkj+/o\nCbsUEZG8inW4lxQluWpZPY+9qnAXkWiJdbgDXH1JI7sP9vP6gb6wSxERyZvYh/sHL24E4PEd+0Ou\nREQkf2If7ovqy1nSUK6pGRGJlNiHO2RG70/tPKglkSISGQp34KPLmzg5PMoTGr2LSEQo3IHVS+qo\nKSvip1u6wy5FRCQvFO5AKpngI+9s4ufb9nNyWHeJFJHCp3APXHvpPI6dHObJnbpaVUQKn8I98N5l\nDVQUp/jpy5qaEZHCp3APlBQl+dA7LuDRV7oZHB4NuxwRkfOicM/y25c1c7h/iMe1akZECpzCPcsH\nLm6kvjzN91/oCrsUEZHzklO4m9laM9thZh1mducEx3/PzF4ys5fN7EkzW5n/UmdeUTLB9Sub+dkr\n++ntHwq7HBGRaZsy3M0sCdwNXAssB240s+Xjmr0OfNDdLwX+Crg334XOlt9Z1cLgyCg/eXlf2KWI\niExbLiP31UCHu+9y90HgQWBddgN3f9Ldx540/TSwIL9lzp5LW6q58IIKvvdcZ9iliIhMWy7h3gJk\nJ11XsG8yfwA8cj5FhcnM+N22Vp5/8wjb9h0NuxwRkWnJ6wlVM/sQmXD/3CTHbzWzdjNr7+mZuytS\nPnnFAopTCf7h6d1hlyIiMi25hPseoDXr9YJg32nM7N3AfcA6d5/wMk93v9fd29y9rbGxcTr1zora\n8jTXr2zm+y/s4diATqyKSOHJJdyfBS4ysyVmlgZuADZkNzCzhcDDwO+7+6v5L3P2/f6aRfQPjvD9\nF874PSYiMudNGe7uPgzcAWwCtgEPuftWM7vNzG4Lmv1noB74hpltNrP2Gat4lqxsrWHlgmoe+PUb\njIx62OWIiJyTnObc3X2ju1/s7svc/a+DfevdfX2w/Vl3r3X3y4Kvtpkserb82w8sZdeBPh7dqvvN\niEhh0RWqZ3Htivksri/jG4/txF2jdxEpHAr3s0gmjD/84DJe3tPLrzoOhF2OiEjOFO5T+J1VLTRV\nFfN3v+jQ6F1ECobCfQrFqSS3f+hCfvP6IR7T3SJFpEAo3HNww5ULWVhXxpce2c6oVs6ISAFQuOcg\nnUrw5x+9mO3dx/jhi1r3LiJzn8I9R9e/u5kVLVV8+ac76Ds5HHY5IiJnpXDPUSJhfOHjK9jXO8DX\nfhaJi3BFJMIU7ufgikW13HBlK/f/+g3dMVJE5jSF+zn63Np3UFWS4s6HX2Z4RA/SFpG5SeF+jmrL\n03xh3Qpe7DzC3b/cGXY5IiITUrhPw8dXNrPusmbu+sVrbO48EnY5IiJnULhP0xfXraCpspg//s4L\nepi2iMw5Cvdpqi4t4u9uWsW+3hP80YMv6LbAIjKnKNzPwxWLavniuhU88WoPX960PexyREROSYVd\nQKG7cfVCtu7t5ZuP72J+VQmfed+SsEsSEVG458NfXv8u9h89yV/+6BVqytL89uUtYZckIjGnaZk8\nSCUT3HXj5Vy1tJ4//+6L/EDPXRWRkCnc86SkKMn//HQbqxfX8acPbebbT70RdkkiEmMK9zyqKE7x\nrVuu5Jp3NPGffriV//rINq2iEZFQKNzzrKQoyT2fWsXvvWch33x8F//mgWe1Dl5EZp3CfQYUJRP8\n9Scu5W8+cSlP7jzAtX/7BE/qGawiMosU7jPopvcs5Lu3vZeSoiQ33fcMX/jRVo4NaBQvIjNP4T7D\nLmut4Sd//FvcfNUivvXrN/jwVx/n4ee79Lg+EZlRCvdZUJpO8sV1K/jB7e+juaaUP3voRa7/+q/Y\ntLUbd4W8iOSfwn0WXdZaw/f/3Xv56r9eyfGTw/zht5/jurt+xXfbOxkYGgm7PBGJEAtr5NjW1ubt\n7e2hfPZcMDwyyoYX9/KNx3bSsf84VSUp/tUVC/jE5S1c2lKNmYVdoojMQWb2nLu3TdlO4R4ud+fp\nXYf4x2d2s2lrN0MjTmtdKdddOp+PvLOJla01FCX1B5aIZCjcC9DhvkEefaWbn7zczZMdBxgedSqK\nU6xZWsdVyxq4fGENy+dXUVKUDLtUEQmJwr3A9fYP8dSuA/y/1w7w644DvHGwH4BUwrhkXiXvXlDN\nhRdUsqyxnGWNFbTUlJJIaCpHJOpyDXfdFXKOqi4rYu2K+axdMR+A7t4BXuw6wktdR3ixs5dHtnRz\npL/zVPuSogSttWU015TSXFPC/OpS5leXMK+6hLryNHXlaWrL0hr1i8RETuFuZmuBvwWSwH3u/t/G\nHbfg+HVAP/AZd38+z7XG2rzqEuZVz+Nj75p3at/B4yfZ2dNHx/7jdOw/Ttfhfvb1DrB1by8Hjg9O\n+HNKi5LUlaepKSuisiRFeTpFeXGK8uIk5ekUZcUpKoqTlKVTFKcSpFMJ0snge7BdFHwvTiUoCl4n\nzUgkIGlGMmEkEvb29qnv6ESxyCyZMtzNLAncDXwE6AKeNbMN7v5KVrNrgYuCr/cA9wTfZQbVVxRT\nX1HM6iV1ZxwbGBqhu3eAt44OcLh/iMP9gxzqG+Rw3yCH+jPf+06O0H10gL6Tw/QNjtAffJ9JCeO0\nwE+aYUHoj+W+8fYvgcz22FZme+zXQ2Z7ov1v/wLJ/OzJ2825XzVzrKA5Vs6cGxxMt5rfvbKVz/7W\n0rzWMl4uI/fVQIe77wIwsweBdUB2uK8D/t4zE/hPm1mNmc139315r1hyUlKUZHFDOYsbys/pfaOj\nzomhEfoGhzk5NMrgyCiDw6MMBd8Hh0c5mbU9tn/UYcSd0VFnZNQZ9cz3t/dlHc9qN+KOO6cu5nJg\n7DSQExwLasvs91Pb49tN9H5Oe7+f9rPm2uVjc+2CtrlVDXOuID+PghoqivNYycRyCfcWoDPrdRdn\njsonatMCKNwLTCJhwTSNTseIFLJZXUBtZreaWbuZtff09MzmR4uIxEou4b4HaM16vSDYd65tcPd7\n3b3N3dsaGxvPtVYREclRLuH+LHCRmS0xszRwA7BhXJsNwM2WsQbo1Xy7iEh4ppxYdfdhM7sD2ERm\nKeT97r7VzG4Ljq8HNpJZBtlBZinkLTNXsoiITCWns2buvpFMgGfvW5+17cDt+S1NRESmS3ekEhGJ\nIIW7iEgEKdxFRCIotLtCmlkPsHuab28ADuSxnEKgPseD+hwP59PnRe4+5Vry0ML9fJhZey63vIwS\n9Tke1Od4mI0+a1pGRCSCFO4iIhFUqOF+b9gFhEB9jgf1OR5mvM8FOecuIiJnV6gjdxEROYuCC3cz\nW2tmO8ysw8zuDLue6TKzVjP7pZm9YmZbzexPgv11ZvZ/zey14Htt1ns+H/R7h5l9LGv/FWb2cnDs\nLptrj6sZx8ySZvaCmf04eB3pPgcPr/memW03s21mdlUM+vynwf+ut5jZd8ysJGp9NrP7zWy/mW3J\n2pe3PppZsZn9U7D/GTNbfE4FunvBfJG5cdlOYCmQBl4Elodd1zT7Mh9YFWxXAq8Cy4EvA3cG++8E\nvhRsLw/6WwwsCf4dksGx3wBryDz16xHg2rD7N0Xf/wz4P8CPg9eR7jPwv4HPBttpoCbKfSbzoJ7X\ngdLg9UPAZ6LWZ+ADwCpgS9a+vPUR+PfA+mD7BuCfzqm+sP+BzvEf8ypgU9brzwOfD7uuPPXth2Se\nU7sDmB/smw/smKivZO7SeVXQZnvW/huBb4bdn7P0cwHwc+DDWeEe2T4D1UHQ2bj9Ue7z2JPZ6sjc\nnPDHwEej2Gdg8bhwz1sfx9oE2ykyFz1ZrrUV2rTMZI/zK2jBn1uXA88ATf72vfC7gaZge7K+twTb\n4/fPVV8D/iMwmrUvyn1eAvQA3wqmou4zs3Ii3Gd33wP8d+BNMo/a7HX3R4lwn7Pks4+n3uPuw0Av\nUJ9rIYUW7pFjZhXAPwP/wd2PZh/zzK/syCxnMrN/Cex39+cmaxO1PpMZca0C7nH3y4E+Mn+unxK1\nPgfzzOvI/GJrBsrN7FPZbaLW54mE3cdCC/ecHudXKMysiEyw/6O7PxzsfsvM5gfH5wP7g/2T9X1P\nsD1+/1z0PuDjZvYG8CDwYTP7B6Ld5y6gy92fCV5/j0zYR7nP/wJ43d173H0IeBh4L9Hu85h89vHU\ne8wsRWaK72CuhRRauOfyyL+CEJwR/1/ANnf/H1mHNgCfDrY/TWYufmz/DcEZ9CXARcBvgj8Bj5rZ\nmuBn3pz1njnF3T/v7gvcfTGZ/3a/cPdPEe0+dwOdZnZJsOsa4BUi3Gcy0zFrzKwsqPUaYBvR7vOY\nfPYx+2d9ksz/X3L/SyDsExLTOIFxHZmVJTuBvwi7nvPox/vJ/Mn2ErA5+LqOzJzaz4HXgJ8BdVnv\n+Yug3zvIWjUAtAFbgmNf5xxOuoTY/6t5+4RqpPsMXAa0B/+tfwDUxqDPXwC2B/V+m8wqkUj1GfgO\nmXMKQ2T+QvuDfPYRKAG+S+bxpb8Blp5LfbpCVUQkggptWkZERHKgcBcRiSCFu4hIBCncRUQiSOEu\nIhJBCncRkQhSuIuIRJDCXUQkgv4/vspwDQYKcwUAAAAASUVORK5CYII=\n",
+ "image/png": "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\n",
"text/plain": [
- ""
+ "