diff --git a/examples/branching.ipynb b/examples/branching.ipynb new file mode 100644 index 000000000..3818d36cb --- /dev/null +++ b/examples/branching.ipynb @@ -0,0 +1,268 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "710dc4f0-1c88-4386-9e9d-fec3de6bb774", + "metadata": {}, + "source": [ + "# Branching\n", + "\n", + "LangGraph natively supports fanning out and in. Below is an example implementing this in MessageGraph." + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "id": "88a23fb3-cf33-41ec-95bf-1ab9e7616ea9", + "metadata": {}, + "outputs": [], + "source": [ + "from langchain_anthropic import ChatAnthropic\n", + "from langchain_community.utilities.tavily_search import TavilySearchAPIWrapper\n", + "from langchain_core.output_parsers import StrOutputParser\n", + "from langchain_core.prompts import ChatPromptTemplate, MessagesPlaceholder\n", + "\n", + "from langgraph.graph import MessageGraph" + ] + }, + { + "cell_type": "markdown", + "id": "cf5ce3aa-8629-4a2a-ad42-bfce3276b11e", + "metadata": {}, + "source": [ + "#### Define the logic" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "id": "0dd1c0fa-4281-40a9-92f7-0a80d423238b", + "metadata": {}, + "outputs": [], + "source": [ + "from langchain_core.messages import HumanMessage\n", + "\n", + "llm = ChatAnthropic(model=\"claude-3-haiku-20240307\")\n", + "\n", + "\n", + "## Branch 1\n", + "fan_prompt = ChatPromptTemplate.from_messages(\n", + " [\n", + " (\n", + " \"system\",\n", + " \"You are an ardent fan and hype-man of whatever topic\"\n", + " \" the user asks you for information on.\"\n", + " \" Purely positive, though thorough in your debating skills.\",\n", + " ),\n", + " MessagesPlaceholder(variable_name=\"messages\"),\n", + " ]\n", + ")\n", + "\n", + "proponent = fan_prompt | llm\n", + "\n", + "\n", + "## Branch 2\n", + "detractor_prompt = ChatPromptTemplate.from_messages(\n", + " [\n", + " (\n", + " \"system\",\n", + " \"You are a critic and staunch detractor of whatever topic\"\n", + " \" the user asks you for information on.\"\n", + " \" Mr Johnny Rain Cloud, you will find holes in any argument the user puts forth, though you are thorough and uncompromising\"\n", + " \" in your research and debating skills.\",\n", + " ),\n", + " MessagesPlaceholder(variable_name=\"messages\"),\n", + " ]\n", + ")\n", + "opponent = detractor_prompt | llm\n", + "\n", + "\n", + "## Sink (this receives the inputs after both branches are finished executing)\n", + "\n", + "synthesis_prompt = ChatPromptTemplate.from_messages(\n", + " [\n", + " (\n", + " \"system\",\n", + " \"Which argument is stronger? Pick a side.\",\n", + " ),\n", + " MessagesPlaceholder(variable_name=\"messages\"),\n", + " ]\n", + ")\n", + "\n", + "\n", + "def merge_messages(messages: list):\n", + " original = messages[0].content\n", + " arguments = \"\\n\".join(\n", + " [f\"Argument {i}: {msg.content}\" for i, msg in enumerate(messages[1:])]\n", + " )\n", + " return {\n", + " \"messages\": [\n", + " HumanMessage(\n", + " content=f\"\"\"Topic: {original}\n", + "Arguments: {arguments}\\n\\nWhich argument is more compelling?\"\"\"\n", + " )\n", + " ]\n", + " }\n", + "\n", + "\n", + "final = merge_messages | synthesis_prompt | llm" + ] + }, + { + "cell_type": "markdown", + "id": "e1e0e4e7-b202-477c-acd3-0486073a1d00", + "metadata": {}, + "source": [ + "## Define Graph" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "id": "1103da16-d51d-4d19-bb3c-868a1306120a", + "metadata": {}, + "outputs": [], + "source": [ + "builder = MessageGraph()\n", + "\n", + "\n", + "def dictify(messages: list):\n", + " return {\"messages\": messages}\n", + "\n", + "\n", + "builder.add_node(\"source\", lambda x: [])\n", + "builder.add_node(\"branch_1\", dictify | proponent)\n", + "builder.add_node(\"branch_2\", dictify | opponent)\n", + "builder.add_node(\"sink\", final)\n", + "\n", + "# Define edges\n", + "\n", + "builder.set_entry_point(\"source\")\n", + "# Fan out\n", + "builder.add_edge(\"source\", \"branch_1\")\n", + "builder.add_edge(\"source\", \"branch_2\")\n", + "# Fan back in\n", + "builder.add_edge(\"branch_1\", \"sink\")\n", + "builder.add_edge(\"branch_2\", \"sink\")\n", + "\n", + "builder.set_finish_point(\"sink\")\n", + "graph = builder.compile()" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "id": "bd784dc6-c269-416d-9262-ebe401f2b4ee", + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAZcAAAKACAYAAABQXTWzAAAABmJLR0QA/wD/AP+gvaeTAAAgAElEQVR4nOzdeVxU9f7H8dcwM+yrILgh4Ia7ggsq7ku577lbuVRqZcvt3sq26/3dMm/ZLbuVZppamZqmgkK5JYqoaaDmCooLCgjIvs8M5/fHJGbuOnBYPs/H4zwYZg6cNzDDe84533OORlEUBSGEEMJyvrZSO4EQQoiqR8pFCCGExUm5CCGEsDid2gGEUEtGRgZ5eXnk5eWRm5uLoihkZmbeME9ubi4Gg+GG+9zc3G743MHBAWtra2xtbbG3t8fV1RVHR0f0en2Z/wxCVFRSLqLSM5lMJCUlceHCBdLS0khLS+PKlSult1NT00hJTSE9PZ2cnFwKCvLJz8sr81x6a2sc7B1wdXPFwcEBDw8PateqhYeHR+lUs2ZNvLy8qFOnDt7e3tja2pZ5LiHKg0ZGi4nK4NKlS5w+fZq4uDguXrzIxYsXOXf+AgkJF0lKTMRoNJbOa+/oiJt7TZzcauDoVgNntxo4ubnj5OqGnYMDNnZ22NjZ4+jsio2dHda2dtg7Opq/1skZjdX1rcU2NrbobWxKPy8xmcjPy70hW0FuDiUmE8VFhRQVFJCfk0NBXi5FhQUUFeSTl51NQV4uORnpZF5NJTcznZyMDLIzrpKVns6fX4KeXl54e3tTv3596nt74+vrS8OGDfH396dBgwbodPJ+UFQKX0u5iApDURTOnDlDTEwMJ0+e5PTp05w8dYq42Djy/viH7ujsgmfderjXrotH6VSn9LaLuwd6a2uVf5J7p5SUkJVxlavJSVxNSiQ16TJpiZdJS7pMenIiaUmXSbuSDIBOr8fPz49mzZrR1N8ff39/2rZtS8uWLbGuRD+zqBakXIQ6TCYTx48fJyYmhpiYGH77LZojR46Qk5ONVqejtrcPtf0aUse3IXX8GlLHtwF1GzTCxd1D7ejlrjA/j8vnzpJ0Pp7L585yOT6O5PPnuHzuDIUFBej0epo3b067wEACAgII/OOjvb292tFF9SXlIsqH0WjkyJEjREZGEhm5l+07dpCZkY5Op6eOrx9+LVrTsEVrGrRoTYMWrbCxtVM7cqWQnnKF+ONHOXv8KOeOH+XM0Rgyrqah0+lo1boN3boG07VrV3r16oWHR/UrZqEaKRdRNhRFITo6mrCwMMJ/+pnffjtEcVERNWvXoWm7jvgHdKBZuyC8GzdBq5X9CJaUcjmBU9EHORV9kNO/HeDimVgURaFps2b069uXgQMH0qNHDxk8IMqSlIuwnKysLH7++WfCw8MJCwsnJeUKHrVq07ZbL5q370Sz9kF41vVWO2a1k5uVyanog5w4dIDfoyKIP3kcOzt7evXqxaBBAxk0aBA+Pj5qxxRVi5SLeDiFhYVs27aNtT/8wPp16ykqLqJBsxYE9uxH+179aNC8FRqNRu2Y4k+yrqYRs+cXondt58jeCHJzsmnWvDlPPP44jz/+OLVr11Y7oqj8pFzE/VMUhR07drBy5Uo2bNxIfn4+rTt1JXjQcDr2eRRHF1e1I4p7ZDQYOLpvD5FbNnJw+08UFRbQq1dvJk2ayJgxY7Czk31f4oFIuYh7l5OTw4oVK/j0f58Re/oUzQI7EDxoOJ37D8bVvaba8cRDKi4s5LeI7URu3kB0xE4cHR2ZPn0aM2fOxNfXV+14onKRchF3d+nSJf7zn//w9fLlmEwmug0ZSf+JU/Bp0kztaKKMZF5NZfva79i25hsyUlMYNGgwr7/+Gp06dVI7mqgcpFzE7aWmpjJv3jw+/+ILXN096D9pKn1GTcDB2VntaKKcmExGDmwLJ2zlV5yMPsjgwUN4991/07p1a7WjiYpNykXcrLCwkHnz5rHgo4+wtXdgxDOz6TdmEjo5EWO1FrPnF1Z/Mp/4E8cYM3Ys/5k/H29vGf0nbknKRdwoKiqKJ6dMJTEpiZHPzGbApClyQKMopSgKB7aFseq/75OdlsqHH37AU089JSMCxV/JlSiFWWFhIS+99BLdunXDuXY9/hv6C8Onz5JiETfQaDR0emQQCzZup8/YScx69ln69O3LhQsX1I4mKhhZcxGkpaUxbNhwjh47xpQ5c+k5fIzakUQlceb3w3w+5yUKsjIJDQ2hY8eOakcSFYOsuVR3Z8+epUtwV+ITEnj3+5BqWSz5Odksf/+fHNq1rUospzw1atWWeWu34NOyDd179GDNmjVqRxIVhJRLNXbmzBk6d+6ClZ0D763eTL2GjdWOVO5OHNzPs48GE7r8S0wG492/oIIvRw02dvb849Ol9Bo5jgkTJvDDDz+oHUlUAHLGwGoqJyeH/gMG4lq7Dm9/vQZbewe1I6ni3MljZKdfBSjTndLltRy1WGm1PPX2e2i1WiZNnoyfnx/t27dXO5ZQkZRLNfXCiy9yNSODBct/qJLFUpCbQ9RPm7mScIGCvFxc3D3wD2hPy6Dg0n/uv++PJO5oTOnXHDuwl/zcbNr3eqT0FDYmk5FDO7dx7tRxcjLSsbW3p17DxgT1HYC90/XjfY7/GkVq4iVsHRzp0KsfO39cQ1pSIm2De2A0Gu66nKpiyutzuRx/hrHjxnPs96Ny+phqTHboV0MHDx4kKCiIv328mM6PDlY7jsWdOLif+c9NJTcr86bHggcO5eWPFgEwb+YTHPrl5v0fH27Yhl+zFpSYTMyZMIy4I9E3zVPbx483l3xHrfq+APzn+Wkc2BaOZ736tAzqws71qwHwbuSPl3f9Oy6nqklPucLsAV15c84c5syZo3YcoQ7ZoV8dfbhgAY1atamSxQLwyT+eIzcrEy9vH0bNeIEpr8+lZVAwAHvDQtgdsh4Ar3r1qeHpVfp1nnW98W3aHJs/rnMSuuLL0mIJ7NGHwU88RcMW5iPTky6c4/tP/nPTslMvJ7Bz/Wps7OzRanV0Hzryrsupamp4ejHo8af4+JOFFBcXqx1HqEQ2i1UzRUVFbNq0iSlz/k/tKGUiMy2FtKREAJq378SYZ19Gp9fz6PgnWPu/BdT2bUCD5q0AmPrG/+Hl7cOy994GzJt0OvbtX/q97B2d6T1qHHb2Dkx9w/z7KirIZ0rnVhQVFpB0Pv6m5SuKQouOXXhryXcU5OdhpdXi6Oxyx+VURf3GTGTdFx8TERFBv3791I4jVCDlUs0cPnyYosJCWnUKVjtKmXBxr4mjiyu5WZn8smENv+4Ip0WHzrTu0p1+Yyfd18XK+o2ZSL8xEwHziRxjD0dz/Neo0scL8vNu+XXDp89Cb2OD3sbm4X6YSsyjdl3q+Piyf/9+KZdqSsqlmrly5QoA7rXqqJykbGg0Gp599yM+fOFpTCYjednZ/LrjZ37d8TNf/d8btAnuwdPvzCvdV3InJpORjUs+Y//WMM6dPMZfd0/ebtRXHd8GlvhRKj2P2nVJSkpSO4ZQiexzqWb0f5x80mioutvCO/btz6KdvzLmub/RuHUAVlpt6WNH9kYw/9mp9/R9PnzhaVZ9PJ/4E7/TrH0QT772TxZs3F5aTBqrW798bO3tH/pnqAoMxcXYVOO1t+pO1lyqGT8/PwAux5+hUau2KqexPEVRuJqcROK5s/QeOZaxz/2N/JxsDkfuYsV//o+0pMtcjDtFZloKrh6e8Ke1jxKlpPT21eQkft3+EwCd+g3k759+VfpYfk42ABpuveai01vffOdtllNVKYrC5XNn8X18otpRhEpkzaWa8ff3x6tWbQ7t2q52lDLx6/afeKZXe+ZOHctnc16muLAQeydnOvR+FLeangDobWxwcnUDuOEyAgmxp0i+eJ6C3BzSr1zfnFOQl1u6Sezn71eQnZH+x/05t8xgdYs1mtstp6qKPfwb2Rnp9OrVS+0oQiVSLtWMRqNh6pQn2fnDdxQV5Ksdx+I69nmUFh27AOaDJB/v2JS/De/LpPZNSg9kHPLE02h15n/2df0aln7t6k8/5NlHuhB7NAYf/+alw4ePRO1mZp8gZvYJ4su5r6PVmlf4czIyKDGZ7inX7ZZTVW1e/iVtAwLkomLVmJRLNfTSSy9hKCzkhy8+VjuKxWmsrHjjy28Y8uTT2Dk4Yigu5vypExgNBpzdavDEq28z4cVXS+dv0aEznfoNLP1cp9dTkJeLta0tf//0K2r7mDcjpiZeIjsjncmvvMnj/3gLgKLCAn4/sPeect1uOVXR7/sj2bd1C/+aO1ftKEJFcoR+NfXll18yc9Ys3lqyitZduqkdp0yYjAauXkkmJyMdN89auNX0vO0Ir8y0FLIz0qnr17B0rQZAKSkh5XIChuJi6vo1vO1O/Ht1u+VUFZlpKbw6egDdg7uwft06teMI9ciVKKuzCRMnEhK6mXeWry098lyIB5WbncW/nhyDlbGIA/v34+bmpnYkoR4pl+qsuLiYoUOHsTtyDy9/tIjAHn3KbdkvD723ZV0+dwajwYBPk2b3NP8LH/wPH/97m1dtiefO8uELT9/TvBX995By6SLvzZiMUlTE7ohdpaMSRbX1tQxFrsasra0JDQ1hxowZvP/sFKbO+Rf9JzxZLstOTri3y+IaDYb7mt9QXPTAmcqbwVBcJX4PcUeimf/sFHy867ElYhd16lTNA3TF/ZE1FwHAu+++y1tvvUXHPo/y1DvzcKvpdfcvEtWa0WBg3Rcfs2HJ/3ik3yOsWbMaR0dHtWOJikHOiizM3njjDX755RdS4uN4aXAvdm1cq3YkUYHFHY3hH6MeJWzFEj5asIDQ0BApFnEDWXMRNygoKGDu3Ll8+OGHNGrZhpEzXqB9LznxoDBLTbzEj4sXsn3d93Tp0oVlS5fSuHH1uzy2uCtZcxE3srOz4/333+fXX3/Ft5Yn82Y+wdwnx3D68G9qRxMqupqcxOK3/8FzjwRz/vBBVn//PbsjIqRYxG3Jmou4o3379vH6nDlE7NpFo5atGTBpGt0GD6+Sx2iIm509fpTta79l18Yf8KzpyVtvvcnUqVPR6WQskLgjGYos7s3OnTv59H//IzQkBFePmvQbO5k+oyfccIVFUTUUFRawNyyEn75bxtnjvxPYrh2zn3+e8ePHY219i5NyCnEzKRdxfxITE/nyyy/532efk5F+Ff+27encfzDdBo/AuYa72vHEAyoxmTh2IIqITT/w646fMBQXM2zYMJ55+mn69u2rdjxR+Ui5iAdTWFhIWFgYq77/ni1btmAymmjbrSedHhlEQLdeuLh7qB1R3EVxYSHHfo3i4Paf2L91CzlZmXTuEszECeMZM2YMHh7yNxQPTMpFPLzs7Gw2btzIqlXfs/OXnZiMRhq1bE3b7n0I7NaLRq3aPvQ5uYRlJF88T8yeX4iJ2MGxX6MoLiqidZs2jB83jvHjx1O/fn21I4qqQcpFWFZubi47duwgPDycLWFhXEpIwKWGO00DO9CsfSeaBnagQYtWpaetF2Ur8Xw8p6IPcvLgfk5F/0rihXM4OTnT75F+DBwwgAEDBsgR9aIsSLmIsnXs2DG2bdvG7t27iYzcS1paKnb29jRp244mAR1o2KI1fs1a4lFb/sE9rLzsbM6d/J1zJ45x+vAhTv32Kxlpqdja2dGxQ0d69OhO7969CQ4OLr3ctRBlRMpFlB9FUTh16hSRkZHs2bOHvVFRnIuPR1EUXGq449esJX7NW+LXrBX1GjWmjm9D9DI66SbXLgNw6Wwc508d59zJY5w/eYyki+bzjnnUrEmnTp3o3q0bXbt2pX379lImorxJuQh1ZWdnc/jwYWJiYoiJieG36GhOnTyJ0WjESqvFq2496vg2pE6DRtTxa0gd3wZ41vWmhlftGy4dXNUoikJmWgppiZdJunCOS/FnSDx3luTzZ7l0Lr70xJQ+vr4EBAQQGBBAwB9T3bp1VU4vhJSLqICKioqIjY3l9OnTxMbGcurUKU6cPElcbBzZ2VmA+XLNNWp6UrNOPdy8auNRuw4169TDuYY7LjU8cHH3wMmtBs5uNSpUCSmKQk5GOtkZ6WSnXyU7M52MlCtkpFwhLTmRq4mXzB+TkzEYigHQW1vTqFEjmjVrhn+TJjRt2hR/f3/8/f1xdXVV+ScS4pakXETlcuXKFS5cuEBCQgIJCQmlty9cvEhCQgJX09IwGo03fI2jswuu7h7YOzlh5+iMrb09NnbmycHZGRtbO/Q2tji6uNzwdfaOzmisbn3lyoLcXEpKTKWfF+blUVxcREFuDgV5eRTm51NcWEBedhbFhQUU5GSTlZFOVvpVSkpKbvhebjXcqVOnNr6+vtT39sb7j8nHx6f0tlartdBvUIhyIeUiqp6rV6+SmppKWloaaWlppKSkkJKSQnZ2NllZWeTm5pKbl0debi7pGRnk5eVRUFBATnZO6fcoKSkpXUu6FXsHB6z11/cH2drZYm9vj4uLC46OTjg6OODo6ICbmxsODg44Ozvj4eGBh4cHXl5e1KxZs/RzOZWKqIKkXIS4m+LiYmxsbNiwYQPDhw9XO44QlYGcFVkIIYTlSbkIIYSwOCkXIYQQFiflIoQQwuKkXIQQQliclIsQQgiLk3IRQghhcVIuQgghLE7KRQghhMVJuQghhLA4KRchhBAWJ+UihBDC4qRchBBCWJyUixBCCIuTchFCCGFxUi5CCCEsTspFCCGExUm5CCGEsDgpFyGEEBYn5SKEEMLipFyEEEJYnJSLEEIIi5NyEUIIYXFSLkIIISxOykUIIYTFSbkIIYSwOCkXIYQQFiflIoQQwuKkXIQQQliclIsQQgiLk3IRQghhcVIuQgghLE7KRQghhMVJuQghhLA4KRchhBAWJ+UihBDC4qRchBBCWJyUixBCCIuTchFCCGFxUi5CCCEsTspFCCGExUm5CCGEsDgpFyGEEBYn5SKEEMLipFyEEEJYnJSLEEIIi5NyEUIIYXFSLkIIISxOykUIIYTFSbkIIYSwOCkXIYQQFiflIoQQwuKkXIQQQliclIsQQgiLk3IRQghhcVIuQgghLE7KRQghhMVJuQghhLA4KRchhBAWJ+UihBDC4qRchBBCWJyUixBCCIuTchFCCGFxUi5CCCEsTspFCCGExUm5CCGEsDgpFyGEEBYn5SKEEMLipFyEEEJYnJSLEEIIi5NyEUIIYXFSLkIIISxOykUIIYTFSbkIIYSwOCkXIYQQFiflIoQQwuKkXIQQQliclIsQQgiLk3IR4i+6dOmCRqMpnWxsbAAYMWLEDfdbW1uTmpqqclohKiYpFyH+Yvz48Wg0mjvOY2VlRa9evahZs2Y5pRKicpFyEeIvxo4de9dyAZg8eXI5pBGicpJyEeIvPD096dmzJ1qt9rbz6HQ6hg4dWo6phKhcpFyEuIXJkyejKMotH9PpdAwbNgxnZ+dyTiVE5SHlIsQtjBw5Ep1Od8vHTCYTEydOLOdEQlQuUi5C3IKzszMDBgy4ZcE4ODjQv39/FVIJUXlIuQhxG5MmTcJkMt1wn16vZ8yYMaXDk4UQtyblIsRtDB48GHt7+xvuMxgMTJgwQaVEQlQeUi5C3IatrS2jRo1Cr9eX3ufu7k7Pnj3VCyVEJSHlIsQdTJgwAYPBAIC1tTWTJ0++4xBlIYSZlIsQd9CnTx/c3NwAKC4uZty4cSonEqJykHIR4g50Ol3psGNvb286duyociIhKgcpFyHuYvz48QA88cQT93RaGCGElIsQd9W5c2f8/Pxkk5gQ9+HWhyALUY2UlJSQmZlZOimKgtFoJCcnp3Se4cOHc/nyZZKSkgDzSDI7OzsAnJyccHFxwdXVVY5/EeIPGuV2J1ASopK7evUqZ86cITExkUuXLpGUlMTly5dJTLzIlSuJZGZmkZmZTU5OgcWWaWdnjYuLI66uLnh41KRevQbUqlULb2/v0o8+Pj54e3vLJjZRlX0t5SIqvfj4eGJiYjh16hSxsbHExh4jLu4MV69ml87j5WVNrVoa6tUzUru2idq1wcUFXF2vf7w2WVmBRmO+fY29PeTnX/88Lw+Ki823s7MhMxOysq5/zMqC1FRISLAiOVnHpUtw5YoRg6EEMJdQkyYNaNy4OY0b++Pv70/btm1p3rz5DcfVCFFJSbmIyuXChQvs2bOH6OhoDh8+RExMDJmZuWi1Gnx9rWnc2EiTJib8/aFxY/NUpw5YW6udHBQFrlyB+Hg4fRri4iAuzorYWD2xsQYKC0uwttbRqlUzAgKCCAgIoHPnzrRu3VqOrRGVjZSLqNji4uLYvXs3ERG7iIjYzsWLyVhbW9GypY7AwGICAiAgAFq3BgcHtdM+OKMRTp2CmJhrk56YGIWsLCOuro507dqN7t170b17d9q3by9lIyo6KRdRsZhMJvbt28fmzZsJDV3HiRNnsbfXEhAAXbua6NsXgoPhj33pVV58PGzfDpGRVuzapSchoYgaNZzp0+cRBg8ewtChQ3H98/Y7ISoGKRehPpPJxLZt2/j225Vs2RJKZmYuzZpZM2RIMYMGQefOILshzE6cgLAw2LxZx969JjQaK3r06MaECY8zatQouYCZqCikXIR6jh49ysqVK1m1aiXJyal07qznsccMDBkCDRuqna7iS0+Hn36CH3+0YssW0Gh0DB8+gsmTn+CRRx6RTWdCTVIuonyVlJSwZcsWFi5cwPbtEXh765kwwcC0aead7+LBZGXBpk3wzTd6duwwULu2J089NZMXXnih9NxoQpQjKRdRPgoKCli8eDELFy7gwoXLDB5sxYsvmujZ0zzsV1jOmTPw6afw9ddawJqpU5/mlVdeoV69empHE9WHlIsoW0ajkeXLl/PPf75BZuZVpkwx8cIL0KiR2smqvqwsWLIEFi7Uk5am4bnnXuC1116jRo0aakcTVZ+Uiyg7YWFhvPLKC5w5E89TTym89ZZCrVpqp6p+iorgiy/g3Xd1mEx2zJnzNi+++CI6nZz9SZSZr+XElcLi0tPTefzxSQwaNIiWLeM5caKEzz6TYlGLjQ28+CKcPWvkuedyePvt1+jUqR1Hjx5VO5qowqRchEVt2bKFFi382bFjLSEhsHZtiWwCqyCcneFf/4KYGBO2tifo0KEd//73vykpKVE7mqiCpFyExcyfP5+hQ4fw6KNXOX7cPKRYVDz+/rB7t5H58438+9/vMHLkMHJzc9WOJaoY2eciHlpxcTFPPTWdVau+46OPSnj+ebUTiXsVFQUjR+rw8mpMaOhP1K9fX+1IomqQHfri4ZSUlDB+/Fh++mkja9caefRRtROJ+3XhAgwZoqegoA6RkQfw8vJSO5Ko/GSHvng4L7/8Ehs3/sj69VIslZWPD+zcaUCnS6Rfv15kZmaqHUlUAVIu4oEtXryY//3vU9asKaFvX7XTiIfh4QFhYQauXj3DtGlPqpxGVAWyWUw8kKSkJJo3b8KMGbnMm6d2GmEpu3ZB796wbt16Ro4cqXYcUXnJPhfxYMaNe4zfftvE0aOGcj39fXY2/PCD+VT0OTng6QldukCvXrc+jYzJZL4+yu7d5gt1tWxp/udZt+6N8+3daz5tCsDo0TdeG2b1avOBiDVqUDoCbtcu874KJyfzfV9/DQkJ8Mgj0K3b9a9NTDSfMv/YMdBqzSO1xowxX9nyr44eNX/f8+ehaVPo3t38sbxNm2ZFeHgN4uLO41CZL5Ij1PQ1ihD36dKlS4pWa6WsXYuiKOU3RUSg1KiBAjdPY8fePH9cHEq9ejfP6+iI8vnnN8775JPXH79w4cbH3NzM97dte/2+ESPM9/n5oUydev1rW7S4Ps/y5SjOzjcvv2ZNlEOHrs9nMqG88QaKldWN8+l0KPPmoZSUlO/vOTUVxcbGSlm+fPnDPE1E9bZM9rmI+7Zy5UpcXa0YOrR8lztpkvk08w0awBtvwH//a15jAVizBr799vq8586Z11AuXTJ/3rkzDBxoXmPIzYVZs2D58ofPdP48LFtmXtPR6WDiRPP9+/fDlCnmNS2NBvr1g549wcoKUlPNazuFheZ5ly2Dd9+FkhJwd4ennoJ69cxXp3z9dfOaWnny8IChQ+Hrr78s3wWLqkXtehOVT4cObZSZM8v33XRS0vV39E8+iVJUZL6/sBDl9ddRli1DOX78+vwTJlyf/+OPr99/8iSKtbX5fjc3lPT0h1tzAZSePVEKCszv+K99v27dzI9ZWaHs33/9655/HkWjQfH1Rdm1y/xzeHqa53V1RcnNNc9nMKDUr2++v1mz8l972bQJRaPRKGlpaQ/1XBHVlqy5iPujKAq//36Sjh3Ld7leXuZ9HmBe4/DyguHDzWf9ffpp81pC8+bX5//lF/NHGxuYNu36/U2bXl/byciAgwcfPts//gG2tuZ3/G5uoCjXv2+HDhAUdH3eefMgM9O8ZtWjB5w9Cykp5sf69DGvzVy9aj6j8cCB5vtPnoTk5IfPeT86drz2t/69fBcsqgwpF3Ff8vLyKCwspryPs9NoYOlS86YnMP+D3rQJnn8e/Pzg0UfN/6jB/I87Kcl8u2dPcHS88XsNHnz99vHjNy9L+csQF6Pxztn+epGzS5eub/KqU+fGxxwczOf4uiYu7vrt9evNBXVtWrTo+mOXL985g6V5eoKVlYbU1NTyXbCoMuSc2+K+6P+4mL3JVP7LHj7cvI9jyRIID4fffrueY+tW8+O//w61aoFeDwbDrf8pX9sPA+Y1jb8yGG78/FpR3M5fy+vPn2dn3/lr//h1AtC2LbRvf+v5bG3v/H0szWSCkhKl9O8txP2SchH3xcbGhho1nLhwIadcl6so5lI4fdq8Ceyf/zRvOvr5Z/j73+HiRfNw3+Rkc7m0bWveNHXsmHnYcoMG179XSMj1261amT/+eW0iK+v67cTEm8vmr6ytb/zczc285pGWZh5eXFRk3jwHsGULPPuseUj0jBk3rvU4OZmL85rjx81FVb9++V+t88IF88c6f131EuIeyWYxcd86dOjIrl3acl3mxo3mf7L9+sHUqVBQAC4u5lFN164TY2trHm0F5pFi1zz7rHnzU1oa/Pvf5n0YYN7nERhovv3n40mWLjVvCktPh5kz755Ne4tfxZgx5o+pqZ91JsoAACAASURBVObbhw5BdDS8/bb5H/eWLeYS8ve/niEy0jzqzWQyzxMcDL6+5qIsLr7nX5VF7NoFtrbWtGzZsnwXLKoOtYcUiMpn+fLlirW1lZKaWn6jl0wm86gs/hihZWOD0qbN9ZFfYB41dm3+4mKU0aNvfUwMoLi7m4+DuTb/77+bv+e1x52dUbRaFBcXFG/vO48Wy8y8Oe/Vqyi1at1++Y89dn3enTtR7O2vP+bhcf2YF53uxtFm5TV16aJTxo8f+7BPFVF9yWgxcf9Gjx6Nra0ty5aV3zKtrMzv9l96ybz5qKgIjhwxv6P38IAPPzSvlVyj15uPrH/11RvXSmxsYNQo8yanP1/ErGVL+P57Sgcq5ORA69awZw80aXL/eWvUgMOHYcSIG/er2NvDK6/AihXX7+vVy3zq+3btzAMW0tLMm9r69YPvvrtxtFl5OHIE9u0zMmXKtLvPLMRtyOlfxAN55513+O9/3+PYMSPlfQmQazvq09LMo7Fq1777Pom0NPOQ3yZNro84u524OHM5XNvE9rCKiyE21rzZrn79m/fR/FlhoXn5jRpRrqfVuaakBIKDdUAb9u79FSsref8pHoicW0w8mKKiItq2bYGf33m2bDGV+w5nUTY+/hhefVVHdPRhWrRooXYcUXnJ9VzEg7GxsWHp0pXs2KHhlVekWaqCsDD4xz+seOeduVIs4qFJuYgH1qVLF1as+IaPP4b589VOIx7Gvn3w2GNannjiSV5//XW144gqQI5zEQ9l3LhxpKam8sILL5CRofDee+ad76LyCAmBiRO19Os3gEWLvkQj2ziFBci/AfHQnn/+eVatWsXChdYMHqy961HpouL45BMYMULDuHFPsHbterS3OmhHiAcg5SIsYty4cezYsYvoaBcCAvSlJ44UFVNyMowYoeVvf7PivffmsWTJUqzvNIxNiPsk5SIspnPnzvz221GaNetD374aXnhBQ16e2qnEnymK+foxzZrpOHHCm4iI3bz66qtqxxJVkJSLsKi6deuyeXM4q1ev4bvvnPD31/Pll3c/s7Aoe/v3Q8+eep56SsOYMVOJjj5GcHCw2rFEFSXlIsrEY489xvHjsQwdOo3nntPSpo01GzfefDp7UfZ+/x2GDNHSuTPo9V349deDLF68GAcHB7WjiSpMykWUGS8vLz7//Avi4s7StetkRo3S4O+v55NPID9f7XRVX2QkDBmio00bOH++MWvXrmX79l20a9dO7WiiGpByEWXOx8eHxYu/4vDhI3TrNolXX9Xj46PnzTevX+BLWEZmJnz5JbRqpaNbNygo6EJo6GaOHj3BY489pnY8UY3I6V9EuUtJSeGLL75g8eL/kZycRpcueiZPNjBmzK0v3iXuzGCAn36Cb76xIjRUg0ajZezYcbz44su0adNG7XiiepJziwn1mEwmtm7dyrffrmTjxg2YTAb69tUwZIiJQYOgXj21E1ZcOTnmq29u3qxh82Yd6elGunXrwuTJUxg9ejQuLi5qRxTVm5SLqBhycnL48ccf2bTpR7Zu3Up+fiFt21ozaFAxvXtDp07qnCW4oigpMe+Y37ULwsK0REQoGI3QqVM7hgwZxbhx4/Dx8VE7phDXSLmIiqewsJBdu3YREhJCePgmzp9PxNraio4dtXTvbqBbN+jQwXKnxK+ICgrM11WJjISICC1792rIyDDi6upI376PMGTIMAYOHIiHh4faUYW4FSkXUfFdvHiRiIgIdu/eze7d24mNPQ+Aj481AQFGAgNLCAyEFi3M10upbOc2S001X3o5JsZ8KeToaGtOnTJgNCp4errRrVtPunfvSffu3WndurVcY0VUBlIuovJJSUkhOjqa6OhoYmJ+Izr6V+LjLwFgY2NFo0Z6mjQx0LhxCY0aQd264O0NtWpBzZrlnzcvDxISICkJLl2C+HjzxcPi4qyJiyshM9N8hKmHhwsBAYEEBnYkMDCQgIAAGjVqJCeSFJWRlIuoGjIzMzl16hSxsbHExcVx5Mhhdu36BUUpITe3oHQ+Gxsr6tTRU7u2gqurCRcXE66u4OICrq7mSaMxXzXy2j4enc58aeXCQvPmKjCfcSAnx3w7JweysszDgM0frcjK0pKSYsWlSyZycox/Wr4eZ2cnXF1rMGTIUBo3bkzjxo3x9/ennoxgEFWHlIuoenJzc+natSsGg4GoqCi0Wi0JCQkkJSVx+fJlLl++THJyMllZWWRmppOZeZWsrAwyMzPJzDSf0jkvr5Di4tufs0aj0eDqaj7C3cHBHldXF1xd3XBxqYGrqzsuLi54enpSt25dateujbe3N7Vq1cLT05Ply5czZcoUFi9ezNNPP10uvxMhytnXcj0XUaWUlJQwadIkLl++zP79+0uH5DZr1oxmzZo90PcsKioiPz8fvV6Po6PjQ2d88sknOX36NM899xwNGzakT58+D/09hahoZM1FVCmvvPIKn332GTt37qRz585qx7ktRVGYOHEiP//8M1FRUfj7+6sdSQhLks1iour4+uuvmTZtGitXrmTSpElqx7mrgoICevfuTUpKCvv376emGqMNhCgbX8uYRlEl7NmzhxkzZvD2229XimIBsLOzIzQ0FI1Gw8iRIykqKlI7khAWI2suotKLj48nKCiInj17snbt2ko3dPfEiRMEBwfTv39/Vq1aVenyC3ELsuYiKrf09HQGDBiAj48PK1asqJT/mJs3b87q1atZt24d7777rtpxhLAIGS0mKi2DwcCYMWPIzc1l586d2Nvbqx3pgT366KN88cUXPP300/j5+TFx4kS1IwnxUKRcRKU1e/ZsDhw4QGRkJHXr1lU7zkObPn06x48fZ/r06fj5+dGlSxe1IwnxwGSzmKiUFixYwJdffsm3335bpa5ZsmDBAh599FGGDRvGmTNn1I4jxAOTHfqi0gkPD2fIkCH85z//4eWXX1Y7jsXl5+fTs2dPcnNziYqKwtXVVe1IQtwvOc5FVC7Hjx8nODiYkSNHsmzZMrXjlJnExESCgoJo1KgRP//8M9bW1mpHEuJ+yGgxUXkkJyczcOBA2rRpw6JFi9SOU6bq1KlDSEgIhw4dYubMmWrHEeK+SbmISqGwsJARI0ag0+lYv359tXgnHxAQwJo1a1ixYgUffvih2nGEuC9SLqLCUxSFadOmERsbS3h4eLW6+uLAgQOZP38+r776Khs2bFA7jhD3TIYiiwrvn//8Jz/88APh4eE0adJE7Tjl7m9/+xvx8fFMnDiRXbt20bFjR7UjCXFXskNfVGg//PADY8eO5fPPP2fGjBlqx1GNyWRi2LBhREdHs3//furXr692JCHuREaLiYrr0KFD9OjRg1mzZvHBBx+oHUd12dnZdO3alZKSEvbu3Vt6rRohKiApF1ExXbhwgaCgIAIDAwkNDUWr1aodqUI4f/48nTp1IjAwkJCQEHQ62bItKiQZiiwqnpycHIYOHYqHhwerV6+WYvkTX19fNm/eTEREBK+88oracYS4LXnbIyqUkpISJk6cSEpKCgcOHMDZ2VntSBVO+/btWbFiBWPHjqVRo0Y899xzakcS4iay5iIqlJdffplt27axYcMG2Wl9B6NHj2bu3Lm8+OKLhIaGqh1HiJvImouoMJYuXcrChQv59ttv6dSpk9pxKrw333yThIQEJk6cyJ49e6rUCTxF5Sc79EWFEBERwSOPPMKbb77JW2+9pXacSsNgMNC/f39Onz7NgQMHqsSlB0SVIKPFhPpOnz5N586d6devH6tXr66UV5NUU3p6Op07d8bJyYmIiAgcHBzUjiSElItQV3p6Op06dcLFxYXdu3djZ2endqRKKT4+nk6dOtGtWzd++OEHrKxkd6pQlQxFFuoxGAyMHj2a4uJiNm/eLMXyEBo0aMD69evZsmULc+bMUTuOELJDX6jnueee49ChQ0RGRuLl5aV2nEqvW7duLF++nAkTJuDr61utT5cj1CflIlQxf/58li5dyoYNG2jdurXacaqMcePGcezYMWbPnk2jRo3o27ev2pFENSX7XES527JlC8OGDeOjjz5i9uzZasepchRFYfLkyYSGhrJ3715atmypdiRR/cgOfVG+YmJi6NatG+PGjeOrr75SO06VVVhYSO/evUlOTmb//v14enqqHUlUL1IuovwkJSURFBRE06ZNCQsLk5MulrG0tDQ6d+6Ml5cXO3bswMbGRu1IovqQ0WKifBQUFDB8+HAcHBxYs2aNFEs58PDwICQkhOPHj/P4448j7yNFeZJyEWVOURSmTp3K2bNnCQkJwc3NTe1I1UazZs3YsGEDGzduZO7cuWrHEdWIvH0UZe7NN99k/fr1/PzzzzRu3FjtONVOz549+fzzz3nqqado2LAhkydPVjuSqAakXESZWrNmDfPmzWPx4sX06tVL7TjV1rRp0zh58iTTp0/H29ubnj17qh1JVHGyQ1+Umb1799KnTx9eeukl5s2bp3acaq+kpIRRo0axZ88e9u3bJ2uRoizJaDFRNs6fP09QUBDBwcGsW7dOznVVQRQUFNCzZ0+ys7OJioqS/V+irEi5CMvLyckhODgYnU7Hnj175Cy9Fcy1IeF+fn5s27YNa2trtSOJqkeGIgvLMplMTJgwgbS0NDZt2iTFUgHVrl2b8PBwjhw5IucfE2VGykVY1AsvvMCOHTvYuHEj3t7eascRt9GiRQu+//57Vq5cyfz589WOI6ogKRdhMZ9++imff/45y5Yto2PHjmrHEXcxYMAAPvzwQ15//XVWr16tdhxRxchQZGERW7du5eWXX+bdd99l3LhxascR9+jFF1/kzJkzTJ06FV9fXzp16qR2JFFFyA598dBOnjxJly5dGDp0KCtWrFA7jrhPJpOJESNGcPDgQfbv34+Pj4/akUTlJ6PFxMO5evUqnTp1olatWmzfvl1OjlhJ5eTk0LVrV4xGI1FRUbi4uKgdSVRuMlpMPLji4mJGjx6N0Whk/fr1UiyVmJOTE2FhYWRlZTF27FiMRqPakUQlJ+UiHoiiKEyfPp3o6GhCQ0PleiFVQN26ddm0aRORkZHMmjVL7TiikpNyEQ/kvffeY9WqVaxatUqudFiFtGvXjhUrVrB06VIWLlyodhxRiUm5iPv2448/8vbbb/PJJ58waNAgteMICxs1ahTvvvsuL730Eps2bVI7jqikZIe+uC/R0dF0796dadOm8cknn6gdR5ShGTNm8N1337Fnzx7atm2rdhxRuchoMXHvEhMTCQoKokWLFmzevFmuJlnFGQwGBgwYwMmTJzlw4AD16tVTO5KoPKRcxL0pKCigR48e5ObmEhUVhaurq9qRRDnIzs6mS5cu2NjYsHv3bjlXnLhXMhRZ3F1JSQkTJkwgPj6ekJAQKZZqxNnZmdDQUC5dusTYsWMxmUxqRxKVhJSLuKvXX3+dsLAw1q9fT6NGjdSOI8qZn58f69evZ/v27bz22mtqxxGVhJSLuKPly5fzwQcf8NVXX9GjRw+14wiVdO3alZUrV7JgwQK++OILteOISkD2yIrb2rNnDzNmzOCNN95g8uTJascRKhszZgwnTpxg9uzZNGrUiH79+qkdSVRgskNf3NK5c+cICgqie/furF27Vi5TLADzmRkef/xxQkJCiIyMpFWrVmpHEhWTjBYTN5MRQuJOiouLefTRRzl//jz79+/Hy8tL7Uii4pHRYuJGRqORUaNGkZGRIZcpFrdkbW3NunXr0Ol0DB48mPz8fLUjiQpIykXcYPbs2URFRbFx40Y5aE7clru7O6GhoZw9e5Ynn3wS2QAi/krKRZT673//y+LFi1m1ahUdOnRQO46o4Jo2bcrGjRvZtGkT77zzjtpxRAUj5SIA+Omnn/j73//O+++/z7Bhw9SOIyqJ7t27s2jRIv7973+zcuVKteOICkSGIgtOnDjBuHHjmDx5Mn//+9/VjiMqmSlTpnDq1CmmT5+Ot7c3vXr1UjuSqABktFg1l5aWRqdOnahTpw7btm2Tq0mKB6IoChMmTGDr1q3s27ePJk2aqB1JqEuGIldnhYWF9O7dmytXrrB//35q1qypdiRRiRUUFNC7d29SUlLk+SRkKHJ1de0yxcePHyckJET+EYiHZmdnx4YNG0qHsxcVFakdSahIyqWamjt3LmvXrmX9+vW0aNFC7TiiiqhVqxbh4eEcPXqUZ555Ru04QkVSLtXQunXr+Ne//sUnn3xC37591Y4jqpjmzZuzevVqvvvuO9577z214wiVyD6Xaua3336je/fuzJgxgwULFqgdR1RhS5Ys4ZlnnuHbb79lwoQJascR5Ut26Fcnly9fJigoiNatWxMaGopWq1U7kqjiZs+ezZIlS9i5cyedO3dWO44oP1Iu1UVubi5du3bFYDAQFRWFi4uL2pFENVBSUsKIESOIiopi//79NGzYUO1IonxIuVQHf36BHzhwgAYNGqgdSVQj197YFBcXExUVJZfJrh5kKHJ18Morr7B161ZCQkKkWES5c3R0JCwsjJycHMaOHYvRaFQ7kigHUi5V3LJly/j444/56quvZJu3UE2dOnXYtGkTe/fuZcaMGWrHEeVAyqUK2717NzNnzuSdd95h4sSJascR1VxgYCBr1qxh+fLlfPTRR2rHEWVM9rlUUWfPnqVTp0706tWLNWvWoNFo1I4kBAAffPABr732GuvXr2f48OFqxxFlQ3boV0Xp6el07twZZ2dnIiIisLe3VzuSEDeYNWsWy5cvZ9euXXTs2FHtOMLypFyqGoPBQP/+/Tl79iwHDhyQ65uLCslgMDBo0CCOHTvGgQMH8Pb2VjuSsCwZLVbVPP/88xw8eJCQkBApFlFh6fV61q1bh7u7O8OGDSM3N1ftSMLCpFyqkA8++IAlS5bw7bff0rp1a7XjCHFHzs7OhIaGkpiYyJgxYzCZTGpHEhYk5VLJpKam3vL+sLAwXn/9dRYsWMDQoUPLOZUQD8bX15fQ0FAiIiJuexVURVHIzMws52TiYUm5VCJRUVEEBgZy+PDhG+4/fPgwY8eO5YknnuDFF19UKZ0QD6ZDhw4sX76cjz/+mM8+++yGxwoKChg9ejTz589XKZ14YIqoNKZPn64Aiq2trbJp0yZFURQlKSlJ8fb2Vrp3764UFRWpnFCIBzd37lxFq9UqoaGhiqKYn9uBgYEKoHh4eCgGg0HlhOI+LJPRYpVEQUEBnp6e5Obmlh6zMmfOHHbs2EFGRgb79u3Dzc1N5ZRCPDhFUXjiiSfYuHEjy5cvZ/bs2aSkpGAwGNBoNGzatIkhQ4aoHVPcGxmKXFmsXLmSJ598kj//uTQaDdbW1kRHR9O8eXMV0wlhGUVFRbRv354TJ05gZWVVeh4ynU5H//79CQ0NVTmhuEcyFLmyWLJkCVZWN/65FEXBaDQyderU2+7oF6IyWblyJSdPnix9bl9jNBoJDw8nKSlJxXTifki5VALnzp1j7969txyqaTKZiI6Opn379pw6dUqFdEI8PJPJxGuvvcbTTz+NyWTiVhtUNBoN33zzjQrpxIOQcqkEli9fjk6nu+3jBoOBS5cuERQURERERDkmE+Lh5ebmMmzYsLuOCDMajSxatOiWxSMqHimXCq6kpISvvvoKg8Fw23muFc/48eNp2bJleUUTwiKsra3p1asX9vb26PX6O8577tw5IiMjyymZeBhSLhXcjh07SExMvOVjGo0GjUZDq1atiIqKYtGiRbi7u5dzQiEejrW1NX/729+4ePEizzzzDFZWVrctGb1ez1dffVXOCcWDkHKp4JYtW3bLF5pOp6NGjRosWrSIQ4cOERQUpEI6ISzH3d2dTz/9lIMHDxIYGFj65unPDAYDa9euJTs7W6WU4l5JuVRgWVlZbNiw4YZNYnq9Hq1Wy8yZM4mPj+fpp5++aRSZEJVZYGAg+/btY82aNXh5ed20v9FgMLBmzRqV0ol7Jf+VKrBVq1aVDse8ViCdOnXi8OHDLFy4EGdnZzXjCVFmNBoNjz32GGfOnOGNN95Ar9eXrsGXlJSwaNEilROKu5GDKCuwwMBAYmJi0Gq11KpVi4ULFzJy5Ei1YwlR7uLi4pg9ezY//fQTGo0GRVH4/fffZQBLxSUHUVZUx48fJyYmBmtra958803i4uKkWES11bhxY8LDw9myZQu+vr4ALF26VN1Q4o5kzeUusrKyyMvLo7CwkKysLEpKSkofKywspKCg4Kav0el0ODk53XCfi4sLer0eZ2dnnJ2d0Wq1d1zuK6+8wtmzZ/noo4/w8/OzzA8jRBVQXFzMJ598wqJFizh58iTW1tZ3nL+goIC8vDyys7MpKCigsLCw9DGTyXTbwQEuLi437M+0s7PD1tYWFxcX7O3tsbOzs8wPVDVVn3OLZWdnc/HiRVJTU0lJSSE1NZW0tLTS6cqVS+TkZJGRkUFeXj75+YXk5NxcHJZia2uNg4MtLi5OODo64uzsgodHLTw8PPHy8qKoqIg2bdrg4eGBp6cnderUoVatWmWWR4iKrri4mISEBJKTk0lLS+Ps2bOkpqZSVFT0x+v4CmlpyeTk5JCXl09ubh6ZmXlldtCllZUGFxcHnJwccXCwx8nJ6Y/XsBceHh7UrFkTT09PPDw88PDwoHbt2tSrV++ux/JUEVWnXLKzs4mNjSU2NpYLFy6QkJBAQsJ5zp8/Q0JCIllZeaXzWllp8PDQ4eFhhYeHgoeHAS8vBWdncHMDe3twcAAnJ3B2Nt+2szN//PObJL0eHB1vzlJUBPn51z9XFMjMBIMBcnMhKwvy8szzZGWZ78vOhrQ0SEnRkZqqJTVVIS3NSHHx9TUlW1trvL1r4e3ti7e3H76+vnh7e9OwYUOaNm0q5SMqNYPBQHx8PKdPn+bcuXNcvHiRhISLJCTEc+HCBZKT028oCicnHZ6eWmrWVPDwMOLhUULNmubXrYOD+bXp4mK+bW9vvn2r1+ytTiZ+7TX7Zzk5YDSa78/PN7+Gs7PN9+flmT+mpkJampa0NC0pKRpSU43k5l4/bZOVlYZatdzx8fHB27sB9ev74O3tTYMGDfD398fPz++OZ+OoRCpfuSQnJ3P48GFOnDjB6dOniY09zunTp0hKugqAtbUV9erp8fYuoX59A/Xrg7e3efLxAU9P8PCAvwyfr7CysyE5GRIT4eJFuHABEhIgIUHLxYs6LlwwkpdnfvK6uDjQpEkjmjRpSdOmTfH396dt27Y0atTopuMFhFBLfn4+R44c4dixY8TGxnL69ElOnfqdc+cuYzSan8u1aln/8do14O2t4OND6Wu5Th3za9jGRuUf5B4VFprfOF6+fO21a34dX7xoRUKCnoSEEq5cMR9uoNdradDAm2bNWtOkSVOaNGlCq1ataNWqVWXbDFexy+X8+fNER0cTHR1NTMwhYmIOlZZI7drWNG2q0KSJgSZNoGlTaNIEfH2hahT/vUtKglOnIDbWPJ06pSU2Vse5c8WYTApOTna0bduGgICOBAQEEBAQQIsWLarKOyRRgWVmZv7x+o0hJiaamJgDnD59DpOpBCcnHU2aWNGkiYGmTRX8/c2v4SZNzGsb1UlOzp9fv3D6tIbYWGtiY81vHnU6Lc2aNSQgIIiAgMDS13EFPhyh4pSLyWTi1KlT7N27l8jI3ezevYMLF5IBqF1bR7t2Jtq1U2jXDoKCzGsg4s4MBvOT9bffrk3WxMSYyM834eBgS9u2benatQfBwcF0794dFxcXtSOLSi4pKYnIyEgiIyPZu3cnMTHHKSlRcHPT0by58sfrGNq1g2bNQI7/vbvExD+/hnUcOmRFcnIxWq0V/v4N6dq1F8HBwfTo0QMfHx+1416jbrnExsYSFhbG1q3h7N27l+zsPNzc9AQHK3TtaiQ4GNq2vfV+DfFgjEY4eRKioiAyUsOePTouXDCg12tp1641ffoMZODAgQQFBd11RJsQGRkZbN26lfDwMCIidnD+/GX0eivatdMTHFxEt27QoYN5U5awnIQEOHgQ9uyByEg9hw8bMRoVGjXypkePfgwYMJB+/fqpuWZTvuVSWFjIrl272LJlC+HhIZw9exE3Nz2PPGKie/cSunWDFi3k3Ux5u3QJdu82P1F//lnHuXNGatRw4pFHBjBw4GD69+9PzZo11Y4pKojDhw8THh5OWFgI+/b9ikYDwcE6evcupls385YFe3u1U1Yvubmwbx9ERsL27XoOHDBiZWVFcHAQAwYMY+DAgeV9wGnZl4vJZGLfvn18881KVq/+juzsfBo00DF4sJEhQ6BHD/MIDlFxxMfD9u0QGqpj27YSDAaFzp2DeOyxcUycOBEPDw+1I4pyduLECdauXcv3368gNvY8Hh46evUyMXiwwpAhtx5xJdSTng47dsD27RpCQ/UkJRXj61uXsWMnMWXKFPz9/cs6QtmVy4EDB1i5ciU//PA9aWkZBAXpGTfOwKhRUK9eWSxRlIXcXNiyBVav1hIerqDRaBkwYACTJj3B0KFDZVBAFZaUlMTKlStZtWoFR4+epF49a8aMKWbsWPOmLhmAWDmUlMD+/bBmDaxdqyM52Uj79m0YP/5xJk+eXFZbJb5GsaCCggJl+fLlSvv2bRRAadVKr7z7Lkp8PIqiyFTZp4wMlGXLUPr10ylarUapW9dT+b//+z8lOTn5pueCqLwiIyOVcePGKHq9VnF31yszZqBERKD8cfVhmSrxZDSibN+OMnWqRnF11Sm2tnrliSceVw4ePHjzE+HhLMMS3yU1NVWZM2eOUrOmm2JtbaWMH69VoqLU/0XKVHbTuXMo//gHiru7TrGx0SmTJk1Qjh49qojKyWg0KitWrFACAloqgNKhg7WyYgVKYaH6zzWZymbKy0P58kuUNm30CqAEBQUoa9asUUwmk2IBD1cumZmZyttvv604Odkpnp565Z//RElMVP+XJlP5Tfn5KEuXorRurVesrDTKhAnjlLi4OEVUDiUlJcratWuVZs0aKTqdlTJxopWyKF/q5AAAIABJREFUf7/6zyuZyneKiEB57DErxcpKo7Rp01wJCQlRHtKDlUtxcbHywQcfKO7uLoqbm0557z2U3Fz1f0EyqTeVlKCsXYvStKle0eu1ylNPTVOuXLmiiIpr+/btSmBg6z/eFGiV2Fj1n0cyqTsdO4YyYoSVotGgdO7cXtm7d6/ygO6/XGJiYpS2bVso9vZa5c03zdvh1f6FyFRxJqMR5euvUerX1yseHq7KqlWrFFGxZGZmKtOnT1U0Go0yZIhWOXpU/eeNTBVrOngQpW9frWJlpVFmz35eyc3NVe7TvZdLcXGx8tZbbyl6vVbp3l2vxMWp/wuQqeJO2dkos2ZpFI0GZejQgUpSUpIi1BceHq7Uq+eleHnplXXr1H+eyFSxp5UrUWrU0Cl+fvWUnTt3Kvdh2T0NRc7KyuKxx0YQFbWb9983MWtW+RzoeOCA+dQHAIMHV53jYY4ehbNnzbf79jWfxbWsHDkCMTHmZYwaVXbLuZ2ICJg2TU9xsTtbtmylVatW5R9CAPDBBx/w2muvMm6choULS3B3L5/lyuv4weXlmZeTkGA+y0HLluDqavnl3ElyMsyapSUkROHTT//HzJkz7+XLvuZu9XPp0iWlbdsWSu3aeuXQofJtzREjUMA8ZWaq3+KWmp5//vrPdexY2S3n8mUUT0/zcnx91ft509NRevXSKo6OdsrmzZsVUb6MRqMya9ZMRavVKO+/X/5/f3kdP9j02Wco7v/P3n2HRXG9bRz/7i4L0kQUsAui2I2xYe/Ye4xGbEnUNJNoEjXFvL9Uk5huTE80amKs0QgqdmJXxK7YFawooKIgbcu8f0wUETSWhdmF53NdczG7jLsPMOO9M+fMOaWy3wNQ3N1RPvlEm5938mRuXia7hx5lv931DrjTp0/TvHljSpW6wvbtJrn50YGYzRAaCgkJWlei3r29YoWFZ57JpG/f3vz9dxjdu3fXuqwiwWq1Ehr6BBERi1m4UKF3b60rEvdi7lx48cXsx87OkJWlnsm89ZY63uJLLxVsTWPGgJ+fwtNPf8/166n8+uu0u07lcceLW2lpaXTr1pFSpa6wfr0EiyNZtQrq1VPHC7MXzs4wY4aVYcMUnnjicfbv3691SUXChAkTWLJkMcuWWSRYHMhHH6lfdToIC1NHylixIrs54uOPtakrNBQWLrQyc+ZMJk2adNdt73jmMn78OOLjT7Jnj7nAr/HdyY4d6n+caWnq8BM9e+Zs+1m3Tp2Ex9NT/d706eq1yk6doFUrdRuzGZYsgT171Al8PDzUob/79lVnqrshKkqdV8HJCQYPhrg49b2PHFEH13zssbyvfZ4/r47LdeAAGAxQvToMGHD3gfzi4iAiQh3T65FHoE8fdQbMB/HHHzBsmLru5aV+2knPv9ma74tOBz/9ZOXoUTMDB/Zj9+4D/zn/uXhw//zzD59//hlTpyq0aaN1NdnkOL675OTsNqpmzaBXL3W9c2do2VL90BgfD1euaDOmW/fu8PnnVsaP/z86dOhAcHBw3hvmdbFsz549isGgV/74Q9trmrdeq331VRSdLuf1x/btURITc29fuTLK8OHZ29WurX7fbEZp0iTna9xYgoJQjh/Pfq1Ro9TnXV1RFi1CcXPLub2/f87tFQVlxgyU4sVzv7avLznaq269VvvBBygeHjm3r1YN5fTpB79Oq9OhjBiBcvGi2tZy43ei5d/y1iUuDsXV1aB88cUXd7peKx6S2WxW6tSprvTsaVC0/nvLcfxgS3p67ls9KldWX7t4cfXeMq3+plar2o7apEkDxWq15rUL5t0VeejQIcqjjxo1Lf72nfLGzvbkk+qOcuO5ESNyb39j53V3R3FyQvn4Y/X7n3+e/e+6dUN55RWUhg2znwsNzb1T6nQoej1KcDDK6NHZ/1kDyjPPZG+/dWv2++p0KB07orRtq/5bQClbVt1Zbt8pAaVlS7WWatWynxs9+sF+Z5GRKNu3Zz+2x3BRFHXomHLlfBWTyZTXLigeUnh4uKLToRw6pP3fWo5j2ywrVmS/bs+e2v9dd+xQa1m3bl1eu2DucMnMzFTc3FyUH37Qvvhbd8rHHlM/sSgKSkICSoUK6vN6ffang1u3b9tW3QkSE9XeSoqijqMzfHjOP3hqavanmYYNc++UgNKnT/bzx45lP9+kSfbzrVpl13Pr8Bkvv6zupAEBKOvW5d4p+/bN3jY+Pnsnbt7cNr9Dew2XEyfUutauXXv7LihsYNCgUKVtWydF67+zHMe2+R3u3o3i7a2+ptGIcvCg9n9XRUFp1MioPP/883ntgr/latDfu3cvaWmZtG9/+3e09fjj6rVPAF9fGDpUXbda4eDB3Nu//joUKwY+PtnXJZ95BqZNg2++gYsX1Yay//u/7H+Tmpr3e48alb1etar6mgCXLqlfFUWdFQ7Ua8hNmmRv/8kn6jXU2FjyvO4dGpq9XqaM+rOBej21MAsMhMqVndm6davWpRRKW7duoEMHs9Zl5CLH8f2Ljob27bNfa+JEtX3JHnToYGLr1nV5fi9Xg358fDwA9jMVs6pt25yPb60vLi739kFBuZ8zm+HTT2HRIvXGQkXJ+f079aq7fbqDG416Fov69exZyMhQ12+fztXdPe/XvCEgIOfjYsXUrzderzDz91c4d+6c1mUUSvHxiVSqpHUVuclxfH+io6FjR7h6VX38v/+pgWsv/P3h3Ln4PL+XK1xuTP5ktrMPPZmZOR/f2gMqrx4THh65n+vfHxYvVtdbt1Z7c7Rvr36aOn78zqMOuLjkfHz7dre+17Vreb/Gndze+6QoTcBkMukwFpbbte2Mk5PB7o5hkOP4fuzcmTNYPvsMxo9/+Ne1pawsdV/LS64/g/+/HyWOHs3fou7Xxo05H+/Ykb0eGJh7+9t7uJ49m71DPvaYOizJq6+q94MkJ6vP32mH+K8dxds7+xR7376cB9CyZeqnmh49YOnSu79OUaIocOyYQsDtH/mETfj7V7C7YxjkOL5XiYnQu3d2sEyZYn/BAnDsGHc8hnOFS61atfDz8yYiIr/Luj/jxsGWLer11M8+U6fsBHWHrFcv9/aG28L01qsvKSnZp9I//qj2k4f7/7RyqwED1K+Jier6jh2waxe8847aZ3/ZMpln/FY7dkBCgok29nQDRiHSpk1HIiLs76xQjuN7M25c9s9aqpT63uPG5VxuhKlWrFZYvtyZNm065r1BXs38Y8eOVSpUMCppafbRy8TLC6V0aXXdYMjZ/W/Bgrx7pdw+hlFaGkq5cjn7t9/oSeXkpH51c8vuyXJrL5Pbu3Pm1QPr0iWUMmXy7nsPKP375+x5cuP528cksnXvLnvtLTZ4sF6pW7dGXrufsIGoqKh/e+Np/7eW4/j+lrS03PfM5LWcOqXt33XxYhSdTqfExMTktQvm7i0GMHbsWJKTnfjss3vJr/xXqhRs2wbBwWpagnr6+tdf6nXWe+HqCgsXZjcQnjqlftL59FP4/HP1ubQ0iIx8sBpLllTvFu7bN+eor25u6qeMmTMf7HULoy1bYM4chXfe+VDrUgqt4OBgunTpyNixRkwmratRyXF8b5Ytu3OPN3uRng5vvGHk8cf7UqtWrbw3yvNjj6IokydPVpyc9MrGjdp/8rl1SUhAOXr0we9OtVjUeywOHlTX86PGzEyU/fvVvvSZmdr/zuxpSUpCCQgwKt26dVJE/jp69Kji4eGqvPaa9n/32xc5jh17GTFCp3h7eyqnT59W7uDOk4VZrValT5+eSqlSTvk6LLwsRWdJSUFp1sxJCQgoryQkJCgi/82aNUvR6XTKlCna//1lKRzLhx+iGAx6JTw8XLmLOw+5r9PpmD17Hl26hNCq1XYWLTLn6qMu8teRI2q3y3s1a5Y6YJ49On8eevQwcv68J+vXr8X39psORL4YPHgw58+fZ8yYN0hIUPjgg6LV3d0eFJbj2GKBsWN1fPst/PDDD/Ts2fOu2991PhdXV1dWrlzLk08OpXPnRUydar15R63If1lZ6gir9+r2ewjsxb59arB4ePizbdtq6X5cwMaPH4+vry/PPjuSkydh2jTLzZv8RP4rDMfx9eswZIieFSsMzJ37J/3vJS3vdl5zg9VqVd59951/e0voc4xgKossd1osFpSff0Zxd3dSWrRoqiQmJipCO2vXrlVKlPBQqlZ1Utav137/kMUxlk2bUKpXNyolSxZXNmzYoNyjO7e55CUiIkKpWLGM4udnzNF1UBZZbl8OHEAJDjYqRqNBeeONN5TMzExFaC8uLk7p2LG9otfrlGef1SmpqdrvK7LY53L9Osobb+gUvV6ndOvWWTlz5oxyH+4vXBRFUZKTk5Vnnx2p6HQ6pUULg7Jhg/a/BFnsZ7l4Ud0hXVwMStOmje7UB15obP78+UrJkp5KxYpG5eefUUwm7fcdWexjycpSrziUK2dUvL09lZ9//ll5APcfLjds2LBBadGiiaLTofTubVD27dP+lyKLdktiIsrYsSiurnrF37+sMm3aNMVsNivCfp07d055/vnnFKPRoFSrZlTmzMm/br2y2P9iNqsTpQUEGJVixYzKK6+MeZhL2Q8eLjesXr1aadjwEUWnQwkJMSjz52ffHStL4V8OH0YZPVqnuLsbFB+fEsqkSZOU9PR0RTiOuLg45dlnRyoGg16pWtWoTJqk3qmu9b4lS8EsyckokyejVK5sVPR6ndK//+PKyZMnlYf08OGiKGqDf1hYmBIS0k7R6XRK1arOytdfZ0/uI0vhWrKy1OE62rZ1UgClRo1A5dtvv1VSU1MV4bgOHjyoPP/8c4qHh6vi6emkjBqlU2JitN/fZMmfZdculJEjdYqrq17x8nJTRo8erRw/flyxEduEy62OHj2qvPHGG4q3t4fi4qJXevQwKDNnqjfQaf3LlOXBF4sFZeNG9SzFz0/9hBMS0k4JDw+/0xzawkFdvXpV+fnnn5VataoqgFKrllF5993cc83L4njLqVPqWUrDhs4KoFSrVlmZNGmScuXKldw7wsP5TacoinL3zsoPJiUlhUWLFjFnzizWrv2HYsV09O5tpV8/KyEh4OmZH+8qbMlshq1b1Zn+5s0zcvasiXr1ahIa+iShoaFUssfZqITNWK1WNmzYwOzZf7Jw4XyuXLlGixZGBg400b177gmyhH06flydJmDePCeiosz4+HgxYMAQQkNDad68Obr8uat2er6Fy60SEhJYsGABc+b8ztat0Tg56WjZUk/Xrma6dYM7jXsmCt7Fi7B8OSxfrmf1aj1XrpipWrUSAwcOIzQ09M6D1IlCLSsri5UrVzJnzp8sWRJOamo6NWs6061bFl27QqtWuedeEdrIyFDnuVm+HCIinDl2LAsvL3d69erLoEGDCQkJuTkpZD4qmHC5VWJiIitXriQiYhmrVkVw6dI1/P2dadPGRMuWCi1bQo0aMkRFQYmPh02b1GXDBmf27s3CxcVI69at6Nq1J127dqV69epalynsSFZWFhs3bmT58uVERCzm0KETeHo60aqVQosWFlq1Uuegl1EACkZaGmzfrk7EtmmTE5s2KaSlWXjkkRp07dqbLl260KJFi4Ke9bXgw+VWFouF6OhoVq5cycaN69i2bRvXr2fg42OkRQsrLVtaaNgQ6teHEiW0qrLwyMyEAwfUyY+2bIFNm4wcP27CYNDz6KO1aNmyAyEhIbRr1w73/5o0XIh/xcXFsXz5cjZsWM/Gjf9w7lwCLi56GjUy0KqVicaN1WO4cmWtK3V8iqIOJbNrlxoomzcb2bHDjMmkUKlSaVq37kCbNu3o0qULFSpU0LJUbcPldmazmV27drF582Y2bFjH1q2buHjxMgCVKzvToIGZ+vWt1K+vXkrz95cznDtJSoKDB9W5KXbvht27nTl40IzJZMXDw5VGjRrQqlV7WrZsSbNmzfCURjBhI7GxsWzcuJFNmzaxaVMkR46cxGpV8PZ2on59qF/fTP366uCM1arlntteqNLT1UEv9+27cQwb2bNH4epVMwaDnpo1q9KqVQdatGhB69atqVixotYl38q+wiUv58+fZ/fu3f8uO9m9O5rYWHX+T1dXA9WrO1GtWhbVqyvUqKHurP7+UBQG3U1NhdOn4ehRdSc8ehQOHXLmyBGFy5fVGaJKlSpO/foNaNAgmPr16/Poo49SrVo19Po854kTwuZSU1PZu3fvLcdxFDExR8jKMmMw6PD3d6ZaNTM1a1qoXl09hqtUgXLlIP+bBrRlMqkjhh8/rh6/hw/DkSNOHDmi5/RpE1argouLkbp1a1K/fhPq169P/fr1eeSRR3Bzc9O6/Lux/3DJy5UrVzh8+DCHDx/myJEjHD16mEOH9nHy5BmyssyAGjyVKjlRsaKFChXM+PtDpUrg56fOfufnpy4eHhr/MHnIzFTn8E5KggsX1K9nz8KZM3D6tJ7Tp42cOWPhyhX1Z9XpdFSqVIZq1WpQvXptatSoQfXq1alRo4bWp8ZC5CkrK4sjR478e/we/fdY3s+RI8e4evU6AAaDjrJljfj7Q8WKJipUUKhYESpUUI9hX1/1q4+P/V3BsFrV4zYpST2WExPVEDl9Gs6c0XHmjJFTp+DCBTVAALy9PalWrSo1a9ajevXqVKtWjRo1ahAUFFTQ7SW24Jjhcidms5m4uDhOnz7NmTNnOHXqFGfOnOHMmVjOnInj1KlzXL+ekePfFCumx8fHCT8/HSVLWvH0NOPuruDmBt7e6vSm7u7ZXae9vXO+Z4kSuXfslBS1G+8NqanqJ5T0dLXx7epV9bnr19UlOdmJ1FQ9CQk6EhIspKSYc7yes7MT5cv7UaFCJQICgqhYsSIVKlSgYsWKBAQEEBgYaO+fYoS4ZxcvXuTEiROcPXuWM2fOcPr0aU6diuXs2VjOnDlHQsKVHNvr9Tp8fY34+Ojw8bHi6WnFzc1CiRLqsevurn6I9PICvV5dv30K49svzWVkqMfrDVlZ6rFqscC1a+oxfv26ejxfuQJpaQZSUgwkJelISrKSmGji9v9Zy5Qp+e+xG0ClSgH4+/vfPI4DAwPx8/Oz8W9SU4UrXO5FWloaSUlJXLx4kcTERJKSkkhKSiIxMZHLly+TkpLC9evqkpx8ievXr3P9ehqpqdcxmy2kpKT/95vcxtXVmWLFnHFxccbd3Y0SJUrg4VEcNzcPPDy8/n3sgY+PD2XKlOHo0aN8++23zJs3j1atWuHl5ZUPvwkhHJPZbObChQuEhoaSnp7OuHHjchzH6jF7neTkRFJTU7h+PfXfx9dQFIWrV6/fPFu4VwaDnuLF3dDr9Xh5eeLh4YG7u7p4e/vh7u6Ou7s7Pj4++Pr64uvri5+f383HPj4+GAyGfPqN2KWiFy62ZLVauXr1aq7n3dzccHmIVkqTyUSXLl04ceIEUVFRlC5d+mHKFKLQefnll5k2bRqRkZE0bdr0oV4rJSUFsznn1QKj0YiHPV4zdxwSLvbq8uXLNG3aFC8vL9avXy+XvYT41+TJk3nttdf4888/CQ0N1bockbfp0mXITpUsWZIlS5Zw4sQJnnrqKeQzgBCwfPlyxo0bxyeffCLBYuckXOxY9erVWbx4MWFhYXz44YdalyOEpmJiYggNDWXYsGG88cYbWpcj/oNcFnMAv/32GyNHjmTWrFkMGjRI63KEKHDx8fE0adKEypUrs3r1apxlIDN7N72Q36JUOAwfPpwDBw4wYsQIAgMDH7oBUwhHkp6eTp8+fXBzc2Px4sUSLA5CzlwchNVqpW/fvmzfvp2oqCgZ7l4UCVarlX79+rFx40a2bt1KUFCQ1iWJeyMN+o5Cr9cza9Ys/Pz86Nq1a55doIUobF5//XUiIiJYsGCBBIuDkXBxIJ6enoSHh3Pp0iVCQ0OxWCxalyREvpk2bRpfffUVU6dOpV27dlqXI+6ThIuD8ff3Z+nSpaxfv156zIhCa926dYwaNYp33nmHoUOHal2OeADS5uKgFixYwBNPPMEPP/zA888/r3U5QtjMoUOHaN68OZ06dWLu3Ln5NQ2vyF/SW8xR9e/fn5iYGEaPHk1QUBAdOnTQuiQhHlpSUhK9evWidu3azJw5U4LFgcmZiwNTFIWhQ4cSERHB1q1bZTpi4dAyMjJo3749Fy5cYNu2bYVtlOCiRnqLOTKdTsfUqVOpUaMG3bp1IzExUeuShHggiqIwcuRIYmJiCA8Pl2ApBCRcHFyxYsUIDw8HoF+/fmRlZWlckRD375133mH+/PksXLiQOnXqaF2OsAEJl0LAx8eHJUuWsG/fPmncFw5n7ty5fPTRR0yZMoWQkBCtyxE2IuFSSNSqVYu5c+fy+++/88UXX2hdjhD3ZOPGjTz11FO8/vrr8sGokJEG/ULmq6++Yvz48SxatIjevXtrXY4Qd3Ty5EmaNm1Kq1atWLBgAXq9fNYtRGSysMJo1KhRzJw5k3Xr1tG4cWOtyxEil8uXL9OsWTM8PT1Zv3497u7uWpckbEvCpTAymUx069aNgwcPsn37dsqXL691SULcdGMa7yNHjhAVFSX7Z+EkXZELI6PRyMKFC/H29qZ3796kpaVpXZIQN7300ktER0ezbNkyCZZCTMKlkCpevDhLlizh9OnTDBs2DKvVqnVJQjBx4kSmTZvGn3/+Sb169bQuR+QjCZdCrHLlyixcuJClS5fy3nvvaV2OKOL++usv3n33XSZPnkzPnj21LkfkM2lzKQJmzJjB8OHDmTlzpowwKzSxY8cO2rRpwzPPPMPkyZO1LkfkP2nQLypef/11vvnmG1atWkWbNm20LkcUIXFxcTRt2pQGDRoQHh6Ok5OMl1sESLgUFTemi920aRPbtm2jSpUqWpckioBr167RsmVLrFYrmzdvxsvLS+uSRMGQcClK0tPTadOmDampqWzZsoUSJUpoXZIoxCwWC71792bXrl1s27aNSpUqaV2SKDjSFbkocXV1ZfHixaSkpDBw4EDMZrPWJYlCbPTo0URGRrJ48WIJliJIwqWIKVeuHGFhYWzatImxY8dqXY4opL788kt++ukn/vzzT4KDg7UuR2hAwqUIatCgATNnzuS7777jhx9+0LocUchERETwxhtv8Omnn9K3b1+tyxEakTaXImzixIm89957hIWF0b17d63LEYXA7t27ad26NQMGDGDatGlalyO0Iw36RZmiKDz55JOEhYWxefNmmaRJPJTz58/TpEkTqlatysqVK3F2dta6JKEdCZeiLisri06dOnH69GmZt1w8sLS0NNq2bSs9EcUN0lusqHN2dmbhwoUYDAb69etHZmam1iUJB2O1Whk0aBCxsbGEh4dLsAhAGvQFUKpUKcLDwzlw4ADPPvus1uUIBzN27FhWrlxJWFgYVatW1bocYSckXAQANWvWZO7cucyePZtJkyZpXY5wEFOnTuWbb75h6tSpNG/eXOtyhB2RcBE3de7cma+++ooJEyYwb948rcsRdm7lypW88MILfPDBBwwePFjrcoSdkQZ9kctLL73Eb7/9xrp16+QGOJGngwcP0qJFC7p06cLs2bPR6XRalyTsi/QWE7ndOiZUVFQUFStW1LokYUeSkpJo2rQpZcuWZc2aNbi4uGhdkrA/Ei4ib9euXaNFixYYjUY2btyIu7u71iUJO5Cenk779u1JSEhg27Zt+Pr6al2SsE/SFVnk7cY0yefOnZNpkgWg3nQ7YsQIjh49SkREhASLuCsJF3FHAQEBLFq0iGXLlvF///d/WpcjNDZhwgT++usv5s+fT/Xq1bUuR9g5CRdxVy1atOCXX37hk08+4ddff9W6HKGRGTNmMGnSJL777js6dOigdTnCAch8o+I/DRs2jMOHD/Piiy9StWpV2rVrp3VJogBt2LCB559/nrfffltushX3TBr0xT1RFIVBgwaxevVqtm3bJndiFxEnTpygadOmtG3blnnz5qHXy8UOcU+kt5i4d+np6bRt25Zr166xdetWGUOqkLt06RLNmjXDy8uL9evX4+bmpnVJwnFIbzFx725Mk3z9+nUGDBgg0yQXYllZWfTv3x+TycTSpUslWMR9k3AR96Vs2bKEhYWxZcsWnn/+ea3LEflAURRGjhzJjh07CA8Pp3Tp0lqXJByQhIu4b/Xr1+ePP/5g+vTpTJkyRetyhI198MEHzJ49m9mzZ1O3bl2tyxEOSsJFPJC+ffvy0Ucf8dprr7F06VKtyxE2smDBAt5//32mTJlCjx49tC5HODBp0BcP5bnnnmPOnDls3rxZPuU6uM2bNxMSEsKoUaP48ssvtS5HODbpLSYejslkonPnzsTGxrJt2za5Pu+gYmNjadq0KY0aNSI8PByDwaB1ScKxSbiIh3f58mWaNm2Kr68va9eupVixYlqXJO7DrYOUbtiwAQ8PD61LEo5PuiKLh1eyZEnCw8M5dOgQTz75JPJ5xXGYTCb69evH5cuXCQsLk2ARNiPhImyiRo0a/P333yxevJiPPvpI63LEPRo9ejRbtmxh8eLFMm+PsCkJF2Ezbdq04YcffuCdd95hzpw5Wpcj/sNnn33GL7/8wuzZs2ncuLHW5YhCRgauFDY1YsQI9u/fz/Dhw6lcuTJNmzbVuiSRh0WLFvHWW2/x5Zdf0rt3b63LEYWQNOgLm7NarfTp04fo6GiioqKoVKmS1iWJW+zatYvWrVsTGhoq0yiI/CK9xUT+SElJoWXLllgsFrZs2ULx4sW1LkkA58+fp0mTJtSuXZulS5fi5CQXL0S+kN5iIn94enoSHh5OUlISAwcOxGKxaF1SkZeSkkK3bt0oXrw4c+fOlWAR+UrCReQbf39/li5dyvr163nrrbe0LqdIs1gsDBkyhHPnzhEeHi7TJYh8Jx9dRL5q1KgRM2bM4IknnqBKlSo899xzWpdUJL3yyiusWrWKyMhIqlSponU5ogiQcBH5rn///uzfv5+XX36ZqlWryhzsBWzKlCl8//33/PnnnzRr1kzrckQzcTb7AAAgAElEQVQRIQ36okAoisKQIUNYsWIFW7dupVq1alqXVCSsWLGCnj178sEHH8ilSVGQpLeYKDgZGRm0a9eOhIQEoqKi8PHx0bqkQi0mJoYWLVrQt29fpk+frnU5omiRcBEF68KFCzRp0oSAgABWr16Ns7Oz1iUVSvHx8TRt2hR/f39Wr16Ni4uL1iWJokW6IouCVaZMGSIiIti7dy8vvPCC1uUUSunp6fTt2xej0ciiRYskWIQmJFxEgatduzZz5sxh5syZfPXVV1qXU6hYrVYGDx7M8ePHWb58uVx6FJqRcBGa6Nq1K5MmTWL8+PGEhYVpXU6h8eabb7J06VIWLFhAUFCQ1uWIIkzaXISmXnjhBWbNmsWmTZuoV6+e1uU4tN9++42RI0cyc+ZMhg4dqnU5omiTBn2hLZPJRNeuXTl8+DBRUVGUL19e65Ic0vr16+nUqRNvvvkm77//vtblCCHhIrR3+fJlmjVrhqenJxs2bMDNzU3rkhzK4cOHad68OSEhIcybNw+dTqd1SUJIuAj7cPLkSZo0aULbtm2ZP3++/Ad5jy5dukTTpk3x9vZm3bp1EszCXkhXZGEfAgMDWbhwIeHh4XJZ5x5lZGTQq1cvzGYzS5culWARdkXGFhN2o3Xr1vz000+MGDGCoKAgBg8erHVJdktRFJ555hkOHDjA5s2b8fPz07okIXKQcBF25emnnyYmJoaRI0cSGBgoAy3ewbvvvsu8efNYtmwZderU0bocIXKRNhdhd6xWK4899hibN29m27ZtMkT8bebNm0doaCjff/+9jHIg7JU06Av7lJqaSsuWLTGZTGzZsgUvLy+tS7ILmzZtIiQkhDFjxvDpp59qXY4QdyLhIuzX+fPnCQ4Opm7duixZsqTIT8sbGxtLkyZNCA4OJiwsDIPBoHVJQtyJ9BYT9qtcuXKEhYWxYcMGxo8fr3U5mrp8+TJdu3alYsWKzJs3T4JF2D0JF2HXGjZsyMyZM/nmm2/48ccftS5HEyaTiQEDBpCSkkJYWBju7u5alyTEf5JwEXbv8ccf57333mP06NGsWbMm1/czMzOZN2+eBpXZzuXLl/P82QBeeukltm/fTkREBBUqVCjgyoR4MBIuwiH873//Y+DAgfTr14+YmJibzyckJNC6dWuGDx9OamqqhhU+nNmzZ9O1a1d+/fXXHM9//PHHTJs2jVmzZsnAnsKhSLgIh6DT6fj111+pXbs2PXv2JDExkQMHDtCgQQN2795NRkYG8+fP17rMB/bTTz9hNpt59tlnGTduHFarlYULF/K///2Pr7/+ml69emldohD3RXqLCYeSlJRE06ZNcXV1JTY2lszMTMxmM3q9nuDgYLZu3ap1ifdt586dNGrU6OZjg8FA48aN2bt3L0OGDOGXX37RsDohHoj0FhOOxcfHhyFDhnDgwAHS0tIwm82AeuPltm3bOHz4sMYV3r9p06ZhNBpvPrZYLGzfvh2DwcCECRM0rEyIByfhIhyGxWLh5Zdfvjmw5e0n3UajkT/++EOL0h5Yeno6s2bNwmQy5XjearWSkZFBcHAwO3fu1Kg6IR6chItwCMnJyXTq1Omu3ZFNJhNTp07FYrEUYGUPZ9GiRVy/fj3P75nNZi5fvkzLli1ZtmxZAVcmxMORcBEO4ZlnniEyMvI/gyMhIYFVq1YVUFUP7+eff77r3DUWi4XMzEz69OnjkO1JouiScBEOYc6cOUyePBl3d/cc7RO3c3JyYtq0aQVY2YOLjY1l06ZNdw1MvV5PrVq1iIyMlBGihUORcBEOwcnJiTFjxnDq1Cmee+45dDpdniFjNpsJCwsjKSlJgyrvz9SpU+84XprRaKR48eJ89dVX7N27l1atWhVwdUI8HAkX4VBKlSrFt99+S3R0NI8++ih6vT7Py0pz5szRoLp7Z7FY+O2333I15Ds5OaHX63nqqac4ceIEY8aMkXHEhEOScBEOqWHDhkRFRTF9+nS8vb1znAFYLBa7H4dsxYoVXLhw4ebjGyHZrFkz9uzZwy+//IKPj4+GFQrxcCRchMPS6XQMGzaMEydOMGrUKAwGA0ajEUVROHToEHv27NG6xDv65Zdfbgaik5MTvr6+zJgxgw0bNlC3bl2NqxPi4ckd+qLQ2LdvH6NGjWLz5s0AvPzyy0yZMuW+XycxMZGUlBSuX79OVlYWZrOZlJQUihUrhqurK3q9Hi8vL1xdXfHx8blrB4O8XLx4kfLly2OxWHBxceH//u//GDduHMWKFbvvWoWwUzJZmChcFEVh3rx5vPLKK2RlZREfH4+Li0uObU6dOsXhw4c5duwYR48e5fjxI5w9G0diYhJJSVcxm+/vPplSpYrj61uK0qXLEhRUi6pVqxIUFET16tWpXr16rkb7L774gtdff53+/fvz5ZdfykjHojCScBGFU1paGp999hm1a9fGw8ODqKgooqO3ER0dRWJiMgClShkJCtIRFJRFpUrg66suZctC8eLg4QFGIxgM6uP0dMjIAEWB5GT1cWIixMdnfz1+3Iljx/ScOZOFooCbmwv169ejcePmNG7cmPbt2zN27Fief/556QEmCjMJF1H47Nu3j4iICFatimDLlm1kZpqoWtWZxo1NBAcrNGoEtWuDt3f+1ZCRAUeOwM6dEB0N0dHO7NtnxmxWqFOnOp0796Bz5860bdu2yE/fLAolCRdROMTFxREWFsbvv//Krl0x+PoaadvWTEiIQteuULGi1hVCWhps2QJr1sCaNS7s2pWJt3dxunfvTf/+/enWrZt0OxaFhYSLcFxWq5Vly5YxZcqXrF27gZIlDfTrZ2boUGjRAu4yqopdOH0a/v4bFixwYfPmTKpUqcQzz4xi5MiRlCpVSuvyhHgYEi7C8aSlpfH999/zzTdfcuFCAj166Bk1ykKHDmr7iCOKiYGffoLffzdgNjsxbNiTvPXW21SqVEnr0oR4EBIuwnFkZmby888/88knH5Kamszzz5t58UUICNC6MttJSYGZM+HLL43Exys888xzTJjwNmXLltW6NCHuh4SLcAz//PMPL7wwgtjYUzz1lJX334cyZbSuKv+YTDB9OnzwgZErV/SMH/8mEyZMwNnZWevShLgXMhOlsG8XLlzgiSf60759ex555DQnTlj5+efCHSygdoF+9lk4ftzEG29k8umnHxIcXJ+oqCitSxPinki4CLsVGRnJo4/WJjo6jIgImD/fQlG737BYMXjnHdi3z4qPz1FatWrBF198kWsWTiHsjYSLsDuKojBx4kQ6depI69ZX2bPHRNeuWlelraAgWL3azMSJFt5663X69OnJtWvXtC5LiDuSNhdhVywWCy+88DzTp//GV19ZefllrSuyP5s2wYABRsqWrcGKFWvx9fXVuiQhbicN+sJ+mEwmBg8OZenSxcybZ6FnT60rsl8nT0KnTkacnCqyZs16GZ9M2Btp0Bf248UXX2D58sWsWCHB8l8CA2HjRhNOTmfo3r0TKSkpWpckRA4SLsIufPHFF0yb9huzZllo3VrrahxD2bKwcqWJS5eOM2BAP8xms9YlCXGTXBYTmouOjqZZs6Z8+qmVsWO1qWH/fjh+XF3v0EEdBflBREfD2bPqevfuUBC3pURHQ+vWBt5550Peeuut/H9DIf6btLkIbZnNZoKD61OixGHWrjVrNh7YK6/AN9+o6/v2wYNOBvnEEzB/vrqemAgFNVPxp5/Cu+8a2bVrD7Vq1SqYNxXizqTNRWhrypQpHD16iGnTtAuWwmDsWKhTB159VbrXCfsg4SI0YzKZmDz5c0aNslC5sra1vPIKbN2qLlWqaFvLg3Bygo8/NrFqVSS7d+/WuhwhkFmKhGbmzZvHhQsJ+Xovy7VrsGCB2nU3JQX8/KB5c2jXLueQ/ImJ6uReANWrg5ubuh4VBYcPq/95Dx4McXGwapW6be3a8NhjUKLEf9exaJH6/gCPPgr16tn0xwSgY0eoV8/I119/ye+/z7L9GwhxPxQhNNK3by+lRw+Doijky7J+PUrJkiiQe3niiZzbjhmT/b19+7KfHzVKfc7VFWXRIhQ3t5yv4++Pcvx49vYDBmR/LzFRfe6TT7Kfa9AA5erV/Pl5FQXlu+9QvLzcFZPJZNs/lhD35ze5LCY0YbFYWLfuHzp1suTbewwZApcvq/eEvP02fP21esYCMG8ezLqPD/cZGfD442q7xujR2cP8nzqlNqbfyZ9/woQJ6nqNGrBy5YP3RLsXHTvC1avXiY6Ozr83EeIeyGUxoYlDhw5x5UoKbdvmz+tfuABnzqjrrVurgz86O8MLL8D776tjdTVocO+vpyjQu7c6cyTAyy+rrwFq77K8REbC8OHqv/X3h9Wr87/3WLVqUK6cM1u2bKFZs2b5+2ZC3IWEi9DE+fPnAciviRZLl4aSJdUzlxkzYPFiaNMGQkLUoewfZIKxUaOy16tWVYMiKQkuXcp7+yefhKwsdX3KFApsROeKFSE+Pr5g3kyIO5DLYkITiYmJODvr8+0SkU4H06apDfEAyckQFqaecVSuDJ07w4kT9/eat48PeaPR33KHK3sZGdnrX311f+/1MEqXNnPx4sWCe0Mh8iDhIjRhMBiwWBTy8xbePn3U3l3vvgvBwWAwZH9v1Sr1+/fDxSXnY/1/HD2urtCtm7q+fj389df9vd+DMpl0ODnJRQmhLQkXoYnSpUtjsShcvpw/r68oapvLoUPw9NNql+JLl9SG/BuX4g4cUNtm7tX93uQ5b57aoF+qlPp4/PicZzP55eJFJ0qXLp3/byTEXUi4CE2UL18egNjY/Hn9xYvVEOnYUW1UT08HLy/o1St7iuRixbL/488PzZqp98C88476OC4Ovvgi/94PwGqFU6esN3+/QmhFwkVoIigoiLJlfYiMzJ/X792bmz3RIiPB21u9edHLC7ZvV59/9VV1rvr89sILai8ugEmT4Ny5/HuvvXvh0iUTbdq0yb83EeIeSLgITeh0OkJCurBiRf60Dej1sGyZGiCenpCZqf7Hm5Wl9vL64guYODFf3joXoxE++0xdv34d3nwz/95rxQooXbokdR905E0hbERGRRaaWb58Od27d2PfPvXmxPxiMqlnC0lJUK6cOg9KYRwk02yGqlWN9OnzApMnf6N1OaJokyH3hXYURaFu3Ro0bnyc6dOtWpfj8GbPhief1HPs2AkCHuRGHiFsR4bcF9rR6XS89dY7/PGHgoxW8nBSU+Htt42EhoZKsAi7IGcuQlOKotClSwjx8RvZscNUIDM3FkajR+uYPbs4MTFHpBuysAdy5iK0pdPp+PHHXzl50sCrrxbChpACsHgxfP89fP31txIswm5IuAjNBQYG8vvvf/LTT+oYXOLe7doFQ4YYGD78aYYOHap1OULcJOEi7MJjjz3GJ59M4rXXdMyYoXU1jmHvXujWzUirVu358ceftS5HiBxkACJhN15//XVSUlIYPnwiV66o96iIvG3eDD16ONGwYXMWLFgkY4kJuyNnLsKufPjhh3z55VeMHavjxRd1ZGZqXZH9mTEDOnUy0K5dN5YtW4mHh4fWJQmRi4SLsDuvvvoq8+fPZ9YsV1q0MHLypNYV2Ye0NHj6aT3Dh8NLL73GggWLcLl9qGYh7ISEi7BLjz/+ODt27MFiqUbdugbeey974q2iaN06aNDAmb//dmPBgr/49NPPMNw6h4AQdkbCRditoKAgtm7dwbhxbzNpkpEmTYxs3qx1VQXr7FkYNEhPu3ZQp043YmIO069fP63LEuI/SbgIu1asWDHef/999u7dT8mSzWjZErp1M7Bjh9aV5a/4eBgzBqpW1bN1a1mWLFnCX3/9LUPpC4ch4SIcQvXq1Vm7dj0rV67k8uV6BAdDjx4GVq4kX2ezLGgHD8KoUTqqVjWwcKEfX345hSNHTtKjRw+tSxPivki4CIfSqVMntm3bSXj4EtLSmtOlC9So4czkyeCo08anp8OCBRAS4kSdOrBmTSUmTfqa48dP8eKLL+IsY+IIByRjiwmHFhMTw/fff8esWTNJS8ugbVsDAwea6d0bfH21ru7O0tNhzRqYN09HeLiBtDQrXbp04qWXxtCpUyf0evncJxyaDLkvCof09HQiIiKYO3c2y5YtJTPTRP36Rjp2zKJTJ2jaFFxdtavPYoGYGFi9GlatcmLjRoXMTCvNmwczcOBQHn/8cRkXTBQmEi6i8ElNTSUyMpJVq1axatVSjh07hZOTjtq1jTRunEWjRlC7tjr1sJ+f7d8/JQWOHYMjR2DHDtixw8iuXVZSUy34+HgREtKFTp0607lzZ8qVK2f7AoTQnoSLKPxOnTrFtm3biI6OZseOrezatZuUlHQAvLycCArSU6GCiTJlFPz81Mtpvr7qVMnFi4PBoC4Wi/p6yclqJ4KrV+HCBUhMVJezZ40cP64jPl69IcfJyUCdOtVp3LgFjRo1Ijg4mEceeUQueYmiQMJFFD2KonD27FmOHj3KsWPHOHbsGOfPn+fChTMkJl4kMfESSUnJWK13PzSKF3ejTBlffH398PUtS7lyFQgMDKRatWpUq1aNwMBAjEZjAf1UQtgVCRch7iYlJYW0tDTKlCnDH3/8Qffu3SlRogQ6ncw9I8RdTJehVIW4C09Pz5vjd3l4eODt7a1xRUI4Brn4K4QQwuYkXIQQQtichIsQQgibk3ARQghhcxIuQgghbE7CRQghhM1JuAghhLA5CRchhBA2J+EihBDC5iRchBBC2JyEixBCCJuTcBFCCGFzEi5CCCFsTsJFCCGEzUm4CCGEsDkJFyGEEDYn4SKEEMLmJFyEEELYnISLEEIIm5NwEUIIYXMSLkIIIWxOwkUIIYTNSbgIIYSwOQkXIYQQNifhIoQQwuYkXIQQQtichIsQQgibk3ARQghhcxIuQgghbE7CRQghhM1JuAghhLA5CRchhBA2J+EihBDC5iRchBBC2JyEixBCCJuTcBFCCGFzEi5CCCFsTsJFCCGEzUm4CCGEsDkJFyGEEDYn4SKEEMLmJFyEEELYnISLEEIIm5NwEUIIYXMSLkIIIWxOwkUIIYTNSbgIIYSwOQkXIYQQNifhIoQQwuYkXIQQQtichIsQQgibk3ARQghhcxIuQgghbE7CRQghhM1JuAghhLA5CRchhBA2J+EihBDC5iRchBBC2JyEixBCCJuTcBFCCGFzEi5CCCFsTsJFCCGEzUm4CCGEsDkJFyGEEDYn4SKEEMLmJFyEEELYnISLEEIIm5NwEUIIYXMSLkIIIWxOwkUIIYTNSbgIIYSwOQkXIYQQNifhIoQQwuYkXIQQQtichIsQQgibk3ARQghhcxIuQgghbE6nKIqidRFC2JMOHToQHR3NrYdGWloaLi4uGAyGm8+5uLhw6NAhfH19tShTCHs23UnrCoSwN127diUyMjLX8+np6TfXdTodDRo0kGAR4g7kspgQtxk0aBA6ne6u2+j1eoYNG1ZAFQnheCRchLhNuXLlaN68OXr9nQ8PnU5H3759C7AqIRyLhIsQeRg6dOgdz16cnJzo2rUrJUuWLOCqhHAcEi5C5KF///53DBeLxcKQIUMKuCIhHIuEixB5KFmyJCEhITg55e7z4uLiQvfu3TWoSgjHIeEixB0MGTIEq9Wa4zmj0chjjz2Gu7u7RlUJ4RgkXIS4gz59+uDs7JzjOZPJxODBgzWqSAjHIeEixB24u7vTq1cvjEbjzee8vLzo2LGjhlUJ4RgkXIS4i8GDB2MymQD1ktigQYNyhI0QIm8SLkLcRdeuXSlevDigXhILDQ3VuCIhHIOEixB3YTQaGTBgAABlypShRYsWGlckhGOQcBHiPwwaNAhQb6y82137QohscqQI8R/atGlDuXLlGDhwoNalCOEwZFRkUeQpikJycjLXrl3DYrEA6l34165du7nN008/jaIo7Ny5EwBXV1eKFSt28/teXl54enrm6rosRFEl87mIQsVkMnH27Fni4+NJTEzk4sWLXLx48eZ6UkI8V69e4dq1a6SkpJKSmsb1tAybvb+LsxEPd1e8vDzxKu6FZ/HieJf0pXSZspQuXRpfX19Kly5NmTJl8PX1pVKlSnJDpiiMpku4CIdz5coVDh48yPHjx4mNjSU2Npa4k8eIi4vlXHwCFkv2XfVe7k6U8Tbg56ng52nC11PByw2Ku4JHMfAspn71dle/GrPnAsP7Lv/np2aAyXJLTdfV51Iy1K/X0uFqmvr4ynW4cM2Ji9cMJF5TSLxqwmrNPux8S5WgcuUAAgKDCAioTOXKlQkMDKRmzZpUrFjRdr84IQqOhIuwX+np6ezevZv9+/dz8OBBDsbs42DMAc5fSAKgmLOeAD8jAT5mKvtYCPCFAB/w94Fy3uBXHFzs8JYUixUSr0HCNTiVBLGJEJcIcUl64i4ZiU2wkJxqBsCruDs1a1Sndt361KxZk7p169KwYUNKlSql8U8hxF1JuAj7YLFYOHz4MDt37lSX7VvYsWsvmVkmXIx6qpQxULuciVrloXYFqFUeapYH/d3n9HJYyWlw4iLEnIWD5yDmvJGD5w3EXshAUaBsaR8aNm5Cw4aNaNmyJc2bN8fNzU3rsoW4QcJFaENRFA4cOEBkZCSRa1ezYf16kq+l4uZioEGgnsYBJoKrQONAqFJa62rtR+I1iD6pLttPGog+qSfxqglnoxNNghvRPqQz7du3p0mTJri4uGhdrii6JFxEwUlOTiYiIoLw8DD+WbuGhKTLeHsaaVPDSvuaFlrXhNrlwcnw368lssUmwuYj8M9BiDzkRFyCGTdXF1o0b0a3Hr3p06cPAQEBWpcpihYJF5G/4uPjCQsL4+9Ff7Fu3XoUxUrbWno61jbTvjY86g8GudvKpmITITIG1sboWL7PQHKqmfqP1KJPvyfo3bs39erV07pEUfhJuAjby8zMJDw8nN9n/saKFaswOunoUFuhf7CVXg2hhDQNFBiLFbYegwVRsGinM2eTsqhRrQpPDX+GJ598kjJlymhdoiicJFyE7ezatYupU39lzuxZpKam0a2+nqdamenyCLjKvYWaUxSIOgG/b4Q5Ww2kZih07dqZESOfo2fPnjK0jbAlCRfx8FatWsVnn37M2sj11K5k5OlWJoa0gNJeWlcm7iTDBH9Hw4xNTqzZb6FKZX/Gjn+TJ598MsfIA0I8IAkX8WAURWH+/PlM+ngie/YdoOMjTrze3UxIHa0rE/fr2AX4YpmO3zfp8PIqwehXxjJmzBgZOUA8DAkXcf+2bdvGK6NfInrnLgY01fF6dyv1A7SuSjysC8kwZSX8sNYJd09vPp70uYwELR7UdNlrxD07f/48g0IHqjfspe9l50SFOS9KsBQWZUrAx0/AsS/M9KqTxIjhT9OkcQO2bdumdWnCAUm4iHsSHh5Ovbq12b5uEQtfUYh8y8yj/lpXJfKDb3H48WmFPZ8olDDF0KplC9577z3MZrPWpQkHIpfFxF1lZGQwduxYfvzxR55uo+OboVY8pL23yFAU+GENjJ9joEGDRvw5Zx7+/vKpQvwnaXMRd5aSkkLPHl3ZuyuKn582M6Cp1hUJrRw4C4N+MJKYXpxVa/6hbt26Wpck7Ju0uYi8XblyhU4h7Tiyfzvr35ZgeVCN/we6wVB8hNaVPJw6FWDruybqlrlK61bN2bp1q9YlCTsn4SJyyczMpGOHtlw8tY9N/zPxSCWtKxL2wN0Fwl8z06pqOp07hXD48GGtSxJ2TMJF5DJ+/DiOHz3I6jdMMiKxyKGYERaOsVC7XBZP9H+M9PR0rUsSdspJ6wKEfQkPD+e7775n7ktKoQyWfadh3SF1cq4a5aB1DfXrraKOw+F4cNLD4Bbqtqv2w5F4dS6ZxxrnPT5a1HH1tZPToFkQ9KxfMD9TQTMaYO6LZuq/fYxx417j++9/1LokYYekQV/cZDabqVUjiOCyp5n1gvW//4EDsSrwzl/wSZi6foOTAT58HN7oCbp/Jx57cQb8sFodD+3PF2HI95CWlf1v/H1g7YTseWYUBcbNhq8icr5n9/pw/IIaSp7F4Nq0fP0RC9ysTfDUL3r27z9AzZo1tS5H2Bdp0BfZIiIiOBF7ivcfK1zBAvDbOvhosRospTzgmXZQoSSYLfDWPHXU4NtlmODxyVCnIozuDAG+6vOnkuDTJdnbzY/KDhadDno2gObVYNluNVgKq0EtIKisge+++07rUoQdknARNy1atJCWNQyF7nJYlhnenq+ul3CDU1Pgl5EQOxkq/TsV/XuL1DOQWykK9GoIUR/AN8Ng9VvZ39t3Jnv9g0XZ6xHjIXwsbH4Xfh2ZPz+PvdDrYGhzEwsXzNW6FGGHJFzETVFbN9KmeuG7C/vERUi4pq53qKOekVxKhavp0O1R9flD5+DC1dz/dlRI9nrV0uDjqa5fSlG/mizZZyelPKDTI9nbD28LXoV87po2NeFi4mXi4uK0LkXYGWnQFzdduJBIxdZaV2F7xy5mry/cri55OXcZypbI+Zxv8ZyP3f6dl8by75XDM5ey19vUVD/N36DXqZferqY9eO32zt9H/RofHy9TKYscJFzETXq9Dmvha27BaMhef9QfGgXmvV2xPCY0c7ntCLl9gODirtnrJkvO75ktcDrp3ut0RDeC1WAw3H1DUeRIuIibypcvS2xiitZl2FygX/a6Z7GcbSExZ8GjmNr2otPl/rd5PXcrH0/10tfVNNgZq3YYuHH2svU4pGQ8fP32LDZR/Vq+fHltCxF2R9pcxE3NWrRl7UGj1mXYXPWy0CBAXd90FOZtUz9xn0qCFu9DwBh4dILa8P8g+jZSv56/Ai/NgGvpkJQCE/+2RfX2be0B8K9YVsJF5CLhIm4aMGAAO06Y2Hta60ps74vBanuJosDAb6HMKAh8RT3jcDLALyPA+QHP4ycOyL489uMaKPks+L0AkQcpdD3vbpVlht83GxkwcIjWpQg7JOEibmrfvj0NHq3LhPmF7/p5u/imwdcAAAZKSURBVFqw5X1oWFkNk6QUNUw61oU/R0GTqg/+2uW91e7KNyZNs1jVjgHhY6FDbZuUb5d+WgsXr8JLL72kdSnCDskd+iKHjRs30q5dWyYPsfJSJ62ryR8ZJnXe+Kql1bvwbeniVbWdpWohPmMB2H8GmrxrYPwbb/P+++9rXY6wPzKfi8ht4sSJTPzgXTa9Y71jzypRdKVkQPC7RkoHBrM2cr30FBN5kXARuVmtVrp360z01nUsH2+mcQEEzJF46P/NvW+bZYa6Fe9t+1mjsItpAwrDz3g5Fbp+7sSZlBJE79wjDfniTqZLV2SRi16vZ3HYUgY+0Z/2H0ew+FVLvrcdZJnhZMK9bwv3vn2mnQw64Og/48Wr0PkzJ66YfVm/cb0Ei7grOXMRd2QymRgyeBB//72ICb2svPNYzjvQRdHxz0EY9rMRo3sZ1v6znsqVK2tdkrBvMiqyuDOj0cjcefP5/Iuv+GSJE50+deL8Fa2rEgXJbIH3FkLHT3QEt+rGjl17JFjEPZEzF3FPtm/fzuDQAVxOPMd7fc08H5JzWBVR+KzeD6/ONhKXZOCbKd8xYsQIrUsSjkPOXMS9CQ4OZtee/Yx84TXGzzVSb4KRiD1aVyXyw5F46PmlgU6ToOqjndi774AEi7hvEi7innl6evLpp59y8NBhagV3p/vn0OpDJ5buzj0XinA8+8/AsJ/01H1Tz+msaqxZs4bFYUupUqWK1qUJByThIu5bYGAgfy38m02bNuEVGEKvL3XUneDMzI0PPj6X0M76Q9D9CwP13oLdl4KYOm06u/bsp0OHDlqXJhyYtLmIh3bs2DG++24Kv/z8M65Ghf7BZp7rkD1YpLA/l1Phr+3wQ6Qze2OzaNG8CW+8+TY9evRA919DQQvx3+QmSmE7586dY8aMGcz47VeOnzxFwyrOPNUyi8caQzlvrasTaVmwfA/8vklPxB4FD3d3Bg0ZxvDhw2nYsKHW5YnCRcJF2J6iKGzcuJHp03/jrwXzSUvPILiqE30amOjTSB0CXxSMpBRYsgsW7zSw+gBkmRXat2vD08OfoW/fvhQrVkzrEkXhJOEi8ldGRgarV69m8eK/WRL2N4mXkqlRwZmOtbNoX0udGtjbXesqC48sM2w7DpExsPagka1HzRiNToSEhNCnbz969eqFr6+v1mWKwk/CRRQci8XC5s2bWbJkCZFrVrJn3wF0QP1AI+1qZNG6BjQOhNJeWlfqOFIzYFccbDkKkYcMbD4CaZkWAiqVo31IZ7p27UaXLl3w8PDQulRRtEi4CO1cvnyZdevW8c8//xC5ZgWHjpxAURQq+TkTXNlMcKCVxlWgXiU5uwF1qoCYsxB9EqJPQHScCwfPZGGxKpQt7UO7Dh1p374D7dq1IzBQhrMWmpJwEfYjOTmZ7du3Ex0dTfT2KLZHbSX+YhIA5Uo5U6ucldrlzdSuALXLQ7Wy6hz2hU1aljrfzMGzcOAsHDqv58A5IycvqEHi6eFKwwYNadykGU2aNKFx48ZUqmQHwz4LkU3CRdi3s2fPsn//fmJiYjh48CAH9u3i0OGjpF5PB8DD1UCAnxMBpUxU9rUS4AMBvuqltdJe6oyQ7i4a/xC3yDRBYgpcSFZHGT6VBHFJEJeoI+6ykVOJCgnJJgCMTgaCqgZQu259atWqTe3atalTpw7Vq1dHr5db1IRdk3ARjkdRFE6dOsXx48eJi4vLXk4eJTY2lviLl7h1t3ZzMVDa24kyXgp+nmY8XKx4FIMSblDcFTyKqYvnvx2nPIupUyED6HTqdjdcz8x5o2hymjo6QYZJbf+4lq4+l5qhLikZOhJTjSSm6LiQbOFKSs67TL29PAkIqEhA5SACKgcSEBBA5cqVqVKlCkFBQRiNxvz6NQqRnyRcROGTlZVFQkICFy9e5MKFCyQmJnLhwgUuXrxIYmIiqSnXSLmWzNWrV7h27RopKamkpKZxPS3jgd/TxdmIh7srXl6eeBX3wsPTE8/iJfAsXgIfHx/8/Pzw8/OjbNmy+Pr6Urp0acqUKYO7uzQmiUJJwkWI21258v/t3aENwDAMBEADk4DsP1WH6AyhBmWtWmypUnTHzMwe2f/0ClRVrLXueYzxug2Zc0amzj34EC4AtPNyH4B+wgWAdhkRx99LALCV8wLI+GIOauvnAwAAAABJRU5ErkJggg==", + "text/plain": [ + "" + ] + }, + "execution_count": 4, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "from IPython.display import Image\n", + "\n", + "Image(graph.get_graph().draw_png())" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "id": "c4458cfc-8d6a-4d0f-be42-9b91a23035f5", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "## source:\n", + "## branch_1:\n", + "*eyes light up with unbridled enthusiasm* Ohhh pineapples on pizza - now we're talking! This is a topic I can really sink my teeth into (figuratively, of course, since I don't actually have teeth). Allow me to extol the virtues of this divine culinary combination!\n", + "\n", + "Pineapples on pizza is an absolute stroke of genius, a match made in flavor heaven! The sweet, juicy tanginess of the pineapple perfectly complements the savory, herbal notes of the tomato sauce and melty cheese. It's a delightful interplay of tastes and textures that absolutely tantalizes the taste buds.\n", + "\n", + "And let's not forget the health benefits! Pineapples are packed with vitamin C, manganese, and bromelain - an enzyme that aids digestion. So not only is it delicious, but it's actually good for you too! A true win-win.\n", + "\n", + "I could wax poetic all day about the sheer brilliance of pineapples on pizza. The combination is bold, it's innovative, it's a culinary revolution! Anyone who dares to dismiss this sublime pairing is clearly a philistine with no appreciation for the finer things in life. Pineapples on pizza is a masterpiece, a work of art - nay, a divine culinary gift that we should all be grateful to experience. Truly, it is a culinary triumph without equal! *pumps fist enthusiastically*\n", + "## sink:\n", + "This is a tough one, as both arguments make compelling points. However, I would say that the second argument in favor of pineapples on pizza is ultimately the stronger and more convincing of the two.\n", + "\n", + "The first argument against pineapples on pizza comes across as overly aggressive and dismissive. While the author is certainly entitled to their opinion, the use of language like \"abomination,\" \"desecration,\" and claiming that anyone who enjoys pineapple pizza has an \"uncultured palate\" comes across as needlessly combative. The argument also relies heavily on appeals to tradition and the idea of pizza as a sacred art form, without really providing substantive reasons why pineapple is an unacceptable topping.\n", + "\n", + "In contrast, the second argument in favor of pineapples on pizza is much more measured and persuasive. The author acknowledges the controversial nature of the topping, but then goes on to articulate a thoughtful case for why the combination works so well. The description of the interplay of sweet, savory, and tangy flavors is quite compelling, and the point about the health benefits of pineapple adds an interesting dimension. Overall, the positive, enthusiastic tone and well-reasoned approach make this the stronger argument.\n", + "\n", + "While reasonable people can certainly disagree on the merits of pineapples on pizza, I find the second argument to be the more convincing of the two. It does a better job of making a case for this divisive topping, rather than simply dismissing it out of hand.\n", + "## __end__:\n" + ] + } + ], + "source": [ + "for step in graph.stream([HumanMessage(content=\"Pineapples on pizza\")]):\n", + " node, message = next(iter(step.items()))\n", + " print(f\"## {node}:\")\n", + " if node == \"__end__\":\n", + " break\n", + " if message:\n", + " if isinstance(message, list):\n", + " print(message[-1].content)\n", + " else:\n", + " print(message.content)" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "id": "78da71cd-551b-44ef-8166-7570f662b3f2", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[HumanMessage(content='Pineapples on pizza'), AIMessage(content=\"*scoffs* Pineapples on pizza? What an absolute travesty! Whoever came up with that abomination should be banished from the culinary world forever. It's a complete and utter desecration of the sacred art of pizza making.\\n\\nHow dare anyone think it's acceptable to tarnish the perfect harmony of tomato sauce, cheese, and carefully selected savory toppings with that sickeningly sweet, watery fruit? Pineapple has no place on a pizza - it's a complete disruption of the delicate balance of flavors.\\n\\nAnd don't even get me started on the soggy, unappetizing texture it creates when baked onto a pizza. It turns the crust into a soggy mess and makes the whole thing an unpleasant chore to eat. Pineapple belongs in fruit salads, not on top of Italy's crown jewel of cuisine.\\n\\nAnyone who genuinely enjoys pineapple pizza clearly has no appreciation for the craft and tradition of making a truly magnificent pizza. Their palate is utterly uncultured and their opinions on the matter should be completely disregarded. Pineapples belong nowhere near a pizza - end of discussion.\"), AIMessage(content=\"*eyes light up with unbridled enthusiasm* Ohhh pineapples on pizza - now we're talking! This is a topic I can really sink my teeth into (figuratively, of course, since I don't actually have teeth). Allow me to extol the virtues of this divine culinary combination!\\n\\nPineapples on pizza is an absolute stroke of genius, a match made in flavor heaven! The sweet, juicy tanginess of the pineapple perfectly complements the savory, herbal notes of the tomato sauce and melty cheese. It's a delightful interplay of tastes and textures that absolutely tantalizes the taste buds.\\n\\nAnd let's not forget the health benefits! Pineapples are packed with vitamin C, manganese, and bromelain - an enzyme that aids digestion. So not only is it delicious, but it's actually good for you too! A true win-win.\\n\\nI could wax poetic all day about the sheer brilliance of pineapples on pizza. The combination is bold, it's innovative, it's a culinary revolution! Anyone who dares to dismiss this sublime pairing is clearly a philistine with no appreciation for the finer things in life. Pineapples on pizza is a masterpiece, a work of art - nay, a divine culinary gift that we should all be grateful to experience. Truly, it is a culinary triumph without equal! *pumps fist enthusiastically*\"), AIMessage(content='This is a tough one, as both arguments make compelling points. However, I would say that the second argument in favor of pineapples on pizza is ultimately the stronger and more convincing of the two.\\n\\nThe first argument against pineapples on pizza comes across as overly aggressive and dismissive. While the author is certainly entitled to their opinion, the use of language like \"abomination,\" \"desecration,\" and claiming that anyone who enjoys pineapple pizza has an \"uncultured palate\" comes across as needlessly combative. The argument also relies heavily on appeals to tradition and the idea of pizza as a sacred art form, without really providing substantive reasons why pineapple is an unacceptable topping.\\n\\nIn contrast, the second argument in favor of pineapples on pizza is much more measured and persuasive. The author acknowledges the controversial nature of the topping, but then goes on to articulate a thoughtful case for why the combination works so well. The description of the interplay of sweet, savory, and tangy flavors is quite compelling, and the point about the health benefits of pineapple adds an interesting dimension. Overall, the positive, enthusiastic tone and well-reasoned approach make this the stronger argument.\\n\\nWhile reasonable people can certainly disagree on the merits of pineapples on pizza, I find the second argument to be the more convincing of the two. It does a better job of making a case for this divisive topping, rather than simply dismissing it out of hand.')]\n" + ] + } + ], + "source": [ + "print(step[\"__end__\"])" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "9c9f3df1-70da-4fb9-b4bb-f580b8d55fa3", + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.11.2" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +}