diff --git a/.envrc b/.envrc
new file mode 100644
index 0000000..1d953f4
--- /dev/null
+++ b/.envrc
@@ -0,0 +1 @@
+use nix
diff --git a/analysis-notebook/.envrc b/analysis-notebook/.envrc
new file mode 100644
index 0000000..1d953f4
--- /dev/null
+++ b/analysis-notebook/.envrc
@@ -0,0 +1 @@
+use nix
diff --git a/analysis-notebook/Analysis.ipynb b/analysis-notebook/Analysis.ipynb
index 3c0e937..f952172 100644
--- a/analysis-notebook/Analysis.ipynb
+++ b/analysis-notebook/Analysis.ipynb
@@ -43,7 +43,12 @@
"metadata": {},
"outputs": [],
"source": [
+ "%config InlineBackend.figure_formats = ['svg']\n",
+ "\n",
"import pandas as pd\n",
+ "import matplotlib.pyplot as plt\n",
+ "\n",
+ "plt.style.use('dark_background')\n",
"\n",
"def toMb(b):\n",
" return b * (9.537e-7)"
@@ -132,7 +137,7 @@
"metadata": {},
"outputs": [],
"source": [
- "def analyse_benchmark_results(i):\n",
+ "def analyse_benchmark_results(i, file):\n",
" \"\"\"\n",
" Analyse a benchmark results.\n",
" \n",
@@ -178,14 +183,22 @@
" compressed_file_dl_size = _compressed_file_merged.loc[_compressed_file_merged[\"_merge\"]==\"left_only\"][\"Size_after\"].sum()\n",
" compressed_file_reused_size = _compressed_file_merged.loc[_compressed_file_merged[\"_merge\"]==\"both\"][\"Size_after\"].sum()\n",
" compressed_file_nar_savings = (nar_dl_size - compressed_file_dl_size) / nar_dl_size\n",
- " \n",
- " return pd.DataFrame( data = {\n",
- " \"Name\": [\"NAR\", \"Casync\", \"File\", \"Compressed File\"],\n",
- " \"Closure Size (MB)\": [toMb(nar_closure_size), toMb(casync_closure_size), toMb(file_closure_size), toMb(compressed_file_closure_size)],\n",
- " \"Downloaded Size (MB)\": [toMb(nar_dl_size), toMb(casync_dl_size), toMb(file_dl_size), toMb(compressed_file_dl_size)],\n",
- " \"Re-used Size (MB)\": [toMb(nar_reused_size), toMb(casync_reused_size), toMb(file_reused_size), toMb(compressed_file_reused_size)],\n",
- " \"DL Savings Compared to NAR (%)\": [nar_nar_savings * 100, casync_nar_savings * 100, file_nar_savings * 100, compressed_file_nar_savings * 100]\n",
- " })\n",
+ " if file:\n",
+ " return pd.DataFrame( data = {\n",
+ " \"Name\": [\"NAR\", \"Casync\", \"File\", \"Compressed File\"],\n",
+ " \"Closure Size (MB)\": [toMb(nar_closure_size), toMb(casync_closure_size), toMb(file_closure_size), toMb(compressed_file_closure_size)],\n",
+ " \"Downloaded Size (MB)\": [toMb(nar_dl_size), toMb(casync_dl_size), toMb(file_dl_size), toMb(compressed_file_dl_size)],\n",
+ " \"Re-used Size (MB)\": [toMb(nar_reused_size), toMb(casync_reused_size), toMb(file_reused_size), toMb(compressed_file_reused_size)],\n",
+ " \"DL Savings Compared to NAR (%)\": [nar_nar_savings * 100, casync_nar_savings * 100, file_nar_savings * 100, compressed_file_nar_savings * 100]\n",
+ " })\n",
+ " else:\n",
+ " return pd.DataFrame( data = {\n",
+ " \"Name\": [\"NAR\", \"Casync\", \"Compressed File\"],\n",
+ " \"Closure Size (MB)\": [toMb(nar_closure_size), toMb(casync_closure_size), toMb(compressed_file_closure_size)],\n",
+ " \"Downloaded Size (MB)\": [toMb(nar_dl_size), toMb(casync_dl_size), toMb(compressed_file_dl_size)],\n",
+ " \"Re-used Size (MB)\": [toMb(nar_reused_size), toMb(casync_reused_size), toMb(compressed_file_reused_size)],\n",
+ " \"DL Savings Compared to NAR (%)\": [nar_nar_savings * 100, casync_nar_savings * 100, compressed_file_nar_savings * 100]\n",
+ " })\n",
"\n",
"def gen_perf_pie(dataframe, key):\n",
" idx=mass_rebuild_results.query(f'Name == \"{key}\"').index[0]\n",
@@ -218,7 +231,7 @@
"metadata": {},
"outputs": [],
"source": [
- "mass_rebuild_results = analyse_benchmark_results(b[\"massRebuild\"])"
+ "mass_rebuild_results = analyse_benchmark_results(b[\"massRebuild\"], True)"
]
},
{
@@ -323,19 +336,1326 @@
"outputs": [
{
"data": {
- "image/png": "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+4B3lbO7+vXvaHtt+UlZ+1PAAIrfZ8px6BMpPiguoOht/jSv55JvUJxL8mxEtIxXPwe4tPzbd0RmTqfoGPl2Wc8sihMoOzIBuDkzV/contShyFzdI5aSJPUtETGCIiyvmT3wmvQRMZjiQ+wuuXonyKpGRPwFODEz72t0LepbDNSSpKbX0wO1pJ7NIR+SJElSBfZQS5IkSRXYQy1JkiRV0NlvYuuRNt544xwxYkSjy5AkSVIfd9dddz2TmW1+AVOvDtQjRoxg+vTpjS5DkiRJfVxEtPuNrA75kCRJkiowUEuSJEkVGKglSZKkCnr1GGpJkiSAJUuWMGfOHF599dVGl6JebsCAAQwbNow111yz0+sYqCVJUq83Z84c1l9/fUaMGEFENLoc9VKZycKFC5kzZw4jR47s9HoO+ZAkSb3eq6++ykYbbWSYViURwUYbbbTaRzoM1JIkqU8wTKsrvJH3kYFakiRJqsAx1JIkqc8ZceZvunR7j593SJduT32LPdSSJEldoF+/fowZM4YddtiBnXfemQsuuIDXXnutbo83fvz4LvnG6JtvvplDDz20Sx772muvZZdddmHnnXdm++235+KLLwbgoosu4rLLLqtc6913382HPvQhAC655BIigmnTpi2ff9VVVxER/PznP19e5zbbbMOYMWPYbrvtmDx58vJl999/f5599tnKNUEde6gjYhvgZzVNWwBfBC4r20cAjwNHZOaz5TpnAScCy4CPZub19apPkiSpKw0cOJB77rkHgPnz53P00UezaNEizj333MYW1k2WLFnCySefzB133MGwYcNYvHgxjz/+OACnnHJKlzzGl7/8Zb7whS8sn95pp5248sor2W+//QCYMmUKO++88wrrXHHFFYwdO5Z//vOfbLnllpxwwgmstdZaHHfccXz3u9/l85//fOW66haoM/MhYAxARPQDngSuAs4EpmXmeRFxZjn92YjYHjgS2AHYFPh9RGydmcvqVaMkqefq6kP2zc4hC91ryJAhTJ48md12241zzjmHxYsXc+qppzJ9+nT69+/PBRdcwD777MPBBx/Meeedx+jRo9lll114z3vewxe/+EXOPvtshg8fzlZbbcU555zDxhtvzH333cdb3/pWLr/88pVOnLvyyiv58pe/TGZyyCGH8NWvfhWAU089lTvvvJNXXnmF9773vcvD/XXXXccZZ5zBxhtvzK677rp8Oy+99BKnn3469957L0uXLuWcc85h4sSJvPLKK3zgAx/g/vvvZ7vttuOVV15Z6Tm/8MILLF26lI022giAtddem2222QaAc845h/XWW4+jjz6agw8+ePk69957L48++ijrrLMOp5xyCrNnzwbgwgsvZI899lhp+zNmzFghMO+111784Q9/YMmSJSxevJhZs2YxZsyYNl+TF198kXXXXZd+/foBMGHCBPbaa6+eHahb2Q/4e2b+IyImAuPL9kuBm4HPAhOBKZm5GHgsImYB44A/dVONkiRJXWaLLbbgtddeY/78+Vx++eVAESAffPBBDjjgAB5++GH23ntv/vCHPzBixAj69+/PbbfdBsAf//hHjj32WObNm8fdd9/NzJkz2XTTTdljjz247bbb2HPPPZc/zty5c/nsZz/LXXfdxaBBgzjggAP41a9+xWGHHcakSZPYcMMNWbZsGfvttx8zZsxg66235qSTTuKmm25iq6224n3ve9/ybU2aNIl9992XH/3oRzz33HOMGzeO/fffn4svvph11lmHGTNmMGPGjBVCeIsNN9yQCRMmMHz4cPbbbz8OPfRQjjrqKNZY4/URxptuuunyXvzvfOc73HLLLQwfPpyjjz6aj3/84+y5557Mnj2bAw88kAceeGCF7U+fPp0dd9xxhbaIYP/99+f6669n0aJFTJgwgccee2yFZY455hjWXnttHnnkES688MLlgXrQoEEsXryYhQsXLv8Q8EZ11xjqI4Ery/ubZOY8gPJ2SNm+GfBEzTpzyrYVRMTJETE9IqYvWLCgjiVLkiRVk5lAEZCPO+44ALbddluGDx/Oww8/zF577cWtt97KH//4Rw455BBefPFFXn75ZR5//PHlvbvjxo1j2LBhrLHGGowZM2b5MIoWd955J+PHj2fw4MH079+fY445hltvvRWAqVOnsuuuu7LLLrswc+ZM7r//fh588EFGjhzJqFGjiAiOPfbY5du64YYbOO+88xgzZgzjx4/n1VdfZfbs2dx6663Llxs9ejSjR49u8/n+4Ac/YNq0aYwbN47zzz+fD37wg20ud9ttt/GDH/yAH/3oRwD8/ve/5yMf+QhjxoxhwoQJPP/887zwwgsrrDNv3jwGDx680raOPPJIpkyZwpQpUzjqqKNWmn/FFVcwY8YMZs+ezfnnn88//vGP5fOGDBnC3Llz26xxddS9hzoi1gImAGetatE22nKlhszJwGSAsWPHrjRfkiSpJ3j00Ufp168fQ4YMWR6sW9ttt92YPn06W2yxBe985zt55pln+P73v89b3/rW5cusvfbay+/369ePpUuXrrCN9rb92GOPcf7553PnnXcyaNAgTjjhhOVfWNLetZYzk1/84hfLw3ytzl6feaeddmKnnXbiuOOOY+TIkVxyySUrzJ83bx4nnngi11xzDeuttx4Ar732Gn/6058YOHBgu9sdOHBgm1+4Mm7cOO677z4GDhzI1ltv3e76gwcPZtddd+Uvf/kLw4cPB4ovBOroMTurO4Z8vAv4a2Y+XU4/HRFDM3NeRAwF5pftc4DNa9YbBlT/yCBJkppOo8eML1iwgFNOOYWPfOQjRAR77703V1xxBfvuuy8PP/wws2fPZptttmGttdZi8803Z+rUqZx99tksWLCAT33qU3zqU5/q9GPtvvvufOxjH+OZZ55h0KBBXHnllZx++uk8//zzrLvuurz5zW/m6aef5ne/+x3jx49n22235bHHHuPvf/87W265JVdeeeXybR144IF861vf4lvf+hYRwd13380uu+yyvP599tmH++67jxkzZqxUx4svvsj06dMZP348APfcc8/y4NpiyZIlHHHEEXz1q19dIfwecMABfPvb3+bTn/708nVbj4Xebrvt+NrXvtbmPvjKV77CgAEDOtxPL7/8MnfffTef+cxngOLDw1NPPcWIESM6XK8zuiNQH8Xrwz0ArgGOB84rb6+uaf9pRFxAcVLiKOCObqhPkiSpsldeeYUxY8awZMkS+vfvz3HHHccnPvEJAP7jP/6DU045hZ122on+/ftzySWXLO953muvvZg2bRrrrLMOe+21F3PmzGGvvfbq9OMOHTqUr3zlK+yzzz5kJgcffDATJ04EYJdddmGHHXZgiy22WH6S34ABA5g8eTKHHHIIG2+8MXvuuSf33XcfAGeffTZnnHEGo0ePJjMZMWIE1157Laeeeiof+MAHGD16NGPGjGHcuHEr1ZGZ/Pd//zcf/vCHGThwIOuuu+5KvdO33347d955J1/60pf40pe+BMBvf/tbvvnNb3LaaacxevRoli5dyt57781FF120wrrbbrstixYt4oUXXmD99ddfYd673vWudvfPMcccw8CBA1m8eDEnnHDC8t7/u+66i7e97W307189Dkd7hwm6QkSsQzEueovMXFS2bQRMBd4CzAYOz8x/lvM+D3wQWAqckZm/62j7Y8eOza64/qIkqefxKh9dq9E9tvX2wAMPsN122zW6DNXZ17/+ddZff/3l16Ku4mMf+xgTJkxYfsm9Wm29nyLirswc29a26npSYma+nJkbtYTpsm1hZu6XmaPK23/WzJuUmVtm5jarCtOSJElqLqeeeuoKY8qr2HHHHdsM02+E35QoSZL6hHoedVfPMGDAgOVXS6nqpJNOarP9jbyPDNSSJKnXGzBgAAsXLjRUq5LMZOHChas8wbG17vpiF0mSpLoZNmwYc+bMwe+oUFUDBgxg2LBhq7WOgVqSJPV6a665JiNHjmx0GWpSDvmQJEmSKjBQS5IkSRUYqCVJkqQKDNSSJElSBQZqSZIkqQIDtSRJklSBgVqSJEmqwEAtSZIkVWCgliRJkiowUEuSJEkVGKglSZKkCgzUkiRJUgUGakmSJKkCA7UkSZJUgYFakiRJqsBALUmSJFVgoJYkSZIqMFBLkiRJFRioJUmSpAoM1JIkSVIFBmpJkiSpAgO1JEmSVIGBWpIkSarAQC1JkiRVUNdAHREbRMTPI+LBiHggIv4tIjaMiBsj4pHydlDN8mdFxKyIeCgiDqxnbZIkSVJXqHcP9TeA6zJzW2Bn4AHgTGBaZo4CppXTRMT2wJHADsBBwHcjol+d65MkSZIqqVugjog3AXsDPwTIzH9l5nPARODScrFLgcPK+xOBKZm5ODMfA2YB4+pVnyRJktQV6tlDvQWwAPhxRNwdET+IiHWBTTJzHkB5O6RcfjPgiZr155RtK4iIkyNiekRMX7BgQR3LlyRJklatnoG6P7Ar8L3M3AV4iXJ4RzuijbZcqSFzcmaOzcyxgwcP7ppKJUmSpDeonoF6DjAnM/9STv+cImA/HRFDAcrb+TXLb16z/jBgbh3rkyRJkiqrW6DOzKeAJyJim7JpP+B+4Brg+LLteODq8v41wJERsXZEjARGAXfUqz5JkiSpK/Sv8/ZPB66IiLWAR4EPUIT4qRFxIjAbOBwgM2dGxFSK0L0UOC0zl9W5PkmSJKmSugbqzLwHGNvGrP3aWX4SMKmeNUmSJEldyW9KlCRJkiowUEuSJEkVGKglSZKkCgzUkiRJUgUGakmSJKkCA7UkSZJUgYFakiRJqsBALUmSJFVgoJYkSZIqMFBLkiRJFRioJUmSpAoM1JIkSVIFBmpJkiSpAgO1JEmSVIGBWpIkSarAQC1JkiRVYKCWJEmSKjBQS5IkSRUYqCVJkqQKDNSSJElSBQZqSZIkqQIDtSRJklSBgVqSJEmqwEAtSZIkVWCgliRJkiowUEuSJEkVGKglSZKkCgzUkiRJUgV1DdQR8XhE3BsR90TE9LJtw4i4MSIeKW8H1Sx/VkTMioiHIuLAetYmSZIkdYXu6KHeJzPHZObYcvpMYFpmjgKmldNExPbAkcAOwEHAdyOiXzfUJ0mSJL1hjRjyMRG4tLx/KXBYTfuUzFycmY8Bs4Bx3V+eJEmS1Hn1DtQJ3BARd0XEyWXbJpk5D6C8HVK2bwY8UbPunLJtBRFxckRMj4jpCxYsqGPpkiRJ0qr1r/P298jMuRExBLgxIh7sYNlooy1XasicDEwGGDt27ErzJUmSpO5U1x7qzJxb3s4HrqIYwvF0RAwFKG/nl4vPATavWX0YMLee9UmSJElV1S1QR8S6EbF+y33gAOA+4Brg+HKx44Gry/vXAEdGxNoRMRIYBdxRr/okSZKkrlDPIR+bAFdFRMvj/DQzr4uIO4GpEXEiMBs4HCAzZ0bEVOB+YClwWmYuq2N9kiRJUmV1C9SZ+SiwcxvtC4H92llnEjCpXjVJkiRJXc1vSpQkSZIqMFBLkiRJFRioJUmSpAoM1JIkSVIFBmpJkiSpAgO1JEmSVIGBWpIkSarAQC1JkiRVYKCWJEmSKjBQS5IkSRUYqCVJkqQKDNSSJElSBQZqSZIkqQIDtSRJklSBgVqSJEmqwEAtSZIkVWCgliRJkiowUEuSJEkV9O9oZkS8A3g2M2dExBHA3sDfge9m5uLuKFCSJEnqydoN1BHxHWA0sHZEPAysB1wHvB34EXBMt1QoSZIk9WAd9VDvk5nbR8QA4ElgSGYui4iLgRndU54kSZLUs3U0hvpVgMx8FfhHZi4rpxNY0g21SZIkST1eRz3UQyLiE0DU3KecHlz3yiRJkqReoKNA/X1g/TbuA/ygbhVJkiRJvUi7gTozz+3OQiRJkqTeqKOrfHyzoxUz86NdX44kSZLUu3Q05OMU4D5gKjCXYuy0JEmSpBodXeVjKDAZOBA4DlgTuCYzL83MSzv7ABHRLyLujohry+kNI+LGiHikvB1Us+xZETErIh6KiAPf2FOSJEmSuk+7gTozF2bmRZm5D3ACsAEwMyKOW83H+BjwQM30mcC0zBwFTCuniYjtgSOBHYCDgO9GRL/VfCxJkiSpW3XUQw1AROwKnAEcC/wOuKuzG4+IYcAhrHhVkIlASw/3pcBhNe1TMnNxZj4GzALGdfaxJEmSpEbo6KTEc4FDKXqXpwBnZebS1dz+hcBnWPGSe5tk5jyAzJwXEUPK9s2AP9csN6dsa13XycDJAG95y1tWsxxJkiSpa3XUQ3028GZgZ+ArwF8jYkZE3BsRq/zq8Yg4FJifmZ3t0W7rpMdcqSFzcmaOzcyxgwf7/TKSJElqrI6u8jGy4rb3ACZExMHAAOBNEXE58HREDC17p4cC88vl5wCb16w/jOLqIpIkSVKP1dFJif/o6GdVG87MszJzWGaOoDjZ8KbMPBa4Bji+XOx44Ory/jXAkRGxdkSMBEYBd1R4bpIkSVLdddRDXS/nAVMj4kRgNnA4QGbOjIipwP3AUuC0zFzWgPokSZKkTuuWQJ2ZNwM3l/cXAvu1s9wkYFJ31CRJkiR1hVVeNk+SJElS+1bZQx0RewDnAMPL5QPIzNyivqVJkiRJPV9nhnz8EPg4xRe6OKZZkiRJqtGZQL0oM39X90okSZKkXqgzgfp/I+L/Ab8EFrc0ZuZf61ZVHzPizN80uoQ+5fHzDml0CZIkSct1JlDvXt6OrWlLYN+uL0eSJEnqXVYZqDNzn+4oRJIkSeqN2g3UEXFsZl4eEZ9oa35mXlC/siRJkqTeoaMe6nXL2/W7oxBJkiSpN2o3UGfmxeXtud1XjiRJktS7+E2JkiRJUgUGakmSJKkCA7UkSZJUwSoDdURsEhE/jIjfldPbR8SJ9S9NkiRJ6vk600N9CXA9sGk5/TBwRp3qkSRJknqVzgTqjTNzKvAaQGYuBZbVtSpJkiSpl+hMoH4pIjai+LpxIuJtwKK6ViVJkiT1Eqv86nHgk8A1wJYRcRswGDi8rlVJkiRJvcQqA3Vm3hUR7wC2AQJ4KDOX1L0ySZIkqRfozFU+/g58KDNnZuZ9mbkkIq7thtokSZKkHq8zY6iXAPtExI8jYq2ybbM61iRJkiT1Gp0J1C9n5vuAB4A/RMRwyhMUJUmSpGbXmZMSAyAz/zsi7qK4JvWGda1KkiRJ6iU6E6i/2HInM6dFxIHA8fUrSZIkSeo92g3UEbFtZj4IPBkRu7aa7UmJkiRJEh33UH8COBn4WhvzEti3LhVJkiRJvUi7gTozTy5v9+m+ciRJkqTepd2rfETEbhHxf2qm3x8RV0fENyPCkxIlSZIkOr5s3sXAvwAiYm/gPOAyYBEweVUbjogBEXFHRPwtImZGxLll+4YRcWNEPFLeDqpZ56yImBURD5UnP0qSJEk9WkeBul9m/rO8/z5gcmb+IjPPBrbqxLYXA/tm5s7AGOCgiHgbcCYwLTNHAdPKaSJie+BIYAfgIOC7EdHvDTwnSZIkqdt0GKgjomWM9X7ATTXzVnm5vSy8WE6uWf4kMBG4tGy/FDisvD8RmJKZizPzMWAWMK4zT0KSJElqlI4C9ZXALRFxNfAK8AeAiNiKYtjHKkVEv4i4B5gP3JiZfwE2ycx5AOXtkHLxzYAnalafQxtfcR4RJ0fE9IiYvmDBgs6UIUmSJNVNR1f5mBQR04ChwA2Z2fJ142sAp3dm45m5DBgTERsAV0XEjh0sHm1too1tTqYcwz127Fi/Al2SJEkN1eHQjcz8cxttD6/ug2TmcxFxM8XY6KcjYmhmzouIoRS911D0SG9es9owYO7qPpYkSZLUnToa8lFJRAwue6aJiIHA/sCDwDW8/tXlxwNXl/evAY6MiLUjYiQwCrijXvVJkiRJXWGVJxdWMBS4tLxSxxrA1My8NiL+BEyNiBOB2cDhAJk5MyKmAvcDS4HTyiEjkiRJUo9Vt0CdmTOAXdpoX0hx1ZC21pkETKpXTZIkSVJXq9uQD0mSJKkZGKglSZKkCgzUkiRJUgUGakmSJKkCA7UkSZJUgYFakiRJqsBALUmSJFVgoJYkSZIqMFBLkiRJFRioJUmSpAoM1JIkSVIFBmpJkiSpAgO1JEmSVIGBWpIkSarAQC1JkiRVYKCWJEmSKjBQS5IkSRUYqCVJkqQKDNSSJElSBQZqSZIkqYL+jS5AkiSpNxlx5m8aXUKf8vh5hzS6hMrsoZYkSZIqMFBLkiRJFRioJUmSpAoM1JIkSVIFBmpJkiSpAgO1JEmSVIGBWpIkSaqgboE6IjaPiP+NiAciYmZEfKxs3zAiboyIR8rbQTXrnBURsyLioYg4sF61SZIkSV2lnj3US4FPZuZ2wNuA0yJie+BMYFpmjgKmldOU844EdgAOAr4bEf3qWJ8kSZJUWd0CdWbOy8y/lvdfAB4ANgMmApeWi10KHFbenwhMyczFmfkYMAsYV6/6JEmSpK7QLWOoI2IEsAvwF2CTzJwHRegGhpSLbQY8UbPanLKt9bZOjojpETF9wYIFda1bkiRJWpW6B+qIWA/4BXBGZj7f0aJttOVKDZmTM3NsZo4dPHhwV5UpSZIkvSF1DdQRsSZFmL4iM39ZNj8dEUPL+UOB+WX7HGDzmtWHAXPrWZ8kSZJUVf96bTgiAvgh8EBmXlAz6xrgeOC88vbqmvafRsQFwKbAKOCOetUnqTDizN80uoQ+4/HzDml0CZKkBqhboAb2AI4D7o2Ie8q2z1EE6akRcSIwGzgcIDNnRsRU4H6KK4SclpnL6lifJEmSVFndAnVm/pG2x0UD7NfOOpOASfWqSZIkSepqflOiJEmSVIGBWpIkSarAQC1JkiRVYKCWJEmSKjBQS5IkSRUYqCVJkqQKDNSSJElSBQZqSZIkqQIDtSRJklSBgVqSJEmqwEAtSZIkVWCgliRJkiowUEuSJEkVGKglSZKkCgzUkiRJUgUGakmSJKkCA7UkSZJUgYFakiRJqsBALUmSJFVgoJYkSZIqMFBLkiRJFRioJUmSpAoM1JIkSVIFBmpJkiSpAgO1JEmSVIGBWpIkSarAQC1JkiRVULdAHRE/ioj5EXFfTduGEXFjRDxS3g6qmXdWRMyKiIci4sB61SVJkiR1pXr2UF8CHNSq7UxgWmaOAqaV00TE9sCRwA7lOt+NiH51rE2SJEnqEnUL1Jl5K/DPVs0TgUvL+5cCh9W0T8nMxZn5GDALGFev2iRJkqSu0t1jqDfJzHkA5e2Qsn0z4Ima5eaUbSuJiJMjYnpETF+wYEFdi5UkSZJWpaeclBhttGVbC2bm5Mwcm5ljBw8eXOeyJEmSpI51d6B+OiKGApS388v2OcDmNcsNA+Z2c22SJEnSauvuQH0NcHx5/3jg6pr2IyNi7YgYCYwC7ujm2iRJkqTV1r9eG46IK4HxwMYRMQf4EnAeMDUiTgRmA4cDZObMiJgK3A8sBU7LzGX1qk2SJEnqKnUL1Jl5VDuz9mtn+UnApHrVI0mSJNVDTzkpUZIkSeqVDNSSJElSBQZqSZIkqQIDtSRJklSBgVqSJEmqwEAtSZIkVWCgliRJkiowUEuSJEkVGKglSZKkCgzUkiRJUgUGakmSJKkCA7UkSZJUgYFakiRJqsBALUmSJFVgoJYkSZIqMFBLkiRJFRioJUmSpAoM1JIkSVIFBmpJkiSpAgO1JEmSVIGBWpIkSarAQC1JkiRVYKCWJEmSKjBQS5IkSRUYqCVJkqQKDNSSJElSBQZqSZIkqQIDtSRJklRBjwvUEXFQRDwUEbMi4sxG1yNJkiR1pEcF6ojoB3wHeBewPXBURGzf2KokSZKk9vWoQA2MA2Zl5qOZ+S9gCjCxwTVJkiRJ7YrMbHQNy0XEe4GDMvND5fRxwO6Z+ZGaZU4GTi4ntwEe6vZC+66NgWcaXYTUBt+b6sl8f6qn8r3ZtYZn5uC2ZvTv7kpWIdpoWyHxZ+ZkYHL3lNNcImJ6Zo5tdB1Sa7431ZP5/lRP5Xuz+/S0IR9zgM1rpocBcxtUiyRJkrRKPS1Q3wmMioiREbEWcCRwTYNrkiRJktrVo4Z8ZObSiPgIcD3QD/hRZs5scFnNxKE06ql8b6on8/2pnsr3ZjfpUSclSpIkSb1NTxvyIUmSJPUqBmpJkiSpAgO1JEmSVIGBWpIkqY+IiIERsU2j62g2BmqtICLeGRE3NroOKSLeFhHr10yvHxG7N7ImqVZEDI+I/cv7A2vfr1IjRMS7gXuA68rpMRHh5Ye7gYG6SUXEvhHxcES8GBGXR8T2ETEdOA/4XqPrkyjehy/WTL+E7031EBFxEvBz4OKyaRjwq4YVJBXOAcYBzwFk5j3AiIZV00QM1M3ra8DJwEYU/xT+DPwkM9+amb9saGVSIbLmup6Z+Ro97Nr5amqnAXsAzwNk5iPAkIZWJMHSzFzU6CKakYG6eWVm3pyZizPzV8CCzPxGo4uSajwaER+NiDXLn48Bjza6KKm0ODP/1TIREf0Bv9hBjXZfRBwN9IuIURHxLeD2RhfVDAzUzWuDiPj3lh8gWk1LjXYK8HbgSWAOsDvFURWpJ7glIj4HDIyIdwL/A/y6wTVJpwM7AIuBKymOoJzRyIKahd+U2KQi4scdzM7M/GC3FSNJvUxErAGcCBwABHA98IP0n6rUlAzUWklEbJKZTze6DjW3iBgMnERxQs3ysdN+2JOkFUXEr+lgyFFmTujGcpqSJ/gIgIh4M/B/gaOB7YDNGluRxNXAH4DfA8saXIsEQETcS8fBZXQ3liO1OL/RBTQ7e6ibWEQMBCZQhOhdgfWBw4BbyysqSA0TEfdk5phG1yHViojhHc3PzH90Vy2Seg4DdZOKiCuAvYEbgCnATcCszBzZ0MKkUkT8F3B7Zv620bVIUk8WEVMz84j2jqB45KT+DNRNKiL+RnEizWXAzzLziYh4NDO3aHBpEgAR8QKwLsXZ6kso3q+ZmW9qaGFqahHxx8zcs3x/1v4D9f2phomIzcv/420eQfHISf0ZqJtYRGxLMdzjfcB8YFtgp8x8qqGFSVIPFRHDDSfqaSLir5m5a3n/W5l5eqNrajZeh7qJZeaDmfnFzNwG+DjwE+COiPAi8Gq4iPh5RBxcXp5M6imuarkTEb9oZCFSjai5v0fDqmhi/qMSAJk5PTM/AQwHzmp0PRJwEXAM8EhEnFceUZEarTa4OEROPYXDDRrMy+Y1qYj44ioWuaVbCpHakZm/B35fXtLxKODGiHgC+D5weWYuaWiBalbZzn2pkbaNiBkUH/i2LO/D62P7PSmxzhxD3aQi4pNtNK9L8c1fG2Xmet1ckrSSiNgIOBY4DpgLXAHsSTHWf3wDS1OTiohlwEsUQWUg8HLLLDwpUQ3i5Rwbz0AtImJ94GMUYXoq8LXMnN/YqtTsIuKXFCfK/gS4JDPn1cybnpljG1acJEk1DNRNLCI2BD5BMU71UuAbmflsY6uSChGxb2be1Og6JElaFU9KbFIR8f+AO4EXKA6fn2OYVg+zUXn0hIj4QkT8MiJ2bXRRkiS1Zg91k4qI1yi+MGMpfjmBeqCImJGZoyNiT+ArwPnA5zJz9waXJknSCrzKR5PKTI9OqKdbVt4eAnwvM6+OiHMaWI8k9UjtfeV4C6/yUX8Gakk91ZMRcTGwP/DViFgbh6lJUlsOLW9PK29/Ut4ew+tXolEdOeRDUo8UEesABwH3ZuYjETGUYrz/DQ0uTZJ6pIi4LTP3WFWbup69PZJ6pMx8OTN/CSyKiLcAawIPNrgsSerJ1i3POwEgIt5O8R0TqjOHfEjqkSJiAvA1YFNgPvAWikC9QyPrkqQe7ETgR+U3zCawCPhgY0tqDg75kNQjRcTfgH2B32fmLhGxD3BUZp7c4NIkqUeLiDdRZLxFja6lWTjkQ1JPtSQzFwJrRMQamfm/wJgG1yRJPVZEbBIRPwR+lpmLImL7iDix0XU1AwO1pJ7quYhYD7gVuCIivkFx3XRJUtsuAa6nGCoH8DBwRqOKaSYGakk9SkRsFRF7ABMpLvf0ceA6YCFweiNrk6QebuPMnAq8BpCZS3n9mv6qIwO1pJ7mQuCFzHwpM1/LzKWZeSnwW+CchlYmST3bSxGxEeWXvETE2yhOTFSdeZUPST3NiMyc0boxM6dHxIgG1CNJvcUngGuALSPiNmAw8N7GltQcDNSSepoBHcwb2G1VSFIvk5l/jYh3ANsAATyUmUsaXFZTcMiHpJ7mzog4qXVjeab6XQ2oR5J6hYg4HBiYmTOBw4CfRcSuja2qOXgdakk9SkRsAlwF/IvXA/RYYC3gPZn5VKNqk6SeLCJmZObo8tsSvwKcD3wuM3dvcGl9noFaUo9UfpHLjuXkzMy8qZH1SFJPFxF3l1+E9RXg3sz8aUtbo2vr6wzUkiRJfUBEXAs8CewPvBV4BbgjM3duaGFNwEAtSZLUB0TEOsBBFL3Tj0TEUGCnzLyhwaX1eQZqSZKkPiAitgTmZObiiBgPjAYuy8znGllXM/AqH5IkSX3DL4BlEbEV8ENgJPDTxpbUHAzUkiRJfcNr5deN/ztwYWZ+HBja4JqagoFakiSpb1gSEUcB7weuLdvWbGA9TcNALUmS1Dd8APg3YFJmPhYRI4HLG1xTU/CkREmSpD4iIgYCb8nMhxpdSzOxh1qSJKkPiIh3A/cA15XTYyLimoYW1SQM1JIkSX3DOcA44DmAzLyH4kofqjMDtSRJUt+wNDMXtWpzbG836N/oAiRJktQl7ouIo4F+ETEK+Chwe4Nragr2UEuSJPUNpwM7AIspvtBlEXBGIwtqFl7lQ5IkqZeLiH7A9Zm5f6NraUb2UEuSJPVymbkMeDki3tzoWpqRY6glSZL6hleBeyPiRuCllsbM/GjjSmoOBmpJkqS+4Tflj7qZY6glSZL6iIhYC9iW4nJ5D2XmvxpcUlMwUEuSJPUBEXEwcDHwdyAovtTlw5n5u4YW1gQM1JIkSX1ARDwIHJqZs8rpLYHfZOa2ja2s7/MqH5IkSX3D/JYwXXoUmN+oYpqJPdSSJEl9QER8DxgOTKUYQ3048BBwG0Bm/rJx1fVtBmpJkqQ+ICJ+3MHszMwPdlsxTcZALUmSJFXgdaglSZL6gIgYCZwOjKAm42XmhEbV1CwM1JIkSX3Dr4AfAr8GXmtsKc3FIR+SJEl9QET8JTN3b3QdzchALUmS1AdExNHAKOAGYHFLe2b+tWFFNQmHfEiSJPUNOwHHAfvy+pCPLKdVR/ZQS5Ik9QHlNyWOzsx/NbqWZuM3JUqSJPUNfwM2aHQRzcghH5IkSX3DJsCDEXEnK46h9rJ5dWagliRJ6hu+1OgCmpVjqCVJkvqIiNgE2K2cvCMz5zeynmbhGGpJkqQ+ICKOAO4ADgeOAP4SEe9tbFXNwR5qSZKkPiAi/ga8s6VXOiIGA7/PzJ0bW1nfZw+1JElS37BGqyEeCzHrdQtPSpQkSeobrouI64Ery+n3Ab9rYD1NwyEfkiRJfURE/DuwJxDArZl5VYNLagoGakmSpF4sIrYCNsnM21q17w08mZl/b0xlzcNxNZIkSb3bhcALbbS/XM5TnRmoJUmSercRmTmjdWNmTgdGdH85zcdALUmS1LsN6GDewG6rookZqCVJknq3OyPipNaNEXEicFcD6mk6npQoSZLUi5VfN34V8C9eD9BjgbWA92TmU42qrVkYqCVJkvqAiNgH2LGcnJmZNzWynmZioJYkSZIqcAy1JEmSVIGBWpIkSarAQC1JkiRVYKCWJEmSKvj/AVFRHcplv/xoAAAAAElFTkSuQmCC\n",
+ "image/svg+xml": [
+ "\n",
+ "\n",
+ "\n"
+ ],
"text/plain": [
"