diff --git a/Makefile b/Makefile index c826d76..48fac9a 100644 --- a/Makefile +++ b/Makefile @@ -1,5 +1,6 @@ dev: GOOS=js GOARCH=wasm tinygo build -o stat/mod.wasm -no-debug ./stat/main.go + GOOS=js GOARCH=wasm tinygo build -o regr/mod.wasm ./regr/main.go GOOS=js GOARCH=wasm go build -o plot/mod.wasm ./plot/main.go prod: diff --git a/notebooks/deno_tinygo_wasm.ipynb b/notebooks/deno_tinygo_wasm.ipynb deleted file mode 100644 index a92beec..0000000 --- a/notebooks/deno_tinygo_wasm.ipynb +++ /dev/null @@ -1,89 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Regressions\n", - "\n", - "$X = (0,1)$\n", - "\n", - "$Y = sin(2\\pi X)$" - ] - }, - { - "cell_type": "code", - "execution_count": 24, - "metadata": {}, - "outputs": [ - { - "data": { - "text/markdown": [ - "![name](data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAqAAAAGACAIAAAD9Gkc5AABXGElEQVR4nOzdB3RUddo/8Gd6S5vJzKT30AIJ3YTQRYRVREUsgIorLui6suwuun91dZFd993XtrbXLeoCghJEpAsooKAQmkAIKZSUSS+TPkmmz/9MhgwQQkiZmTvl+zlzOHPv3Ln3SbiZZ36da7FYCAAAALwLl+kAAHyORqPx8/O7do/JZOJwOC64dLcX2rt374EDByQSyapVq1wQAwC4BpvpAAB8RVVV1cKFC++5557f/e5399xzz/Dhw8+ePWt7afLkycuWLXN2ACqVKjAwcNeuXV32z549OzQ0dNOmTV32f/vttw8++KBIJJo0adJdd901ocOiRYt+/vlnZ4cKAAOHBA/gIo899lhiYuLOnTs//vjjnTt3Llq0qLGx0fbS008//eCDDzo7gNDQ0JUrV44ePbqXx995553PPvusVqv961//+s0332RmZu7bty8kJCQ1NfXPf/5zz+/dvXu30Wh0RNQA0E+oogdwBYvFcvjw4UWLFtn3LFiwgM/n254//vjjN3sXi8Xq5flvPLLLToFAcGMlvO0YNpvdbXcc29vtJwkICHjnnXeMRuNf//rX2bNnT5gwodtgdDrdU089VVxczOXiEwaAMSjBA7gCi8WKi4t79dVXDx8+bNsTFxcXERFBRPv3758zZ85vf/tbIrp06dIjjzxy3333vfDCCyNGjBCLxbaUfOLEiblz5z777LNEVFRU9Lvf/S45Obm9vZ2Ivvzyy/T09CeeeGLatGk7d+605ex333139uzZtp0ffvih7YoffvjhmDFjtm/fbtu8ePHizJkz77777ieffPLLL7/s9puELet3yf2rV682m82fffYZETU0NEyZMmXBggW33377Pffc09raWl1d/cQTT1RVVT322GNvvPEGEf3nP/+ZOXPmY489lpycvHbtWuf/sgGggwUAXGLfvn22vnXDhw9/++23W1pa7C8tWbLk3nvvtT1ftWpVSkqKVqs1m82rVq1is9kajcZisTz99NNz5syxHfPTTz/ZOusZDAaxWHzq1CmLxVJYWLhjxw6LxfLFF19ERkba3lVbWxsUFPTVV1/Z3hgcHLxmzRqLxaLX62NjY1etWmXb/9Zbbw0dOvTGmH/44Qci+uGHH7rsj4yMnD59usViqamp+eijjywWi8FgkEgkn376qcVi2b9/PxFptVr7yW3BfPTRRwEBAU741QJAN1CCB3CRO++8My8v75VXXmlra/vDH/6QnJxcXl7e7ZF8Pl8gELBYrPvuu89sNqvV6pud02w2m0ymLVu2GI3GuLi4e+65h4g+/fTTWbNmSSQSIpLL5bNmzVqzZk2XN+7bt6+4uLjfPftkMllDQwMRKRSKZ555hoi4XG5sbGxNTc2NB//hD3+wBTNo0KDm5matVtu/iwJAnyDBA7hOZGTk6tWrCwoK1q5dW1FR8Ze//KXn42/Zhs3n89966633338/JibmxRdfbGtrI6Li4mKlUmk/JiwsrLi4uMsbCwsLhUJhSEhI/36QioqKxMREImpra3v11VeXLl26cuXKqqqqbuv5jx079qtf/eq3v/3tf/7zn/5dDgD6AV1gAFzBYrHk5+cPGzbM1h6/ePHi7777Lj8/f+Bn/s1vfrNw4cLPP//8tddeU6lUX3zxhUQi0el09gN0Op1cLu/yLolEYjabe9mDr4vCwkK1Wj127Fhb98CgoKCPP/6YxWLt27ev24OnTp166tSp5OTkAwcObN68uX8XBYC+QgkewBVMJtPrr79+7R42m52QkND7M/B4vObm5i4729vbs7KyZDLZc889t3r16hMnThDRyJEjL1++bD8mLy8vOTm5yxuHDh2q1+vPnz/fj59l9erV0dHRy5cvJ6Ljx4+PGTOm25xtNpuJ6MyZM2w2e/jw4TfrsgcAToISPICLbNu27YMPPpg/f35wcPDOnTv37Nlz5MiRGw+z9Y6xP7f/m5yc/K9//evjjz9WKpWHDh2y7bc152/cuJHP5x85cmTq1KlE9OKLL06dOnX//v3Tpk3bunVrQUHB+vXru1wlLS1txowZv/rVr958802TyXTs2LFu825raysR5efnBwUFsVisixcvrlu3rqamZufOnWKx2PZFYcOGDUlJSSqVqqGhwXaSwYMHE9HGjRtTUlKGDBmi0+nefPPN1NRUewd+AHABDianBHABNpudnp6em5u7bdu2Xbt2mc3mjz/+OCYmhojWr1+v1+tDQkIuXboUEBCQnZ2dkJBQU1MTHR29YcOGCRMmFBQUpKenjx49WiAQZGVlicXiefPmyWSy3NzcyZMnNzQ0ZGRk7N27d+zYsa+88gqPx1MoFPPnz9++fXtGRoZYLP7f//3f6OjoxsbGDz74ICUlxVYNEB8fP3fuXA6Hs3v37ubm5vvvv18ikTQ0NCQlJdlj/vbbb3/66SfbJc6dO5ebmysQCObOnbt69erQ0FDbMVOnTi0tLc3JybHNc1ddXR0WFhYfH+/v73/y5Ek2m33XXXcNHTr0+PHjLS0tTz/9tJ+fX35+fmpqKnP/FQC+goXqMgAAAO+DNngAAAAvhAQPAADghZDgAQAAvBB60YPTmc106RIZjTR4MPF4TEcDAOAbkODBuYqLadUqsk3JGhxML79MNwzJBgAAx0MvenAis5mWLKGysqt7AgPps8+oYwQ1AAA4EdrgfY5aTW+9Rb/8Jf3+99SxJpkTFRRcl92JqKmJTp927kUBAOxKS0sPHjx4+PBhlUplNBptO7Va7ZkzZ1xw9fLy8pKSki47Kysr//rXvyYnJx87dsypV3eXBN/a2vqb3/ym25cuXbrk8nC8lkZDK1bQvn3WvJudTa+9Rt9958TLmUzd7Oz8E3MW3DDQJ7hhvJXRaFy4cOHy5csLCwuzs7OXLFmyYMEC20tr164dM2ZMbW1tP07bpxtmyZIlCxcu7LIzLCzs+eefP3/+vG2mSOdxlzZ4i8Vys0UkbTNag0Ps2UPV1dftWbuWZs501uUSE0mhoGv/iEQiGjPGWZezwQ0DfYIbxlt9/PHHOTk5WVlZts2lS5cuWbLE9nzRokVDhgxRKBT9OG2fbpgPPvjA6Owyzc25SwkeXKNLhTkR1dR0X852CC6X/vQnCgq6sikW04svUkCAsy4HAGB36dKl1tZWU+cHHI/H+5//+R/byk8mk2n06NG2LmhNTU2NjY1ms7m1tfXEiRM1NTW2MmdjB1s6b25ubmxstC/SqNFojh07lp2d3dLSYr9ce3v76dOnc3JyDAaDbY9Wq1UqlVFRUfZjLBZLcXHxkSNHVCqVC34DSPC+JS6u656ICOJwnHjFpCRav55Wr6ZXX6UNG2jCBCdeCwDALjU1taCg4Be/+EVmZqZtT0REhC2jv/XWW1KptKKigoi++OILqVT6+9///vHHH1+4cGF8fHx2drZOp3vvvfekUmlpaSkR7d27Nykp6d1337Utzzh+/PjDhw/v2LFjzpw5tjNv2rQpNTX18OHDGRkZw4cPP3r0KBFdvHjxkUcemT59uu2Y2tra6dOn//a3v83Kytq0aZMrfgUW99DS0rJkyZJuX8rPz3d5OF6rvd2yZInljjuuPO6803LkCNMxORpuGOgT3DBebOXKlWy2tRw7ZMiQf/7znyaTybb/7NmzHTWaZRaLRa1WE5FtQUWj0ahQKFavXm2xWGyLKRcXF9veMmrUqL///e8Wi+XBBx9cunSpbeeePXssFktVVZVEIvnxxx9tO//3f/930KBBBoPBYrGsWrVq3Lhxtv3Lli1LS0szm832Jun9+/c79cdHCd63CIX07ru0cCElJ9PUqfT225SeznRMAADO8eabbxYWFv7lL3/R6XTPPPPMU0891fPxHA4nKSnJtuLizSgUiq+//jojI8NoNM6ePZuIDh482N7ent75YTpjxoxLHbq8cevWrXfffTeLxRrwj9Vb7tLJDlzGz49++UumgwAAcImYmJg//elPf/zjH5966qk1a9a88cYbcrm8h+NvmYCXLl1qNBp/+ctfLl++/LXXXnvmmWcqKir8/f1tVQVEJJPJbGPhhg0bZn+XXq+vqamJjIzs6dTHj1+ZFIyI0tIoPPzqS2VldOLEledRUTR+/HVv/Prrq8/nzbM/ZbIEr75GXV0dptwBAABH2blzp/05j8dbuXJlR7fimgGeVigU/vvf/66pqVmyZMmvf/3rnJwchUKh0WjsKaypqYmIYmNjr30Xn8+XSqW3GBfH45FQeOXBvj47czhXX+LeUDK3vyQUXrubsRK8Xq9ftWqVfdNgMNh+KQAAAAO3e/fulJSUmJgY22ZpaWlgYGBiYmIv3y6RSIiooqLCfgabHTt2PP/88/7+/q+//vr7779fWVk5ceJEFot17ty5kSNHdpTDj8vl8rgbujQnJyfv37//2WefveklexhDHBZmfdzMXXd1u5uxBM/n8z/88EP7pkajWbFiBVPBAACAlxEKhdOmTfvDH/6QnJxcVFT0xhtvfPzxx3w+X6PR5OTkENG5c+dkMtmFCxeI6MKFC2PGjKmpqWlsbKyoqGhpaYmJiUlISFi6dOncuXPb2trq6upKS0s1Gs0PP/yg1WqnT5/+7bffRkVFTZgwQSKR2OrqV69erVarX3/99a+++orFYlVWVpaUlDQ3N+fn5w8dOvSDDz6YMGHCE088MXbs2JKSEjabffny5alTp3JvLJE7iLvMRW9L8J988smNL124cGHIkCFMBAUeCTcM9AluGC+WnZ2dk5PT0NAQGho6ceJEpVJJRCqVKj8/33ZASkpKTk6Obax8WlrapUuX6urqiGjo0KExMTGVlZXffvutXC6fPn36+fPnGxoakpKSSkpKqqqqampqQkNDf/GLXwg7a8Vzc3NPnjypUCjS0tJszfAnT56sr6+3vXrHHXdwOBy1Wn348GGdTnfnnXeeO3dOp9NNmjTJz8/PST8+Ejx4G9ww0Ce4YaBPPOiGwTA5AAAAL4RhcgAAAD3Jyspat25dQ0ODrZO8UqmMjo6Oj4+fM2eO8yrYBw4leAAAgJ6MHDny1VdfXbt2bWJi4gsvvPCb3/xm8ODB7777bmJi4ueff97zezUazc2WUnM2JHgAAIBekUgkUql0xIgR8+fPz8zM/MUvfvHEE0/0vLT8Cy+8YJsZ1/VQRQ8AAHALthnurp3njsVi/eMf/9i2bdsrr7yya9cuIvrkk0/y8vKampqSk5OfeeYZLpe7cePGNWvWmM3mEydO2Fam37hxY1lZGZvNfuyxx9LS0pwaMxI8AABAfwQFBaWkpGRnZ9s2d+7c+e677/r7+48dO1an061cuTImJkar1U6ZMmXs2LFEdOLECT8/v7fffnvDhg0zZswoKyuTSqW9v1xjI23aRBcvUnAw3X8/XTMTbveQ4AEAAPopNjb2xx9/NJlMHA7nn//8Z3jHBPJpaWlZWVlsNts2HX1CQoJtZN3MmTP9/PwEAsE999yzbNmyy5cvj+8yq/zNaTS0fDlVVl7ZPHyY/vpXGjeup7cgwQMAANyCbc6YG2eOaWhoUCqVHA6HiEwm05dffllXV1dYWJiQkHDjSaRS6U8//VRYWFhVVUVEZrO59wHs3Hk1u3dciz799BYJHp3sAAAA+qmgoMBWOt+zZ8/UqVNFItHMmTOjoqK6PXjevHkff/xxSkrKrFmzuv260IOioq57VKpbvMWHSvAWi8WVC/ECAIDXuLGTHRH9+OOPubm5X3es1vrf//531qxZ99xzDxGJxWKj0djlDBUVFdu3b8/Pzx8yZIhtQtw+paQbV5rtYfUZGx8qwde3tR0tLCypr3eLuXkBAMBjWSyWQ4cOPfroo8uWLbv//vuJSCQSnT9/3mg06vV6W/62Davj8/nlHau822attw2Zq6io6OsV77mHOma4v2rx4lu8hXPtmq0M0uv1e/funTt37o0v1dXV9bw+fy+J+fxIqbS5vT23oqJVrw8UiThsH/p+4zscdcOAj8ANA7eUlZX19ttvq9XqixcvfvPNN1u2bFm/fv3ly5dXrVr13HPP2Y6JjY3973//+9577505cyY2NrawsDA+Pj4hIaGoqOjvf//76dOn7+pY1HXVqlW7d++WSCTl5eVarTY9PV0gEPQmBpGIJk+mlhYyGCg+np57jtLTb/EWH11sRq3RGEymsMBAx54W3IEHLQUB7gA3DPSJB90wPlqElfv52bK7yWw+WVys1miYjggAAMCRfKiTXbc4bPaoqKhCtfpidXWkVBolk6EbHgCAz9LcvLwnFovZjmjY/fzzz7///vvBgwe/8MILAz9bD3w9wRMRj8MZEhJiUSpLGxrOlZWNvLGroqc5epQ+/ZTKyigigp58kiZNYjogAABPYDQao6OjJ02a5O/v39LSsnPnzsmTJ4eFhbW1tZ09e3br1q3jeh543juLFi364YcfMjMzHRFyTxyf4A0Gw0cffZSdnd1tg7rbYrFY0TJZdGcnxeK6OqW/v5jPZzquPjt7llatIlvPitJSWr2a/ud/qGOSRAAAuIW5c+euXbvW1t19586dy5cvnz9/PhG99dZbTIfWZw5ug29qanrnnXfOnz9fXV3t2DO7WLBEcqG6+mRxcX1rK9Ox9M2WLXRtv0mLhb766qYHG43U1OSauAAA3B2Hw1m2bFm3L82dOzcmJsa+ee0KsM3Nzd2+paWlxWQyddnZ1NSk0+k4HI4Lerg7OMEHBgb+8Y9/dEglBrP8hcLRUVEjIyOrW1qOFhTobpiywG11Dr+8qr6+m8PMZvr0U7r/fpo/nx57jE6ccE10AADui8ViTZgwoduXBALB8uXLJ02atG3btqFDh7722mtE9N5776Wnp7/88su33Xabrcp93bp1ERERy5cvnzt3blRUVGhoaFZWlu0Mu3btSklJee655373u98dOnTIBROv+Wgv+l7ic7nDQkPT4uMFXC4Rten1xr5MHcyIG9cX6nbFoS++oIwMsn0HraqiP//51rMeAgD4rJiYmGnTpuXm5sbGxh44cCA8PPzo0aMvvfTSrl27Pvjgg2eeeeaBBx7omHxmcV1d3eTJk3fs2FFRUeHv729rrS4pKZk/f/7f/va3zz777KOPPprkkr5RSPC3xu78nqU3mX5Wqc6VlbXp9UwHdVOPPUahoVc3lUp6/PFuDutYvPgqo5H27nV+cAAAnkwikYwaNSoiIuK555776quvUlJSZB09t0aPHl1ZWVlWVmarBrB1theLxRMmTFCr1US0ceNGiUQyZ84cV0brul70Z8+e3bZt281e1ev1N2vGaGtru3DhgjND64MgIp1We7y+3kSk5PEEbjkX3h/+wPnxx6Dqar5SqZ88ubG21lRb2/WYpqbBRNdVEJWWNl+4UOmQAFgWC7e9ndfebhCJDGKxfb+gpSXk7Fm2ycQym9ul0qrRo699V2BJiYXDMYhERrHYKBT2u3nKNiskQC/hhoFuqTpqNSsqKuwJqLq62mAw2G+Y3NzcwsJC2zy1JpMpLS0tOzu7tbXVbDbb36XRaIxG44ULF86cOaNUKu2nampq0mg0XVKb3mIxXdMwz2Gx+B3Fy/7tVygUrkvwcXFxjzzyyM1ebWtre//997t9SSwWu+G0QXqj0WAySXo3xaDrjRplf9r9HJyjRtGpU9ftmTo1YMiQAAdcOzOTfvqJbG0ZU6fStVm8udn64PGIw+FLJIFd/ltPnqSaGjIYrM+fe46u+WZAJhN1rMbYS254w4A7ww0DN2pvbyei8PBw++0REhLC4/EiIiJseyIiIhoaGrZu3drljWw22/6ugIAAo9E4ZMiQ2NjYnJwc+6kCAwMNBkOXG6+yqanlmr57/kKhbUK2/u1vNZlcl+ADO9zsVY1Gw+V60qB8PpfL7whYZzSeUqlC/P3j5HIPmtz+2Wdp5cqrPfLS02nGjL6832Kh8nJSqaiigqZNI4Xi6kuJiaRUUkCA9dHlC1BAAN1++03P+eij1PFXRU1N12V320rI5eUUEkKRkTRiBPn59SVWAADHGz58+JYtW1paWvz9/W958LBhw9599926urrg4OCbHRMWGNjtBOr93u/gnFpfX79p06affvqpsbHx3XffnTFjRnJysmMv4W4EXO7EhISq5uaTKpWEzx+kVAp5PKaDurXISPr0UzpwgGprKSmJ0tKobz06d+6kvDwKDqaICOrytUahuC7f95VIZH10MWEClZVRVRWdPUuxsUjwAOBUWq3W1qBeWVnZ2toqkUhsO00mk76zD9ZTTz313nvv3Xvvvc8880xwcHBVVdXChQv1er3FYrGV/i0Wi06ns60b+9BDD7333nuPPPLI73//+/r6+qysLLlc7uxFzH10sRknaWpvV2s0CQNJb+6pudlapL62iqWujng8a4mccefOkdFo/ZLSsRSjZ90w4A5ww8CNPvvss/rOEcYcDue5554rLi7evn07EanV6ueffz6g49Ovqalpw4YNhYWFISEhc+bMSUpK+uKLL2o7Oj3de++9RUVFtjFyqampEyZMqKur27Vr1/nz50eOHBkbG/vzzz+PHj16ypQpzvspkOCdJausTOHnFx4UxHQgA6DTUX4+5eRYS89z59LQoUwH1J2jR+nUKdLrKS6O7riDAgM99IYBpuCGgT7xoBvGk5q9PUtyRERxXd2RgoKQgIC44GAPap6/KjOTzpyx5vVJkygqiulobiI9nVJTqaCA8vK6qdsHAPBVSPDOwmax4uXyeLm8qrn5lEo1LibG83J8Wpo1tbt/50cOhwYPtj66qKyk0NA+di4AAPASbv/Z7flCAwJCO9uqa1paBFxuoBsWNFta6PRpEotp/PirOztbtT2S0UgZGdYfYfRoGjXKs38WAIC+87QypYcLEArLGhoyCwsr3GeNl9ZW2rWL/vUvys/3qizI5dLSpZSSQqdO0aZNTEcDAOBqKMG7lJDHGx4ebrJYVB3N88NCQ2Udoy+YxOVai+/33kuDBnlbbbZEQhMnUloa3WSSRAAAL4YEzwBOZ/O8uWMIg9FsNprNQqaaugUCWrCAmUu7BodDUul1ezQa69cab6quAAC4AaromWRbxsZoNudUVPxcUtLUMTeCc+l09P335GmL3DvYkSP0r3/R0aN0w1LNAABeAyV45gm53LHR0VqD4XJtbV5lZYJCoejFxId9ZrFQVhYdPmwtvA4eTIw3DTBoxgySyawJ/tw5WrjQLabrAQBwNCR4dyHk8UaEh5vM5uZrFg9wpNxcOnCAxo+nCRPIEybTdSIu1/p7GDHC+o0H2R0AvBQSvHvhsNnSznVWThYXiwWCRIVC4JDm+aQkioykm6/343NEIkpLYzoIAABnQYJ3X+NjYxva2rLLy9ksVqJSGTDATmEsFrL7LVRVUUsLDRrEdBwAAA6ATnZuTSoWj4uJGRYWVtbQ0Lc1A+rrKSOD1GqnheaNSktp61basYNc0NsRAMDJkOA9gIjHSwoLsw1RL1Sri+vqzD0sEWSx0PHjtGYNGY3E4bgwTM83fjwtXEjV1fTJJ9TWxnQ0AAADgip6DxMvl5c3Nh4vKgoSiRIUCv6NzfPFxfTTTzRlCo0b520T17hAZCQ9+SRdvEidPSEAADwUErzniQgKiggKqm9tzSovH6RQBHVJRXFxtGwZ+fkxFp+n43Bo2DAnnTsnhzZvpupqGjKEFi0ihcJJ1wEAQIL3WDKJxD7NbYtO16bThdhHfCG7O1Z1NclkAx9bePo0vfTSlcl1Ll+mzEz617+6TrIHAOAoaIP3fMXFourqFq32SEHBLZrnoX/27KE1a6iqaoCnWbfuuqnz6utp27aBhgYAcDNI8J7MZKIDB+jLL7nFxYlKZXpCApfDOV5UVNrQwHRk3uXhh0kupw0b6MSJgZymtPTWewAAHAVV9B7LbLamnMZGuvdeGjKEiFhEkUFBkUFBRrPZdki7wSDy8UnrHEIkonnz6OxZ0ukGcprISMrLu25PRMRAQwMAuBkkeI/FZtPo0RQbe+Nkq1w2m4gsRBerq3VGY5xcrkCr/MCNGjXAEzz+OL38MnV++yKplO6/3wFxAQB0i7EEr9PpFi9ebN80Go1m+ycf9FJKSg8vsohGRkYaTKYitfpSdXWkVBotk7kwOOhq3Dh680368kuqraVBg6z5Hv8hAOA8jCV4gUCQkZFh39RoNCtWrGAqGC/G43AGh4QMCgmpaWlhOhbv0tBAP/9M06f3aTahlJSev5UBADgMOtl5jpoaWreOGhv78VYWUUjnErT5VVVnS0s1A2tOBmpro7w8+vxzwjcnAHBLSPAeIjeX1q8nsZgGuOQM0dDQ0EEhIQW1tceLimo1GgfF53siIuiJJ6xP1q7t37cuAACnQic7T1BWRrt20YQJNGmSQ2aflfD59uZ5EY/nJxA4Ikrf4+9PixZRfj4FBTEdCgBAV0jwniAykh59lMLDHXtWW/O87XmtRlPf2hovl/OwPk2fcDg0fDjTQQAAdAMJ3kM4Ort3ofDzYxGdKS0VcLmJSqWEz3fq5QAAwNnQBg9XyP38bouNTVAoLlVXl9TXMx2OZ2pvp+3bqbWV6TgAAJDg3VNJCX32GWm1rr+yn0AwKirKNmLebLGUNTRgavs+MBpJrbb+36nVTIcCAL4OCd795OTQl1+SUklM15OzWCyTxXK0oOBiTY0R0xD1hr8/PfooBQfThg3I8QDALLTBu5nCQtq9myZOtD6YxiKKkcliZLKalpafVSp/oTApLIzpoNyeQEDz59PPP2OaOgBgFhK8m4mNpfvvp0GDmI7jOkp/f6W/v75zrVOsYXMLbDaNH890EADg65Dg3Qyb7W7Z3Y7fOYKuvLGxprk5SiaLlEodMCofAACcAG3w0GeJCkVafLzZ1jxfXW1C83zPTCY6fZrpIADA5yDBM02vp++/p87ab0/BZrFiZLKJCQlBYjG62d9CTY31v3jnTsI3IQBwISR4Rmm1lJFB+fmeO3Ja6e9vW36+oqnppErV0NbGdETuJyyMHnmECgpo+3bkeABwGSR45rS308aN1n8XLaKAAKajGajwwMCUiIiqpqajhYXlWHyli4gIa47XakmvZzoUAPAV6GTHKKmU7riD/PyYjsMxBFzusLAws8Wiqquram4O9fxvLY4UGkoLFjAdBAD4ECR45ohEdN99TAfheGwWK04utz3XGgyXamoSlUpPH1bX1kZcLuMzDwEA9AESPDiRkMeLCQ7Oq6w0WyyJCkWQWMx0RH1WWEhvv00XL1oT/PTp9Nxz1i9mjmE0Wk8KAOAcaIN3rfZ2piNwtQChcEx0dHJEREVT0/mKCqbD6RuNhv74R2t2t6Xj776jd95x0KlPnKANGxhZbgAAfAQSvAs1NdHatXT2LNNxMEDA5SaFhY3oXPS2sqnJZPGA4XVHjlCX/oKHDlFLiyNOPWwY6fWUkYEcDwBOggTvKs3NtHEjBQbS8OFMh8I8Fot1srj4fEWF1mhkOpaeNDd33WOxWIv1DuDvTwsWkE5HO3Y44nQAAF2hCdBVtm+3fqY/+CB5eHczhwgNCAgNCGhqb88pL7cQjY6K4rDd7rum0UiFhV13KpUUGuqgC9hyPErwAOAcSPCuctdd1g90ZPdrBIpEY2NitEajLbvrjUa+O3U6+7//o/37r9sjENDvf08sB86/HxDgBVMgAIB7Yuzz1GQybd261b6p1WrbvbsDWnAw0xG4KWFnUq9rbS1Sq0MDA2OCgzmOzKL90dpKe/Z03bl4MY0dy0w8AAB95Xb1ouCzwgID0xMShDzeiaKinIoKHaPN842N3awP4PQVA4qKyL07JQCAB2GsBM/hcObPn2/f1Gg0P/zwA1PBOIVORyUlbrv2q9sKDwwMDwxsbG/Xm0wC5mrsQ0NJKqWGhut2DhvmzEsajbR3L8nl9MAD5GY9Es6fp4wMqqykuDh67DGKiWE6IADoBff6HPEeBgNt3kyHDnncMnFuIkgk8hcIiKhFpztWWFjZ1OTiADgcWr6cOlfAt7rjDho50pmX5HLp4Yepqop27qRejyE8f57+3/+jRYvohRcoO9spcZ07RytX0vHj1u+rhw5Zfy3l5U65EAA4lhv1afIeJhN9/TW1tFg/d69NEdB3/gLB+NhYVX390YICFzfPT5pEH31E331Hra00fjxNnuz8S8pk9NBDtGmTtbDcOWdADy5coOefv1KpX1NjzcTvvENJSQ4OasOG676mtrVZv7uuWOHgqwCAwyHBO0FlJdXV0YIF6CDtEBw2O14uj5fLK5uaitTqRIXCZZeOj6dly1x2tQ4hIfT0072c9X7z5uua7E0mysig1asdHFFZWdc9njYhIYCPQhW9E0RG0tKlJJUyHYe3CQsMtGf38xUVzd46grzXa9pUVXXdU13t+HDi4rruiY52/FUAwOGQ4J3DncZze6UEhUJVV3esqKjqxtnmfMaNqffGPQO3ePF1XzkCA+nhhx1/FQBwOCR48EgiHi85ImJcTIxGqz1WWOgB89r3T0VFD33nFi2ypls7f396/HHHhzB4MH34Ic2YQcOH05w59NFH5MJGEgDoPxQ0HeTsWVIqe9MxChyIy2YnKpWJSqVtU63R+AuFTAflUOXl9MMPJBR2O94yNJT++U/avJnKyqy33oMPUkiIU6KIi6P/9/+ccmYAcB4keEfIy6Nvv6U770SCd6WWFusvXiSipKQrgxW4bPa58vIWnS5cq/WSTD9+PDU3044d9PDDFBl54+sKBf3610wEBgBuDwl+wFQq2r2bJkygUaOYDsWHHDxI77xDOh3Z+ny9/rq1OBskFo+PiTmfn19UV9em1yeHh0s6BtN7thkzqL3dWkjvLsEDANwMEvyAVVXRiBEuGSUNV1RU0BtvXB2cXVJCf/sbvf/+lU0eizUkIsJoNts2TWYzi8ViMz25/YDMmcN0BADgeZDgByw1lekIfM6xY11nCMzLI7Wa5PKre7ids7226vXny8tlEkm8QsHHvEMA4DOQ4MHLBQiF6QkJda2tWaWlXA5nkFLp5wX19gAAt4JhcuB5JkzoOtHAsGHXFd9vFCyRjI+NHRwS0qbXOzs852pupoMHez9ZPQD4LCT4vrNY6MABcvnyJ2AXFkYvvEAi0ZXN2Fh66aVevVHC5yv9/a3/h0THCgtV9fUWj8uU7e2UlUXff890HADg7lBF33cHDlB2NiUnMx2HT5s+ncaPp5wckkgoKanPy6uyiFLj48saGjILC2USSYJCwfOU5vmQELr3XtqyhYKCaMwYpqMBAPeFEnwfnTpFZ87QffdR5+QqwBQ/P0pNpREj+rl4OosoSipNT0hQ+PvnVlY6Pj7niY+nmTO7WQQGAOAaKMH3UXU1zZrllCm/gSHBEkmwRGJ7XlBbGygSyf38mA7qVkaNwrwLANAzJPg+uvtupiMAJ4qSyQpray/W1ERJpZFSqSePnQcAX4cqeoCr+BzO0NDQCXFxFosls7DQ47vcA4APQ4IH6IrFYkXLZOnx8eKOdVI1Ol2rO2d6vZ5++KHr1D8A4POQ4G/FZKKDB0mrZToOYAybxbpUXX2iuLiutZXpWLrT3k7nztHu3UzHAQDuBQn+VvbsofPnkeB9mZjPHxUVNSoqqralJbOwsFajYTqi6wUG0rx5dPEiHTnCdCgA4EaQ4HuUmUn5+dZPz6AgpkMBhtma59Pi4vw7Z7q1r2fDvMhI+sUvqKiI3CckAGAaY73odTrd4sWL7ZtGo9Hsbp9NFov1E3P2bCzTCXYsFkvI49my+88qlYDHG6RUSjqa6hk2fDglJZFHL5oHAA7FWIIXCAQZGRn2TY1Gs2LFCqaC6R6LRQsW4BMTusVls1Pj4jQ63aXqaoPJFK9Q2AfTMwb3KgBcA+Pge4RPTOiRn0AwKipKbzJVNzczn+ABAK6BNniAgeJzOFFSqe35ufLyyzU1Jmbbm8xmOn0aK84B+Dgk+BtkZaGnEvRbSkSEv1B4SqXKLi9vNxiYCaKpiQ4dooMHmbk6ALgHJPjrHT5MBw5QQwPTcYAHCwkISI2LiwkOzqus1DMy/4xUSnPn0s8/07lzDFwdANwDEvw1cnPp2DGaM4eCg5kOBTxegFA4Jjqa37EKbVVzc3ljo0svn5BAU6ZY72fMcAfgq5DgO1ks1k/DiRNp8GCmQwFvo/T3N5hMRwoKXNo8n5ZGixeTp6xzDwCOhl70nVgsWrSIOucwAXAgNosVGxwcGxxc3dx8SqWKCQ4ODQhwxYVxPwP4MCT4a+DTEJwsJCAgpDO1m8zmFp0uSCRiOigA8E6oogdghoWovLExs7CwoqnJFderrHTFVQDAbfh8gq+uZjoC8FFcNnt4WNhtsbFag+FoQUFJfb0TL1ZZSevX08WLTrwEALgZ307wBQW0bh2VlTEdB/guDpsdL5enJyTIOifCMzljgpqwMEpNpd27Sa12/MkBwC35cIKvr6edO2nsWKwlA+7Ar7MLyPny8p9Vqqb2dgdfYMoU662+a5eDTwsA7sqHO9nt2kWhoXT77UzHAXCdkZGRWoOhoLY2r7IyJjg4LDDQMedlsWjuXGptdczZAMDt+XCCv/tuEouxnAy4ISGPNzw83GQ2q+rrzRYL21F3qUCAoSIAvsOHEzymqwP3Zmuetz0vrqtr1esTFQoB14f/ZgGgL/BhAeABYoODG9rassvLWSzWIKUyQCh0wEmNRsLXBQDv5WOd7IxGpiMA6CepWDwuJiYpLExVV6fWaAZ6usuX6eOP0SQP4MV8KcFrtbRmDV24wHQcAP0n4vGSIyLkfn5EpNHpCtVqc/+G1cXEkEBAW7diNRoAb+UzCd5ioe3brU9iY5kOBcAx/AQCIZd7oqgot7JS19faKR6P5s2jujrav99Z8QEAo3ymBe7wYaqooMcfRy9i8CbhQUHhQUG25vkgkShRqezDm4OCaO5cDCQB8FY+k+BjYykiAj3nwSvZmuftNfX1ra32efFuIS7OmXEBAJN8JsHHxDAdAYBz2Uvi9W1teVVV4YGBMcHBDhtDDwCexmfa4AF8RqJCMTEhgc/lHu9onmc6HABgBmMleLPZnJuba99sa2szYgwbgONEBAVFBAU1a7W2zVvPiHf5MlVW0uTJLooPAJyMsQRvMpm2bdtm39Tr9e0OX10jM5NkMhoyxMGnBfAc9ilxiuvqalpa4uVypb//TY/OzKTgYEpKcl18AOA0jCV4Ho/3pz/9yb6p0WhWrFjhyAtcvkw//kh33+3IcwJ4rHi5PFomK1SrL9fUREil0VIpq0uBPjGRJk6kPXusOT4khLFAAcBBvLQNvqGBdu2isWNp+HCmQwFwF1w2e7BSOSEhgcNiteh03RwxcSLFxVFdHQPBAYCjeWkv+tpaiojAUrAAN2IRRUqltucNbW1FavWgkBB/+/wQ8+YxGRwAOI6XJvjBg60PAOiRVCwWhIZerqnRGo1xcrmiYwZcAPAOXprgAaB3xHx+SmSkwWQqUqs1Wm1c5wK1AODpkOABgHgczuDOjnUWi+VybW1scDBPrSY+nzrr8wHAs3hRJzuNhqqqmA4CwOOxWCypWHymtDTr/PnWXbvIYGA6IgDoD28pwZtMtHUrWSz0+ONMhwLg8eR+fnI/P01g4CWt1pyZOWbKFKYjAoA+85YS/MGDVF9Pc+cyHQeA9/CTSkelpIw6eZJUKiJq1mr7tfI8ADDDK0rw1dV05gw98AAFBTEdCoB3iYpi//KXJJMRkUarPV9eHuznFy+X8zgcpiMDgFu4UoK/dOkS05EMQEgIPfUUJSQwHQeAN+rI7ra159MTEoIlktMlJWfLyvQmE9ORAUBPriT4f/zjH0xHMjCdn0EA4FRyP7/UuLhEhcK2dA0q7QHc1pUEv2XLloceeqisrIzpeJyorY0s+DQCGIjOHvV+AgGXbf30UGs0mYWFZY2N+NsCcDdXEvyyZct+/etfP/jgg2+88YbhhlEx58+fZyK2W+l1DeHJk/TEE3TvvTRvHn3+uZOjAvBWOh395z908eK1+xQdBXqjyZRZUHCppsZoNjMXHwBc50qCf+mll6ZNm/bjjz8KhcKpU6cePHjQfoTBYNi8eTNzEd6ESkX//je1tt7ywMJCevVVKi8n21D5tWtpyxZXBAjgbQQCSkqib76h+vprd7NZrNjg4PSEhECRSK3RMBcfAFznSi96Ycei0Vwud/ny5Q8//PCUKVMUCoV/x7rROp1u4sSJTMd5vZYW2rGDBg0iieSWx+7eTUbjdXu2baMHHnBidABea9o0qqqirVvp8ceJx+vyon2leaPZfLa0NF6hkInFTEQJANTNMLnc3Nxly5ZdvHiRzWabOurA9Xo9Q7HdhNlsTdGBgTRzZm8Ob27uuqepySlxAXg/FovuvZeys4nb0whbLpudEhFxubY2v7IyOjg4IiiI5cIYAcDmShX9unXr2tvbX3755VGjRuXk5Hz66ad5eXmZHY4ePcpiudOfJ4tlLbvfey/1biRucnLXPSkpTokLwCeIxZSaSrf6TOBzuUlhYWnx8UaTKdvWQgYArnUlwX/yyScjRoz429/+Nm/evLy8vCeffNJ+hEAgmNvHGeLMZrPFeR3WWSxKS7OW4Hvnrrto9OirmzIZPfOMs0IDgGvZmudTIiJsm8V1dW3uViMI4L2u1LOdOnVKqVTu2rXr7rvvvvGgcePG9f6Mf/zjH81mc0NDw9ChQ1euXOm4UPuJy6W//50OHaKLF0kupzvvpM6GQgBwqWCJ5EJ1tdFsTkDzPIDzXUnwU6ZM2bJli5+f3wBP99VXX124cGHbtm0Wi2X06NETJ06cMGGCI+IcEDabpk+3PgDAkZqa6PhxuuMOYvdqVQt/oXB0VJTOaCzoaJ4fFxvLx5S3AE5z5c/y2WefHXh2J6Ivv/xy8uTJthUnb7/99oyMjIGf84pDh6ihwWFnA4CBM5spN9f6t9kXgs7meVt2bzcYTBg9D+AEVxJ8X1vZb6aoqEgul9ueKxSKoqIih5yWTpygkydJq3XM2QDAIaRSuvtu69/m9bPf9Aa7s5ue1mA4qVJll5drsfA8gEM5eLnY5uZm25D6js624iZHjEgTq9XWIsIdd1BY2MDPBgCONGgQ3XYbXb7c7xNIxeK0uLhomSy3svKUSqXR6RwaH4DvcvByscHBwW1tbbbnGo0mODjY/tLx48fXr19/szcaDIbGxsZuXxKWlDRHRlaKRHThgmOjBa9UjkFZrsUKC7MQDfzPU0JktFiKior4rh2XixsG+sR5N4zJxCopsZaQo6O1HM5AR6KFh4c7OMEPHjy4srLS9ry8vHzw4MH2l0aNGpVw8xVdW1tbV69e3e1L9WPGDBk0KKB3vXgAiGjIkCFMhwAD0m4wnC4pCQ0IiA0O5jj/bx83DPSJM26YS5do9WqqqaGOBm569VUaOnSg53TwX87ixYu//fZb2wS3Bw4cePTRR+0vCQQC+c0FBwf3NJ0OsjuALxHxeBMTEiQCwUmV6nxFhbbLdNMA3sVgoD//+Up2J6LaWuvmwFurHFyCnz59+qVLl373u9+1t7e//vrrI0aMcOz5AcCt6fXU3EydPW0HKDQgIDQgoKm9vaKxMd5B5wRwQ3l51qR+rfp6ysmhMWMGdFoHJ3giWrp0qcPPCQCe4cgR62fVE0+Q4+axCRSJAkUi2/OssrKQjqzvqJMDuINuB4oOvN4KVd8A4DiTJpFAQNu3k3Mmqx4RHt6q0x0pKChUq83Omw8bwLWGDes6/XpAAA28BhwJHgAch8ej+++nqio6fdoZp+ew2QkKxcSEBCGPd6K4GDkevINAQK+8cnUadT8/evllB9SCOb6KHgB8mkxGCxaQQuHUi4QHBoZ3FnmqW1qEXK69Gh/AE40cSRs2UFYWmc00ahRJJA44JxI8ADhaaKgrrxYoFF6urc2rqooNDkbzPHgusZgcu3gLqugBwLMJebwR4eHjYmI0Ot3RgoLG9namIwJwCyjBA4A34LLZiQpFokJh6miYN5qt+Fx8xIHvQgkeAJxp82Yndbi7GU7HlFkGkymrvPxMaWkLFqkCX4WvtwDgTHFxdPAghYRQRIQrLyvi8cbHxLQbDJdralr1+kSFQu6IFbEBPAhK8ADgTOPG0ZAhtH07dS5D5UoiHi85ImJcTIwLJrQHYJjRSOvX0zWrtOOmBwAnmz2bbr7QlAtw2Wxp55jiE8XFeVVVepOJwXgAnGLvXmpuJqXSvgNV9ADgZDwezZrFdBBX3BYbW9/amlVWxmWzE5VKf4GA6YgAHOH0acrLo4ULrx1BjwQPAL5FJpHIJJI2vb6orm54WBjT4QA4gkBAM2Z06emCBA8AvkjM59uze0FtLYfNjpbJ2D0sWg3gzoYPv3Ef2uABwIVMJjpyhPR6puO4TrxCweVwjhcVoXkevAkSPAC4kE5HWVm0ezfTcVyHRRQZFDQhPj7E3z+rrKwJc+GBV0CCBwAXEovpvvuooICOHWM6lG7IJJLxMTG2dWtatFq1RsN0RAA3d/EiVVT08DoSPAC4Vng43X47nT9P7l0ZLuTx6lpbjxYUlNTXY1VayM2l//yH/v1vunx5wMu4OkRtLe3aRZcu9XAIOtkBgMuNGUMpKcThMB1HT3gczpCQEItSWdrQkFlQEC2TRUqlTAcFzNi2jf7v/+xbUc3NtGABowHpdLR1K0VE0JQpPRyFEjwAMMFDloFhsVjRMll6QkJI50K07QYD00GBSzU3W8vu11q3zlp+ZtLly2Q209y51OO4D8/4GwMAYBavo77BYrFcrK7WGY3xcjkmt/cRFy5Qly91JhPl55NCwVhINHw4DRpEfH7PR6EEDwBMY7g01AcsFmtkZOToqChb83xpQwPTEYHTddsyExTEQCTXuVV2Z7IEr9PpFi9ebN80Go1ms5mpYACAMYWF9PXXtHAhhYczHUpv2Zvna9HN3gckJlJKCp07d3XP4ME0YgSTIfUSYwleIBBkZGTYNzUazYoVK5gKBgAYEx9PQ4bQ1q30xBPXTqPt/lgsltLf3/Y8r6pKbzQOUirFvShXgcdZtYo+/JB+/JEsFhoxQvPyy34MzHloNFJ7O3Xecr2BKnoAYNrs2SQS0d69TMfRf8NCQ+Pl8gvV1SeLi+uZWBgXnMrfn158kXbtsj6eeqqcmfr5b76hLVv69A50sgMApvF49MAD1sKRJ/MXCkdHRemNxgK1WsjloijvfdgMloiPH6eLF2nhwj69CQkeANxAYCDTETgGn8sdFhpqe17d3Nyk1cbL5VwmMwN4vupqOnSIZs3qaz8VJHgAAKcICQhgsVg/q1QiHi8RzfPQbyEh9MADlJDQ1/chwQOA+7FYep7Bw1Mo/f2V/v4tWu2F6mq5n18U5sKD/ul7dkcnOwBwP1lZlJFBXjRu1tY8b8vuZouloqmJ6YjAJyDBA4CbiYmhmho6eJDpOJyCRaQ3Go8UFFyqqTF60ZcYcLwBdztFggcANxMURHPn0unTlJ3NdCiOx2KxYoODJyYkBIpEP6tUuZWVTEcEbqmoiNasIb1+IOdAGzwAuJ+4OLrjDjeYDtSJbM3z+s41c7VGo9BDFuABp2tooB07KCmpN/PR9gD3EwC4pTFjmI7AFfida+aW1NXVtbbGBAeHe8uIQegnvZ6+/pqUSpoxY4BnQoIHAGDe4JAQs8VSXFd3pKAgJCAgXi5ne8U4AugzDofi4yk1deAT6yDBAwC4BTaLFS+Xx8vlVc3Nnj2rHwwEh0PTpzvkTOhkBwBuLz+fzpxhOgjXCQ0I4HQU38saGk6qVI3t7UxHBB4JCR4A3F57O+3fTyoV03G4WqRUmhIRUd7YmFlYiNHz0FdI8ADg9kaPppEjads2amhgOhRXE3C5w8PCUuPitAZDdXMz0+GAc7S10Z49pNM59qxogwcAT3DHHdTYSLW15JOzvdqa523P2w2GgtraRKUSw+q8hMlEW7das7uju1Xi/gAAT8Bm00MPMR2EWxDxeJFSaU5FBRElKhSBIhHTEcHA7NtHdXW0ePEAR73fCFX0AAAeJkgkGhsdPTwsrLShIQdz4Xk0o5Gam+n++52xYjJK8AAAHknI4424ZoHwyqamkIAAjJ73MFwuPfKIk86NEjwA9I3JRDk5dO7cAOfJHpiKCiorY+7y7shCdKKoKKeyUmc0Mh0LuAWU4AGgD4qL6dVXyVYrLJXSn/5EKSlMxHH2LF2+TI8/7t3z1fdJeGBgeGBgQ1tbdnk5m8UaFRWF0ryPQwkeAHrLbKZVq8je5tvQQK+9Rq2tTIQyaxbJZPTVVw4fWeTppGLxuJiYpPBwW3a3L2YDbsRkouPHyfmLBSPBA0BvFRRQefl1e5qbrWVpBnA49MAD1g/Ky5eZuLy7s4+gU7e0HCkoKK6rMw94cXFwmD176Ngxamlx9nUYq6I3GAz//ve/7Zs6na6VmYIAAPRWt0UOxhp8RSJ68kni8Ri6vGcIDwoKDwoqb2w8VlQUJBIlKpX29euAGZmZlJ9PDz3kjG7zXTCW4DkczqhRo+yb7e3tWVlZTAUDAL2RmEhKJdXUXN0jFtPo0cwFhOzeOxFBQRFBQfWtrTqDAQmeSQYDnTtHd95J0dEuuBpjCZ7NZk+aNMm+qdFoNm3axFQwANAbHA698gq9+uqVGWMlEnrpJQoIYDos6B2ZRGJ70qzV5lZWxgUHh+A/z8V4PFdWO6EXPQD0wdChtG4dZWWR0UgjR5K/P9MB2TU2WotHCgXTcXiAAKFwXExMsVp9ubY2IigoWiZDf3vXcWG1EzrZAUDfiESUlkaTJrlTdieiI0foq68Y6tPvebhsdqJSmZ6QwOVwCtVqpsMBp0CCBwCvcOedJBZbc7zBwHQoHoNFFBkUlNhZ7ZFdXt6CYYcOZzZTfj4jV0aCBwCvwOPRAw9YS/DMjNvzBgkKRVFt7bGiohrnj+DyIfv2WR9M1C2hDR4AvIWfHz3+uPVf6Bcxn58SGWk0mwvV6iK1OjUujumIPF9mJuXk0MMPU2cPR1dCggcAL4LsPmBcNnuwUmnfrGttDRAKeRhc1w/t7XTyJN19N0VFMXJ9JHgAALgpFot1prSUx+EMViolAgHT4XgUkYiWLiWhkKnrI8EDgJfS6aihgUJDmY7Ds8nE4ttiY1t1usu1tTqjcUR4uJjPZzooz8FcdkcnOwDwXseO0aZNhDFgjiARCEZGRo6OiuJ3zHJvMpstmNze7SHBA4CXmjzZWnzfvNkFq3r4CB6Hw2Vbs4ZGp8ssKsqvqjJgtboudDoqKGA6iCuQ4AHAS7HZdP/9JBLRTz8xHYq3CRSJ0uPj5X5+Z0pLz5SWtmL0vI3RSF99Rfv3k3t870EbPAB4Lz6fHn4Ya9I4idzPT+7n16rTten16H9HFgtt30719fToo+Qegw5QggcAryYSERclGSeSCASKjlmLzRZLZmFhWUODjzbOV1RQWRk9+CBJpUyHcgUSPAAAOACbxUqNizNZLJkFBRdraoxmM9MRuVZEBD39tFuN2kCCBwCfYTbTpUtMB+HN2CxWjEyWnpAQJBLlVlQwHY7LuVk7BRI8APiMsjLaupVOn2Y6Du+n9PdPiYy0Pb9cW1uHVf6YgKYpAPAZ0dE0axbt20d8Po0YwXQ0A1VcTN9+S62tNGoUTZtGbruke7RMVlhbe6GqKlomi5BK3TXMflGprPdSWBjTcXQPCR4AfMnIkdTeTseOUVISsT24CvPYMXrtNTIarc+/+ca6+eKLTMd0E3wOZ2hoqNliKW1oyCwoGB0dLfKOcQ3l5bRlC40ejQQPAOAe0tJo7FiPzu4WC7333pXsbnPwIM2ebc01bsvWPB8jk9k2NTodh8324ExfU0ObN9OQITR9OtOh3JQH3+IAAP3kuXmlg1rdzQy8588zE0z/sFis/KqqUypVY1sb07H0S3ExxcTQXXcxHUdPUIIHAPAw/v7E5V5XgiciuZyxePpBwuePjorSGY0FtbV5VVVDQkJkTKyY3n+33UYWi/t2fOiAEjwA+DRpYSHV1zMdRd8IhTRnznV7FAqaNo2xePpNwOUmhYWlxsWJOleoM3nQ6Hn3zu5I8ADg20wmv6oq2riRGhqYDqVvnn6aHnmE/PyIzaYxY+jNN0kkuvW7dDrKySGVyhUR9h6bxbI1xhtMplMqVXZ5ebvBwHRQ3oCxKnqdTrd48WL7ptFoNHvQFzcA8A4cTnla2qBz56w5fuFCCgpiOqDe4nBoyRLro/f1xD/+SO+8QxqN9XlyMr36qtv9uDwOJzUurlmrza2sNFssgxSKILGY6aA6tbfTvn10xx1Mx9EHjCV4gUCQkZFh39RoNCtWrGAqGADwWWY2mx54gHbsoLY2t8t4vdDL7F5RQX/729Vm++xsevtt+stfnBpaPwUIhWOjo3VGY01Li7skeK2WMjLIbPaswRfoZAcAPo/LpXnzmA7CuX76qWunvOPHrV9p3CSB3kjA5UZ1rtqSVVYm4fPj5HIOI/lVp7Nmd5OJFi50399Xd5DgAQC8X5fsbhtMf+NO9zQyMrKqufmUSiXm8xOVSlePnufxKDqaUlM9K7ujkx0AQHcs3rbkaWpq18r84cMpIICxePoqNCAgNS4uJjg4r7LSYDK59NpsNt1+O3nWKL4OSPAAANdTqejTT6m5mek4HCkhgZ5+mjicK5vh4fT88wyH1A8BQuGY6Ghex49R2dRU0dTEdERuDVX0AADXCwkhHo+++IIWLKDAQKajcZh58yg9nbKzyc+Pxo6lzpHnnkrp76+qrz9aUBAaGBgTHMxx7Kh0rdZ6D9i/EHkmlOABAK4nFNIjj5BEYs3xntJM3TuhoTRzJk2Y4PHZnYg4bHa8XJ6ekCDk8U4UFdW0tDjs1K2t9PnndPCgw07IEJTgAQBuIBBYc3xJCXHxIenuwgMDwwMDbZ0mDCZTm14f2JtJf26mpYUyMqxl9/R0x8XIDJTgAQC6w+NRQgLTQUBv2SvoSxsajhUWVvW7C8V33xGfTwsWeGKvui7w5RQAALwEj8MZER5uMpuL6+qOFBREy2T2wfS9NXu2tfguEDgrRBdCggcA6IWaGmpvp5gYpuOAW+Ow2QkKRYJCodHpbHvMFgu7l73wPG2wew9QRQ8A0At5ebR5M124wHQc0Ad+nQXxrLKy0yUlzVot0xG5FErwAAC9MHUqsVi0fTvdeSeNGsV0NNA3o6Oi2g2GyzU1rXp9XHBwyLVT/OTnU3k5zZjBZHzOgQQPANA7U6aQWOxxi8eDjYjHS46IMJrNqro6hb3G/swZ+u47Sk1lOjqnQIIHAOi1ceOYjgAGhNvRPG97XnzqVFtxccKMGYKxY5mOyymQ4AEAwBfFxsbWi8XnJBJOScmgkBB/r+g5fy0keACA/mptJRbLm/pd+xa5XCaXy4ja9PrLtbWRQUEyzx/7fi30ogcA6K/vv6f166mujuk4YEDEfH5KRIQtu7dotar6eotXLCeIBA8A0F933kkyGW3YQCoV06FAL1RWUnZ2z4f4CYVsFiuzsDC/qsrV69I6GhI8AEB/8fk0fz4lJdHp00yHArdy4QJ98QUVFPR8FIsoSipNT0hQ+PufLS0tqK11VXyOhzZ4AIABYLFo5kwym5mOA3p04gT98AOlptLUqb18R7BEEiyR2OvqG9rapJ7W2QIJHgBgwNioDXVvCgXNnk0pKX19H6tzglu1RpNbWRkplXpQ4zwSPACAQxkM1NhInYOtwS3ExQ3wBIOUykSlsqyhoUSrpaqqoaGhDorMifCtEwDAoc6coc8+o5wcpuMAB7M1z8cIhWGBgbY9ZvfubM9YCd5kMn3//ff2zfb2dl3nsj8AAB7sttvIZKLdu6migmbMQO09M44codBQJ63oHygS2Z4UqdV1ra1xcrnCz88ZFxogxhK8xWIpLi62b+p0OqPRyFQwAACONGEChYTQiRNkNiPBu5pOR7t2kUpFd93l7EslKBTRMlmRWn2pujpSKo2SSlm9XJTWJRhL8Fwu96mnnrJvajSaM2fOMBUMAICDxcdbH+BiJhOtW2f9XvXoo6RUuuCCPA5ncEjIoJCQsoaGVr3ez53mu0UnOwAA8BYcDk2fTtHR5NpEa2uetz2va20tbWgYpFRK+HxXxnAjJHgAAOezWOi772jcOJLJmA7F2w0axOz1gyUSAZd7qbraYDLFKxTBzM1vj8YhAADns42dW7uWzp1jOhSv09zMdARd+QkEo6KiRkZF1ba0FDO3VAESPACA8/H59NBDNHEi7dtHR48yHY230Olo71765BNqb2c6lG7wOZyhoaGxwcG2AXWXampcPLk9qugBAFwlNZViYsi71iRlTFER7dlDLBbdfz91jlvrvcpKWrOG8vNJJqN582jKFOcE2YnNYgWJxWdKSwVcbqKrmueR4AEAXMgTZkDzDK2tNGgQTZ1KfU+WTU20YgXV15Mt0+fk0MqVNGuWU8K0U/j5Kfz8NDrdpepqC9HoqCjnXg9V9AAATDKZMOddP40YQTNn9iO7E9Hu3Veyu9369Q6Lq2dXmucjI22bLVqt8ybDQ4IHAGBOWRnt2UMbN5JazXQobk+rddSZKiq67qmpIVdOO8vunA+nSavNLCi4XFNjcsKChEjwAADMiYmhxYutT9asoYsXmY7GXRkMdPgwffSRNQ87wo1TEEVHEyNz0EUGBaUnJPgLhadUquzycsf2wkMbPABAV/X1tGHDlR5YDzxAo0c782IKBS1YYL1YTIwzL+OxCgtp714ymWjGDEet0XfXXfTNN6RSXdnkcGjpUoecuJ9CAgJCAgKatVq2Q79lIMEDAFynpYWWL6fq6iubJ07QqlWUnu7kqw4d6uQLeCwOhwYPpkmTSCh01CmFQnrvPdq8mXJzrd/h7rvPLX79AY77AW2Q4AEArvPNN1ezu20Ouv/+1/kJvou2NmuxNT0dve4pJsYZdRsSCT3xhMPP6l7QBg8AcJ2yslvvcTq9ngwGWreOtmyh2lqXX545zc107BjTQXgJlOABAK7TOYLpqogIlwcRFEQPP0wlJXT4MJWWOqrt2a21tFBmJp07Z/3ZR47sx9w10AUSPADAde66i3buvFpLz2LRk08yFEp0ND36qEvHbzFo/35Sq62//WHDmOnR7nWQ4AEAruPvT++/T599Rnl5JJPRQw85uRf9LXXJdpmZFBhIQ4cS27vaWGfPJqEQqd2BkOABALqSyWjFCqaDuBmNho4epe+/t37vSE0lDofpgPpOq6XsbJJKKTHx6k7UyTuasxJ8W1ubWCx20skBAHzXzJk0aRJlZdHlyy7v3D9gajUdOkRFRSQQ0OTJTEfj5Ryf4Kurq1955ZXq6urt27c7/OQAAGAt7KalWR9dlJZSZKRb13Lb6hvmzKFBgzyy7sGjODjBNzU17dixIywsrOLGqX4BAMB5mppo40ZryTg2loYMYX7qFq3WWlI3m2n48Ks7pVJ64AEmo/IlDu6jERgY+Ktf/SosLMyxpwUAgFsIDKRf/5qmTSOTiS5cYDKSxkZat47ef5+++YZKSpiMxLehkx0AgLfw86ORI62PLvR6WruWQkIoLIwiIhw5rt9goOpqYrGuO6efH0VF0ZQp1n+5yDKMwa8eAMDbWSzWrF9ZST//TNnZtGTJda/m5RGPRwKBNRmHhFw3+s5gIK2WTCbrE4mEru06XVpKO3eSRmM9+dCh1yV4Lpduv90VPxf0aKAJfvfu3YsWLbI9P3PmTFxc3M2OPHTo0D//+c+bvWo0Gs03WQ237f+zdzewTZR/HMCfruvL1na7zcBGmWs3kM11I2y4RaIJiQEBp0iMBjGRDWMwCorOwECYTqKzEQVMFIIGTYxOMYLOITqNIAyzNDpW2YZ2A0WU2eHouq1ru77c/TOOfxmVl7XbfO6u308Wcrun7L5pntyvd/f0edxuG93bTSAqZ8+epR0BxCRWOgzDDP/cfHNcIMBefkY1Hj6s6u/np9M5tXBhYMSSJ2mtrcypU/z2uZkze0css6rweLRGo1+j8TLM8H+JmbO0WDqMXq8fa4G/8847T58+zW8nJSVd45VzL7haq8vlevoqXztNTEzMyckZY06IKegwEJFY7zA5OYRlh6/R/f5pGs1lg/DT08nttw9fkcfHT05MnKxUXvYfZ83678MKgVg6zFgLvEKhYBhmnMIAAAANcXFEpRr+CZOcPPwD4jTOo+gdDsfOnTvb29sZhtm+fXtra+v4/n0AAAAYjXEeZJeamvr444+P798EAACASElrrQIAAAC4AAUeAABAglDgAQAAJAgFHgAAQIJQ4AEAACQIBR4AAECCMBc9AICYOJ3k0KHhf00mUlJCOw0IGAo8AIBodHaSdeuIy3Xx1zvuIBs2UI4EgoVb9AAAY8KyxGYjbW3E75/wY73xxqXqTgg5eJA0NU34QUGkcAUPABC9v/4iL7xAzpwZ3k5JIRs3XmE19vHi811hzbaWFjJnzkQdEUQNV/AAAFHiOPLiixerOyGkt5dUV5OBgYk6nEJBEhLCd2ItGLgaFHgAgCidPk3+v1z2RS4X+emniTqcTEYWLbpsj1pN5s2bqMOB2Mm4C4v8C4HH40n496dTQliWjYvDBxEYLXQYiMhYOkxnJ3niifCd69aR+fPHIdgVBQJk1y5y4ADx+ciNN5KnnyYzZ07UseCKRHSGEVCBBwAQF5YlZWXEbr+0R6Ui779PUlMn9rh+P/F4SFLSxB4FxE4cH0MAAAQoLo5UVV0q52o1qayc8OrOP4xHdYfrwhU8AMCYeDykpYX4fKSwEEPeQEBQ4AEAACQIt+gBAAAkCAUeAABAglDgAQAAJAgFHgAAQIJQ4AEAACQIBR4AAECCUOABAAAkCAUeAABAgkSwHvx3333X1NREO0U0vF6vXC5XKBS0g0SMZVmv15uYmEg7SDQGBgZ0Oh3tFNFwu91qtVos61iMFLhArVbTDhIN8XYYl8ul1Wppp4jG0NBQXFycGM+NHMe53W6NRkM7yPXdf//9IpjJ7r777tu8eTPtFNH45JNPsrKyiouLaQeJWFdX1549e5555hnaQaKxdu3aLVu20E4RjW3bti1dulSv19MOErGWlpZff/112bJltINEQ7wdZv369S+//LJcLqcdJGL79+/X6XRz586lHSRiAwMD27Zte/7552kHub7MzEwRXMErlcr8/HzaKaJx9OjRrKwsMYbXarWTJk0SY3JCSHJyskiTT5o0acaMGUajkXaQiDmdzr6+PpG+7eLtMAzDmEym+HgRnMbDWK1WhmHE+LY7nc7U1FSxJBffzUAAAAC4LhR4AAAACUKBBwAAkCDxPbwRkQceeEClUtFOEQ29Xr9mzRraKWLOmjVrbrjhBtopolFYWJibm0s7RcypqakR4wN4QkhpaakYxwaKjig7h1iI9GTND2ycMmUK7RQxR7zvueYC2iliTmZmJu0IUUpJSaEdISbgFj0AAIAEocADAABIEAo8AACABMmrq6tpZ7gOlmVNJhPtFCAa6DAQEXQYiEhcXFxOTg7tFKMigqlqAQAAIFLCGkXv8Xiee+45lUrV09NTXV2dkZEx+laIQb29vZs2bdLpdE6n02w2MwwzsnXFihUKhSIpKcnhcNTU1KSnp9NLCoLwxx9/1NTUMAzj8/nMZnPYt1g5jnvzzTfPnj3LL+JiNpvpJQVBOH78+I4dO3Q6nUql2rx5c9hCULt37z5y5AjDMKmpqVVVVUJcJooTkscee+ytt97iOK6xsbGoqCiiVohBpaWldXV1HMd99NFHixcvDmutqKjgN1555ZVFixbRCAjCYjKZfv75Z75LPPXUU2GtW7duXbduHb9tNptpBAQB8Xq9GRkZf//9N8dxq1atevXVV0e2fvnll9OnT/d4PBzHPfjgg2GtAiGgAj80NKTT6X777TeO41iWTU1NtVqto2yFGGS325VKpdvt5jhuYGBAoVB0d3ePfMHg4CC/UVtbm5WVRSkmCMWPP/6o1+v57fb2doZhAoFAqNXr9arVarvdTi8gCMtnn31WUlLCbzc0NOTm5o5sXb16dXl5Ob+9d+9ek8lEI+N1COiWgt1uHxgY4O+jymSyqVOndnR0jLIVYtDJkye1Wm1CQgK//J1Gozl58uTIF/Dr2Tudzo8//risrIxeUhAEm80WekwzdepUp9PZ3d09sjUpKSktLa2jo6O1tRWDkyCsw3R2drIsG2pVqVSBQIDfNhgMp06dohTzWgT0DP78+fMymYw/X/NzY/X09IyyFWKQw+HgSzhPq9WeP38+7DXvvfdebW1tenr68uXL//OAICwjO4xWq+XPKqHV9202m1wu37p1a2Ji4vfff+9yufbv3081L1AW1mGCwWBfX19oDr6ysrL58+d/8cUX6enp3377rfcCtVpNNXI4ARX45ORk/lY8P/LF7XYnJyePshViUHJystfrDf16xS6x4oJjx44VFxfbbDbxTh4MYzeyw7jdbn5PqFWj0SQkJFRUVBBCysvLGYZpbm6ePXs2vbxAWViHkclkOp0u1FpQUHD06NGvv/6aEFJSUqLRaIRW3YU10c2UKVOUSmXouvzcuXNGo3GUrRCDjEZjX1+f3+8nhAwNDfX39xsMhlAr/wiK3y4qKpLL5S0tLfTCAn1Go3HkCUStVqelpYVas7Ozu7u7g8EgIUStViclJfX29tILC/SFdZiMjIywpX2mT5++evXqxYsX2+32vLw8SjGvRUAFPiEh4Z577mlsbCSE/PLLL0ql8tZbbyWE7Nu3z+VyXa0VYlZmZmZRUZHFYiGEHDly5JZbbjEYDIFA4NNPP/X7/SdOnPjwww/5V547d66/v3/GjBm0IwNNt912m9/v//PPPwkhBw8eXLJkiUqlcrlc+/btI4Tk5ubm5eUdOnSIENLf3+92u/Pz82lHBpruvvtum802ODjId5ilS5cSQv75558DBw7w36Djn7uzLPvuu+8Kc/lNYU10Y7fbV61aZTKZrFZrVVVVcXGxw+FIS0urr69fuHDhv1tp5wXKOjo6KisrCwoKrFbr66+/ftNNN7W3t8+cOdNqtTIMU15ePmfOnPj4eIvFsnz58mXLltHOC5Q1NTW99tpreXl5bW1tu3btmjx58ldffXXvvfd2d3enpKT8/vvvFRUVs2bNamtrKy0tLS8vp50XKKuvr6+trZ02bVpnZ+fu3bu1Wu0777xTWVnZ09PT2Ni4ffv2wsJCm81WVFT07LPP0g57BcIq8Dyfz6dUKkO/8pNOXK0V4BodhmXZoaGh0NhMgOueYQQ4VAroCuswg4ODocWR3W73yKG+QiPEAg8AAABjJKBn8AAAADBeUOABAAAkCAUeAABAglDgAQAAJEhAM9kBgPCZzeZjx475fL6srKxHH33UZDLV19d//vnnHo9n3rx5jzzyCO2AAHARruABIALr169fsGBBXV3dtGnTTCYTIeSuu+46c+bMk08+ieoOICj4mhwARKy0tPTw4cPHjx/Pzs7euHEjwzBr166lHQoALoMCDwAR6+rqys/PLygo2LBhw44dO+rq6mQyGe1QAHAZFHgAiMYHH3zw8MMPGwyG5uZmLNMHIEAo8AAQjWAwaDAYHA5HS0tLTk4O7TgAEA4FHgCisWnTJkLI22+/nZ2d/cMPP8jlctqJAOAyGEUPABH75ptvTpw48dJLL+3cudNisWzZsoV2IgAIhyt4AIhMV1fXkiVLGhoaUlJSCCEPPfTQ3r17m5ubsYA6gKCgwANABILB4IIFC2pqakpKSvg9DofDZDLp9XqLxRIfj7mzAIQCt+gBYLSam5tXrlwZDAYbGhpCO/fs2TN79myZTLZy5UqLxUI1IABcgit4AAAACcIVPAAAgAShwAMAAEgQCjwAAIAEocADAABI0P8CAAD//5FTPCCQYbDbAAAAAElFTkSuQmCC)" - ] - }, - "execution_count": 24, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "// deno-lint-ignore-file\n", - "\n", - "import { display } from \"https://deno.land/x/display@v0.1.1/mod.ts\";\n", - "import pl from \"npm:nodejs-polars\";\n", - "import plot from \"../plot/mod.ts\";\n", - "\n", - "const data = await Deno.readTextFile(\"assets/X_Y_Sinusoid_Data.csv\");\n", - "const df = pl.readCSV(data, { sep: \",\" });\n", - "\n", - "const real = pl.DataFrame({ x: new Array(100).fill(0).map((_, i) => i / 100)}).select(\n", - " pl.col('x'),\n", - " pl.col('x').mul(2).mul(3.14).sin().alias('y')\n", - ");\n", - "\n", - "const draw = (x, y, title = \"Sinusoid Data\") => \n", - " plot.DrawPlot(\n", - " { \n", - " title,\n", - " width: 7,\n", - " height: 4,\n", - " XLabel: \"X\", \n", - " YLabel: \"Y\", \n", - " }, \n", - " { type: \"line\", data: [real.x, real.y], legend: \"Sinusoid\", lineDashes: [3, 4], lineColor: \"#ff8888\", lineWidth: 1 },\n", - " { type: \"scatter\", data: [x, y], legend: \"Data\", lineDashes: [3, 4], lineWidth: 2, glyphColor: \"#4444ff\", glyphShape: \"circle\" },\n", - " { type: \"trend\", data: [x, y], legend: \"Trend\", lineDashes: [4, 2], lineColor: '#aacccc', lineWidth: .5 },\n", - " );\n", - "\n", - "\n", - "draw(df.x, df.y);" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Deno", - "language": "typescript", - "name": "deno" - }, - "language_info": { - "codemirror_mode": "typescript", - "file_extension": ".ts", - "mimetype": "text/x.typescript", - "name": "typescript", - "nbconvert_exporter": "script", - "pygments_lexer": "typescript", - "version": "5.6.2" - } - }, - "nbformat": 4, - "nbformat_minor": 2 -} diff --git a/notebooks/regressions.ipynb b/notebooks/regressions.ipynb new file mode 100644 index 0000000..869464c --- /dev/null +++ b/notebooks/regressions.ipynb @@ -0,0 +1,126 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Regressions\n", + "\n", + "$X = (0,1)$\n", + "\n", + "$Y = sin(2\\pi X)$" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": {}, + "outputs": [ + { + "data": { + "text/markdown": [ + "![name](data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAkAAAAEgCAIAAADT5FumAABLrklEQVR4nOzdB3hT5foA8Dd7NknTNt1NW0YLpZVNywYFRIELCCIgQ1FwsQQHV0XkqlfF+5d78TpAryCyRAQEFBAQQfZqKdBS6N4zHdnr/J/00FBCWjqSnCR9f08enpyRc9720LznO+c778ckCAIQQgghT8OkOgCEnE6pVAqFwsZzTCYTg8Fwwa7t7ujgwYNHjx4VCASrVq1yQQwIeSs61QEg5CwlJSUzZswYP3780qVLx48fHxcXl5ycTC4aMmTIggULnB1Abm6uWCzev3+/zfxHH300KChox44dNvMPHz48depUHo83ePDgxx57LKnezJkzL1265OxQEfJEmMCQ15o1a1bnzp337du3YcOGffv2zZw5s7q6mlz0wgsvTJ061dkBBAUFLV++vFevXi1cf/To0S+//LJWq33//fd//fXXM2fOHDp0KDAwcMCAAe+++27znz1w4IDRaHRE1Ah5DLyEiLwTQRAnTpyYOXOmdc706dPZbDb5fvbs2U19ikajtXD7969pM5PD4dx/kZBch06n2739TH7cuhGRSPR///d/RqPx/ffff/TRR5OSkuwGo9PpnnvuuZycHCYT/6JRB4ItMOSdaDRaVFTUypUrT5w4Qc6JiooKDQ0FgCNHjowbN27x4sUAcOvWraeeemrixImvv/56jx49+Hw+mXLOnz8/YcKEl19+GQCys7OXLl0aHx+v0WgA4Mcffxw4cODcuXOHDx++b98+MietXbv20UcfJWd+/vnn5B4///zz3r177927l5zMyMgYNWrU448//uyzz/744492MyWZ1Wxy2+rVq81m8/fffw8ACoVi6NCh06dPHzly5Pjx41UqVWlp6dy5c0tKSmbNmvXJJ58AwPr160eNGjVr1qz4+PiNGzc6/5eNEEUIhLzUoUOHyL4bcXFx//rXv+rq6qyL5s2b97e//Y18v2rVqoSEBK1WazabV61aRafTlUolQRAvvPDCuHHjyHX++usvsjOIwWDg8/kXL14kCCIrK+uXX34hCGLr1q1hYWHkp8rLyyUSyU8//UR+0M/P77vvviMIQq/XR0ZGrlq1ipz/6aefxsbG3h/z8ePHAeD48eM288PCwkaMGEEQRFlZ2RdffEEQhMFgEAgE3377LUEQR44cAQCtVmvdOBnMF198IRKJnPCrRcgtYAsMea3Ro0enpaW98847arV62bJl8fHxhYWFdtdks9kcDodGo02cONFsNldUVDS1TbPZbDKZdu3aZTQao6Kixo8fDwDffvvtmDFjBAIBAPj7+48ZM+a7776z+eChQ4dycnLa3HNEKpUqFAoACAgIePHFFwGAyWRGRkaWlZXdv/KyZcvIYLp06VJbW6vVatu2U4TcHCYw5M3CwsJWr16dmZm5cePGoqKif/zjH82v/8B7SGw2+9NPP/3Pf/4jl8tXrFihVqsBICcnRyaTWdcJDg7Oycmx+WBWVhaXyw0MDGzbD1JUVNS5c2cAUKvVK1eunD9//vLly0tKSuxehzx79uzzzz+/ePHi9evXt213CHkEvOWLvBNBEOnp6d26dSPvh82ZM+f3339PT09v/5ZfeeWVGTNmbNmy5b333svNzd26datAINDpdNYVdDqdv7+/zacEAoHZbG5hDxEbWVlZFRUVffr0IbufSCSSDRs20Gi0Q4cO2V152LBhFy9ejI+PP3r06M6dO9u2U4TcH7bAkHcymUwffPBB4zl0Or1Tp04t3wKLxaqtrbWZqdFoUlJSpFLpwoULV69eff78eQB46KGHbt++bV0nLS0tPj7e5oOxsbF6vf7atWtt+FlWr14dERGxaNEiADh37lzv3r3t5iSz2QwAV65codPpcXFxTXUJQchrYAsMea09e/asW7duypQpfn5++/bt++23306dOnX/auTdYOt767/x8fFfffXVhg0bZDLZn3/+Sc4nb6dt27aNzWafOnVq2LBhALBixYphw4YdOXJk+PDhu3fvzszM3Lx5s81eEhMTH3744eeff37NmjUmk+ns2bN284pKpQKA9PR0iURCo9EyMjI2bdpUVla2b98+Pp9PJsIffvihe/fuubm5CoWC3EjXrl0BYNu2bQkJCTExMTqdbs2aNQMGDLB2gETIKzGwmA3ySnQ6feDAgTdu3NizZ8/+/fvNZvOGDRvkcjkAbN68Wa/XBwYG3rp1SyQSpaamdurUqaysLCIi4ocffkhKSsrMzBw4cGCvXr04HE5KSgqfz588ebJUKr1x48aQIUMUCsX27dsPHjzYp0+fd955h8ViBQQETJkyZe/evdu3b+fz+R9//HFERER1dfW6desSEhLIZlx0dPSECRMYDMaBAwdqa2snTZokEAgUCkX37t2tMR8+fPivv/4id3H16tUbN25wOJwJEyasXr06KCiIXGfYsGH5+fnXr18n63SUlpYGBwdHR0f7+PhcuHCBTqc/9thjsbGx586dq6ure+GFF4RCYXp6+oABA6g7FAg5Cw0vLyCEEPJEeA8MIYSQR8IEhhBCyCNhAkMIIeSRMIGh5pSVwZUr0HRhCoQQogx2o0f2EQR8/jns22d5Q6PBxInw0ktUx4QQQo1gAvNsly7B2bPAYMDQodCoP7YD7NkDv/xy5z1BwO7dEBEB48Y5chcIIdQeeAnRg23cCG++ack0u3bB4sV3841D/PHHg+cghCiXn59/7NixEydO5ObmWgc11Wq1V65cccHeCwsL8/LybGYWFxe///778fHxZ8+edere3SWBqVSqV155xe6iW7duuTwcD1BUBFu33jNn/XpQKh22/fqyRPdw+Hi/eGS9FR5Z1zAajTNmzFi0aFFWVlZqauq8efOmT59OLtq4cWPv3r3Ly8sduLuqejYz582bN2PGDJuZwcHBr7322rVr18jKMs7jLpcQCYJoatAH8/1fpQjg5k2weQZdp4PMTHjoIcdsPynJsovGBg1yzJat8Mh6KzyyrrFhw4br16+npKSQk/Pnz583bx75fubMmTExMQEBAQ7cnd2qF+vWrTM6/Ny2xdwlgaHW8vVt6cy2mTYNbt+G+nEcLYYPhylTHLZxhFD73bp1S6VSmUwmBoNBlp/+5z//SVayNplMvXr1IgiCRqPV1NQQBCESiTQazfXr1yMjI2UyGUEQNTU1ACASieh0em1trdls5vF4HA6HHLv12rVrAoEgMjLSx8eH3J1Wq83IyJDJZF27dmWxWOQcmUxG7p1EEERubm5hYaFjc2dT3OUSImqthASwKa3erx9ERDhs+0wmvPsufPEFvPkmfPklvPUW0PE/C0LuZMCAAZmZmWPHjj1z5gw5JzQ0FABqamo+/fRTX1/foqIiANi6dauvr++rr746e/bsGTNmREdHp6am6nS6f//7376+vvn5+QBw8ODB7t27r127lhzQoF+/fidOnPjll1/GNXTc2rFjx6hRo06fPr19+/a4uLjTp08DQEZGxlNPPTVixAhynfLy8hEjRixevDglJWXHjh2u+BVQPST0HXV1dfPmzbO7KD093eXheIaqKuK994ixY4lx44g1awiViuqAWgmPrLfC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)" + ] + }, + "execution_count": 1, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "// deno-lint-ignore-file\n", + "\n", + "import { display } from \"https://deno.land/x/display@v0.1.1/mod.ts\";\n", + "import pl from \"npm:nodejs-polars\";\n", + "import plot from \"../plot/mod.ts\";\n", + "\n", + "const data = await Deno.readTextFile(\"assets/X_Y_Sinusoid_Data.csv\");\n", + "const df = pl.readCSV(data, { sep: \",\" });\n", + "\n", + "const real = pl.DataFrame({ x: new Array(100).fill(0).map((_, i) => i / 100)}).select(\n", + " pl.col('x'),\n", + " pl.col('x').mul(2).mul(3.14).sin().alias('y')\n", + ");\n", + "\n", + "const draw = (x, y, title = \"Sinusoid Data\") => \n", + " plot.DrawPlot(\n", + " { \n", + " title,\n", + " width: 6,\n", + " height: 3,\n", + " XLabel: \"X\", \n", + " YLabel: \"Y\", \n", + " }, \n", + " { type: \"line\", data: [real.x, real.y], legend: \"Sinusoid\", lineDashes: [3, 4], lineColor: \"#ff8888\", lineWidth: 1 },\n", + " { type: \"scatter\", data: [x, y], legend: \"Data\", lineDashes: [3, 4], lineWidth: 2, glyphColor: \"#4444ff\", glyphShape: \"circle\" },\n", + " { type: \"trend\", data: [x, y], legend: \"Trend\", lineDashes: [4, 2], lineColor: '#aacccc', lineWidth: .5 },\n", + " );\n", + "\n", + "\n", + "draw(df.x, df.y);" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": {}, + "outputs": [ + { + "data": { + "text/markdown": [ + "![name](data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAqAAAAGACAIAAAD9Gkc5AABrlklEQVR4nOzdB1hT1xcA8EPCCGHLkKGCMkW04La4xb0HuKqiuLXWvVt3tVZtrdbRPyqu4kDcW5HioooL2ciesgOB7OT/QZQiywRe8pJwfh9fv7x178GGnNz37lAXiUSAEEIIIdWiTnYACCHZevDgwb1796hU6s6dO8mOBSEkPxSyA0AIEeDNmzcLFy7U1tZ2dXUdPHiwh4eHj49PXl4eAHh4eNja2p45c4bsGBFCcoUJHiFV4ObmtnXrVjabPXv27Lt37964caOgoKBr1658Pl/yQq5evSrLGBFCcoUJHiEVRKPRFixYkJSU9OrVq7rOqdb/JjMzc/ny5XKJDiEkD5jgEVJNdDodAD5+/Fhtv0gk2rdv39ChQ729vfv06XPo0CEAiI2N9fb2zsrKmjx58qlTp0gKGSFEJOxkh5BqCgkJ0dLS6tSpU7X9Z86c+eOPP6Kiouh0em5urp2dnZWV1ejRo8ePHx8dHe3v709SvAghgmGCR0ilREZGXrx48cWLF35+fkePHrWysqp2wrFjx4YMGSJu35uamg4cOPDEiROjR48mKV6EkKzgLXqEVEphYWFRUVH//v2jo6NnzJhR84Tk5GQzM7PKTQsLi+TkZPnGiBCSB2zBI6RSevbsOWfOnHpO0NHR4XA4lZtsNtvExEQuoSGE5Apb8Ag1Ld98882HDx8qN2NiYtq3by9+LRQKyYsLIUQwTPAIqQgWiwUAZWVlNeefFlUQv16/fv3jx48fPXrE5/PPnTuXlpa2atUqAHBwcMjKyrp37154eDgZ4SOECKaGc9EjpALi4+NPnz4tboLTaLTly5eLu9GJp6p9/PixQCAwNDScN2+enp5eQkKCn59fdnZ2hw4dRo8e3apVKwDg8/mbNm3Kzs4eOnTohAkTyP6FEEKNhQkeIYQQUkF4ix4hhBBSQZjgEUIIIRWECR7JC/bQRgghOcIEj2ROKISMw9eyNh3h8cgOBSGEmgxM8Ei2kpNhjjcPVqzU+eWn+ROL3r8nOyCEEGoaMME3Vffvy+GeuVAIW7ZAl9ADVqx4fV7+sFdbt2yBsjJZV4sQQggTfNOTlwcHtjFKRk69ONj3yRPZ1pWQAMzE3GlJW8WbY9IO6mfGvn4t20oRQqhSWlpaUFBQSEhISkoKn88X72Sz2W/evJFD7RkZGampqdV2ZmVlbd++vX379qGhoTKtXVESfGlp6eLFi2s9FB8fL/dwVBaTCUuXgqXvFj1O7qB/Nu75kXH/vgyrEwhgZsIGHT5DvEkV8ebHLfv8JyYr+IZBUsE3jKri8/lTpkxZsmRJYmLi+/fvfXx8Jk+eLD7k5+fXsWPH3NzcBhQr1RvGx8dnypQp1XZaWFisWrUqIiKitLS0AQFITlEWmxGJRGw2u9ZDOD82gW7fBs3E2DFpBwHAgJc7LXGLn9++gQNlVZ09861jxrGqe7rm32bl3QIYJqsq8Q2DpIRvGFX1v//9LzIy8t27d+LNuXPn+vj4iF9PnTrV0dHR1NS0AcVK9YY5cOAAX9ZtmropSoJH8pGeDvPjllFFn7qzj0k7eDNpnkDgSKXKpLpsLerKzn21tbcIBOZJSdtsbecuWdLcrbe+TCpDCKEq4uPjS0tLBQIBteIDTkNDY+fOnRV3Fsu5ubmJRCI1NTUGgyESifT19VksVmRkpI2NjZmZmUgkYjAYAKCvr0+hUIqLi4VCoba2tpaWVsWtUGZERISOjo6NjY2enp64OhaLFR0draWl5eDgoKGhIX4QYGZmRq3y8SoSiVJSUjIyMhr23UJainKLHslH94JbXfNvV25SRbylqctklN0TEhIWbty4/6b/oXs95++xG7NyakevSDdPO6iyGDlCCMlIt27dEhIShg4d+vz5c/EeKysrAGAwGHv27DEyMsrMzASAv//+28jIaPny5dOnT58yZUqbNm3ev3/P4XD2799vZGSUlpYGAHfu3HF2dv79998BIDo6ukuXLiEhIdeuXRsxYoS45PPnz3fr1i0kJOTcuXPt2rV79uwZAMTFxU2aNKlfv37ic3Jzc/v16/fDDz+8e/fu/Pnz8vgnECmGkpISHx+fWg/FxMTIPRyVxTt49G77FSeMhx6ktTpjPu2i9YqMyStE2dmEVxQVFTVmzJiCgoLKPRwOZ+rUqYRXVBO+YZBU8A2jwlauXEmhlLdjHR0dDx8+LBAIxPvfvn1bcUczXSQS5eXlAUBoaKhIJOLz+aamplu3bhWJRBERERUDfZPFl7i6uu7atUskEnl6es6dO1e88/bt2yKRKDs7W0dH5/Hjx+Kdv/zyi729PY/HE4lEmzdv7ty5s3j/vHnzunfvLhQKKx9JP3jwQKa/Prbgmxb1RXO/fbbniJ2hf6ft5zpPcbqxx/LvPdC8ObG1XL/+dsOGDSdPnjQyMqrcqampCaBWWFh7TwuEECLcr7/+mpiYuG3bNg6Hs2DBgtmzZ9d/PpVKdXZ2Li4uruccU1PTwMDAc+fO8fn8IUOGAEBQUBCLxfr222/FJwwYMCC+QrULL1++PHz4cDU1tUb/WpLCBN/kvHiRbm/ffORIKxubHBcXggsXiWDv3tAff/z50KEz+vrVn7UbGvY7eDCY4CoRQqhu1tbWGzdujIuLmz59+okTJ8Tt9Xp8NQHPnTt33LhxM2fOtLS0PHz4MABkZmbq6emJbxUAQLNmzcRj4apexeVyc3JyWrRoUV/R//4LgYGffioeH/wnPf2/Qy9fVr+w8lBgYNXdZCb4vCry8/Nx4Vr5OHTojLv71A4dTLS0cogtWSiEn3/+5++/DwYGnjY3p9c8YeTIYUFBd4itFCGEanX9+vXK1xoaGitXrgSAnJzGfu7RaLSjR4/m5OT4+PgsXLgwMjLS1NSUyWRWpjBx7zwbG5uqV2lqahoZGX1lXJyGBtBon34oX2ZnKvW/Q+o1esdXHqLRqu4mrRc9l8vdvHlz5SaPxxP/oyCZ+vgR4uJeHTq0VijMfvSI4AQfEHD35s3zV674tWxZ+/uqe3fzvLz0rCywsCC2ZoQQqu7mzZsdOnSwtrYWb6alpRkYGNjZ2Ul4uY6Ojrh1XlmC2LVr11atWqWnp7djx44//vgjKyvL3d1dTU0tPDz8m2++qWiH/2tiYtK6detqBbZv3/7BgweLFi2qs8qOHes8ZGFR3+fmsNoHHpOW4DU1NQ8ePFi5yWQyly5dSlYwTcfly2EODp3MzEAgMC0oKCC05MuPHt0LCfFVV6/ztpCBATg4OL99G2Vh4Uxg1QghVBONRuvbt++KFSvat2+flJS0e/fu//3vf5qamkwmMzIyEgDCw8ObNWsWGxsLALGxsR07dszJySkqKsrMzCwpKbG2tra1tZ07d+6oUaPKysry8/PT0tKYTGZwcDCbze7Xr9+9e/datmzZo0cPHR2dLVu2LFiwYOvWrXl5eTt27AgICFBTU8vKykpNTS0uLo6JiXFycjpw4ECPHj28vb07deqUmppKoVA+fPjQp08f9ZotcoKoKciNcXGC9/X1rXkoNjbW0dGRjKBU0OLFy2bPXuHq2gIAvL29/fz8CCn27NmzYWFh+/bt++rjqxcvXgQHB69evZqQemuFbxgkFXzDqLD3799HRkYWFhaam5u7u7ubVYzRTUlJiYmJEZ/QoUOHyMhIgUBQcYuxe3x8fH5+PgA4OTlZW1tnZWXdu3fPxMSkX79+ERERhYWFzs7Oqamp2dnZOTk55ubmQ4cOpX2+Kx4VFfXy5UtTU9Pu3buLH8O/fPmysh3l4eFBpVLz8vJCQkI4HM6gQYPCw8M5HE7Pnj11dXVl9OvjRDdNCI/Hy83NFGd3oohE4Ov7v+Tk5N9++02S87t06bJv3z4CA0AIobq0r1Btp3WFyk2LKre+O3fuXPVMCwuLGTNmiF937dpV/KKsrMzd3b1mXc4Vqu7p0qVLtXNMTEzGjRsnfl05Pl52sBd9E3L79u2hQ4eKX4tEwGYDl9uoAktLYerU3+Picnbs2CHhJWpqavr6+tjfAiGEZA1b8E3I5cuXDxw4IH4tEsGHD5CaChL3OKmuuBimT99Bo2lv2bJBqgs9PDzu3r3r5eXVwIoRQqg23t7edR368ccfbW1tG1ZsaGiov79/5eB4Npvt6upqa2s7YsQI2pe91hUNJvimoqioSF1dvfJhD4UCNBo9L49pZ9eQxz98PkyatLF585aHD8+T9h0+ePDg779fMWGCFwXvHyGEiJOamurn56enpxcfH9+tW7djx46NHDmSxWL9+uuvubm5kiT4vLw8ExOTaju7d+9uYmJib29/+PDh8ePHP3v2rKysbOvWrStWrDhw4MCoUaPqKZDBYNDpdPHU9PKHH7FNxdq1F7p08ay6p1kzs8zMhoyUE4lEa9as6N/f6ehRqbN7xQAKg3fvSpKTcQkvhBCRBgwY0KpVKyMjIzqdDgB0Ot3U1LRVq1YDBgzQ1taWpIRhw4aJO9zVSldX19TU1MnJafLkyW/evHFzc5s0aVJCQkI9Bc6ZMyclJaVBvw0BsAXfJBQVwfPnD9et+7vqzlatzEpL8wDaSFWUUChcvHixh4dHZVcRaWlrQ7t23W7cCF2y5NuGlYAQQjVt2FD748IxY8bcuHHjyJEjWlpaI0eOHDBgAADk5+fv378/JSWlWbNmXl5e7dq1O3jw4MuXL3fs2NG2bVtPT8/666JSqYcOHWrduvW2bdvEw5H++OOPpKQkJpPZqVOnuXPn8vn8U6dOXbp0qUWLFs7OzrNnz46MjAwMDExPT6fRaLNmzRIPmpcpTPBNwr17CebmNtbWXywb17evGY0mXQuez+fPmzdvwoQJlZ31GmbkyGGnT5/BBI8QkoOjR48ePHgwKCiorKysa9euZ8+e9fDwmDRpUu/evY8fP/7ixYugoKBvvvnG2NgYAEaPHl11EY16WFpa2tnZvX//Xrx5586dv/76i0KhODs7a2pqTps2rXnz5kKhcODAgQ4ODgDw6NEja2vrVatW/fbbb/3798/Ozpb21n1REZw/D3FxYGwMY8dC27ZfOR9v0TcJ586dmTp1erWdZmZmUs3a+OEDZ/LkmdOmTWtkdq+4k+ZUUBDL4TSyGIQQ+rrt27fPmzfP1NTU2tq6X79+/v7+APDq1Stra2sqldqjR49FixbR6XTx5LIuLi6tWrWSsGQbG5vk5GTxa19f3xYtWlhaWnbq1Ondu3caGhrivO7g4CB+/O/p6fndd9/RaLQRI0YUFBSkp6dL9VswmbBkCQQEQHg4PHoEy5ZBWNhXLsEWfJNAoURMnryp2k4zMzPxosWSiIwsmzp15uzZS/v27dH4eMzMoFs3y7y8DPHyzAghJCNMJjM9PT00NFQ8D3xKSop4VZhx48b5+PgEBwf7+PjUOq5dEoWFhZXD6Fkslr+/f2FhYWZmZtvaGtfGxsbBwcHJyclJSUnix53VTmCzgcf79Fpb+4sp5/n88tRedf0agQCOHQPxuP2Skv/26+n99xpb8KrvyZMnPXu617wVJHkL/vXrkkmTps2fv3bxYgKyu9jw4cNv3rxJVGkIIVQr8crr3bp1G1PBz8/v77//BoC//vrr/PnzmZmZPXv2rOvhff1EIlFSUpJ4GkR/f//hw4c3a9Zs8ODBzWtbgFsgEAwYMCAwMLBjx451TXFz5w4cOvTpp1rXvfh4ePiw+vmVvfcqrzp06IsTsAWv+vz9/Tdtqt58BwAjIyNJpqMvLCxcsmTWypU7ZswgcgL5vn37zpo1a+7cuQSWiRBC1ZiYmNBoNB6PV21C4pKSknEV9uzZs3nz5vpn6xJPwl1tKu4rV65kZ2cvWbJE/HXB09Nz8ODB4jnwa5YQEREREhISGBhobGwsnv2+pr59oXv3T6+rdQNo3Rp69IDLl7/YWTkF3+fZ9qrDFryKY7PZRUVF4hmYq/n4US06Wljx7bZOubm5FVPW/0psdhevNiQSiTj4HB4hJGOTJk06dOjQx48fq+5cvny5+IWVlZX4E1Lcty4jI6NmCeJFWyqXbhEKhbdu3Vq4cOG6dev69OlTcUddOzw8XCgUslisoqIi8WmGhoaVBYrH6b19+1a8Ql2tcRoagrn5px8trS8O0WgweTJUzHD/n8q8XnmVufkXJ2CCV3EBAddGjhxZ6yENDRAIKGVldV6bkZHh4+Nz4MAByRdYlErv3n1u3PhHFiUjhJosX1/fvXv32traXrx4Udwu37dvn7u7u5ubW6dOnTw9PR89egQAycnJQ4YM8fLyOnz4sHicW6dOnTp27Pjtt9/OmzevaoGhoaG7d+9u06bNgQMHBg8ePHfu3OHDhwcGBl69evXnn38Wn7NmzZo3b944OTktXrzY1dU1KSkpLCysefPmo0aNGj9+/JQpU6ysrObMmTN27Ng+ffrExMTY29ufOHGCV/nIXQJGRrB/P3h4QMuW4OoKO3ZA795fu0akGEpKSnx8fGo9FBMTI/dwVERZmahjx2mxsaxaj5aWijp1mpGWVvu18fGJI0eOzMrKkl14d+5k9O37A+HF4hsGSQXfMEgqSvSGwRa8Knv2LFdbW9fWtvbZ5iruGKnV2oI/fTrWy2vZ8eMnzKvd8SFURUf69Kr9QhFCCBEFE7zqOnTIz89/7NhJVGrtx9XUoHt3A1PTomr7jx4N3717na/vSRMTY5kGaGgINjbODx9GybQWhFATweFwmJ9Jdfe7pvj4+J9++snT07PyeXnlYjONl52dvXPnTk9PT/EjednBBK+Cnj2D34bcg0WL1G5ftLXtVc+ZlpZmublfjJQ7derloUPb/P1Pd+xoIPtIYcyYYf/+e0sOFSGEVN6TJ09mz56tp6c3tsK33347d+5c8fB3adnb28+YMSMgIKCkYoz52bNnmzVrVlfnOGmZm5uvXr06ICCgWr8/whGf4Hk83v79+2fPnk14yUgSb9/Ctk388U+WAsCW4ui/DvJfvarzZBMTk6pD4Z88eXLr1m9Xr552cdGRT7QzZ3bNyXkpn7oQQqptwIABM2fOFE9dd+PGjfv377969WrMmDGElLx///76H1k+ffo0MTGx8XURiOAEz2Aw9u3bFxERIesvJqguly7BiNRDrUqjAaA1L39U6oGAgDpPNtcz0Dn4l/j1/fv3fX19T58+aWMjvxWOKRSKnp4eg8GQW40IoSZCR0fHy8srODiYyWRW3c+uMji4tLS05vJxfD6/sLCQUmVBa3Nz80WLFlG+XOK6pKSExWJVbq5Zsybryy5FbDaby+VWK1woFObn51cbUi8jBE90Y2BgsGbNmqNHj964cYPYkpGE2Bn5MxI3V25OS9q6KWMagGm104RCOHECqFvuDk87u7Z0rWnfD7GxN44dO0at64m9zAwaNOju3bteXl5yrhchpPLU1dX5fH5paWlAQMBPP/20bt264ODg69evl5WVJSQkzJw509HRMScnx8LC4vDhw2pqaoWFhfPmzcvOznZzc6tsphYUFOzevfvkyZPPnz8Xz1d/8+bNLVu2uLi4MBiMN2/eBAUFHT58+OnTp5s2bbKzszty5Ih4BhEjIyOBQMDhcPz9/bW0tNhs9vLly8PCwrp37171m4HUli6FLVvAQIKnqLLomn/kyJERI0ZIdQkOkyPKu16LRABVf8K/nVfztNOnRVPdkzkULRHAM9321tbfJyYKyYhXVFRUVNf/+obBNwySCr5hVMmdO3fEI9fFm4MHD27btq34taGh4bJly9LT0zdv3iwSiXr16rVp0yaRSMTn8y0tLf38/EQikbe3d8+ePYXC8g/DDx8+AID47RETE1Ox4NYHkUh09+5dLS2tkJAQcbE7d+788OGDeHKbJ0+eiHdOmzZtxowZ4tfdunUT17h582Y7OzsWiyWuVLwAndS/4ZMn5R/sy5ZJci52slMtQqG9p9se20U/mY7b73R4v9Ph410O23p1hhr3oG7cgDnxqzSFHADowXw/3dDj3j153DKqycDAoKCAWVwsIqV2hJDquXnz5v79+4cOHZqamipeO06sU6dOVlZWmzZtysnJefz4sXhOeCqV2r59+5cvX/L5/DNnzkyfPr3+++eXL182Nzfv1etT/+UFCxa0bNmy2jmXLl2qnHDe1dX15cuXAODn5+fl5VXrRLaSEgrhhx/KXxw8CHXMd1uV/Oaif/v27ZUrV+o6yuVy6xqEUFZWVtfMvaimD216ndC6NW35/3KZ6mZmXLdeRWl0AVR8Fa2qVVJ2n5yLlZvz45b/lfxtbGw+ITGoiUTqLJYGi8Wn0bg6//XX02Qyzd+8oQgEakIh29Awq2NH8X4KxfXw4aAZHYUiKpWnrc2n0/k0WoMTfq0zTSJUF3zDqBLxGqxMJtPCwmL+/PkODg4UCkWcQQQCQVZWlvh1ZGQkAGzdulVfX1+cgAAgJCSEz+dXnp+WlgYA4pXfKv/L5/Pj4uJMTU2rZSXxY/7U1FQTE5OioqKysrIjR46IUx6TyTQ2No6Ojk5NTdXS0hJfKF5KLj09vWo5aWlp9XdIsgkK6iTuNc3jZU+e/LTeNXJMTU3ll+Bbt249adKkuo6WlZX98ccftR6i0+nVFglAdWGzYe7c75cu3TRnTuWcxSa1nCcULkueWHWHJSthat5xe8fVBATx/Dk8eQLilRB79YLPWRzEixoyGKChAVSqJp2u//l/69ixo86dO7empRNkZ39aLnHRItDV/e9CgQCk6RyAbxgkFXzDqAzx6uwTJ07s1q1btUNUKtXCwkL8/1rcXW7jxo1VF3YT32Y3NzcXn6NesVxr69atK98erVu3trW1NTc3LywsrPaeESfmVq1aOTo6crlcNTW1uXPnirv0V9LT0zM2NhZfKO7Z16JFi6rlxMXFib9J1EqTzR566lTlpvmbN2q3byc6OdV1flJSkvwSvEGFuo4ymUx1dVzarrHOnw/W1TXy9u7wlfNKSjR/3rzXDypvmjg5waSJelLUJBJBRgakpEBWVnkWr7o8op0dmJmBvn75T7UFE/T0oH//moX17++8a1d00bCthoYALFZ5WFWze8UdN0hNBXNzaNECXFyqH0UIIWm0bNlST08vLCysaoI3NDQ0NzcPDQ0dPnx4Pde6uLhcunQpKyurciX4SuK0rampaWdnFxYWVi3Bt23bNjQ0dNGiRXWVPLJCnRWvXg1fDgcY9/gxHD4MNdcC/4zgnFpQUHD+/PknT54UFRX9/vvvAwYMaN++PbFVoLqwWKzAwN8uXLhY9//uzwwMjH3GzJ8EDx9Cbi44O0P37iDdqI0bNyAqCpo1K8+41drWpqblP9KwsAAbG8uUlAxDQyvQ1hZPovuFbt3Ayqq8ff/2LdjYYIJHCNUkEAiys7PF97o7dOigXeWThMfjCYXCyklvaDTa+vXrN23apKam1qlTJwaDYW9v365du507dy5evNjc3NzOzu7JkyeVY+rEF4r/O3r06OvXrw8dOnT16tUWFhYpKSnu7u729vYtW7Y8efIkl8vt2rXrpk2bvL29jY2N+/Tpw2KxTE1Nu3Xrtn379uHDhzs5OXXt2jUqKkpNTY1d/2qe1UybBjVHG3G59SR4tcr178jFZDKXLl3q6+tb81BsbCzeQJPEunXrRo0a1aNHD+KLLi4GOh2q3mLJzy/flGSchmTu3buXmprakPmR3r8vf4s7O1d+LcA3DJIKvmFUxtOnT8PCwsSvdXV1fXx8Kg+dOXMmPz8fAL755pu+ffuKdz58+DAkJITL5bq5uY0ePVqr4o5jSEhIUFAQlUr18vK6c+cOhULp16/fw4cPxZcMHTpUJBLZ2dlduHAhPDxc/P1g9OjR6urqDx48uHXrlpOT0/Tp02k02suXL+/evctgMFxcXMaPH69b0Sx5/fr13bt3WSzWuHHjXrx4wWKxpk2b1qzaKrDEwQSvIsLCws6dO7dnzx4iC+VwICYGIiMhPR1GjYK6H/YQURVnzpw5p6o8YZLU8+fw8mV5qK1bg4cHGBriGwZJBd8wSCpK9IbBx96qgMfjbd++/e+//ya43H//hdevwdERevaEGuNAiKWlpSUQCLhcrqampnRX9ugB3bpBYmL5F5Ga9/YRQqipwgSv9Ph8mDJl98SJ39PpdIKL7tYNvv0W5NX5sU+fPsHBwYMGDZL6SgoF7OzKf6rJygJzcyk7FyCEkIrAiW6U3unTkVlZ6aNHD2hUKSUl8M8/5U32qrS05JbdKx5ujfD3J25lOT4fzp+HI0cgNBSk6smCEEIqAVvwyi0jQ7hv309//XWs4a33sjIICoLoaNDXB1l00JOYnp5lWFh6VhbUGHvSIOrqMGcOvH0LYWEQGwszZhBRKEIIKQ1M8MrtwIEDI0ZM79HDsOFFaGhAaSmMHg329uTezTY0hFatnB49ipkyhaDefDo64O4O3btDHZMkIoSQCsNb9EosKSnp48e3O3eOblQpGhowcSI4OCjCs+ohQ4bduEHcXXoxKhWMjL7Yw2TiTXuEkMrDBK/E1q1b98svv0h3DYcDjx7B59keFM3Ysd0zM/+V+cjNp0/hyBF49qzmGjwIIaQy8Ba9svL19R02bJiZmZmkF4hE8O4dhISAujo4OkKVNWAUR4sWFDs7veJiRj2zGhNgwABo1qw8wYeHw5QpULHaBEIIqRhswSultLSshw8fTp8+XYproqLg4UNwdYU5c8DSUobBNc6gQYPu3r0r2zrU1aFLF5g7t/xfA7M7QkhFYYJXPgwGjBu3avlyKW/OOzvD7NnQu3c9ExcrgsGDB9+/f18eNWlrQ/fu8qgIIYTIgAle+WzefKFt2+6dO7eS7jI1NQKnjpcdAwMDBoNBzgzKOTkQE0NCvQghJAOY4JXMkyf5Dx9e3LNn0Vf6vBcWwvnzkJsrt8AI5OLS+ebNlyRUnJIC167B5csK2wkRIYQkhwleyRw8uH7Tpp/NzOpO7yIRhIbC8ePA5VZfyFVJ2NqOOHr0BgkVd+kCU6aUfys6dgxzPEJI2WGCVya3b992c2szfrx9fSelpsLTp9C7N3z3HchsFUKZ6t/fOTk5uqiIjLpbtIBZs2DgQNmOMggOlmHhCCFUARO80igpKTl69OjKlSu/cp61NcyfX94YVYCJaxrGwgKaNTP/998scqpXV4e2bWVUdmQk+E++xhk06n9bs5Xz+QlCSGlgglcaGzdu3Lx5M1WSu+4KOcZdKuPGDX3z5jbZUXyWmws8XuOLef0a1i7j9rm6XItX0uro+sWLobCQiPAQQqg2mOCVw82bj/X09FxdXWs5lpgIqakkxCRL8+b1j4x8RHYUn92+DSdOQHZ2I4s5eRJGJf1uyUoAgEGZfibJYVeuEBQhQgjVgAleCURHs1ev3rNw4Y/VDwgE8PAhBARASgo5kckMjUYTCoVcLpfsQCp4eoKxMZw5Ay9eNKaYkvjs75K2i1+rgWhh7A9paQRFiBBCNWCCV3RcLixfvm3WrLWWllpfHBAK4exZiIyEMWOgVy/S4pOZPn36BCtIZzRtbRg/Hvr3b+SN+rnJ67UFJZWb7RjPeqf/TUR8CCFUC5yLXtH99VcYh8NavLjGSu0UCri5gY0N6OmRE5mMjRgxYs+ePYMGDSI7kM86dmzU5SUlWgbFp2htjJr1U1NTLyl5p6WlPdQsibDwEELoS6QleA6HM2PGjMpNPp8vFArJCkZh8Xi869e3HTx4VkurtsPt28s/JLmxtLSMiUlnMJRi/r2vexoefsBa3Wdr5D//0HJzwd4eXr/2sR47pBPZgSGEVBVpCV5LS+vcuXOVm0wmc+nSpWQFo7B27969YsUiZ2ddsgMhh0hkd+dO3MSJDmQHUpvCQnj1Cvr1k2Q2oeDgYF9f31OnTmlqag4c+GlnWdmBSZMm7dnj6+Ag8ZKACCEkMXwGr7iio6NTU1P/u0f98SMcPw4FBSSHJUdDh464epWMKe0kUVYG0dFw9iyUlNR/4t27d0+dOuXn56epqVl1P51OX7Xqj/Hj56el8WUcK0KoKcIEr6CEQuGPP/74yy+fl4yLioIzZ0BPD+h0kiOToxEjukdG/qugk8ZaWYG3d/kLP7+6cjyfDzt2XA0ICPT19VVXr+VuWa9eNp6eC729V5eVyTxehFBTgwleEQmFsGnTwSlTphgaGpZvZ2TAjRvQtStMmAA0GtnRyY+NDcXKSq+oiEF2IHXQ04OpU6F371r7OfJ4sHLlhXv3HuzadYRCqfMPbd06DxMTq9WrT8k4VoRQk4MJXhFduZJ89+7rwYPHfdq2soLvvoNevZR39tmGoVBg+nSP58/lsjx8w1Cp8M03NXdzubBkyZn37/+9fPmAsXF9/9c0NODo0RVFRSEvX5KxgB5CSHVhglc4+fmwZcvqn3/+5YsJZy0tSQyJRIMHD7537x7ZUUjtxIljOTmRly7tlWS5H0ND+OuvP7Zs2fLx40d5BIcQahowwSucjRuP9+gxzMOjOdmBKAQjI6OioiKRSER2IJJhs+H69UO//ZaVlXbp0k7xAxZJ0On0gwcPLliwgM/HDncIIWJgglcsWVlZOTn3dn0/CE6eBBaL7HAUQufOnZXm9jWXu+/MmcLg4M2LF0t7qY2NzcKFC1evXq0sX2YQQgoOE7xiWbt27b6Fcwxv/w1mZlD77DZNTv/+I3x9FXWwXBVsNuz8809hx44bpkyBM2dA+uVgPTw81NWtFi48JRDIJkSEUFOCCV6BBAQEdLG1tX71Crp3h6FDoe6u102KlZVzaGh0URHZcdSruBgmTNicn6+3cs0a8PSEHj1AksfvNWzYsOLt25BDh5TkjgVCSIFhClEU+fn5/v7+izZsgLFjoWdPssNRIBYWYGTU/MULxe2AVlQEXl4bzMystm+vuDNPoUC3bpLMcFeTgQH4+f1x+PCWoCDF/X0RQkoBE7xCKCuD2bPXb9/+sxqVCvb2ZIejcAYMGHb58k2yo6idSCSaPHlF69ZtjxyZQ8gkBY6O9N27D/7yC3a4Qwg1CiZ4hbBr1201NRsHB0eyA1FQ333XPy3tEdlR1EIoFC5evHjSpB5//PHdlxPRfnESvH4tVbEjRtisWbN4zZo1hASJEGqaMMGTjct9c/blpUtHf/ttVYPu6TYJbdrQDAyEXC6X7EC+IBAI5s+fP3jw4BkzJmho1H1eTg48egTXr4M06yX279+/RYsWfn5+hISKEGqCMMGTis2Gc+fXHD3+w8KN1ta4Nn99evXqFRISQnYU/+Hz+bNnzx4/fvyoUaO+cqq5OUyaBAkJcPWqVDl+2bJljx8/fvHiRWNjRQg1SZjgycNigb//k/fhHTvrzZzbmexoFN2wYcNu375NdhSfJCVxx4yZOW3atMGDB0t0gZVVeY4vKwMOR6qKDhw4sG7d1pAQ7HCHEJIaJngysXV198bEbNm5rb4bvKhCq1atUlJSyI6iXFwce/z4GX36zOvfv78Ul5mbw9SpoK0tVV10On3JkoOLFi1ITcUOdwgh6WCCJ4+29tY3b1auXauFE9pIxtzc4eHDOFKq5h45wYtPrli2t8zTc/qMGUtXrpTTUMbRo228vBZ7e69S0GVzEUKKChM8aV6/fl1WVubu7k52IErDwWHE8ePyntIuMRFW+RRwlqwM7b162zbm0qXTFi5c98MP3QhY2E/iUXBr1/Zv3rzV778fb3SVCKEmBBO8fH1uhaWk8BYv3rp9+3ayA1ImI0Z0j4h4Ic8Z+plMWLMG3O9v1uMV9Mq+GLZ3qJPT5nnz3Ago+sULOHMG2GxJztXQgLNnlyUmPsUOdwghyWGCl6OiIjh5EsLCBAJYtmzPoEELdHV1yY5JmVhbU7S0tN+/L5FbjU+fgkF61Mj0w+LNPby8uOh2JYTU37YtcLlw7pyEOZ5CgQMHDmzduhWXlEUISQgTvLwUF4O/PxgYwDff/P13zMePKatXS9YBG31GpcL48QMjI+/LrcbiYlgSs5Aq+nQv3b4sZkiGL5NJRNF6ejB5MnA4cO2ahFfQ6fQ///xz0aJFOMMdQkgSmODl5epV0NUFT0++GvX33zfs2bOTTic7JCU0d+7Q58/vyKcuPh8oN651KPqn6k6fxI0W2gxiKhDn+L59Jb/C2tp60aJFixdjhzuE0Nfh5CryMnw46OiApuahP/5Yu3Zyjx5GZAeklIyMjIqKikQikRoBndy+4uBB4IUVil8HGfb+p9UyDY3yjKzHLAFDA2Lq0Ncv/5FGv379jh17u3Tp8aNHZ+FygwihepCW4AUCweXLlys32Ww2S569p+SvYvHQ5OTksLCwU6dOkR2NEuvcufOrV686d5bt1EClpXDnDuzN+Eu82Yvxr59eh5E/tLH1lGm1Evnzz2VDhvj8+afL9993JTsWhJDiwiaAXK1du/aXX34hOwrlNmzYsFu3bsm6lqIi6Jl6vB3jmXhTQ8SZG7dSIJBxrUlJwON99ayKJWUPHjmy4+1b+Xa4u3tXrtUhhBqHtARPpVInVDFmzBhtKSf5UnQcDsTHV93h5+c3ZMgQCwsL8mJSBW3buvzzz/viYlmVLxKJgoKCtq/39olbUnV/z9zLXZjBsqpV/Mz/zh24cgUk+B7h6Kh95syBbdsW8sRfCAIDZRgYQEQEnPguiD9s1KFlHxRjOkGE0NfhM3jZ4PHg4kVgs6FNG6hYJO7Bg+xjx+4+fuxPdmRKj0oFPr95aOjHQYOaE1hsaSncv59y/PgJHi9i+PC+u5b+kGfW/cCt/1aHadsWBtnIsvu6ujpMnAhnz8L16zB6NHytk4GbW6vFixfPnLnyW8rkBacnHJ7yuNda9/btiY8rPBzWrhL8+WypupDrdmb5ksRrhw6BlRXxFSGEiIUJXgYEgvIWVUkJTJ0qzu7FxbB+/br163eRHZmKGDBg2OXLNwcNmkVIaWw2e9++wAsXrjdrZjllyjRPz80GFV3oDNzchi+A+/fLc3+XLtCrFyG11atZM/DygvPnITNTkhRqadnvddibNalT1EA08PoPS/Je7P2N4uxMTCwCAfD55f89eRKGphxtzXwPAD3yrjun3bt4cdDSpcTUghCSHUzwMpCdDQUFMGlSZQfpLVsCHBzcRo2yJjsyFTF6dP9Zs+ZwubM0NRtVzosXL06dOsVgMDw8xvr7n3J01KjWL71NG5g3r5HBSql5c5g/HyT7xS5eBG91k/asJACwL3nlke7n6ztr82Y2AJfL5bIrpKSwk5O5HA6XxWI3a8Y2MmJzuZ+OMhjssDA2j8fl8bhqamwbm/LzxUf5fH5S0qc5ePg53Ccfb1ZWuiBu6aH0cPzoQEjx4V+pDFhZwdy54rY7AHz8WPjkif+VKxdxUBNR2ralmZkJ+HyepqbUy/Cx2fDkSc7du6eSkkK7du26ceNGc3Nz2YTZUBJ/bSlMY66PX1e5OT1mUe+i25mZOvr6mpqamrQKDAYtJ+fTprU1TVubpqmpSafTaTQahULT1aVpaWnSaJoGBjQ3t/LzNSuoq6tnZIBQCBQKJI1cYpTNraylVWn08JRDAEtk8JsjhIiECV42Pmd3ANi0ad3JkzssLDC9E0ZTE0aO7Bka+liqBVvz8vh79964dy9QW1vX2/u7X39dKcsY5cHrw8/G3MzKTVMh28+udbdzuyUvoZ5/v0+PCLhcehedwKIVAgHk598xNh6ipQUe9vKbLRgh1GCY4GXr7t27LVu2dHJyIjsQVTNixIj9+/dLmOCjoqL8/PySklKbNx/m63ukQwd6lS9gii07G/LywMWllkNCYbse+heyNnE4n3ZoasKwb7VAIAACfz1NTaOjO92SwN8fTpzImzdvz/TpQDcjrHiEkOxggifI27dgYgItWlTdx2Qyjxw5cvHiRfLCUlmtWrVKSUmpJ5nxeJCYyHj0yP/Bgwft2rWbP39+mzZt5B5mo6Wnw6NHQKOBnV31QxSK7va1/X6AixfLz7K0BE9P0CNyYMF/WreGZcsgMBAmTQIzzO4IKQlM8ESIioJ792DgwKoJnseDn37a9NNPP6mr4z+yTNjYOMSOX6DuOctmUveqWT4/X3vnzgdXr56jUISbN0+6cOECRXm7P3TuDAwGXL1anlpr61dvagoLF8ojEI2K3g64zA1CSgRzT6MlJ8OtW9CjB7h9sUz4gQNPk5Npbm5ErB2OaggKgtSgDm3efJfw6N28h6Hbf1YzN4eUlJQTJ/yuXo1wde23d++vXbsaaUjdCU/xDBgAZWWQmkru2HPx11QJ5tlDCCkKTPCNlpMDLi7VRknHxrKPHdt96dJ58sJSZZmZsHs3bEr7WwMETsUv7EKPT5+uZWR03crKasaMGRMmTHVxqXFDW6mNGPHVeW/koHlzqr6+EOe3RkhZYIJvtK7VF/zg8WDZsu3e3qucnGgkxaTiQkPBLedej7zr4k3v2O+vUE+cPHnGwkKj4ttVLNkBEk0BsnvFk3htHZ0yAF2yA0EISQS/jBPvzZs32tql33/fk+xAVBZFwF8Q999UauZC1uLSSA1VuB2v0Oh0ellZGdlRIIQkhQmeYHw+f+fOrSdPbqNh611m+scealUaXXXPxNRfTUqbxiooJSUQFAQikfxrxgSPkHLBW/TSE4ngwQPo0gUMDWse3Lt37/z583V18TamDOkvmva0rddffwGLVb7ZsiWsXQumZgZkxyUXZWXw7h3UP0mNbNBoNLZ49lqEkDLABC+9+/chKgpcXWseiYmJSUhIWLNmDRlhNSVGRu7j4ZvB5f8f6HRwdgblHQcntebNYfRouHSp/Ptlx47yrFldnV5YiC14hJQGJngpvXhR3n7y9ART02pHiopE69ZtOHbsfyRF1uTo6tbs4Ng0tGkDAwdCaqqcE3x8PJ1KLevRQ551IoQaDhO8lPLyYOhQsLGptlskgu+//9PRcWKzZs1Iigw1Ja6utd5DkiltbXwGj5AywQQvpWHDat197VpKdPS/f/55Wu4BISQnOjqY4BFSJk3n0aUMFRXB5s3rduzY/Xn9d4RUkIEBTSjETnYIKQ1M8AS4evXU6NEegwZZkB0IapJ4PPjnHxAIZF1P9+50e3tswSOkNDDBf41AAEFBUPfooI8fP96+fWvz5lmKMdsYanpKS+HdO7h1S9b14Dh4hJQLJvivuXkTIiLqSfBr1qzZtWuXfGNCqApDQxg3DmJj4flzmdaDCR4h5YIJvl5Pn0JcXPmnZ21z2gBAYGCgq6urTY1O9QjJVYsWMGQIfPgAQqHsKsEEj5ByIa0XPYfDmTFjRuUmn88XyvKzqSFEIkhNLf/crLLKe1Xv3xeeOuUfGIhLxiEF4OIC7drJdFkaTPAIKRfSEryWlta5c+cqN5lM5tKlS8kKpnZqajBpUl2fmGVlsGDBhnnztlGa0CRqSLHJuBtIVhb93TtM8AgpDUxO9ar7E3PPngemplZTpjjJNyCESKOmRmMwcJgcQkoDJ7ppiOho5vnzB2/eDKBSyQ4FoZpEInj7FlxdiW3Ta2mp8/l8AgtECMkUtuBrePPmqz2V/ve/n3799UcbG/x6hBQSgwHBwRAURGyp4gX3ZT/eHiFEDEzwXwoJgUePoLCwnlOePn2qpaU1bFgnOYaFkDQMDWHUKHj1CsLDCSy1RQuws2tKC/chpOSwDVpFVBSEhsKYMWBsXNcpHA5n9+7dVbsHIqSIbG2hd+/y93O7dkDQkyRNTaDRZN2TDyFEGEzwn4lE5Z+G7u7g4FDPWTt27Fi1apW2trYcI0OoQbp3Bzc3orI7QkjpYIL/TE0Npk4FLa16TvH3f5eVxejZs6ccw0KoEep9PyOEVBsm+Crq/TRMSxP8/PPWkyf95BgQQggh1EDYYUYiAgEsW7ZnzJjZHTvqkR0LQg3y8WMjCxAKITcXGAyC4kEIyViTT/CZmZKc9fBhXEbGh7Vrh8o+IIRkIDsbTp6EuLjGlKGmVv4lIS+PuKgQQrLUtBN8QgKcOQNpafWfJRKJjh5dd/HiLh0deQWGELHMzaFbN7h5szH5WU2t/IfHIzQwhJDMNOEEX1AA169Dp07QsmX9Jx4+fNjT07NFizrHziGkBHr3Ln+rX7/emDI0NDRZLC5xMSGEZKgJd7K7dau8WdO/f/1npaamhoaGnjp1Sl5hISQbamowciQwmY0po2VLOp1eBqBJXFgIIVlpwgl++HBJpu1Ys2bNvn375BUTQrKkpdXIgXO2tnQ9vTIAQ+JiQgjJShNO8EZGXz1l2bJTbm4DLCws5BIQQooOl4RHSIk04QT/NQ8efAwKuhEUdIHsQBCSDT4f1KX7BMAEj5ASaWKd7CTuAVxcDOvXr/3xx111T0uPkDJLSABfXygtleoiTPAIKZGmlODZbDh+HKKjJTn35Mkr9vau48a1kX1YCJGhVSvQ1ITLl7+6OHJVFAqtqIgty7AQQoRpMgleJIJr14BCgdatv3puUVFRcPDpkye/x5UxkcrS0IDx46GgAB48kPyi+Hh6aCi24BFSDk3mGfyTJ5CRAdOnA4321XM3bty4bds2dXVM70ilGRjA6NFSteDpdDqLhQkeIeXQZBK8jQ2Ym9ez0HulBw8eNG/e3NnZWS5hIUQqa2upTtfRoRcUFMgsGoQQkZpMgv/adHViTGbpgQMHAgICZB8QQsrHyIiekoIteISUQ5NJ8BLgcGD8+E3ff/+jhoYG2bEgpIi6dKGVlmInO4SUA2kJXigURkVFVW6WlZXx+XyyghE7dOi5SEQdNKgzuWEgRI7ERMjMhJ496zkFh8khpERIS/ACgeDKlSuVm1wul8ViEVzH8+fQrBk4Okpybnw8x9f3l4AAf02cZhs1TUIhPHtW/idTdwcUTPAIKRHSEryGhsbGjRsrN5lM5tKlS4ms4MMHePwYhg+X8PTff9/h47OsbVttImNASInY2YG7O9y+XZ7jzc1rPQUTPEJKREVHghUWwo0b0LEjtGsnyenv3r2jUAqXL+8j+8gQUmDu7tCmTT1rxmOCR0iJqGgnu9xcsLT86lKwYgKBYPPmzbggLELlxo6t52B2Ni0ykiPHaBBCDaeiCd7BofxHMvv27Zs9e7aenp6MY0JI6fH5wGKJRKKvLrOMECKfit6il1h4eHx8fPxwiR/VI9SUiQeQSrxmE0KITCragpdMTo5o2rT1/v5HyA4EIYWUm1ue0g0NK3eIV5fl8QAHmyCk+FSoBc9kQlaW5KeLRLB69dG+fcc7O+OKsAjV5tEjCAyEKhNUNG8O9vagjWNNEFIGqpLghUK4cgXu35f8imvXUiMinm7bNkmWYSGkzIYPBxYL7typ3KGuDlpagKssIqQUVOUvNSgI8vNh9GjJrzh2bM2vv+7S15dlVAgpNR0dGDMGYmIgJYXsUBBCUlOJZ/AfP8Lr1zBhAhgYSHjFmTNnRozo16+flYwjQ0jJWVnBrFnQrBnZcSCEpPapBR8fH092JI3QvDnMng1t2kh4em5u7rVr1+bMmSPjsBBSCZjdEVJOnxL8b7/9RnYkjSPNZ9DatWt37dqlhiN5EZJebm49M90hhBTIpwR/6dIlLy+v9PR0suORId7WncDhHjt2xcXFpY3EzX2E0H94vLw8ana2kOw4EEJf9+kZ/Lx58/r37+/p6Tl27Nhly5ZVWxA9IiLCxcWFpAjrxud/Gpb7NS9fwq0tYT/d3HDsLG87982rVwGyDw4hlcPhgK+vliaNySwD0CU7GoTQV3xqwa9fv75v376PHz+m0Wh9+vQJCgqqPIPH4128eJG8COuQlARHj0Jp6VdPTEyEn36CCU+WqoFoYvz2tsbLHz2iyiVEhFSLlha4uGhRNUtz8R49QkrgUwuYRqNVDHJVX7JkycSJE3v37m1qaiqenp3D4bi7u5Md55eKi+H6dXB0BB2dr5578ya4Z1xox3gKALoi3uLs0/5Xeo0fL5c4EVIxvXu31vfXDX8Ig6fhbHYIKbjq4+CjoqImTJgQFxeXn59fVIHBYJAUWx2EQrh6FQwNwcNDktNZ+ay58asqN4dmHDNOfSvL+BBSXWpqbbq2MLDThS+f4iGEFNCnBH/y5EkWi7VhwwZXV9fIyMhjx45FR0c/r/Ds2TPF6nBOoZS33ceMAapEd9pHx/9qxk6t3FQD4bKkJbKMDyFVRtfXL7O3x+XkEFJ8n27R+/r6bt26NTExceLEifv372/evHnlGVpaWqNGjZKqUD6fT6lAdLSfde0q+bn2k7ucZl5MSvq0qacLM7wrJq7XxV5CCEmNTqeXlZWRHQVC6Os+JfiwsDAzM7MbN27UunBq586dJSxOJBKtXLmSSqUWFhba2tquXbuW0GgbgjJi6NRh8M8/EBcHJiYwaBDgyu8INRgmeISUxacE37t370uXLuk2ulEbEBCQmJh4+fJlkUjUqVOnXr16KUIHPQoF+vUr/0EINRKVSi8o+Jzgi4vhxQsYMADv2COkgD7dRV+0aFHjszsAXLhwoVevXhV9cdT69u177ty5xpf5SXAwFBQQVhpCqEHi4mgvXrA/bQgEEBEB//xDckwIodp8SvDSPmWvS3JysrHxp+XVTU1NU4hahCo0FF69Ai6XmNIQQg1Fp9NZrM8teCMjGDasvBEfF0dyWAihGgjuB1dcXCweUg8A2trahAyxo+flQUgIDBwI5uaNLw0h1Bg6OlUSPAA4OECXLvDhA5kxIYRqQ/ByscbGxpUdcEpLSytb8wDw/PnzkydP1nUhj8er69sALS2tuFWrLC0tiI0lNlqkkjIyMsgOQZWpqbHZ7KLYKn+MapaWIgDl/fPENwySiuzeMAKBWllAqJqAT/Pqqa4uamRplpaWBCd4R0fHrKws8ev09HRHR8fKQ506dWrbtm1dF5aWlv7000+1Hipwc3N0cNDHXjxIYlXfeIhYWlpaWVl8FfsXVrFfB8maLN4w8fGwYzPv52sjKSLB2pio9Vs0nZwaWybBt+i9vb3v3LkDAGw2++HDh9OmTas8pKmpaVg3AwOD+qbTweyOkGLAYXIIEY7Hg02b4NtXB1qUxVmyEnq9/n3TJuBwGlsswS34Pn36eHt7L1u2jM1m796929nZmdjyEULk+kqC53KBwQBTU7nGhJCSi44GXkbutKSt4s3vkrY/sJgeGWnesWOjiiU4wQPArFmzCC8TIaQgaDQam82u8/Dz5xARAd7ekiwEhRASEwphZsIGHf6njmjagpJZCev5/OONLFZms8kihFSRuro6n8+v87C7O2hrw7VrIGpsFyGEmg7T9LtDMv5Xdc+gTL9veGGNLJb4FjxCSIVlZkJ8PAgEdSz2pK4OY8fCyZMQFgZdusg/PISUi0Ag2L9/f9rjx5P3Xrp61Uz8+EtbG7y9wcHSuJGFY4JHCElBKAQOB3i8uldzNDKCSZPwMTxC9Ssrg9evX+zdu3PmzJnLly8HAJf58O5d+Z+Yqysxz7gwwSOEpKBe8ZnB48HnGa1qg3NSIVSvp08Z69ZttLbWP3v2LJ1OF++k06FHDyJrwQSPEJKCOMELBGTHgZByKi2FtWvPBQdfXLVq89Sp7eu8E0YETPAIISk0awYODqCvT3YcCCmhhISEDRs2mpn1e/QowMRE5vO7YIJHCEmBQgFNzfL/SuriRbC1hUaO50VIyXG53F9++SU9Pf2PP/abmZnJp1IcJocQkqXWrSEoCHC+d9RUsVhw506wp6enu7v70aNH5ZbdMcEjhGSsc2dwdISrVwEnuEVNz5MneQMHzj979p8LFy70799ftpXx+XD6NCQkVO7AW/QIIRkbMqS8EY9QU8Jmi3744di//z5YvXqbl5e9uhyS7Z07UFxcdQwLtuARQtIpKtJMT+dKcYGGBgweDJ/HAiGk8iIiIqZOnWBiQr9//9yUKXLJ7q9fQ3Q0jBlTdQQ9tuARQtJhMOhJSWUtWmiSHQhCCofFYm3bto3JZB47dszQ0FB+FdPp4OEBVlZV92GCRwhJh0ajM5llAHL88EJI4bHZcOPGnb///mv16tXdu3eXd/W1rR6Pt+gRQtLR1hYn+AYRCODpU+DxCI4JIVIFB2f26eN940bkhQsXSMjudcAWPEJIOra2dEPDhiZ4LhfCwyEvD0aPJjgshMjA4wnmzDkQHv5q3bodY8e2ksfjdolhCx4hJB1bW7qeXkMTvLY2jBkD8fHw4gXBYSEka7m5kJZWdcerV6+8vCY4OdncuXPa01Pu2T0+HtLT6zmuSF82EELKgEajsdnshl9vYQEeHuUJvmNHUKj2DkJ1i4oCyvwN6mzmh02/ODpCcXHx5s2b1dXVT506paenR0JAeXlw/Tp06QItWtR1Cv51IYSkQ6fTyxo5a42rK7Rrh9kdKYsrV+DurreH/j2mBsI/Ny+6evVpbu75TZs2ubq6khMQhwOBgdCyJfTsWc9Z+AeGEJIOAQlePDgeIWXAYMBff8EvsUvUQAgAM9+OnMzc8eifS2Zm5D3jFk9XN2oUqNW3Yg0meISQdCgUel5eAdlRICQncXHwbfqF9kWPxZsd+IWzKFqxsRQ5Tipfg7Mz2Nt/9VsydrJDCEknMZH+8iWhE8vn5xNZGkKEMtZmzY1fVXXPrA/rjTWKyYuoggT3wEhrwXM4nBkzZlRu8vl8oVBIVjAIIclpa9M4nEZ0sqsmMRECA2HqVLCwIKxMhIjTJjf0rXWPqKIexYwXevqd1dQoenrQKf8JwDCyQ/sK0hK8lpbWuXPnKjeZTObSpUvJCgYhJDldXTqLRVwLvk0bsLeHy5fB2xvnq0eKqF8/25f9Dh6Egwe/69DhjIsLc8MGXRImcuRygcUCAwPJr8Bb9Agh6ZiY0CkUQm/RDxsGNBrcvk1kmQgRR08PVq8WeHhQb96E2bMz5DnH/H9u3YLAQKmuwE52CCHpuLnRW7YkNMFraMC4cSASEVkmQoRKSEiwtbWlkNUo/vdfSEiAqVOluggTPEJIOsQMk6uGnDYRQpJ6/jzc2bkDOXXn5MA//8DQoVXXepcE3qJHCEmHRqNxOByyo0BIri5dChcKSUrwZmbg6Qnt20t7HSZ4hJDURLK+nY6365EiEQohMzO5Q4fWpEXQuiFVY4JHCCmY8HA4fx5w3CxSGAUFIBQKmzevb9o4BYQJHiEknZwciIsDFktmFbRsCR8/wsOHMqsAIekwGGx9fW15dxRp9H0sTPAIIalxucDjyax0IyMYNQrevClvyiOkABiMqFGj2tY77zvRkpLg+PHyv7RGwASPEJKOeIpMGSZ48RNHDw/sWo8UREREhIuLi/zqKyyEa9fA2ho0NRtTDCZ4hJB0xKu8yjbBA0DHjtCqlYzrQEgi4eHhHTrIqws9jweBgWBmBv37N7IkHAePEJKOri44OoKpKdlxICQv2dnZ5lKOQW84KhXs7KBLF2j0rDqY4BFC0lFTAw2N8k8hhJoCeY/ZpFCgTx9iSiKkFIQQkqHYWHj9muwgUBP15ElBZqYx2VE0BCZ4hJDUqFSqXNd3ZrPhwQNISpJfjQh9FhYW0aZNO7KjaAhM8AghqWlraxM/HX09vvkG3Nzg2jUoKJBfpQhVkEcX+rIyuHmz/IssoTDBI4SkxmDQP3yQY4IHgAEDwNIScnLkWilCAImJkZ07yzLBCwRw+TJ8/Nj4XnXVYIJHCEmNwaAnJck3wVMo4OkJTk5yrRQhACsrhru7vgwruHsX8vNh/PhGjnqvCRM8QkhqWlo0NtG3ExFSTGrlZFY6nw9MJowdCwYGhJeNw+QQQlKj0ehlJUyyo0BI5lJTU1u2bCnDCtTVwctLRmVjCx4hJB2BAPoVxtjeOdO4ebIbJzsb0tLIqx41FfKepJZQmOARQlJIToa50zmD7wV0vHZsgWc+acvBvH0LgYFQWEhS9aipwASPEGoShELYvBnc/91rxcvVFzDHvP5xyxYoLSUjlIEDwcQEAgKAwyGjetRU3LwZq69PdNdOgQBCQ0H2M0lggkcISSohAdiJmVOSfxZvDk//yyQj/O1bMkKhUmHcuPKPyLg4MqpHTQKDAQwGS0eH4M7tcPs2vHgBJSUEF1sDaZ3seDze0aNHKzc5HE4pOQ0BhJCkhEKY9WE9TfDpT5UCgvnxy4v5D8iJRlsbZs4kfGQRQpUyM/nq6hrGxE5T+/w5xMTApEmy6DZfDWkJnkqlurq6Vm6yWKx3796RFQxCSBL2jDCHrFNV97gVPGRmXAMYRU5AmN2RLL15E9eqlSOR08/w+RARAYMHQ4sWxBVaJ9ISPIVC6dmzZ+Umk8k8f/48WcEghCRBcXJICE7dsweKiqBisJyooGBHq5uJu0aDjg7ZwSFEvIjx4wntYaeuDjNnlv9XLnAcPEJIYvr6tn30f+8O796VN0U6dACAI/PnH5g9e93ff/8sy9lAJMBgAJeLy9QjAsXERHh7exNcqLyyO3ayQwhJTUsLunaFb78FXd3yn+PHv5848dvZs2dzyO3Q/vQpXLwITJx+BxEmOTm5devWZEfRcJjgEUKNoqkJY8aMXLBgwbRp0wpIXO1t4EDQ0YGAACBz/h2kUoRCIQH3pYRCiIoiJiApYYJHCBGgc+fOu3fvnjVrVlzcB3Ii0NCACROAxYI3b8gJAKmWsrIybW1tAgq6exfu3yfl3hImeIQQMWxsbPz8/GbN2rB373PZz+FRGx0dmDYNunUjo26kaq5dizAyatfYUp4/h8hIGDcOdHWJCUsamOARQoQxNDQ8ffrM5cunVqwIIOeJPBkfo0glhYREmJh0aFQRbDaEhcHw4SDT5WrqhgkeIUSk1q01rl8/nJQUs3DhXrJjQajhYmMjOnZs3Bg5Gg3mzoW2bQmLSUqY4BFCBDMyAn//jT16mC5dulQgEJAWB5cLHz+SVjtSZmw2FBbmODiYNbYgLS1iAmoQTPAIIeJpa8Ps2dNHjhw5ffp0JllD1/79F86dg9xccmpHyoxKBSsraN6c7DgaBxM8QkhWBgwYsGHDhunTp2dlZZFQvbs7WFjAxYtyWNUDqZiSkoI2bYwb0vzmcCAhQRYhNQAmeISQDDk7Ox8+fHjSpCXHjkWKRPKtm0KBsWNBVxdCQuRbMVJ64eHh7du3l/oygQAuXYL794HPl0lYUsIEjxCSrebNmx86dPLw4V1btz6Q9+eehgZ4esLgwfKtFSm98PDwDh2k7EIvEsH165CXB15e8pyPth6Y4BFCMteuHf36db9//rm1fPkJedetra0gn7ZIiURFRbVrJ+Ug+OxsSEkp/0LZrJmswpISJniEkDxYWFCvXt1nbl68adMmsmNBqD4sFqSnMzU1pVwh0cIC5s8v/6/CwASPEJITPT1Yv/4HNze3BQsWcEmZMV4kgg8kzaSLlEdWFmRmNmgSelIHxdWECR4hJFdjxoyZOXPmtGnTCgsL5V13ejoEBsLr1/KuV3ZEovJfChEqIiLV3LylCjzYwQSPEJK3rl277ty5c+zYmRcvJsm14pYtYfBgePAAIiLkWq9sJCdDsM/p1AGzHj0CeY9QUGlv3kQ4OUk2h11qKmRmyjyghsIEjxAiQZs2bXbtOrF9+5rff38p15VpvvkGeveGZ8+AxCn2iPD8OSybzWx/dl2ruPuPll3buZPsgFRIYWF4v34SdKHPyICAAIiJkUdMDYIJHiFEju7dja5cOXPx4rH166/KuWLw9gYqVa6VEkokgj/+AK+En4255c3H+XHLnzzk4jK5RGEwYocOdfrKSTk5cPEiODpC//5yCkt6mOARQqRp3Vrzxo0jbPbr/fv3y7ViTU25Vke0vDzQSEuckLJPvGnJShib+rtKPHZQCDweT/2rT+BTUsDGBoYNk1NMDYIJHiFEJiMj+P33Lbq6uitWrBCSs4y88tHTg/kfVmqI/luRd3LChpR/D7HZbFLjUgV8Pl9DQ+Pr53XpAqNHQ0O62suP8ncTRAgpPx8fn3v37k2fPv3o0aM6OlKOP24co8REMDEBY2N5VtpItOQYe620OL1OAkGpQFCmqWmqri4awXgxZ87z0lKj/v2ne3l1NqtrITSRSMHTErni4uLs7e0lOlXh/xmxBY8QUgiDBg1au3bt+PHTHz6U4xqvIpFudjb4+0NBgfwqbTwnp2aJL5/8HubzzeFJdltOLArTev/K9bTf6dOnFyxYExz8wMPDa8qU35OT86pdx2ZD3px1GUGxJMWtBJ49i3B0bNwy8AqDtBY8h8OZMWNG5Safz8e7cwg1cS4uLitWHPjhhwUrV+7w9m4rjyrV1DK6dbN/9648x0+ZAkZG8qiUCFQqzJoFAGVFRfTly//bP3Cg1cCBa7P/z969xzVZ9n8A/25jG5MBAwQRiHFS/IGHRPRJH8uziPh4SkD0EUkFJRSNHpPMTK2MNNMnS7OyTFOxPJMHLFM0M55CyFADfTxxEJQzYwzGtt9rzocQUwG33bvH5/3ij+2+xn19mbf39z5c9/cqom+++TEpaYlcLg8LCwsODubxeKdPU/LynA9+eD9j//n3ph1+4w2SSJj8E0zT/v3ZM2dG/UVDbS0dPUrDhzMQU1sxluCFQmFycnLjW5lMtmDBAqaCAQATMWKEy/btX77wwuz8/OglS4YYoUc1j0eTJtGBA1RTw6IEryMWy5ydxQ8ud3amefMGEg2UyWRff/31lClTnJy8srJmrLn0Ek+j7Fd65MDJw2vEo998k4mgTZhSSbduXX/6ac/mDQoFJSeTWs2uhy9wiR4ATEuvXtbffrvt0qX9X375pZG65PO1Od7NzUjd6Y9MJhOL/yLBNxKLxTNmzNi1a5eHR5RP7mv9So/olsfmvpRxVimXGytQligpIY1G7eh4/831+nptdlepKCKCOnRgLLjWQ4IHAJPj4sLbvv3fJSUlK1asYDoWkyaXyzu0LOW4Onm9Kfut8a2bPHfYpRfr6thd7Ufvqqtr7O0fOGTi88nDg3XZHQkeAEzXyy+/7OfnFxsbq1Qqjd03S0q/tjzBj/hjvZs8t+mSObe3L3rh+YSEhHPnzhUVGSxEVqmouDB2rF/zpRwODR5Mxn24Qy/wmBwAmK5Jkya5urqGhU179dVN/frZGqnXmzfp2DEKCyMbGyP12FYlJTI+/1GX6Bs5zJ70nfPor7++V6LXyYkSEuiTp11ulJdv2LD98OGVPj4BkZH/HDrU3dZYX7MJys7O7t7dTIbQI8EDgKnr379/VFTHF16Y/tZb/54wQWqMLp2cSCCg7dspIsLEB5qfOyfPz+/Qose23d1HzKMeofT77yQWU58+96r5SW1s3n138cKFtH//uY8++mDduptTpw4PDw+3bZd5Pjs7e8yYMaQbM8/nE8tnlGN39ADQHowb18XRcXNs7Jz8/MS5c/sYvL6IpSVNnkzffEM7dlB0NLWkrhlDFAq5tXUrbgw7O2t/HtSxI82aFTBzZoBCoUpL+y4hIUGtVk+YMGHEiGCBgM+qkeNP5Pbt205OTlRTQ8nJ5OZGQUFMR/REkOABgAUGDHDYs+erl16a6+k57t45lkEJBBQWRjdumHJ2v1tQpFYs1tvILw6HRCLeqLtkMtnevXsnTIiSy+0nTIgIDR3AwocMWufe/ILV1drsbmFBzz7LdERPCoPsAIAdfHyEBw9+8vPPP3/44YfG6I/PJx8fY3TUVhoNCYUaA439EovFkZGR+/ZtX7Lk1V9//Tk4ODQ2dtnVq1cN0plpOHHidlGREx0/rj28Y+GY+QchwQMAa3A4nLfeeksgECxcuBC1Lzkc7RHIU08ZsAuRiEaOdNm+PeH06W9mzZq4adOmsLCwDRs2lLGrsm/LnDuX3bVrdwoKosmTydKS6XD0AJfoAYBlYmJiUlNTp0+fuWTJBl9fkZF6vXOHamrIw8NI3ZkYiYT69OnZp09PtVp98uTJxYsX5+bKevUaGxk5rnt3oWnfx2ip7OzsAQOe0R7UmAucwQMA+wQFBY0evSA0NPLEiTtG6vLSJdq9m/74w0jdmSoulzt06NCPP/5448ZPBQKKjo4ePDju4MFTGpZUDniEGzcuBgb6Mx2FPuEMHgBYKSKil0Sydt68mEWLkqZN8zV4f889R1wuHTxItbXUu7fBuzN5vr6id98Nq68PS0+/nZmZPHnyRz4+PtOmTevWrRvTobVSTg7l59OwYU89JQsMZF81m0dAggcAtgoOdnNx2RofP9vdffagQYMM3t/AgdShA8smljUwgYCefdbp2Wfj4+Pjc3JyduzYceHCBXv7gePGTRk40IkFz9JnZdGxY/S3v+lGeDAdjZ7hEj0AsFivXtbHj2/dvXv3zp07jdFfQAANG2aMjlogP59yc//3cJcJ8PX1Xb58+TfffNOrV+CqVcsHD54aF7dDJqtlOq6H+/VXbXYfOpQGDbp+/bpUapQySkaEBA8A7GZhYbF+/fqCgoKkpCSmYzEquZzq601u/lIOhxMXNzAt7aM9ez5/6inLuXNjo6Ojjx07ZopPPXh60pgxFBhIROfPn+/ZsyfTAekZEjwAmIN//etfnp6esbFxBQUNxuu1pkb7w5D6ejXP1NJ7E15ewsTEiVu2bFm1atX169enTp26aNGizZt/z89nOrJGDg7kd29qGTOrQq+DBA8AZiI8PDwwcPKYMdN+/bXKSF2mpdG2bVRSYqTu7ldVJbO0ZMGgMDs7u5iYmJ07d06dGnPkyL7g4EkTJ65KSSlgOq4/qdV0+PBla+uuTAeiZ0jwAGA+Zs589pVXlkdFTU9JyTNGfyNGkKMjffUVXbtmjO7u5+IiCwxs0VRyJqJnT+/du5eePr07JGTwtm2rwsLCtmzZIpPJjBdBURH99tuDi0tLSS5XisXmNurc3P4eAGjnIiK6urp+8vLLsS4uS/r0edqwnfH5NHEiHT9OmZnk6WnYvh7Q0CC3s2NfOVWJhGbO7DdzZj+lUnnkyJF58+ZxudwxY5739g76v//jGbBmzuXLlJJC3t7Uq1ezllu3Giws+KY9cWBbIMEDgLl57jnHU6e+iot7MTQ0NDg42LCdcTg0fDgxMYJMLpd3YHO9dD6fP/auysrKjz/es3z5FFtb1wkT/hkaGuDqqu/OMjK0x2H9+//lFDKZmX9IpV3M7ik5XKIHAHMkEllu3rw5LS3t448/NkZ/XAb2pTKZTCxm0yX6h7G1tV20aMZ//rNryZL56elHp0+ftHLlyps3b+qzj44dKTj4YRPEcbnnQ0PNbQg9EjwAmC0Oh5OUlKRWqxMTEysqjFhItaGBbt82Qj9sP4NvRiCgESOkO3cu/v773aNGjfrggw/CwsI++eSTvLzKysonXrtUSj16PKzx0qXsZ55BggcAYJUXX3zR3f25UaNm5eTUGanLzEzato2ysw3dT26uvLzcfBJ8UwEBAe+9997OnTvd3d1nz04YNuyFhISDv/yiVCgM0l1eXp67u7tBVs0oxu7Bq1SqEydONL6tra2tqzPWfz8AaE9iY0dzuZ1DQ/+5fv3GQYM6Gry/vn2pvp4OH6bCQho2zHCVaHJzZY6Ohv9zmMPj8UbdlZMj++yzvXPmRPXoYR8TEzFgwIDH/KZGQ2fOkLNzC2f0N4OZcv4SYwleo9Fcv3698W1dXV1DgxHLUwBAu8Hh0Jw5vZ96au38+THbt7/r79/F4F3+/e/a7PKf/5AhM0dtrVldon8EX1/x6tWRKlVkcXFhcnLy2rVr/f39IyMjO3XysnqwEEBdHaWk0I0b1LLxlTU1NeYxlOFBjCV4CwuLWbNmNb6VyWSZmZlMBQMAZi8kxO2ZZ76YO3dOXFzcwIEDDd6ft7f2x5Bqa+VicbtI8Do8Hrm4uCQkJOgqy27atCkt7Zqn5+CIiMkDBth31F3LUKtp61ZqaKCpU7XHWC2wb98FW1s/QwfPCDwmBwDthYOD7datW+Pj4wsKCsLDw5kO50nZ2cm6dTPPU8/H6nlXebl6+/aTa9YsXrZMtmDB2PDwcUKhkIYOJTc3EgpbuKq0tPO+vuZWpFYHg+wAoB3h8/kbN268du3aqlWrjD3s57vv9FvU1spK5u3dThO8jp0dd+7coWlpH6ekfGppSdHR0XFxcacKCjQCQcvvjeTm/t63b/PSN+YBCR4A2p3ExEQ+323kyPi8PGMN/amv12b3rVspK0tfqzSzx+TarqrK1VUUFha2devWN954IysrKzx88ujRr23c+MfVq48ZBSGTUXV1aZcuDsaL1oiQ4AGgPYqPnzJq1MSxY6dduWKUAmYCAU2eTP37a8/jf/pJL6tEgqe6OjpyhD77rHFOPycnp/j4+OTkXXPnRh4/vnPcuEmTJ6+7/fCyBJaXMt3cyMnJiDEbEe7BA0B7xOPRq68Odnd3Tkxc5Ov7oY+P3oujPoDD0SZ4Dw/6i5HfbVFfXy8QCPSyKla6elWb3TkcGj++2VfK5VJIiG9IyHKZTHP06Jnly5dXVFSEhIRMmDBBJBLpPnPrFm37WD5rVUgX58CffqLnnmPorzAkJHgAaL+mTu3WufPixMT5S5cu7dnTKLXMOnfW15oUClIqyYCzs5g4hYJ8fGjIEHr4UY5YzJk0aeCkSQPr6uoOHToUGxtLxHd2Dh09evhHH3H/8UuSveJWQsHZmOV1ta8Ig4KMG7/h4RI9ALRrrq4227ZtW7NmTWpqKgPdq1R08WIbfk+hoCtXqLjYACGxhZ8fBQU9Irs3JRQKJ06cuGXLluXLVykU12fOnJp/Zk7Y9VXaDUBZ8vyNNdu2GT5go0OCB4D2TiQSffHFF99///2nn35q7Gnh8vPp0CHasYPu3GnV79XX092CIoaKyxTV1j75OqRSu3XrYqKjd76pyBNo7j1HMeX6SlVeofmVs0OCBwAgLpe7evXqoiLFmDGv3b79vz19WprBO5ZKKSqKOBzasoVyclr+e7rKn+3l+rxSqf232LCBior0sr7+9aeGlh5ufGupqokvTDS/6WLb1eEfAMCjJCbOW7o0Zfz42R98sP7c9zVTl008HLzeZ+mU3r0N2aujI0VEaLO7VNryX+JwSCRqeTUXNrt6lY4eJZWKRoygTp30ssr+qtMZHs/L5ffecjjkJ1XQnTvafwszggQPAHAPn08rV/5j3brOY8dO+5BrZ1VXNuTIKzOqxie+2eGx85s8KV/fVn3czo68vclMa6jfTyDQfjkDB+rxcMbijde6/Yu++YYuXiR7exo/nuy76WvdJgQJHgDgTxwOubgEDnOOHpcZREQd6wrCriV9/vkKgyf4ZmprKTWV+vfX1zkri7m5aX/0zcqKoqL0vlbTgnvwAAD3yc+nBTdW8+jenfiwG6uVl28YO4i6Om2O37KF9u5t7fg7disvpzNnmA7CTCDBAwDc52/FB/uUfdf4VqBWzMtbaOwgJBKKiKDJk0kupyYzazcywyo3FRV0+DB99hnl5uplwDzgEj0AwH36Si7/0GW2bgRWeXmajU3fv/WyotJScjB6xXKpVPvzV89vyWQyc5vF/ORJ7Zc8dmxrhyPAwyDBAwDcR7j45afn0NatdOkSKZVXL1xYdyr5A2JwvHqz57d+/pnE4l/yJdeumVch+lGjSChs/sfCE0CCBwBozt6eFiyguw9gew0frtm//7/h4d5MB/U/NTV05kxZiQdPxSeVing8pgNqPYWCzp8niYS6dv1zoaUlkyGZI0Pdg5c3PmAIAMBafD4lJr66bl2SCd0UHjaMXnyx2tq6gwWffdm9tJT27aMPP6T0dNxoNzT9J/ji4uKYmJiIiAi9rxkAwPhGjnRxcLD/6adspgNpQiSqFlpadXJuvjwv7zHznzPOwoLUahozhl58kXr1YjoaM6fnS/SVlZUHDx7s3LlzYWGhftcMAMAIHo++/PKVhISEYcO+ZDqWP3XtKnd0vP8efGUl7dxJQiFJpdS1K/n5MRacTm0tXbtGKhX16PHnQltbev55JqNqT/R8Bm9raxsdHd1Zf/MhAgAwzsHBwcvLKz09nelA/qRUyiWS+xO8rS3FxtLgwdpT5NxcxiLTHWp8+SWtX09HjlBeHpORtG8YZAcA8HgJCQnR0dHJyclMB3KPTCZze7C+m7U19er1F5e+Gxpoyxbq1ImcncnFhVxd9RaHUnlvztqmwYjFJJVqDzXc3Ng3SsCMIMEDADyetbV1YGDgDz/8MHToUKZjId1A5g4dWvyYnFpN3bvTrVv0668kENDMmfe15uRo07BQSBYW2oMAbpMru/X1pFBojw+USm3atrL6s6mggPbtI7mcNBrq1u2+BM/jabM7MO1JE/yhQ4emTp2qe52Zmenp6fmwT6alpW3cuPFhrQ0NDeqHzMMsl8tzWjOLIrRzBQUFTIcAbNLyDWbYsFFz5ry2fr23ra3CwEE93o0bN1xcXFqxb7Sz0/74+XEbGtT3/5bHyZPCykrd6LyrQUFKkaixySk72+7KFd3rOz16lHn/+ayghUJh7e2ttLJSSCQNQmGr5rplNbbsYVxcXJ40wY8cOfL6/8oo2tjYPOKTg+56WKtMJluge+z0AR06dPBFYSNoDWww0Cot32D8/YP37fvtnXfGGjiixystFdnbd/f19dLDunx9taf4SiUplV5WVveVmuncmZ59Vntmb2HhKBI5Npt/vr0Og2fLHuZJB9nx+XzJ/3C5qGwPAOZsyZJZKSlfFBT89eVGY7p+XaZQ6K9ULZdLQiGJxc0LydnYkJMT2dtrXzTL7mDy9JySy8rKNm7ceOHCBYlEsm7dut9//12/6wcAYJCXl8WQIc+vX8/8ULvaWrlYbF6lakHf9DzIzt7ePjY2Vr/rBAAwHUlJU6ZNC21oCLOwYHKQcn19LRI8PBouqgMAtIKVFTcyctqWLVuYDcPJSeXqih04PAq2DwCA1hk/fnxqampdXR2DMTg4kJ0dg/0DCyDBAwC0WnR09COe+wUwBUjwAACtNnLkyBMnzubkyJgOBOChkOABANpiyJD5ixb9+yEFugCYhwQPANAWs2YNyMu7dOZMufG7rq8nXrkCxxbwaEjwAABtIRbTnDkL3357tUpl1H4rKui7JafmHDt59qxR+wXWQYIHAGijf/6zl41N8Z07RaSb0MXwLl+mmVHqbhvj+yqKT8R+/c47RugT2AoJHgCgjUQievvtxKSkpPzNx4oS1ymVBu/x3/+mZ3M/85b9RkQxlxee+a4W5/HwMJguFgCg7USiLt8fVSz4ZK6d8vacnMj4FR31NQOLWk1//EEVFbKSkoqqqgoPj4qSkoqM44VvXn5Z9wEnxc3QG6szM5f276+fHsHMIMEDALSRRkPLl9OMBneP2stENP7c0mXLNmzdStbW932sooKqq0mhILlcZWtb3tBQoVNVVXX1alVmpjZ/V1dXCIVVnTvfu86vVqs1GsrJ4YlEVtbWEltbyZAhEolEMr/ymJ3qz2fzJl9/97BqBpGbsf9yYAMkeACANrp2jUovl0XfXKN7G5K/abOFw4QJVoGB2vxdU1PD4XC4XO7Nm1RVRbrpN7t3t5VKtana5i5vbw8HB4m9vaRjR4lUauPm9sjbpoWFlQ2Liy2ljQs4HArK+YBolaH/UmAjjubuJP+moLa2ViQSPbhcrVZjIlpoOWww0CpPssFcuULZQ+PH561vXJJh3Scl4as5c7Qp3NLSUrewtpa4XBIIms/F2gYNDbRpEx0+TPX19NRTtGAB9ez5pOuEVmHRHsaEEjwAALtosi9qevbiahqaLpR9uUccOdGg/SqV2oMGGxuDdgKshwQPANBW5eXXM0rXrqWKCu07S0uKjqbAIdbUqRPTkQEgwQMAPJm6OsrMpPp6evppnFWDCUGCBwAAMEPsGCkAAAAArYIEDwAAYIaQ4AEAAMwQEjwAAIAZQoIHAAAwQ0jwAAAAZggJHgAAwAwhwQMAAJghFswmd/z48bNnzzIdRVsoFAoej8fn85kOpNXUarVCoejQoQPTgbRFdXW1dbPZOllCLpdbWlqyZR6LphruapxbhV3Yu8HIZDKxWMx0FG1RV1fH5XLZuG/UaDRyudzKyorpQB5v0qRJLKhkN3HixBUrVjAdRVt8/fXXnp6effv2ZTqQVissLNy1a9dLL73EdCBtsXDhwtWrVzMdRVusXbs2PDzcxcWF6UBaLTMz848//oiIiGA6kLZg7waTmJj49ttv83g8pgNptW+//dba2nrQoEFMB9Jq1dXVa9euXbp0KdOBPJ67uzsLzuAFAkH37t2ZjqItfvzxR09PTzYGLxaLHR0d2Rg5Edna2rI0ckdHx65du3p4eDAdSKtVVFRUVlay9Gtn7wYjkUj8/f0tLFiwG28mKytLIpGw8WuvqKiwt7dnS+TsuxgIAAAAj4UEDwAAYIaQ4AEAAMwQ+27esEhoaKhQKGQ6irZwcXGZP38+01G0O/Pnz3dwcGA6irbo3bt3t27dmI6i3Vm5ciUbb8ATUUhICBvHBrIOKzcOtmDpzlo3sLFz585MR9HusPc7t7qL6SjaHXd3d6ZDaCM7OzumQ2gXcIkeAADADCHBAwAAmCEkeAAAADPEW7ZsGdMxPIZarfb392c6CmANbDDQKthgoFW4XK6vry/TUbQIC0rVAgAAQGuZ1ij62traxYsXC4XCkpKSZcuWubm5tbwV2qHy8vIlS5ZYW1tXVFQkJSVJJJKmrS+88AKfz7exsSkrK1u5cqWzszNzkYJJuHHjxsqVKyUSSX19fVJSUrOnWDUazYcfflhQUKCbxCUpKYm5SMEknD9/fsOGDdbW1kKhcMWKFc0mgtq8efOpU6ckEom9vf3rr79uitNEaUzJ7NmzP/roI41Gc/r06YCAgFa1QjsUEhJy4MABjUazc+fOsWPHNmtNSEjQvXjnnXeCg4OZCBBMi7+//2+//abbJOLj45u1vv/++6+88orudVJSEhMBgglRKBRubm63bt3SaDRxcXGrVq1q2nro0CEfH5/a2lqNRjN58uRmrSbChBJ8XV2dtbX11atXNRqNWq22t7fPyspqYSu0Q0VFRQKBQC6XazSa6upqPp9fXFzc9AM1NTW6Fzt27PD09GQoTDAVv/zyi4uLi+71hQsXJBJJQ0NDY6tCobC0tCwqKmIuQDAt+/bt69evn+51ampqt27dmrbOnTs3KipK93rPnj3+/v5MxPgYJnRJoaioqLq6WncdlcPhuLq65ubmtrAV2qErV66IxWKRSKSb/s7KyurKlStNP6Cbz76ioiI5OXn69OnMRQomIScnp/E2jaura0VFRXFxcdNWGxubTp065ebm/v777xicBM02mMuXL6vV6sZWoVDY0NCgey2VSv/73/8yFOajmNA9+NLSUg6Ho9tf62pjlZSUtLAV2qGysjJdCtcRi8WlpaXNPvPFF1/s2LHD2dk5MjLS6AGCaWm6wYjFYt1epXH2/ZycHB6P9/7773fo0OHkyZMymezbb79lNF5gWLMNRqVSVVZWNtbgmz59+ogRIw4ePOjs7Pzdd98p7rK0tGQ05OZMKMHb2trqLsXrRr7I5XJbW9sWtkI7ZGtrq1AoGt/+5Sbxwl3nzp3r27dvTk4Oe4sHw5NrusHI5XLdksZWKysrkUiUkJBARFFRURKJJCMjo0+fPszFCwxrtsFwOBxra+vG1h49evz4449Hjx4lon79+llZWZladjetQjedO3cWCASN5+W3b9/28PBoYSu0Qx4eHpWVlUqlkojq6uqqqqqkUmljq+4WlO51QEAAj8fLzMxkLlhgnoeHR9MdiKWlZadOnRpbvby8iouLVSoVEVlaWtrY2JSXlzMXLDCv2Qbj5ubWbGofHx+fuXPnjh07tqioyM/Pj6EwH8WEErxIJPrHP/5x+vRpIrp06ZJAIHjmmWeIaO/evTKZ7GGt0G65u7sHBASkp6cT0alTpwIDA6VSaUNDw+7du5VK5cWLF7dv36775O3bt6uqqrp27cp0yMCkv//970qlMi8vj4h++OGH8ePHC4VCmUy2d+9eIurWrZufn9+JEyeIqKqqSi6Xd+/enemQgUljxozJycmpqanRbTDh4eFEdOfOncOHD+ueoNPdd1er1Z9//rlpTr9pWoVuioqK4uLi/P39s7KyXn/99b59+5aVlXXq1CklJWXUqFEPtjIdLzAsNzd30aJFPXr0yMrKWrNmTZcuXS5cuNCzZ8+srCyJRBIVFdW/f38LC4v09PTIyMiIiAim4wWGnT179r333vPz88vOzt60aZOTk9ORI0fGjRtXXFxsZ2d37dq1hISEp59+Ojs7OyQkJCoqiul4gWEpKSk7duzw9va+fPny5s2bxWLxp59+umjRopKSktOnT69bt6537945OTkBAQEvv/wy08H+BdNK8Dr19fUCgaDxra7oxMNaAR6xwajV6rq6usaxmQCP3cOY4FApYFazDaampqZxcmS5XN50qK+pMcUEDwAAAE/IhO7BAwAAgL4gwQMAAJghJHgAAAAzhAQPAABghkyokh0AmL6kpKRz587V19d7enrOmjXL398/JSVl//79tbW1w4cPnzFjBtMBAsA9OIMHgFZITEwMCgo6cOCAt7e3v78/EY0ePfrmzZvz5s1DdgcwKXhMDgBaLSQkJC0t7fz5815eXq+99ppEIlm4cCHTQQHAfZDgAaDVCgsLu3fv3qNHj1dffXXDhg0HDhzgcDhMBwUA90GCB4C2+Oqrr6ZNmyaVSjMyMjBNH4AJQoIHgLZQqVRSqbSsrCwzM9PX15fpcACgOSR4AGiLJUuWENEnn3zi5eV15swZHo/HdEQAcB+MogeAVjt27NjFixffeuutjRs3pqenr169mumIAKA5nMEDQOsUFhaOHz8+NTXVzs6OiKZMmbJnz56MjAxMoA5gUpDgAaAVVCpVUFDQypUr+/Xrp1tSVlbm7+/v4uKSnp5uYYHaWQCmApfoAaClMjIyYmJiVCpVampq48Jdu3b16dOHw+HExMSkp6czGiAA/Aln8AAAAGYIZ/AAAABmCAkeAADADCHBAwAAmCEkeAAAADP0/wEAAP//aMDh0cMGbI4AAAAASUVORK5CYII=)" + ] + }, + "execution_count": 2, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "import { polynomialTransform } from '../encoding.ts';\n", + "import { trainTestSplit } from \"../split.ts\";\n", + "import regr from '../regr/mod.ts';\n", + "\n", + "const polyDf = df.select('x').hstack(\n", + " polynomialTransform(df.drop('y'), 36, false, false)\n", + ").hstack(df.select('y'));\n", + "\n", + "const [trainX, trainY] = [polyDf.drop('y'), polyDf.select('y')]\n", + "const linreg = regr.Linear();\n", + "linreg.fit(trainX.rows(), trainY.rows());\n", + "const predY = linreg.predict(trainX.rows());\n", + "\n", + "\n", + "plot.DrawPlot(\n", + " { \n", + " width: 7,\n", + " height: 4,\n", + " XLabel: \"X\", \n", + " YLabel: \"Y\", \n", + " }, \n", + " { type: \"line\", data: [real.x, real.y], legend: \"Sinusoid\", lineDashes: [3, 4], lineColor: \"#ff8888\", lineWidth: 1 },\n", + " { type: \"linePoints\", data: [trainX.x, df.y], legend: \"Test Data\", lineDashes: [3, 4], lineColor: \"#8888ff\", glyphColor: \"#4444ff\", glyphShape: \"circle\" },\n", + " { type: \"linePoints\", data: [trainX.x, predY], lineWidth: .5, legend: \"Predicted\", glyphColor: '#f00', glyphShape: \"pyramid\" },\n", + ");\n" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Deno", + "language": "typescript", + "name": "deno" + }, + "language_info": { + "codemirror_mode": "typescript", + "file_extension": ".ts", + "mimetype": "text/x.typescript", + "name": "typescript", + "nbconvert_exporter": "script", + "pygments_lexer": "typescript", + "version": "5.6.2" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/regr/main.go b/regr/main.go index 6dfb09d..bee5480 100644 --- a/regr/main.go +++ b/regr/main.go @@ -11,7 +11,7 @@ import ( func InitRegrExports(this js.Value, args []js.Value) interface{} { exports := args[0] - exports.Set("ABCD", js.FuncOf(src.ABCD)) + exports.Set("Linear", js.FuncOf(src.NewLinearRegressionJS)) return nil } diff --git a/stat/mod.ts b/regr/mod.ts similarity index 83% rename from stat/mod.ts rename to regr/mod.ts index d4dcba6..69a9713 100644 --- a/stat/mod.ts +++ b/regr/mod.ts @@ -1,5 +1,4 @@ import "../lib/wasm_tinygo.js"; -import type { Stat } from "./types.ts"; // @ts-expect-error: no types const go = new Go(); @@ -13,9 +12,9 @@ const wasm = wasmMmodule.instance; go.run(wasm); -const _exports = {} as Record unknown> & Stat; +const _exports = {} as Record unknown>; // @ts-ignore: no types -__InitStatExports(_exports); +__InitRegrExports(_exports); export default _exports; diff --git a/regr/mod.wasm b/regr/mod.wasm new file mode 100755 index 0000000..1ece383 Binary files /dev/null and b/regr/mod.wasm differ diff --git a/regr/src/Linear.go b/regr/src/Linear.go deleted file mode 100644 index 30cac26..0000000 --- a/regr/src/Linear.go +++ /dev/null @@ -1,16 +0,0 @@ -//go:build js && wasm -// +build js,wasm - -package src - -import "syscall/js" - -// ref: mat.Dense -// fit: solve least squares -// predict: predict y from x -// save: save model -// load: load model -// note: separate wasm/js glue -func ABCD(this js.Value, args []js.Value) interface{} { - return nil -} diff --git a/regr/src/LinearRegression.go b/regr/src/LinearRegression.go new file mode 100644 index 0000000..e9e1817 --- /dev/null +++ b/regr/src/LinearRegression.go @@ -0,0 +1,59 @@ +//go:build js && wasm +// +build js,wasm + +package src + +import ( + "syscall/js" + + "gonum.org/v1/gonum/mat" +) + +// ref: mat.Dense +// fit: solve least squares +// predict: predict y from x +// save: save model +// load: load model +// note: separate wasm/js glue + +type LinearRegression struct { + Coef *mat.Dense +} + +func (reg *LinearRegression) Fit(X, Y [][]float64) error { + XDense := Array2DToDense(X) + YDense := Array2DToDense(Y) + reg.Coef = new(mat.Dense) + reg.Coef.Solve(XDense, YDense) + return nil +} + +func (reg *LinearRegression) Predict(X [][]float64) ([]float64, error) { + YDense := new(mat.Dense) + YDense.Mul(Array2DToDense(X), reg.Coef) + return YDense.RawMatrix().Data, nil +} + +func (l *LinearRegression) Save() ([]byte, error) { + return nil, nil +} + +func (l *LinearRegression) Load(data []byte) error { + return nil +} + +func NewLinearRegressionJS(this js.Value, args []js.Value) interface{} { + reg := new(LinearRegression) + obj := js.Global().Get("Object").New() + obj.Set("fit", js.FuncOf(func(this js.Value, args []js.Value) interface{} { + X := JSFloatArray2D(args[0]) + Y := JSFloatArray2D(args[1]) + return reg.Fit(X, Y) + })) + obj.Set("predict", js.FuncOf(func(this js.Value, args []js.Value) interface{} { + X := JSFloatArray2D(args[0]) + Y, _ := reg.Predict(X) + return ToJSArray(Y) + })) + return obj +} diff --git a/regr/src/utils.go b/regr/src/utils.go new file mode 100644 index 0000000..8e4ff57 --- /dev/null +++ b/regr/src/utils.go @@ -0,0 +1,39 @@ +//go:build js && wasm +// +build js,wasm + +package src + +import ( + "syscall/js" + + "gonum.org/v1/gonum/mat" +) + +func Array2DToDense(X [][]float64) *mat.Dense { + dense := mat.NewDense(len(X), len(X[0]), nil) + for i, row := range X { + dense.SetRow(i, row) + } + return dense +} + +func JSFloatArray2D(arg js.Value) [][]float64 { + arr := make([][]float64, arg.Length()) + for i := 0; i < len(arr); i++ { + arr[i] = make([]float64, arg.Index(i).Length()) + } + for i := 0; i < len(arr); i++ { + for j := 0; j < arg.Index(i).Length(); j++ { + arr[i][j] = arg.Index(i).Index(j).Float() + } + } + return arr +} + +func ToJSArray[T any](arr []T) []interface{} { + jsArr := make([]interface{}, len(arr)) + for i, v := range arr { + jsArr[i] = v + } + return jsArr +}