Skip to content

Instantly share code, notes, and snippets.

@Philogy
Created September 14, 2022 18:35
Show Gist options
  • Save Philogy/79aebb916f06e74e2f73267be0eb0d9d to your computer and use it in GitHub Desktop.
Save Philogy/79aebb916f06e74e2f73267be0eb0d9d to your computer and use it in GitHub Desktop.
Simple VRGDA simulator
Display the source blob
Display the rendered blob
Raw
{
"cells": [
{
"cell_type": "code",
"execution_count": 46,
"id": "89a726d8",
"metadata": {},
"outputs": [],
"source": [
"def simulate_vrgda(base_price, total_time, f, inv_f, k, buys, res=0.1):\n",
" buy_index = 0\n",
" times = []\n",
" prices = []\n",
" bought = []\n",
" target = []\n",
" total_bought = 0\n",
" for time_step in range(round(total_time / res)):\n",
" cur_time = time_step * res\n",
" if buy_index < len(buys):\n",
" buy_time, buy_amount = buys[buy_index]\n",
" if cur_time >= buy_time:\n",
" total_bought += buy_amount\n",
" buy_index += 1\n",
" times.append(cur_time)\n",
" bought.append(total_bought)\n",
" target.append(f(cur_time))\n",
" prices.append(base_price * (1 - k)**(cur_time - inv_f(total_bought)))\n",
" return times, prices, bought, target\n",
" "
]
},
{
"cell_type": "code",
"execution_count": 47,
"id": "acc4d933",
"metadata": {},
"outputs": [],
"source": [
"%matplotlib inline"
]
},
{
"cell_type": "code",
"execution_count": 48,
"id": "759192dd",
"metadata": {},
"outputs": [],
"source": [
"import matplotlib.pyplot as plt"
]
},
{
"cell_type": "code",
"execution_count": 61,
"id": "f1717c64",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"<matplotlib.legend.Legend at 0x7f65609eb400>"
]
},
"execution_count": 61,
"metadata": {},
"output_type": "execute_result"
},
{
"data": {
"image/png": "iVBORw0KGgoAAAANSUhEUgAAAXcAAAEICAYAAACktLTqAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjUuMSwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/YYfK9AAAACXBIWXMAAAsTAAALEwEAmpwYAABFrElEQVR4nO3deXiMV/vA8e/JUvu+1L6UkNqSSl5Lo5aiKBpaVGhLUbGlaGnpQtHip6oqKIoXRdSurRa15kVbYt8lSu1rUbtIzu+PM9pUQ7aZPJOZ+3NdcyWzPc+dSXLPmbPcR2mtEUII4Vo8rA5ACCGE/UlyF0IIFyTJXQghXJAkdyGEcEGS3IUQwgVJchdCCBckyV0IIVyQJHeRISilViqlhiZye7BS6qxSykspdUwpdUspdd122wylVPYHHt9WKfWrUuqGUuq87fseSillu//+Ma4ppa4opTYrpboppRL9X1FKrVdKXVZKZUoi/tlKqTNKqT+VUoeVUl3S8noIkRRJ7iKjmAG8ej8JJ/AqMEdrfc92vbnWOjvgDzwFDLz/QKXU28AXwKdAIeBxoBsQBDyW4JjNtdY5gJLASOBdYNqDASmlSgHPABp4IYn4RwCltNY5bY/9WCkVkMRzhEg1Se4io1gK5MUkUwCUUnmAZsCsBx+stT4LrMQkeZRSuYChQA+t9UKt9TVt7NBat9da30nkGFe11t8CLwMdlFKVHnjIa8AvmDeeDo8KXmu9L8E5tO1SxhZbN6XUcqXUBKXURaXUaaVUw0e/HEI8miR3kSForW8B8zEJ9b42wEGt9a4HH6+UKgY0AWJsN9UEMgHLUnHuLcBJEryx2LwGzLFdGimlHn/UcZRSE5VSN4GDwBngB9tdVWzxfQsUBCZjPi0IkWqS3EVGMhNorZTKYrv+mu22hJYqpa4BJ4DzwGDb7fmBiwm6b7D1p1+x9bHXTuLcpzGfHO4/txam22a+1nobcARo96gDaK17ADkwbxKLgfst+SrASK31Sq11PLA/iViESJIkd5FhaK03AheAYKXUE8B/gLkPPKyFrb+8LuCLSeoAl4D8SimvBMd7Wmud23ZfUv8LRYE/ElzvAKzSWl+0XZ9LEl0ztnPG2X6OYkB3282Vge8SPKwSkuBFGnkl/RAhnMosTIu9PCa5nkvsQVrrDUqpGcBooAXwM6alHAwsSskJlVL/wST3jbbrWTBdQp5KqbO2h2UCciul/BLrJkqEF1BGKVXa9v2hBPc9hRljECLVpOUuMppZQAPgDf7dJfOgsUBDpZS/1voKMASYqJRqpZTKrpTyUEr5A9kSe7JSKqdSqhkwD5ittd5ju6sFEAdUwAzY+gNPAv/jn2MC949T0DYFM7tSylMp1QgIAdZiumT22Lpj7nsKSM4bhBAPpaSeu8holFLrAT+gUMJZLkqpY0AXrfXqBLd9CRTUWr9ku94e6I3p+rgB/IaZ5jhDa33XdozHgXvA/f7v2cAkrXWc7RgrgH1a67cfiKsNMA4o9kDffgFgoS1mD+B3YJzW+iul1IdAUa11N9tj8wFngeyJzeARIrkkuQshhAuSbhkhhHBBktyFEMIFSXIXQggXJMldCCFckFPMc8+fP78uVaqU1WEIIUSGsm3btota6wKJ3ecUyb1UqVJERUVZHYYQQmQoSqnfH3afdMsIIYQLkuQuhBAuSJK7EEK4IEnuQgjhgiS5CyGEC5LkLoQQLkiSuxBCuCBJ7m5m1iy4fNnqKIQQjibJ3Y2cOQMdOkCtWlZHIoRwNEnubiQuznzdvx/u3rU2FiGEY0lyd1PLl1sdgRDCkSS5u6lp06yOQAjhSJLc3VCBAvDjj3DqlNWRCCEcRZK7G+rUCeLjYeZMqyMRQjiKJHc3VLYs1KkD06ebJC+EcD2S3N1U585w5AhERlodiRDCESS5u6mXXoKcOWVgVQhXJcndTWXNCu3awcKFcOWK1dEIIexNkrsb69wZbt+GiAirIxFC2JskdzcWEAB+fvDVV6C11dEIIexJkrsbUwpCQ2HHDtiyxepohBD2JMndzb3yCmTPDpMmWR2JEMKeJLm7kcS6XnLkMAl+3jz444/0j0kI4RiS3N2QUv+83q2bGViVFatCuA5J7gI/P6hZ03TNyMCqEK5BkrsAoHt3OHwY1q2zOhIhhD1IchcAtG4N+fLBl19aHYkQwh6STO5KqeJKqXVKqQNKqX1Kqd622z9SSp1SSu20XZ5P8JyBSqkYpdQhpVQjR/4Awj4yZ4bXX4elS812fEKIjC05Lfd7wNta6yeBGkBPpVQF232fa639bZcfAGz3tQUqAo2BiUopTwfELuysa1e4d0/qzQjhCpJM7lrrM1rr7bbvrwEHgKKPeEowME9rfUdrfRSIAarZI1jhWD4+0LAhTJlikrwQIuNKUZ+7UqoU8BTwq+2mXkqp3Uqp6UqpPLbbigInEjztJIm8GSiluiqlopRSURcuXEh55MIhevaEEydM94wQIuNKdnJXSmUHFgF9tNZ/Al8CZQB/4Azw2f2HJvL0f02w01pP0VoHaq0DCxQokNK4hYM0awalS8MXX1gdiRAiLZKV3JVS3pjEPkdrvRhAa31Oax2ntY4HvuLvrpeTQPEETy8GnLZfyMKRPD0hLAw2boTt262ORgiRWsmZLaOAacABrfWYBLcXTvCwlsBe2/ffAm2VUpmUUqUBH0DKUmUgnTqZejPSehci40pOyz0IeBV49oFpj6OUUnuUUruBekBfAK31PmA+sB9YAfTUWsc5JnzhCLlyQceOpt7MuXNWRyOESA2vpB6gtd5I4v3oPzziOZ8An6QhLmGxsDAYP96UJBg82OpohBApJStURaLKlYPnnzcrVu/csToaIVzTllNbiDod5ZBjS3J3IyktCta7t+mWmT/fMfEI4a6OXj5KyKIQqk+tzqB1gxxyDknubujBkr8P07AhPPmkGViVapFCpN3lW5fpt6ofvhN8WXZwGR/W/pBvWn3jkHMl2ecu3JdSpu+9Rw8zNfKZZ6yOSIiM6W7cXSZuncjQDUO5cvsKHf07MqzeMIrmfNRi/7SRlrt4pA4dTLXITz+1OhIhMh6tNQv2LeDJCU/Sd2VfAosEsiN0B9ODpzs0sYMkd5GErFmhVy/47js4cMDqaITIODaf2EzQ9CDaLGxDVu+srGi/glWvrsKvkF+6nF+Su0hSz56QJQuMHm11JEI4v5g/Ymg1vxVB04M4duUY016Yxs7QnTQqm77VzyW5iyQVKGBqvc+eDaelkIQQibp08xJ9VvShwoQKrIhZwZC6Q4gOi6bTU53w9Ej/queS3EWyvPWWKQM8bpzVkQjhXG7fu82nmz6lzLgyhG8J53X/14kOi2ZQnUFkeyybZXFJchfJUqYMvPSSWbH6559WRyOE9eJ1PBF7IvAd78s7q98hqEQQu7vtZnLzyRTOUTjpAziYJHeRbP37w9Wr8NVXVkcihLU2HNtA9anVabe4HXmy5GH1q6tZ3m45FQtWtDq0v0hyF8n2n/9AvXowdizcvWt1NEKkv0MXD9FiXgvqzqzL2etnmdliJtu6bqP+E/WtDu1fJLmLFOnfH06ehIgIqyMRIv2cv3Genst7UnFiRdYeXcvwZ4dzuNdhXvN7DQ/lnGlUVqiKFGncGKpUgZEj4ZVXzOYeQriqW7G3GPvLWEZsHMHN2JuEBoQyuO5gCmYraHVoSXLOtxzhtJSCDz6Agwdh0SKroxHCMeJ1PLN2zaLc+HK8t/Y9ni39LHt77GVC0wkZIrGDJHeRCi++CL6+8PHHEB9vdTRC2Nea39YQMCWADks7UCh7ITZ03MDStkvxze9rdWgpIsndjdirsqOnJ7z/PuzZY8oSCOEK9p3fR9O5TWnwdQMu37rM3Bfn8muXX6ldsrbVoaWKJHc3lNySv4/Stq2Z+z5smJQDFhnb2etnCf0ulCqTqrDp+CZGNRjFwV4HCakc4rSDpckhA6oiVby8YOBA6NIFVq40A61CZCQ37t7gs58/Y9SmUdyJu0NYtTA+rP0h+bLmszo0u8i4b0vCcq++CiVKSOtdZCxx8XFM2z4Nn3AfBq8fTOOyjdnfYz9jG491mcQOktxFGjz2GLz7LmzeDOvWWR2NEElbGbOSpyY/RZfvulAyd0k2ddrEwjYL8cnnY3VodifJXaRJp05QuDAMHWp1JEI83O5zu2k0uxGN5zTmRuwN5reaz+ZOm3m6+NNWh+YwktxFmmTObFrvGzbA2rVWRyPEP5368xSdlnXCf5I/W09t5fNGn7O/x35aV2yNssfMAicmyV2kWWgoFCtmFjdJ37twBtfuXOPDtR/iE+7DnD1zeKvmWxx58wh9avQhk1cmq8NLFzJbRqRZ5szw4Ycmyf/4Izz/vNURCXd1L/4e07ZPY9D6QZy/cZ62ldoy/NnhlM5T2urQ0p203IVdvP46PPGEtN6FNbTWLD+8nCpfVqHb8m6Uy1eOXzr/QsRLEW6Z2CEZyV0pVVwptU4pdUAptU8p1dt2e16l1E9KqWjb1zwJnjNQKRWjlDqklErfjQOFJby9YfBg2LEDliyxOhrhTraf2U79WfVpFtGMe/H3WPLyEiI7RlK9WHWrQ7NUclru94C3tdZPAjWAnkqpCsAAYI3W2gdYY7uO7b62QEWgMTBRKSW1A91A+/am5sygQRAXZ3U0wtUdv3qc15a8RsCUAPac30N4k3D29dhHC98WLj9YmhxJJnet9Rmt9Xbb99eAA0BRIBiYaXvYTKCF7ftgYJ7W+o7W+igQA1Szc9yAKVq1bJnZ21NYz9MThgyBffvgm2+sjka4qqu3rzJw9UDKhZdj/r75DAgaQExYDL2q9cLb09vq8JxGivrclVKlgKeAX4HHtdZnwLwBAPfrYBYFTiR42knbbQ8eq6tSKkopFXXhwoVUhG6m3rVoAdOnp+rpwgFatTL13gcPhthYq6MRriQ2LpbxW8ZTNrwsIzeNpE3FNhwOO8yIBiPIlTmX1eE5nWQnd6VUdmAR0Edr/agtkhP7PPSvITat9RStdaDWOrBAgQLJDeMf6teHoCCTSG7cSNUhhJ15eJhyBDEx8qYr7ENrzdKDS6n0ZSXCfgyjcsHKRL0RxayWsyiRq4TV4TmtZCV3pZQ3JrHP0Vovtt18TilV2HZ/YeC87faTQPEETy8GnLZPuA/GBZ9+CmfPwpgxjjiDa0mvWSzNm0OtWuZN9/r19DmncE1bTm2h9ozatPymJZ7Kk+9DvmfNa2sIKBJgdWhOLzmzZRQwDTigtU6YQr8FOti+7wAsS3B7W6VUJqVUacAH2GK/kP+pZk2zecSoUXD+fNKPF/Yp+ZvU8T/9FM6dg88+c+y5hGs6evkoIYtCqD61OocvHWZS00ns7r6bpuWaymBpMiWn5R4EvAo8q5Taabs8D4wEGiqlooGGtutorfcB84H9wAqgp9baoXMnhg+HW7dMd4BwDjVqmP73+5+shEiOy7cu029VP3wn+LLs4DI+rP0hMWExhAaG4uUhay5TIslXS2u9kcT70QHqP+Q5nwCfpCGuFClfHt54AyZNgjffBB/XK/CWIQ0fDkuXmhk0X35pdTTCmd2Nu8vErRMZumEoV25foaN/R4bVG0bRnP+aiyGSyWVWqA4eDJkyme3fhHPw8YFu3eCrr8yG2kI8SGvNgn0LqDChAn1X9iWwSCA7QncwPXi6JPY0cpnkXqgQ9OsHCxbAr79aHY2478MPIWtWs2uTEAltPrGZoOlBtFnYhizeWVjRfgWrXl2FXyE/q0NzCS6T3AHefhsKFjRJXuqbOIeCBU1J4KVLYeNGq6MRziDmjxhazW9F0PQgjl05xtTmU9kZupNGZaVSiT25VHLPkQM++cQkkfnzrY5G3Ne3LxQpYr7Gx1sdjbDKpZuX6LOiDxUmVGBFzAqG1B1CdFg0nat2xtNDKpTYm0sldzDVCf39oX9/uHnT6mgEmG6Z//s/iIqCmTOTfrxwLbfv3ebTTZ9SZlwZwreE87r/60SHRTOoziCyPZbN6vBclssld09P+OILOHECRo+2OhpxX/v2Zk3CwIHw56PWNwuXEa/jidgTge94X95Z/Q5BJYLY3W03k5tPpnCOwlaH5/JcLrkD1K4NrVvDyJEmyQvrKWXedM+dg48/tjoa4Wgbjm2g+tTqtFvcjjxZ8rD61dUsb7ecigUrWh2a23DJ5A5mxarWZjBPOIf//Md0m40dC4cPWx2NcIRDFw/RYl4L6s6sy9nrZ5nZYibbum6j/hOJLokRDuSyyb1UKdPvHhEBmzZZHY24b/hwsy3f229bHYmwp/M3ztNzeU8qTqzI2qNrGf7scA73Osxrfq/hoVw2zTg1l37V330XihaF3r1l8whnUaiQmfv+/fewYoXV0Yi0uhV7ixH/G0HZcWWZvG0yoQGhxLwZw8BnBpLFO4vV4bk1l07u2bKZ7plt28wqSXfnLHP/e/c2q1f79IE7d6yORqRGvI5n1q5ZlBtfjvfWvsezpZ9lb4+9TGg6gYLZCiZ9AOFwLp3cAUJCoF49M0vj3Dmro3EOVhfVe+wxM7h66JDMaMqI1vy2hsApgXRY2oFC2QuxvsN6lrZdim9+X6tDEwm4fHJXCiZONJt59O9vdTTiviZNTNXIjz+G336zOhqRHPvO76Pp3KY0+LoBf9z6g7kvzuXXLr9Sp1Qdq0MTiXD55A5m0+b+/eHrr2HDBqujEfeNHQteXtCzp/N0GYl/O3v9LKHfhVJlUhU2Hd/EqAajONjrICGVQ2Sw1Im5zW/m/ffNDJru3eHuXaujEWAGu4cNMwOrixZZHY140I27Nxi6YShlx5Vl+s7phFUL48ibR+gf1J/MXpmtDk8kwW2Se9asEB4OBw7IlnzOpFcvUy6id2+4ds3qaARAXHwc07ZPwyfch8HrB9O4bGP299jP2MZjyZc1n9XhiWRym+QO0KwZtGgBQ4fCsWNWRyPAdMtMmgRnzsCgQVZHI1bGrOSpyU/R5bsulMxdkk2dNrGwzUJ88skOOBmNWyV3MLM0PDxM94z08zqH6tUhNBTGjYPt262Oxj3tPrebRrMb0XhOY27E3mB+q/ls7rSZp4s/bXVoIpXcLrmXKGFWSa5YAbNnWx2NuG/4cFP7vXNniI21Ohr3cerPU3Ra1gn/Sf5sPbWVzxt9zv4e+2ldsbVsRJ3BuV1yBzM74+mnzSIamfvuHPLkMVNWd+40C8+EY127c41B6wbhE+7DnD1zeKvmWxx58wh9avQhk1cmq8MTduCWyd3TE6ZOhevXISzM6mjEfS1bmmqeQ4fC/v1WR+Oa7sXfY3LUZHzCfRgWOYxg32AO9jzI6OdGkydLHqvDE3bklskd4MknzabaCxbAkiVWRyPuCw+H7NlN94zUA7IfrTXLDy+nypdV6La8Gz75fPil8y9EvBRB6TylrQ5POIDbJncwC5v8/aFHD7h82epoBMDjj5uB1V9+MYlepN32M9upP6s+zSKacS/+HkteXkJkx0iqF6tudWjCgdw6uXt7w/TpcOGClKB1Ju3aQdOm8N57cOSI1dFkXMevHue1Ja8RMCWAPef3EN4knH099tHCt4UMlroBt07uAE89ZUoD//e/pgytsJ5SZu67t7fpnpFNtVPm6u2rDFw9kHLh5Zi/bz4DggYQExZDr2q98Pb0tjo8kU7cPrmDWTxTpQp06WJa8a4qI83rL1YMPv/c1AIaO9bqaDKG2LhYxm8ZT9nwsozcNJI2FdtwOOwwIxqMIFfmXFaHJ9JZksldKTVdKXVeKbU3wW0fKaVOKaV22i7PJ7hvoFIqRil1SCnVyFGB21OmTKao2OXL0K1bxkqCqZFRPpG//jq88IIp17x3b9KPd1daa5YeXEqlLysR9mMYlQtWJuqNKGa1nEWJXCWsDk9YJDkt9xlA40Ru/1xr7W+7/ACglKoAtAUq2p4zUSnlaa9gHalKFVPEavFik+iF9ZQym6zkygWvvCIbeyRmy6kt1J5Rm5bftMRTefJ9yPeseW0NAUUCrA5NWCzJ5K61jgT+SObxgoF5Wus7WuujQAxQLQ3xpau334ZnnjFz348ftzoaAWbV6tSpsGsXfPSR1dE4j6OXjxKyKITqU6tz+NJhJjWdxO7uu2larqkMlgogbX3uvZRSu23dNvdXPxQFTiR4zEnbbRmCpyfMmGEG8Dp2lIE8Z/HCC2Y8ZNQo2LjR6misdfnWZfqt6ofvBF+WHVzGh7U/JCYshtDAULw8vKwOTziR1Cb3L4EygD9wBvjMdntiTYZEe7CVUl2VUlFKqagLTjSK+cQTZiBv3TrzVTiHMWNMPf7XXnPP0sB34+4y9pexlBlXhjE/j6F95fZEh0UztN5QcmTKYXV4wgmlKrlrrc9preO01vHAV/zd9XISKJ7gocWA0w85xhStdaDWOrBAgQKpCcNhOnc2pYEHDoStW62ORgDkyAGzZsHvv7tXRU+tNQv2LaDChAr0XdmXwCKB7AjdwfTg6RTNmWE+FAsLpCq5K6UKJ7jaErg/l+FboK1SKpNSqjTgA2xJW4jpTymYNg0KFYK2beHPP62OSAAEBZl+9zlzYOZMq6NxvM0nNhM0PYg2C9uQxTsLK9qvYNWrq/Ar5Gd1aCIDSM5UyAjgZ6C8UuqkUqozMEoptUcptRuoB/QF0FrvA+YD+4EVQE+tdYasEJI3L0REmJaiO0yPzCjeew+efdZU9jxwwOpoHCPmjxhazW9F0PQgjl05xtTmU9kZupNGZTPEzGLhJJIcgdFahyRy87RHPP4T4JO0BOUsgoJgyBD44ANo2NDMuxbW8vQ0dfj9/ODll+HXXyFLFqujso9LNy8xLHIYE7dO5DHPxxhSdwhv13ybbI9lszo0kQHJCtUkDBhgWoq9erluSzGjKVzY9L/v2QNvvWV1NGl3+95tPt30KWXGlSF8Sziv+79OdFg0g+oMksQuUk2SexI8Pc2ipmzZTEvx5k2rIxIAjRubqp6TJpmyzRlRvI4nYk8EvuN9eWf1OwSVCGJ3t91Mbj6ZwjkKJ30AIR5BknsyFCliEvzevWavT+l/dw6ffGL2X+3SBQ4fdsw5TpyAe/fsf9zI3yOpMbUG7Ra3I0+WPKx+dTXL2y2nYsGK9j+ZcEuS3JOpUSPT/z57Nnz5pdXRCDBVI+fPh8ceM7s4Xb9u3+PHx5s9d8uUsd+CtkMXD9FiXgvqzKjDmetnmNliJtu6bqP+E/XtcwIhbCS5p8D775s64336mM0khPVKlIB58+DgQbM+wZ6fqu4f6/hxGDEibcc6f+M8PZf3pOLEiqw9upbhzw7ncK/DvOb3Gh5K/g2F/cl65RTw8DDdM4GB0KoVbN9uap9kFK7anVS/Pgwfbga/q1d3zCDrhx9C1arQpEnKnncr9hZjfxnLiI0juBl7k9CAUAbXHUzBbBnoDyclLl2CmBiro8hY8uYFHx/7H1drbfklICBAZyQ7dmidObPW9eppHRtrdTTJFxOjNWg9a5bVkdhffLzWL76otaen1uvW2eeYsbHm9RowQGs/P61z59Y6Ojp5z42Lj9Mzd87UxcYU03yEDo4I1gcuHLBPYM6sZk3zoskl+ZeXX071yw1E6YfkVWm5p4K/v5ml0bGjaS2OHm11REIps5tW9epmVtO2bWbDD3vIls1soh4YaPr2f/7ZbOL9MGt+W0P/n/qz4+wOAosEMrvlbOqUqmOfYJzdlStQq5ZZbSaSp7BjZkZJck+lDh0gKgo++wwqVTKJXlgrZ05Tj79aNVMbKDISsmZN/fESdmOVLm1WLDdpYvr2583796Yn+87v453V7/BD9A+UzFWSuS/O5eVKL7tXn7rWZnpZSvuvhN250V+d/X3+OTRoAF27wqZNVkcjAJ58EubONeMhHTrYt2zzc8+Zvv35883X+85eP0vod6FUmVSFTcc3MarBKA72OkhI5RD3SuxgXnCpJ+8UpOWeBl5e5h+9enXzcX3LFlOWVlireXNT+71/fzN9dciQtB0vYa565x2z3uGDD6B4mRscK/wZozaN4k7cHcKqhfFh7Q/JlzVf2k6YkWktyd1JSHJPozx54LvvoEYNs6nE5s2P7o8V6ePtt2H/fhg61LTm27ZN+TESm12kFEyeEscvd2bQIepDyHGGl558iRH1R+CTzwEzHjIaSe5Ow80+MzpG+fKmBb9/v9nrU3Zwsp5SZrHZM8+Ygm9b7FR4emXMSmrMeIqYil3IdKskeRZvYkyNhZLY75Pk7jQkudtJw4YwdiwsW2ZajcJ6mTLBokVmMkJwsCnfnBpKwe5zu2k0uxGN5zTmRuwN5reaz7Yem4k79jTNm7vn7lCJ0tosCBGWk9+CHfXqBX37miQvW/Q5hwIF4Pvv4fZtM4Hjj+Ru9Y6tWybHKRbd64T/JH+2ntrKmOfGsL/HflpXbE3FiooFC2DfPtPt44gaNBmODKg6DUnudjZ6NLRubVZJzp9vdTQCoEIFWLoUjhwx4yK3biX9nGt3rjEkchC86cMuPYe3ar7FkTeP0LdmXzJ5Zfrrcc89BxMmwA8/SFE5QLplnIgkdzvz8DC1xmvVgldfNXOthfXq1DGlIzZvNuMicQ/ZH+xe/D0mR03GJ9yHEZuHwcFg+nofZPRzo8mTJU+izwkNNeUJpk83X92aJHenIcndATJnNn3vZcqYvt59+6yOSAC0aWO6yxYvht69/9nK1lqz/PByqnxZhW7Lu+GTz4cNr/4CiyLIq0oneewhQ+CNN0wZ4vHjHfhDODvpc3caMhXSQfLmhR9/NFMkGzc2i5xKlLA6KtG7t6nR/tlnpjzBgAGw/cx2+q3qx7pj6/DJ68OSl5cQXD6YO3dMCzQ5DVGlYOJEOHcO3nzTbK7eqpWDfxhnJC13pyHJ3YFKloQVK6BuXVO58H//M//0wlqjRsHp0zBw5HGWqA/Ycvtr8mfNT3iTcEIDQvH29AZS3n/u5WVKFDRsCO3bQ758UK+eA34AZyYDqk5DPj85mJ+fGWw7c8YMvqVktoa9uf1gn821u1cp1nEgHr3LseX6fJrlHkBMWAy9qvX6K7GnVtasZlFb2bJmpezPP9sp6IxCWu5OQ5J7OqhZ08zWOHQInn/e+jnR7vq/FxsXy/gt4ykbXpZPfx5J28pteHrbYX54awRrfsj1r8fffzNM6euVNy+sXm3m1zdpYurcuA1J7k5Dkns6adDATI2MijKDrLdvWx2R+9Bas/TgUip9WYmwH8OoVLASUW9EMafVLFbOL0H16mae+sqV9jtn4cKwZg3kymU+se3da79jOzUZUHUa8ltIR8HBMGMGrF8PL70kCT49bDm1hToz6tDym5Z4KA++C/mOta+tJaBIAGDqAP3wA1SsaIq/bdhgv3OXKAFr15o9Xhs0cNwm3k5F+tydhiT3dPbKKzB5skkoL74oCd5Rjl4+SsiiEKpPrc6hS4eY1HQSe7rvoVm5ZqgHkk/u3LBqlano2bTp3wk+td0yCZUpY1rw8fFmUP2331J/rAxBumWchiR3C7zxBkyZYqZKtmwpCd6eLt+6TL9V/fCd4Muyg8v44JkPiAmLITQwFC+Ph08OK1DAtLJLljTjIuvW2S+mJ5+En36CmzfNYqroaPsd2+lIcncaktwt8sYbMHWq6ecNDk7eknjxcHfj7jL2l7GUGVeGMT+PoX3l9kSHRTPs2WHkyJQjWccoVMgk9SeeMC34NWvsF5+fn3nzuH3bJPgDB+x3bKciyd1pJJnclVLTlVLnlVJ7E9yWVyn1k1Iq2vY1T4L7BiqlYpRSh5RSjRwVuCvo3Nkk+J9+kgSfWlprFuxbQIUJFei7si+BRQLZEbqD6cHTKZqzaIqPV7CgScI+Pn8vQrJXrvLzM+Mt8fFm7YNLDrLKgKrTSM5vYQbQ+IHbBgBrtNY+wBrbdZRSFYC2QEXbcyYqpTztFq0L6tTJ1CRZvdp0B/z5p9URZRybT2wmaHoQbRa2IYt3Fla0X8GqV1fhV8gvTcctUMC02itWtFOgCVSsaPr0vbxMgt+50/7nsJQMqDqNJJO71joSeHDpTTAw0/b9TKBFgtvnaa3vaK2PAjFANfuE6ro6doTZs2HjRjPodvGi1RE5t5g/Ymg1vxVB04M4duUYU5tPZWfoThqVtd8Hxfz5TYJ/5RWThO2pfHmT4LNmhWefhV9+se/xLSXdMk4jteUHHtdanwHQWp9RShW03V4USPinetJ2278opboCXQFKSNEV2rUzc6JbtTK7B61aBcWLWx2Vc7l08xLDIocxcetEHvN8jCF1h/B2zbfJ9lg2h5wvb174OvAL+GKr3Y9dFthf1byBHKsFJWpDkSJ2P036u3lTkruTsHdtmcR+q4kuetdaTwGmAAQGBsrCeMwg3sqVZtl6rVqmL75cOaujst7te7cZv2U8H0d+zLW71+jyVBc+qvsRhXMUdvzJP/rIdDUUKGD3Q2cHmuY3dW5uroNrj0OOjL7/bunS5o9XWC61yf2cUqqwrdVeGDhvu/0kkLC9WQw4nZYA3U3t2mbGRuPG5n9kxQqoWtXqqKwRr+P5Zu83DFwzkN+v/s7zPs8zqsEoKhZ0QGf4w8TFQZcuMGaMQw7vBeS6Ci1amMHWL94zVSWFSKvUDmt/C3Swfd8BWJbg9rZKqUxKqdKAD2CnrYndR9WqpoJkliwm2f/wg9URpb/I3yOpMbUG7Ra3I0+WPKx+dTXL2y1P38QOptXu4NkfuXL9veahd294/30p8ibSLjlTISOAn4HySqmTSqnOwEigoVIqGmhou47Weh8wH9gPrAB6aq0fsueNeJTy5c1AW/nypptm0qS0HzMjJIxDFw/RYl4L6syow5nrZ5jZYibbum6j/hP1rQkoLi5dpvZlzgwLFpj1D8OHw2uvwZ07Dj+tcGFJdstorUMeclei/21a60+AT9ISlDAKFzazKtq2he7d4ehRGDEi7bnGGce7zt84z5D1Q5i8bTJZvbMy/Nnh9KnRhyzeWawNLD4ePNNnNq+npylNUbIkfPABHDsGS5aYmTtCpJSsNnBy2bObcsHdu5tNJkJCXKtcwa3YW4z43wjKjivL5G2TCQ0IJebNGAY+M9D6xA7p0i2TkFKmW2bePNi61ezkdehQup0+zUaMMHvVCuvJTkwZgJcXTJhgJiK8887fLbqMPHUuXscze/ds3l/7Pif/PElw+WBGNhiJb35fq0P7p3TqlnnQyy+bqpLBwSbBL16cMXZ1eu8983XrVjMG7SUZxjLScs8glIL+/c0/+b59EBiYcRe/rPltDYFTAumwtAOFshdifYf1LG271PkSu9aWLqevWRN+/dV0zz33nBl3cfZxk7x5zdfwcDPjy8qdx9ydJPcMpmVLs3Vb5symANWMGVZHlHz7zu+j6dymNPi6AX/c+oO5L87l1y6/UqdUHatDS9z9TJpOfe6JKV0aNm82+7J2724GXJ25W87LC7p1g//+18z4qlbNNEZE+pPkngFVrmw+9j7zDLz+OvTpA/fuWR3Vw529fpbQ70KpMqkKm45vYlSDURzsdZCQyiF4KCf+E4yzTfSyuBBW7txmX9b334dp08yb+smTlob0UPerD3TsaObt37hhupWWLUvqmcLenPg/SzxKvnxmgVOfPvDFF6Zld+aM1VH90427Nxi6YShlx5Vl+s7phFUL48ibR+gf1J/MXpmtDi9p8fHmqxNUOfT0hI8/Nt1y+/dDQABERlod1aPVrGkaIb6+ZpHWgAHO3QhxNdb/1YpU8/KCzz+HWbNM3+xTTyVnkwn9d1+ygy5xcfeYvn0aPuE+DF4/mMZlG7O/+z7GNvqcfFnyOvz8drvcb7lb2C3zoJYtze86d25TZO6zz5y7H75YMdM9ExoK//d/JmZna4S4LK215ZeAgAAt0mbPHq19fbX28NB62DCt4+L+/ZjDB+7pGJ5waEpcUQZduTuaj9A1OqM3Frc8Raf9Mnp0+v9Ck3DlitYtWpjwmjXT+uJFqyMy8ufXukePxO/7+muts2bV+vHHtV67Nn3jclVAlH5IXpWJSi6iUiXzETg0FD780JQPnj37nwtgVOxdyvAbZyrWp3DrZ+x6/t2cpT8/sYojPEEe5tOAVsUroDo74YqplPDygvbtrY7iX3LlMl0048dDv37g7w8REc5ds+uVV8yny1atzIbhQ4bAwIFO9cHItTws66fnRVru9hMfr/WkSVpnyqR1kSJa//TT3/dF77qhNejtL4+02/lOXj2pX1/6ulYfKZ1nZB49ZvMYfTv2tt2OL5IWFaV1mTJae3pqPXx44p/a0sujWu73Xbumdbt25lNHnTpaHz+eLqG5JB7Rcpc+dxejlGm9//wz5MxpBlrfesv+0+eu3bnGoHWD8An3Yc6eObxV8y2OvHmEvjX7kskrk31PJh4pIAC2bzct4vfeM7/zEyesiUXrpMtbZM9uPlXOmAHbtkGVKvDNN+kSnluR5O6innrK/OP07GkGXatVg317bSNvaSgucy/+HpOjJuMT7sOwyGEE+wZzsOdBRj83mjxZ8iR9AOEQOXOabpmvvjIDrpUrmwSqnXSwVSno0MFsM1i+vKmf1KGDbDNpT5LcXVjWrKZPdvlyOH8e2tm6jlPzD6+1Zvnh5VT5sgrdlnfDJ58Pv3T+hYiXIiidp7R9AxepopQpPb9rlxmDefVVaNPGubdtLFPGzKYZNMi8GT31lLku0k6Suxt4/nnYvRuermGyuvdjKWu5bz+znfqz6tMsohn34u+x5OUlRHaMpHqx6o4IV6RRmTKmmuiIEWbxUOXK5g0+PSSnW+ZB3t5mcDUy0jy/Th2zYcmNG46J0V1IcncTBQuafVkBKiRzv4vjV4/z2pLXCJgSwJ7zewhvEs6+Hvto4dsC5Yx1g8VfPD3NoqEtW8yMqWbNTI14Z27FBwWZRkivXqY2TZUqZpWrSB1J7m5E2baz9fR8dGK+evsqA1cPpFx4Oebvm8+AoAHEhMXQq1ovvD290yNUYSf+/hAVZabHRkTAk0/C3LnO2xefPTuMG2c+eShlKmH26AHXrlkdWcYjyV38JTYulglbJlA2vCwjN42kdcXWHOp1iBENRpArcy6rwxOplCkTDB1qZtQ88YSZtt+sGRw/bv9zpaZbJjG1a5tWfN++phpmxYpmXwNnfVNyRpLc3YlOfLaM1pqlB5dS6ctK9PqxF5UKViLqjSi+bvk1JXOXtCBQ4QiVK5sKk59/bro7KlaEsWOdt95L1qymJvymTabcQsuW8MILZj8DkTRJ7m5uy6kt1JlRh5bftMRDefBdyHesfW0tAUUCrA5NOICnpyk2t3ev6ePu29fMUNmwwerIHq5mTTOtd/RoUzupQgUzWHz3rtWROTdJ7u4kQcv96OWjhCwKofrU6hy6dIhJTSexp/sempVrJoOlbqB0afjxR1PC4No1qFsX2rWD06fTdlx7dcs8yNsb3n4bDhyAJk3MYi1/f1i92v7nchWS3N3M5czQ7853+E7wZdnBZXzwzAfEhMUQGhiKl4eUGnInSpmujv37zTzzxYvNgqJPP4U7d6yOLnHFi8OiRWZq5507ZjVu8+YZa5/Z9KK0E4xQBAYG6qioKKvDcGl34+4yMfIzhq58jytZFB39OzKs3jCK5izq0PPGxsZy8uRJbjvz9kEuLHPmzBQrVgxv76RnOR05YrppvvvOtOxHjDCLoFLSEs+Tx6w0HTs29TEn1507ZmbNsGFw65ZZjT1o0N9b/bkDpdQ2rXVgonc+rOhMel6kcJjjxMfH6/l75+syX5TRfIRu+Cp65+h+6Xb+3377TV+4cEHHx8en2zmFER8fry9cuKB/++23FD1v5Uqtq1Qxhb2qVdM6MjL5z82VS+vevVN0ujQ7d07r0FBT7jpvXq2/+ELrO3fSNwarIIXD3NPmE5sJmh5Em4VtyOKdhRXBC1j1Nfh5Ora1ntDt27fJly+f9ONbQClFvnz5Uvyp6bnnzLTJ//7XbOdXu7bZSengQcfEmVYFC5rpkjt3msHh3r3N7k9ff/33fivuSJK7C4r5I4bWC1oTND2IY1eOMbX5VHaG7qRRiWfNA9I50Upit05qX3tPT7MPanS02d5v7VpTr+b11+G335I6Z6pOmWaVK8NPP5mB4ty5zYpcPz/3nR8vyd2FXLp5iT4r+lBhQgV+jP6RIXWHEB0WTeeqnfH0kB0RRMplzWo25o6JgbAws8q1fHno2hV+//3fj7c6iSoFjRubVbnz55s5/C1bQvXqZmaN1fGlpzQld6XUMaXUHqXUTqVUlO22vEqpn5RS0bavUgfWwW7fu83ozaMpM64M4VvC6ejfkeiwaAbVGUS2x7L9/cCHLGISxqBBg1gtc+sSVbCgWfz022/QrRvMnAk+PqY0wMmTVkf3bx4e0Lq1mc8/bRqcPWtm1gQFwQ8/uEeSt0fLvZ7W2l//PWI7AFijtfYB1tiuCweI1/FE7InAd7wv/X/qT1CJIHZ3282U5lMonKOw1eFlKHFxcQwdOpQGDRpYHYpTK1LEFPWKjoZOnUz9+DJlTMK/313jTG0HLy8TZ3Q0TJgAp05B06Zmg5PFiyE+3uoIHccRE5uDgbq272cC64F3HXAetxb5eyT9VvVj6+mt+BfyZ9oL06j/RP1HP8nilnufPmbQy578/ZOednfs2DEaN25M9erV2bFjB+XKlWPWrFlUqFCBTp06sWrVKnr16sWKFSto1qwZrVq1YuvWrfTu3ZsbN26QKVMm1qxZQ9asWRkwYADr16/nzp079OzZk9DQUPv+QBlEiRJmEPPdd+H//s8Mvk6d6rzJMlMm8ymjSxeYMweGD4eXXjKrXd97z0z5TMZs0QwlrS13DaxSSm1TSnW13fa41voMgO1rwcSeqJTqqpSKUkpFXbhwIY1huI9DFw/RYl4L6syow5nrZ5jZYibbum5LOrG7uUOHDtG1a1d2795Nzpw5mThxImDmgW/cuJG2bdv+9di7d+/y8ssv88UXX7Br1y5Wr15NlixZmDZtGrly5WLr1q1s3bqVr776iqNHj1r1IzmF0qVNkj961Lx5Z80KJZ24HNFjj5lB4QMHTHVMpczG3WXKmPIGV69aHaEdPWyOZHIuQBHb14LALqA2cOWBx1xO6jgyzz1p566f0z2+76E9h3jqHMNz6OGRw/XNuzdTdpDz583k5fBwxwSZiP3796fbuR7m6NGjunjx4n9dX7NmjQ4ODtYlS5bUx44d++v2Dh066AULFujdu3frp59++l/Heemll7SPj4/28/PTfn5+ulSpUnrlypXp8jOkRXr+DjLacoa4OK2XLdO6bl3zr5E9u9Z9+midwqUBluER89zT1C2jtT5t+3peKbUEqAacU0oV1lqfUUoVBs6n5Rzu7lbsLcb+MpYRG0dwM/YmoQGhDK47mILZEv1AJB7iwSmB969ny5btX4/VWic6hVBrTXh4OI0aNXJMkC7Amfrbk8PDw1SafOEFM7f/88/N1pTjxplZNm++Cc88k/F+LkhDt4xSKptSKsf974HngL3At0AH28M6AMvSGqQ7itfxzNo1i3Ljy/He2vd4tvSz7O2xlwlNJ6Q+sbvxbJnjx4/z888/AxAREUGtWrUe+lhfX19Onz7N1q1bAbh27Rr37t2jUaNGfPnll8TGxgJw+PBhbshecC6jalWz8OnYMXjnHTO3v04dM78/PDzjddmkpc/9cWCjUmoXsAVYrrVeAYwEGiqlooGGtusiBdYeXUvglEA6LO1AoeyFWN9hPUvbLsU3v6/VoWVYTz75JDNnzqRKlSr88ccfdO/e/aGPfeyxx/jmm28ICwvDz8+Phg0bcvv2bbp06UKFChWoWrUqlSpVIjQ0lHvOWgxdpFrRoqauzsmTMH06ZMtmWvBFipgB2W3brI4wmR7WX5OeF+lzN/ad36ebzmmq+Qhd8vOSeu7uuTouPs5+Jzh71nQsTphgv2MmwVn63CtWrGh1GJZxht9BRhcVpXWXLlpnzWr+hQICzL/RpUvWxoXUlnFuZ6+fJfS7UCp/WZmNxzcyqsEoDvY6SEjlEDyU/IqEsFpAgJnTf/q06aK5e9dUoSxc2CyW+v57sPXWOQ3JHBa6cfcGQzcMpey4skzfOZ1e/+lFzJsx9A/qT2avzPY/oZv2uZcqVYq9e/daHYZwAblyQa9esGuXGYDt3t1sWdi8ORQrBm+9Ze5zhhWwktwtEBcfx/Qd0/EJ92Hw+sE0LtuY/T3280WTL8ifNb/V4QkhkqCUqUA5dqxpzS9bZkobjB9vFtZVqAAffWQ2QrGKJPd0tjJmJU9NforO33amZO6SbHx9IwvbLMQnn4/jT+6mLXchHMnb20ylXLzYJPovv4RChWDoULMJeeXKprJmdHT6xiXJPZ3sPrebRrMb0XhOY27E3mB+q/ls7rSZoBJBVocmhLCT/PlNnZ1160wdm3HjTFfOhx9CuXKmtT9sGOzZ4/iuG0nuDnbqz1N0WtYJ/0n+bD21lTHPjWF/j/20rtg6/eucS8tdiHRTuLApk7xxI5w4AWPGQJYsMHgwVKkCZcuaTb9/+cUx55fk7iDX7lxj0LpB+IT7MGfPHN6q+RZH3jxC35p9yeSVydrg3Ci5X7ly5a86Mo9y7Ngx5s6dm6zHVapU6V+3r1+/nmbNmqUqxuR61DnGjh3LzZs3HXp+kXrFipn9aTdvNl03kyebuvj3V8M6giR3O7sXf4/JUZPxCfdhWOQwgn2DOdjzIKOfG02eLBaXtneGIfx0Zu/k7qwkuWcchQqZzU5++AEuXDBVNR3BESV/3ZLWmh+if6D/T/05cPEAtUrUYlnbZVQvVt3q0P7Nqpa7BTV/BwwYwJEjR/D396dhw4aMGjWKd955hx9//BGlFB988AEvv/wyAwYM4MCBA/j7+9OhQwdatmzJq6+++ld5gfHjx/P0008/MpQ///yTli1bcujQIWrXrs3EiRPx8PAgIiKC4cOHo7WmadOm/J/tvzl79uxcv34dgIULF/L9998zY8YMjhw5Qvv27YmLi6NJkyaMGTPmr8ddv36dVq1asXfvXgICApg9ezbh4eGcPn2aevXqkT9/ftatW5f211Wki5w5zcURJLnbwfYz2+m3qh/rjq3DJ68PS15eQnD5YOfbO9QNW+4jR45k79697LS9qSxatIidO3eya9cuLl68yH/+8x9q167NyJEjGT16NN9//z0AN2/e5KeffiJz5sxER0cTEhJCVFTUI8+1ZcsW9u/fT8mSJWncuDGLFy/m6aef5t1332Xbtm3kyZOH5557jqVLl9KiRYuHHqd379707t2bkJAQJk2a9I/7duzYwb59+yhSpAhBQUFs2rSJN998kzFjxrBu3Try55eptMKQ5J4Gx68e54O1H/D17q/JlyUf4U3CCQ0IxdvTSav+Wz2gmtSuGulg48aNhISE4OnpyeOPP06dOnXYunUrOR9oPsXGxtKrVy927tyJp6cnhw8fTvLY1apV44knngAgJCSEjRs34u3tTd26dSlQoAAA7du3JzIy8pHJ/eeff2bp0qUAtGvXjn79+v3jHMWKFQPA39+fY8eOPbIImnBfktxT4ertq4zcOJLPf/kcgAFBAxhQawC5MueyODKRFJ3MTy+ff/45jz/+OLt27SI+Pp7MmZNeMZxYWeFHnS/h42/fvp2suDJl+nsw3tPTUwqXiYeSAdUUiI2LZcKWCZQNL8vITSNpXbE1h3odYkSDERkjsVvdcrdAjhw5uHbt2l/Xa9euzTfffENcXBwXLlwgMjKSatWq/etxV69epXDhwnh4ePD1118TFxeX5Lm2bNnC0aNHiY+P55tvvqFWrVpUr16dDRs2cPHiReLi4oiIiKBOnToAPP744xw4cID4+HiWLFny13Fq1KjBokWLAJg3b16qfk4hpOWeDFprlh1axrur3+XwpcPULVWX0Q1HE1AkwOrQRBLy5ctHUFAQlSpVokmTJowaNYqff/4ZPz8/lFKMGjWKQoUKkS9fPry8vPDz86Njx4706NGDl156iQULFlCvXr1EN/V4UM2aNRkwYAB79uyhdu3atGzZEg8PD0aMGEG9evXQWvP8888THBwMmPGAZs2aUbx4cSpVqvTXoOnYsWN55ZVX+Oyzz2jatCm5ciXdcOjatStNmjShcOHCMqAqAFDJ/ZjqSIGBgTqpwSqrbDm1hX6r+vG/4//DN78vnzb8lKY+TZ1vsDQ5fv8dSpWCadPMlvDp4MCBAzz55JPpci5XcfPmTbJkyYJSinnz5hEREcGyZanf80Z+B65LKbVNax2Y2H3Scn+Io5eP8t7a95i3dx4FsxVkUtNJdK7aGS8PecmEY23bto1evXqhtSZ37txMnz7d6pBEBiSZ6gGXb13mk/99QviWcDyVJx888wHvBL1Djkw5rA4t7dywzz0jeuaZZ9i1a5fVYYgMTpK7zd24u0zcOpGhG4Zy5fYVOvp3ZFi9YRTNWdTq0IQQIsXcPrlrrVl0YBEDVg/gyOUjNHiiAaMbjsavkJ/VodmftNyFcBtundw3n9hMv1X9+Pnkz1QqWIkf2/9IozKNMuZgqRBCJOCWyT3mjxgGrhnIwv0LKZy9MFObT6Wjf0c8PTytDs2xpOUuhNtwq0VMl25eos+KPlSYUIEfo39kSN0hRIdF07lqZ9dP7G4quVUh7WHp0qXst8O+ao8q7VuqVCkuXryY5nMI1+cWyf32vduM3jyaMuPKEL4lnI7+HYkOi2ZQnUFkeyzpxSkuww1b7qlJ7lpr4uPjU3wueyV3IezBpbtl4nU83+z9hoFrBvL71d953ud5RjUYRcWCFa0OzS31WdGHnWd32vWY/oX8Gdt47EPvf7Dk7+DBgwkODuby5cvExsby8ccfExwczLFjx2jSpAn16tX7q3DXrFmzmDNnDsWLFyd//vwEBATQr18/jhw5Qs+ePblw4QJZs2blq6++4o8//uDbb79lw4YNfPzxxyxatIgyZcr8FceCBQsYMmQInp6e5MqVi8jISG7fvk337t2JiorCy8uLMWPGUK9evX/Ef+nSJUJCQrhw4QLVqlVLdm0cIVw2uUf+Hkm/Vf3Yenor/oX8mfbCNOo/Ud/qsKzlhi33B0v+3rt3jyVLlpAzZ04uXrxIjRo1eOGFFwA4dOgQ//3vf5k4cSJRUVEsWrSIHTt2cO/ePapWrUpAgCk30bVrVyZNmoSPjw+//vorPXr0YO3atbzwwgs0a9aMVq1a/SuOoUOHsnLlSooWLcqVK1cAmDBhAgB79uzh4MGDPPfcc/+qPjlkyBBq1arFoEGDWL58OVOmTHHQKyVcjcsl90MXD/Hu6ndZdmgZxXIWY2aLmbxS5RU8lFv0QDm1R7Ww04vWmvfee4/IyEg8PDw4deoU586dA6BkyZLUqFEDMKWBg4ODyZIlCwDNmzcHzGYZmzdvpnXr1n8d886dO0meNygoiI4dO9KmTRtefPHFv84RFhYGgK+vLyVLlvxXco+MjGTx4sUANG3alDx5LN7NS2QYDkvuSqnGwBeAJzBVaz3SUecCOH/jPEPWD2Hytslk9c7K8GeH06dGH7J4Z3HkaTMWN2y5P2jOnDlcuHCBbdu24e3tTalSpf4qt5uwONjDuj/i4+PJnTv3X58EkmvSpEn8+uuvLF++HH9/f3bu3JnsLhaZmitSwyHNWaWUJzABaAJUAEKUUhUcca5bsbcY8b8RlB1XlsnbJhMaEErMmzEMfGagJHaRaCnfggUL4u3tzbp16/j9998TfV6tWrX47rvvuH37NtevX2f58uUA5MyZk9KlS7NgwQLAvAncLxXwqLK7R44coXr16gwdOpT8+fNz4sQJateuzZw5cwA4fPgwx48fp3z58v94XsLH/Pjjj1y+fDkNr4ZwJ45quVcDYrTWvwEopeYBwYBdpxJs3RDBS8tf40S2ewSfysHI3aXw/WY9sN6ep3Ed97sP3Kgl+GDJ33fffZfmzZsTGBiIv78/vr6+iT7vP//5Dy+88AJ+fn6ULFmSwMDAv0rvzpkzh+7du/Pxxx8TGxtL27Zt8fPzo23btrzxxhuMGzeOhQsX/mNAtX///kRHR6O1pn79+vj5+eHr60u3bt2oXLkyXl5ezJgx4x+bcQAMHjyYkJAQqlatSp06dShRooTjXizhUhxS8lcp1QporLXuYrv+KlBda90rwWO6Al0BSpQoEfCwFtSjXN63jZdnPM/755+kzs0C9gne1WXODCNGgG2rNkfLyOVmr1+/Tvbs2bl58ya1a9dmypQpVK1a1eqwUiwj/w7Eo1lR8jexpuE/3kW01lOAKWDquafmJHkqBrDq03OpeaoQSeratSv79+/n9u3bdOjQIUMmduG+HJXcTwLFE1wvBpx20LmEcIi5c+daHYIQqeao+YFbAR+lVGml1GNAW+BbB51LODlZeGMdee3dl0OSu9b6HtALWAkcAOZrrfc54lzCuWXOnJlLly5JkrGA1ppLly6ROXNmq0MRFnDYPHet9Q/AD446vsgYihUrxsmTJ7lw4YLVobilzJkzUyydBs+Fc3G5FarCuXh7e1O6dGmrwxDC7ciafCGEcEGS3IUQwgVJchdCCBfkkBWqKQ5CqQtAypeo/i0/4Izb00hcKSNxpYzElTKuGFdJrXWiy/OdIrmnlVIq6mFLcK0kcaWMxJUyElfKuFtc0i0jhBAuSJK7EEK4IFdJ7s6695jElTISV8pIXCnjVnG5RJ+7EEKIf3KVlrsQQogEJLkLIYQLytDJXSnVWCl1SCkVo5QaYGEc05VS55VSexPcllcp9ZNSKtr2Nd23rVdKFVdKrVNKHVBK7VNK9XaG2JRSmZVSW5RSu2xxDXGGuBLE56mU2qGU+t5Z4lJKHVNK7VFK7VRKRTlRXLmVUguVUgdtf2c1rY5LKVXe9jrdv/yplOpjdVy22Pra/ub3KqUibP8LDokrwyb39NyEOxlmAI0fuG0AsEZr7QOssV1Pb/eAt7XWTwI1gJ6218jq2O4Az2qt/QB/oLFSqoYTxHVfb0yp6vucJa56Wmv/BHOinSGuL4AVWmtfwA/zulkal9b6kO118gcCgJvAEqvjUkoVBd4EArXWlQBPzF4XjolLa50hL0BNYGWC6wOBgRbGUwrYm+D6IaCw7fvCwCEneM2WAQ2dKTYgK7AdqO4McWF2DVsDPAt87yy/S+AYkP+B2yyNC8gJHMU2McNZ4noglueATc4QF1AUOAHkxVTk/d4Wn0PiyrAtd/5+oe47abvNWTyutT4DYPta0MpglFKlgKeAX3GC2GxdHzuB88BPWmuniAsYC7wDxCe4zRni0sAqpdQ22+byzhDXE8AF4L+2bqypSqlsThBXQm2BCNv3lsaltT4FjAaOA2eAq1rrVY6KKyMn9yQ34RaGUio7sAjoo7X+0+p4ALTWcdp8bC4GVFNKVbI4JJRSzYDzWuttVseSiCCtdVVMN2RPpVRtqwPCtD6rAl9qrZ8CbmBdl9W/2Lb4fAFYYHUsALa+9GCgNFAEyKaUesVR58vIyd3ZN+E+p5QqDGD7et6KIJRS3pjEPkdrvdiZYgPQWl8B1mPGLKyOKwh4QSl1DJgHPKuUmu0EcaG1Pm37eh7Tf1zNCeI6CZy0feoCWIhJ9lbHdV8TYLvW+pztutVxNQCOaq0vaK1jgcXA046KKyMnd2ffhPtboIPt+w6Y/u50pZRSwDTggNZ6jLPEppQqoJTKbfs+C+aP/qDVcWmtB2qti2mtS2H+ntZqrV+xOi6lVDalVI7732P6afdaHZfW+ixwQilV3nZTfWC/1XElEMLfXTJgfVzHgRpKqay2/836mAFox8Rl1UCHnQYongcOA0eA9y2MIwLThxaLac10BvJhBuaibV/zWhBXLUxX1W5gp+3yvNWxAVWAHba49gKDbLdb/poliLEufw+oWv16PQHssl323f9btzouWwz+QJTtd7kUyOMkcWUFLgG5EtzmDHENwTRk9gJfA5kcFZeUHxBCCBeUkbtlhBBCPIQkdyGEcEGS3IUQwgVJchdCCBckyV0IIVyQJHchhHBBktyFEMIF/T/n4KO1fGSQagAAAABJRU5ErkJggg==\n",
"text/plain": [
"<Figure size 432x288 with 1 Axes>"
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
}
],
"source": [
"times, prices, bought, target = simulate_vrgda(200, 80, lambda n: n*3, lambda n: n/3, 0.05, [(20, 80), (40, 18), (60, 35)], 0.01)\n",
"plt.plot(times, prices, 'b')\n",
"plt.plot(times, bought, 'r')\n",
"plt.plot(times, target, 'g')\n",
"plt.title('VRGDA $3n$')\n",
"plt.legend(['price', 'total bought', 'target sold'])"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "5ae39b3d",
"metadata": {},
"outputs": [],
"source": []
}
],
"metadata": {
"kernelspec": {
"display_name": "Python 3 (ipykernel)",
"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.12"
}
},
"nbformat": 4,
"nbformat_minor": 5
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment