{"cells": [{"cell_type": "markdown", "metadata": {}, "source": ["# Tricky detail when converting a random forest from scikit-learn into ONNX\n", "\n", "*scikit-learn* use a specific comparison when computing the preduction of a decision tree, it does ``(float)x <= threshold`` (see [tree.pyx / method apply_dense](https://github.com/scikit-learn/scikit-learn/blob/master/sklearn/tree/_tree.pyx#L796)). *ONNX* does not specify such things and compares *x* to _threshold_, both having the same type. What to do then when writing the converter."]}, {"cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [{"data": {"text/html": ["
run previous cell, wait for 2 seconds
\n", ""], "text/plain": [""]}, "execution_count": 2, "metadata": {}, "output_type": "execute_result"}], "source": ["from jyquickhelper import add_notebook_menu\n", "add_notebook_menu()"]}, {"cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [], "source": ["%matplotlib inline"]}, {"cell_type": "markdown", "metadata": {}, "source": ["## Conversion to float"]}, {"cell_type": "code", "execution_count": 3, "metadata": {}, "outputs": [], "source": ["import numpy\n", "N = 1000\n", "delta = 1e-9\n", "factor = 10\n", "dxs = numpy.empty((2 * N,), dtype=numpy.float64)\n", "fxs = numpy.empty((2 * N,), dtype=numpy.float32)\n", "for i, x in enumerate(range(-N, N)):\n", " dx = (1. + x * delta) * factor\n", " dxs[i] = dx\n", " fxs[i] = dx"]}, {"cell_type": "code", "execution_count": 4, "metadata": {}, "outputs": [{"data": {"image/png": "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\n", "text/plain": ["
"]}, "metadata": {"needs_background": "light"}, "output_type": "display_data"}], "source": ["import matplotlib.pyplot as plt\n", "fig, ax = plt.subplots(1, 1, figsize=(12, 4))\n", "ax.plot(dxs, fxs)\n", "ax.set_title(\"conversion from double to float\")\n", "ax.set_xlabel(\"double\")\n", "ax.set_ylabel(\"float\");"]}, {"cell_type": "markdown", "metadata": {}, "source": ["## Region where (float)x <= y"]}, {"cell_type": "markdown", "metadata": {}, "source": ["Let's see how the comparison ``(float)x <= y`` looks like."]}, {"cell_type": "code", "execution_count": 5, "metadata": {}, "outputs": [], "source": ["N = 100\n", "delta = 36e-10\n", "xs = []\n", "ys = []\n", "for x in range(-N, N):\n", " for y in range(-N, N):\n", " dx = (1. + x * delta) * factor\n", " dy = (1. + y * delta) * factor\n", " if numpy.float32(dx) <= numpy.float64(dy):\n", " xs.append(dx)\n", " ys.append(dy) "]}, {"cell_type": "code", "execution_count": 6, "metadata": {}, "outputs": [{"data": {"image/png": "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\n", "text/plain": ["
"]}, "metadata": {"needs_background": "light"}, "output_type": "display_data"}], "source": ["fig, ax = plt.subplots(1, 1, figsize=(12, 4))\n", "ax.plot(xs, ys, \".\")\n", "ax.set_title(\"Region where (float)x <= y\")\n", "ax.plot([min(xs), max(xs)], [min(ys), max(ys)], 'k--')\n", "ax.set_xlabel(\"x\")\n", "ax.set_ylabel(\"y\");"]}, {"cell_type": "markdown", "metadata": {}, "source": ["## Equivalent to (float)x <= (float)y ?"]}, {"cell_type": "code", "execution_count": 7, "metadata": {}, "outputs": [{"data": {"text/plain": ["'factor=1.0, error area 5.7525%'"]}, "execution_count": 8, "metadata": {}, "output_type": "execute_result"}], "source": ["def area_mismatch_rule(N, delta, factor, rule=None):\n", " if rule is None:\n", " rule = lambda t: numpy.float32(t)\n", " xst = []\n", " yst = []\n", " xsf = []\n", " ysf = []\n", " for x in range(-N, N):\n", " for y in range(-N, N):\n", " dx = (1. + x * delta) * factor\n", " dy = (1. + y * delta) * factor\n", " c1 = 1 if numpy.float32(dx) <= numpy.float64(dy) else 0\n", " c2 = 1 if numpy.float32(dx) <= rule(dy) else 0\n", " key = abs(c1 - c2)\n", " if key == 1:\n", " xsf.append(dx)\n", " ysf.append(dy) \n", " else:\n", " xst.append(dx)\n", " yst.append(dy)\n", " return xst, yst, xsf, ysf\n", "\n", "xst1, yst1, xsf1, ysf1 = area_mismatch_rule(100, delta, 1.)\n", "\"factor=%1.1f, error area %1.4f%s\" % (1., len(xsf1) * 1.0 / (len(xst1) + len(xsf1)) * 100, \"%\")"]}, {"cell_type": "markdown", "metadata": {}, "source": ["Applied to a decision tree, it does not mean that the evaluation of the condition of each node would fail in 5.75% of the cases, it depends on how the thresholds are built and the area of errors depends on the numbers."]}, {"cell_type": "code", "execution_count": 8, "metadata": {}, "outputs": [{"data": {"text/plain": ["'factor=10.0, error area 6.2025%'"]}, "execution_count": 9, "metadata": {}, "output_type": "execute_result"}], "source": ["factor = 10\n", "xst, yst, xsf, ysf = area_mismatch_rule(100, delta, factor)\n", "\"factor=%1.1f, error area %1.4f%s\" % (factor, len(xsf) * 1.0 / (len(xst) + len(xsf)) * 100, \"%\")"]}, {"cell_type": "code", "execution_count": 9, "metadata": {}, "outputs": [{"data": {"image/png": "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\n", "text/plain": ["
"]}, "metadata": {"needs_background": "light"}, "output_type": "display_data"}], "source": ["fig, ax = plt.subplots(1, 2, figsize=(14, 4))\n", "ax[0].plot(xst1, yst1, '.', label=\"agree\")\n", "ax[0].plot(xsf1, ysf1, '.', label=\"disagree\")\n", "ax[0].set_title(\"Factor=1, Region where\\n(float)x <= y and (float)x <= (float)y agree\")\n", "ax[0].set_xlabel(\"x\")\n", "ax[0].set_ylabel(\"y\")\n", "ax[0].plot([min(xst1), max(xst1)], [min(yst1), max(yst1)], 'k--')\n", "ax[0].legend()\n", "ax[1].plot(xst, yst, '.', label=\"agree\")\n", "ax[1].plot(xsf, ysf, '.', label=\"disagree\")\n", "ax[1].set_title(\"Factor=%f, Region where\\n(float)x <= y and (float)x <= (float)y agree\" % factor)\n", "ax[1].set_xlabel(\"x\")\n", "ax[1].set_ylabel(\"y\")\n", "ax[1].plot([min(xst), max(xst)], [min(yst), max(yst)], 'k--')\n", "ax[1].legend();"]}, {"cell_type": "markdown", "metadata": {}, "source": ["## Good threshold"]}, {"cell_type": "code", "execution_count": 10, "metadata": {}, "outputs": [{"data": {"text/plain": ["(1.0, 1.0, 0.99999994)"]}, "execution_count": 11, "metadata": {}, "output_type": "execute_result"}], "source": ["def good_threshold(dy):\n", " fy = numpy.float32(dy)\n", " if fy == dy:\n", " return fy\n", " if fy < dy:\n", " return fy\n", " eps = max(abs(fy), numpy.finfo(numpy.float32).eps) * 10\n", " nfy = numpy.nextafter([fy], [fy - eps], dtype=numpy.float32)[0] \n", " return nfy\n", "\n", "good_threshold(1.), good_threshold(1 + 1e-8), good_threshold(1 - 1e-8)"]}, {"cell_type": "code", "execution_count": 11, "metadata": {}, "outputs": [{"data": {"text/plain": ["'factor=1.0, error area 0.0000%'"]}, "execution_count": 12, "metadata": {}, "output_type": "execute_result"}], "source": ["xst1, yst1, xsf1, ysf1 = area_mismatch_rule(100, delta, 1., good_threshold)\n", "\"factor=%1.1f, error area %1.4f%s\" % (1., len(xsf1) * 1.0 / (len(xst1) + len(xsf1)) * 100, \"%\")"]}, {"cell_type": "code", "execution_count": 12, "metadata": {}, "outputs": [{"data": {"text/plain": ["'factor=1e+20, error area 0.0000%'"]}, "execution_count": 13, "metadata": {}, "output_type": "execute_result"}], "source": ["xst, yst, xsf, ysf = area_mismatch_rule(100, delta, 1e20, good_threshold)\n", "\"factor=%1.1g, error area %1.4f%s\" % (1e20, len(xsf) * 1.0 / (len(xst) + len(xsf)) * 100, \"%\")"]}, {"cell_type": "code", "execution_count": 13, "metadata": {}, "outputs": [{"data": {"text/plain": ["'factor=10.0, error area 0.0000%'"]}, "execution_count": 14, "metadata": {}, "output_type": "execute_result"}], "source": ["factor = 10\n", "xst, yst, xsf, ysf = area_mismatch_rule(100, delta, factor, good_threshold)\n", "\"factor=%1.1f, error area %1.4f%s\" % (factor, len(xsf) * 1.0 / (len(xst) + len(xsf)) * 100, \"%\")"]}, {"cell_type": "code", "execution_count": 14, "metadata": {}, "outputs": [{"data": {"image/png": "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\n", "text/plain": ["
"]}, "metadata": {"needs_background": "light"}, "output_type": "display_data"}], "source": ["fig, ax = plt.subplots(1, 2, figsize=(14, 4))\n", "ax[0].plot(xst1, yst1, '.', label=\"agree\")\n", "ax[0].plot(xsf1, ysf1, '.', label=\"disagree\")\n", "ax[0].set_title(\"Factor=1, Region where\\n(float)x <= y and (float)x <= good_threshold(y) agree\")\n", "ax[0].set_xlabel(\"x\")\n", "ax[0].set_ylabel(\"y\")\n", "ax[0].plot([min(xst1), max(xst1)], [min(yst1), max(yst1)], 'k--')\n", "ax[0].legend()\n", "ax[1].plot(xst, yst, '.', label=\"agree\")\n", "ax[1].plot(xsf, ysf, '.', label=\"disagree\")\n", "ax[1].set_title(\"Factor=%f, Region where\\n(float)x <= y and (float)x <= good_threshold(y) agree\" % factor)\n", "ax[1].set_xlabel(\"x\")\n", "ax[1].set_ylabel(\"y\")\n", "ax[1].plot([min(xst), max(xst)], [min(yst), max(yst)], 'k--')\n", "ax[1].legend();"]}, {"cell_type": "markdown", "metadata": {}, "source": ["Let's draw the function:"]}, {"cell_type": "code", "execution_count": 15, "metadata": {}, "outputs": [], "source": ["N = 1000\n", "dxs2 = numpy.empty((2 * N,), dtype=numpy.float64)\n", "fxs1 = numpy.empty((2 * N,), dtype=numpy.float32)\n", "fxs2 = numpy.empty((2 * N,), dtype=numpy.float32)\n", "for i, x in enumerate(range(-N, N)):\n", " dx = 1. + x * 1e-9\n", " dxs2[i] = dx\n", " fxs1[i] = numpy.float32(dx)\n", " fxs2[i] = good_threshold(dx)"]}, {"cell_type": "code", "execution_count": 16, "metadata": {}, "outputs": [{"data": {"image/png": "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vb0GHgMunktJ72Gtyjq47VdtN/ne57toTJ48mRNPPJHS0lL+8pe/MGfOHG688ca0ynz00UeZN2/e5v0f/ehHXH/99elWVURERKRFoXAjAOWlaYabkfrotrQizRrlB7V8x7j2X+8zb+m6jJY5elAPrj5u1xbT3XPPPdx7770cf/zx1NXVsffee3PFFVdskaa6upoLLriADRs2MHLkSCZPnkzv3r254447mDRpEqFQiB122IG7776b6upqpk2bxksvvcR1113Hww8/zMiRI1m9ejVffPEF2267bUbvU0RERCRWQyQafFeUpRt8N0S3ZZVp1ig/qOU7D4RCIRYvXszw4cOZNm0anTt3prq6mlNPPXWLdGeddRY33HADc+fOZffdd+faa68F4MQTT2TmzJm888477LLLLtx5553st99+HH/88dx4441UV1czcuRIAPbYYw9effXVrN+jiIiIFJem4Dv9lu9goGVpYSyop5bvGKm0ULeHVatW0atXr6Rp1q5dy5o1azj44IMBOPvsszn55JMBeO+99/jFL37BmjVrqK2t5aijjkpYzoABA1i6NO6U6CIiIiIZUx/OUMt3uKnbSWG0fCv4zgOdO3dOa6GY733vezz66KOMHTuWu+66ixdffDFh2k2bNtG5c+c2X0tEREQkFQ2R6OLjFWm3fAfdTgqk5VvdTvJA7969iUQiSQPwnj170rt3b1555RUA7r777s2t4OvXr2fgwIE0NDRwzz33bM7TvXt31q9fv0U5H374Ibvttls73IWIiIjI1zI64LKkPL35CvOIgu88ceSRRzJjxoykaaZMmcJll13GmDFjqK6u5qqrovNW/vrXv2bvvffmiCOOYOedd96c/rTTTuPGG29k/PjxfPTRRzQ0NLBo0SKqqqra9V5EREREGiKNlJYYpSVpBs2RhoIZbAnqdpI3LrroIn73u99x+OGHU1tbu/n4Nddcs/n9uHHjeOONN7bKe+GFF3LhhRdudXz//fffYqrBRx55hJNOOomyMv2zi4iISPsKRRopL81Aa3W4vmC6nIBavvPG+PHjOfTQQ4lE0luCNZlwOMxPf/rTditfREREpEko3Jh+f2+IznZSIIMtQS3feeXcc89t1/KbZkcRERGRwvP8/OXM+uSrtMvpu/Fjdl35JOBplTP6yw0Mswg893p6FaqZVTAL7ICCbxEREZGC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\n", "text/plain": ["
"]}, "metadata": {"needs_background": "light"}, "output_type": "display_data"}], "source": ["fig, ax = plt.subplots(1, 1, figsize=(12, 4))\n", "ax.plot(dxs2, fxs1, label=\"(float)\")\n", "ax.plot(dxs2, fxs2, label=\"good_threshold\")\n", "ax.set_title(\"Function good_threshold\")\n", "ax.set_xlabel(\"double\")\n", "ax.set_ylabel(\"float\")\n", "ax.legend();"]}, {"cell_type": "markdown", "metadata": {}, "source": ["That's explain some tricky lines in package [skl2onnx](https://github.com/onnx/sklearn-onnx/tree/master/skl2onnx). Let's check if it still works with negative value."]}, {"cell_type": "code", "execution_count": 17, "metadata": {}, "outputs": [{"data": {"text/plain": ["'error area 0.0000%'"]}, "execution_count": 18, "metadata": {}, "output_type": "execute_result"}], "source": ["N = 100\n", "xst = []\n", "yst = []\n", "xsf = []\n", "ysf = []\n", "for x in range(-N, N):\n", " for y in range(-N, N):\n", " dx = -1. + x * delta\n", " dy = -1. + y * delta\n", " c1 = 1 if numpy.float32(dx) <= numpy.float64(dy) else 0\n", " c2 = 1 if numpy.float32(dx) <= good_threshold(dy) else 0\n", " key = abs(c1 - c2)\n", " if key == 1:\n", " xsf.append(dx)\n", " ysf.append(dy) \n", " else:\n", " xst.append(dx)\n", " yst.append(dy)\n", "\n", "\"error area %1.4f%s\" % (len(xsf) * 1.0 / (len(xst) + len(xsf)) * 100, \"%\")"]}, {"cell_type": "markdown", "metadata": {}, "source": ["It works."]}, {"cell_type": "markdown", "metadata": {}, "source": ["## What about double double?"]}, {"cell_type": "code", "execution_count": 18, "metadata": {}, "outputs": [{"data": {"text/plain": ["'factor=1.0, error area 3.1125%'"]}, "execution_count": 19, "metadata": {}, "output_type": "execute_result"}], "source": ["def area_mismatch_rule_double(N, delta, factor, rule=None):\n", " if rule is None:\n", " rule = lambda t: numpy.float64(t)\n", " xst = []\n", " yst = []\n", " xsf = []\n", " ysf = []\n", " for x in range(-N, N):\n", " for y in range(-N, N):\n", " dx = (1. + x * delta) * factor\n", " dy = (1. + y * delta) * factor\n", " c1 = 1 if numpy.float32(dx) <= numpy.float64(dy) else 0\n", " c2 = 1 if numpy.float64(dx) <= rule(dy) else 0\n", " key = abs(c1 - c2)\n", " if key == 1:\n", " xsf.append(dx)\n", " ysf.append(dy) \n", " else:\n", " xst.append(dx)\n", " yst.append(dy)\n", " return xst, yst, xsf, ysf\n", " \n", "xst1, yst1, xsf1, ysf1 = area_mismatch_rule_double(100, delta, 1.)\n", "\"factor=%1.1f, error area %1.4f%s\" % (1., len(xsf1) * 1.0 / (len(xst1) + len(xsf1)) * 100, \"%\")"]}, {"cell_type": "code", "execution_count": 19, "metadata": {}, "outputs": [{"data": {"text/plain": ["'factor=1e+20, error area 2.9900%'"]}, "execution_count": 20, "metadata": {}, "output_type": "execute_result"}], "source": ["xst, yst, xsf, ysf = area_mismatch_rule_double(100, delta, 1e20)\n", "\"factor=%1.1g, error area %1.4f%s\" % (1e20, len(xsf) * 1.0 / (len(xst) + len(xsf)) * 100, \"%\")"]}, {"cell_type": "code", "execution_count": 20, "metadata": {}, "outputs": [{"data": {"text/plain": ["'factor=10.0, error area 3.1975%'"]}, "execution_count": 21, "metadata": {}, "output_type": "execute_result"}], "source": ["xst, yst, xsf, ysf = area_mismatch_rule_double(100, delta, factor)\n", "\"factor=%1.1f, error area %1.4f%s\" % (factor, len(xsf) * 1.0 / (len(xst) + len(xsf)) * 100, \"%\")"]}, {"cell_type": "markdown", "metadata": {}, "source": ["The probability it fails is lower than for floats but still significant."]}, {"cell_type": "code", "execution_count": 21, "metadata": {}, "outputs": [{"data": {"image/png": "iVBORw0KGgoAAAANSUhEUgAAAz8AAAElCAYAAADKh1yXAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADh0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uMy4yLjAsIGh0dHA6Ly9tYXRwbG90bGliLm9yZy8GearUAAAgAElEQVR4nOzdd3hUVfrA8e87M+kJkADSm4CCIiKgoogiithWWRVFUX+oa3etq2uHVbHsWtB1lcWGDVBXbKgIiFQFBUEQVKQX6SSkl5k5vz/OHbiE9EyYZPJ+nmeezNxy7pk7M/fNe8+554oxBqWUUkoppZSKdp5IV0AppZRSSimlDgZNfpRSSimllFL1giY/SimllFJKqXpBkx+llFJKKaVUvaDJj1JKKaWUUqpe0ORHKaWUUkopVS9o8qNUHSAi/UTktwhuv7+IbIrU9pVSSik3EWkrItki4o3Q9tuLiBERXyS2r6pOkx9VI0RknYjkOQem0KNlFcs6aP94i0isiPzPqb8Rkf6VXN+ISI7zfjeLyLPhODAbY+YYYw6vbjlKKVUbRWvMEOspEdnlPP4pIlJGeaeJyK8ikisi34hIu4qW5fwz/o2z7q8icnqxsi8TkfVOjPpYRNJc8+JE5HURyRSRrSJyZ7F1e4jIIqfsRSLSoxL7yP3ZbhWRcSKSXNH1S2OM2WCMSTbGBKpblqpfNPlRNelPzoEp9PgjEpWowlmZucDlwNYqbvJoY0wycApwCXB1FcuJSnqWTClVimiMGdcBg4Gjge7AucD1pWy3CTAJeAhIAxYC71WirAnAYqAx8ADwPxFp6pR9JPBf4AqgGZALvORadyTQGWgHnArcIyJnOuvGAp8A7wCpwJvAJ870ivqTExd7AMcA91Vi3aincfHg0uRHHTQikioik0Vkh4ikO89bu+anicgbIvKHM/9jEUkCvgRaus8GOmepRjvL/uE8j3PK6S8im0Tk7yKyFXijonU0xhQaY0YbY+YC1TqbZIxZBczDHuxD7/FcEVkiIhki8q2IdHfN6ykii0UkS0Q+EJH3ROQx93tyLdtVRGY65SwXkfNc88aJyH9E5HOnrAUi0rGkOorImyJyl/O8lXPm8ibndScR2V3szOJdIrJdRLaIyFWu6XEi8rSIbBCRbSIyRkQS3HV3fx4i4hGRe0VktXMG8333WUillIqSmPF/wDPGmE3GmM3AM8DwUoq7AFhujPnAGJOPTUiOFpEu5ZUlIocBPYERxpg8Y8yHwDLgQmfdYcBnxpjZxphsbIJ1gYikOPOvBB41xqQbY34BXnHVsz/gA0YbYwqMMS8AAgyo6H4KMcZsBb5i/7jYx4mHGSLyk7haz0Skg4jMdmLZdCe2vePM26/bmfM5f+rErVUicq2rnJFOnHnLKWu5iPQuqY4i8g8R+bfzPEZsS9k/ndcJIpIvIqmuVYY5sW+niDzgKqfUOOeq+zUisgGY4Uy/WkR+cb7PX4mr5U+FjyY/6mDyYINKO6AtkAe86Jr/NpAIHAkcAjxnjMkBzgL+KHY28AGgD/YAejRwHPCgq6zm2DNn7YDrxPYNzijjcVm436wTsPoBq5zXPYHXsWfqGmPPwn3qBOVY4CNgnFPvCcCfSyk3BvgMmIrdT38F3hURd7e4S4F/YM/SrQJGlVLNWdjABralao3zF+BkYI4xxjivmwMNgVbANcB/XAHgKeAw7OfRyVnmYdd29vs8gFuxZzBPAVoC6cB/SqmjUqp+ioaYcSTwk+v1T860cpd13stq1/JllXUksMYYk1XGfHfZq4FC4DDnON6ynLKXumIBwNIy3kepnOT1LPbFxVbA58Bj2P3/N+BDcVqsgPHA99iYORLbclWaCcAm571cBDwuIqe55p8HTAQaAZ+y/3fJzR0Xj8W26IXi4gnAb8aYdNfyJwGHA6cBD4tIV2d6ReLcKUBXYJCIDAbuxybBTYE5zntS4WaM0Yc+wv4A1gHZQIbz+LiEZXoA6c7zFkAQSC1huf7ApmLTVgNnu14PAta5li8E4qv5HjYB/Su5jgEygRzn+QQgzpn3MvbMmnv537AHv5OBzYC45s0FHiu+D7AJ1VbA41p2AjDSeT4OeNU172zg11Lq29H5fDzAGGxiFtrOm8Cdru3nAT7Xutux/0yI8347uuadAKwt7fMAfgFOc71uARS5y9eHPvRRfx7RGjOwrUFdXK87O7FBSlj/NeDJYtPmAcPLKwubFMwvtu4oYJzz/GvghmLzNzvvvY1TjvsYPdC1fx4CJhZb991QzKnEZ5vlbOdroJEz7+/A28WW/wrbytUW8AOJrnnvAO84z9s75fmc9xAAUlzLPuF6/yOB6a55RwB5pdQ3AcjHJlz3YhOSTUAy9qTiC8W239q17vfAUOd5qXHOte6hrvlfAte4Xnuw3RPbRfr3GW0PbflRNWmwMaaR8xgsIoki8l+xF1xmArOBRmIHBGgD7Db7n00pS0tgvev1emdayA5juw1EQk/sQfIS4HggyZneDrjLffYQ+75bOo/NxjniOTaWUn5LYKMxJuiath7b2hLi7nue69TnAMae/cvG/lPRD5gM/OG0Ip2CPQMWsssY4y+h3KbYs6+LXO9rijM9pPjn0Q74yLX8L9jA1ayU96yUin7RGDOygQau1w2A7GLH+tKWDS2fVcp8d1mVXdc9P9v1urLrVtRgY0wKNtnqAjRxprcDhhSLiydhE4WW2M8411VOWXFxt9m/5au8uBgvJVxrY4zJw15vFToxOQv4FujLgXGxpHJD8bYicc79ftoBz7uW341NbN3vQYWBJj/qYLoL2zR8vDGmAfagAvbHvRFIE5FGJaxXUpD4A3ugCGnrTCtxHdk3JGZpj2FVfVMlMdb7wHfs6/61ERjlCu6NjDGJxpgJwBaglch+owC1KaX4P4A2IuL+/bbFnsWrilnYLgKxxvYjn4Xt/50KLKnA+juxrUJHut5XQ2Mvbg0p/hluBM4qti/ine0rpRRER8xYju1mF3K0M63cZcVev9TRtXxZZS0HDpV91/CUNN9d9qFAHLDSSSC3lFN292LxqXsZ76NUxphZ2N4JTzuTNmJbftyxIMkY86RTpzQRSXQVUVZcTCv2/qsbFwdgB2f4wXk9CNtdcnYFy6hInCt+wvP6YssnGGO+reJ7UKXQ5EcdTCnYf5IznIv+RoRmGGO2YJt8XxJ7kWuMiIQC3TagsYg0dJU1AXhQRJqKHSHnYWxzeInMviExS3u8G1rWuQYn3nkZKyLxoYO+iAwXkXWVeM9PYvuPN8deQHqDiBwvVpKInOMcrL/DnhG6RUR8InI+9iBbkgXYbmb3OPupP/AnbF/mqpgF3MK+A/pM7HVEc00FhhB1WqBeAZ4TkUNg7+AJg8pYbQwwKnQxp/M5nl/F+iulolOdjxnAW8CdzjGxJTahG1fKZj8CuonIhU55D2Ovtfm1vLKMMSuxJ6tGONv/MzZB+dBZ913gT2LvGZcEPAJMcrWUvOXsn1Sx16te66rnTGx8utV5r7c400MX6fcXkZISztKMBgaKHS77Hadeg0TE69S9v4i0Nsasx7bAjBQ7pPgJ2Fh3AGPMRmzrzBNOGd2x16a+W9LyFRA6CbjCGFOI3Qd/wXbn3lHBMiob58YA94kdmQ8RaSgiQ6pYf1UGTX7UwTQa25d2JzAf2zXK7Qpsf9hfsdeT3A7gHPgnAGuc5uCW2IsjF2IvulwG/OhMC4ffsAG3FbbvcR77zhi2wfbBrhBjzDLsQfRuY8xCbEB5EXvh4yqc0XScg+sF2IN1BnbY1MlAQQllFmIv3DwLuy9fAq50BcjKmoX9JyOU/MzFdmOr6NktsP22VwHzne4p07FnbEvzPPaC06kikoX9PhxfyXorpaJbNMSM/2IHqFkG/Iy9uP+/oRXFjjo2zKn3DuzobKOwMeJ4YKhrO2WW5Szb21n3SeCi0D/qxpjlwA3YZGA79ph/k2vdEdjrotZjY8K/jDFTnHULsRfuX4mNT1dju7EVOuu2wZ7AqxCnTm8BDzlJy/nY62p2YFs/7mbf/6fDsNeQ7sJ+Xu9RQlx0XIq9luYPbCI5whgzraL1KuZb7HcvFAdXYK8DqkxcrFScM8Z8hB08aKITR3/GxnkVZlJyt1OlVElEZCpwm7FDgdb0thYAY4wxFR52VSmllDqYRORV4ANjzFcHYVvvYQfwGVHuwkqVQpMfpWoJETkFewZxJ/Zs1xjsSDBbIloxpZRSKgJE5Fjshf9rgTOAj4ETjDGLI1oxVafpHWWVqj0OB97HjhSzGttlQRMfpZRS9VVzYBJ22OlNwI2a+Kjq0pYfpZRSSimlVL2gAx4opZRSSiml6gVNfqpIRJ4Qkdtdr28UkW3O+P+NRcSISKca2G4zEflFROLCXXZd5gyNuamcZSaIyOBS5rV3PrNqdwUVkXUicnpV6+la9lYRebK69alJuk+Vqr00TtUuGqciQ/epKk6TnyoQkabYIR//67yOAZ4FznDG/98Vxm3t92MyxmwDvgGuC9c26gNnzP+jgU8iXZdKGAtcLs69c2ob3adK1V4ap+oePaaGn+5TVRJNfqpmOPCFMSbPed0MiKcKdzuuoneB68NdqHNDrWg9U3c98K6pQxe5GWPysTfxuzLcZYtIszAUo/u0isTS46+qScPROFXX6DHVReOUxqmaEpVv6iA4C3sTMETkMOzwxGDvQj2j+MLOwfotEdkhIutF5MHQF0pEOorIDBHZJSI7ReRdEWnkzHsbaAt85nRTuMcpcgFwqOy7a/AXIvKMa3vvicjrFXkjIuIRkdNF5F3szcWaVGF/hMo61ulS4XNNu1BElpSy/DkislhEMkVko4iMdM0LNUX/n4hscPbNA675CSIyTkTSRWQFcGw51dv7mTnre0XkaafcNcA5xerWUkQ+FZHdIrJKRK51zRsnIo+5XpfUnH2siKxw6veG7Lv7d/F90FJEPnS+G2tF5NZii8wM1c35ruwWkZ6udXeKSP9y3ntoW43Ednv5ntLvMF4Z0bBP7xaRD4ut/28RGV1K2feKyGoRyXLq8udi7/8Z5/2vFZFbxNWdQkRmisgoEZkH5GJ/w11EZJqzT34TkYtd5cU5+3OD87saIyIJJdVLqRJonCq5LI1T+2icqhv7VONUuBlj9FHJB/YuxMe6XrcHDOBzTTNAJ+f5W9gm1xRn2ZXANc68TsBAIA5oir178GhXOeuA00uow1LgPOd5c+wdmwdg7w+zBkgp5z0cCjyCvZvzUuAuoJlr/mXYOzmX9mhbSrkrgLNcrz8C7ipl2f7AUdgkvDuwDXvXaPc+fQV7l+WjsXd17urMfxKYA6Rh7y79M7CplO0kOWU1dU27AXtX8DZOGd+4P0PswfIl7JnSHs5nfpozbxzwWLH3scn1ep1Tn1DZ80LLu5d13vci4GEg1vlM1gCDXGX1BHa7Xl8L/AIkYu8k/nQ5n7PH+X6NB/Y4n8dgIMa1zOQyPufJ0bxPgRZADtDIee3D/pZ6lfK+hwAtne1c4qzbwvX+VwCtgVRgerH3PxPYABzpbKch9h+5q5zXPbH3eDrSWX409u7gadhjx2fAE5E+/umjbjzQOKVxSuNUVOxTNE6F//gY6QpUusLwuvOh/xyGsk4Flrge+TgHtXLWK8KeTfgOe6AbRSlBBfA6yxzhmnc9MLOUsgcDi12v11FyUJkHXOl6fYHzBd0JnFRG3Y92vtzbgReAnmH+fP6ObWLG+THkhn50FVh3NPCc87y9sw9bu+Z/Dwx1nq8BznTNu47Sg0orp6x417QZwA2u12eEPkPsgSuAKzADTwDjnOfjKP8A6C77bGB18WWB44ENxep6H/CG63VnIFBsmU+BZdh/BuLK2J+3YA9iPwK3Ak3C+DlHzT7Fdi+41nl+LrCiEvthCXC+6/1f75p3OgcGlUdc8y8B5hQr77/ACECwAauja94JwNpwfYb6qLkHYYxTTnltganYfyhXAO0rsE6V4pSz3EZsPJxZStkap4zGKddrjVM1vE/ROBXWR13s9jYOODMcBRljvjHG9DDG9MCejcrFBpj9iMi6YpPSsT+QW4Gny9lME2xmv941bT32R4mIHCIiE0Vks4hkAu9QsSb9FOwZj5DJ2AD2mzFmbhnrNQK6AKuAn5y/4fQO8CcRSQYuxv5oSrxRp4gcLyLfOM2+e7BnJIq/962u57nYG4CCPaux0TXPvX+LC+2nFNe0stZviT3jklVsfqsytlFc8bJblrBMO6CliGSEHsD92L75ISnYM2FurwDdgH8bYwrKqEMH7JmdJdgAFLYLnImuffomcLnz/HLg7dIqICJXisgSV9nd2PedLf7+Nx5QwP7T2gHHF6vrMOwZ8qbYs6aLXPOmONNV7TeOMMUpx1vAv4wxXYHjsEnBfsIYpz5ztmHQOKVxSuNUbdmnGqfCqM4lP8aY2cBu9zSnj+kUEVkkInNEpEsVir4I+NIYk1uBZZdim1F/wJ5dK8tOZ5l2rmltgc3O8yewQaa7MaYB9kstrmVN8QKdvpmdsEEhZBT2rGALEbm0tMoYY2ZhmzufwPYn3SB2GMgzRcTr2sYwsf23S3u0LaX8zdgzjX8GrqCMHyi2iftToI0xpiEwpth7L8sW7FmakBLr49QpB1gNHFbB9f8A0kQkpdj80GeWg/3BhzQvYbPFy/6jhGU2Ys+QNHI9UowxZ7uW6Yrrc3aC9WjgNWCkiKSVUC4Axpi7sM3py7BnT9eKyKMi0tm9nIh8Wcbn/GUpZUfNPgU+BrqLSDfsGbV3SygXsdcuvII9U9nYGNMI28Uh9J3dgv1tlVTfEPfveSMwq1hdk40xN2KPG3nYrgWheQ2NMckllKlqmXDGKRE5AntWdppTdnY44pSIhP6R+hR41FmmnTFmvpMICBqnQOOUxqlasE/ROBVekW56qsoD29T8s+v110Bns685cUYVypwBnFvKvHXFXt8JjHWej6SM7gTO83ewfVhTsEnQr8BfnHnvY7+oXuzZhXns34w6H7iu2PZPxNXkCZyM/RK2Ak4KPa/g+24C3AYsxv5IDwnD5zMMeyDLBJLKWG478H/O89DZzHdcn3HxfTrTtd+ewvbNTcX+kJdSSncCZ/kXgPtdr29k/36vX7N/0+8c4EVsv99QP++Bzrxrnc8wDXvwm8+BTd/LnLLTnLIed+b1Z1/Ttxfb7/fv2P7iXuwZGnc//bHAPa7XrwHvu+a9X4nPpRfwb+f78XoYPueo2KfOtFec71Cpxw5sl6B84HCn3KsAv+s7eSN2JK1W2DPX0ziwO8FfXOWlYM8MXgHEOI9j2Xe9wPPY48MhzutWuPqE66N2PwhTnMJ2MZsMTMIep/8FeEtYbl2x16XGKew/Vp+xr9vbS9jY445TQTROgcYpjVO1YJ860zROhekR8QpU8cvcHieoYJuX89j/2p1fnHkXYDPe4o+vipXXAntRm/viuv+4yit0PX8AeyDe5HxpR1J+8pOKTYB2YLPohwGPM+9I50eQ7ZR/V7Ef0/nY/rAZwN9cdbvVed7A+cENda3zFLb7nlRyvx4NJIfh80nEBpQ3y1nuIudHlYUN7i9S8aCSiO0KkoE9kN1N2UGlG/YHL85rH/Actol9LXAz+x8AWjt12o09c+TuxxsPvOe8x6XAHRx4ALzPqVcGtrk60ZnXv9iyLYEJ2G4T6diD6emu7WzCucDX+S5sBtJc3/1VwLBKfj6xwHFh+Jzr/D51rXOSU9erynnPo5z678TeM2WW6ztZ/P3fgT2bHto/M3EFFWfa4cDn2GPDLuxJmB6uuj6OvW4gE3vG/Nbqfm76ODgPwhSnsMfJPdiz4z7gQ/YNRFClOIU9K/yH83oFdiS4J9k/ThWgcSq0/zVOaZyK2D51raNxKkyP0JutU0SkPXZ0j24i0gDbf7hFNcq7DdtsV+IN2URknTGmfbFpj2PPADUCso0x5fWpDguxN72aBRxj7FjwtZKIrMZeVDc90nUJEZHx2DNQH0e6LhUhIn/FdrW4p9yFIyRa9qnTPeZXoLkxJjNM2zoLGGOMaReO8lTdEq44JSJ9gCeNMf2d11cAfYwxNxdbrsJxyvkdtDTG3FfGdrNNFbuvaJyqumg5ptYm0bJPNU6Fj6/8RWo3Y0ym2LHKhxhjPhARwfZL/qnclfe5FJutV2a79wOIa8z/g8EYsx3bZaHWEpELsWcnDriXRCQZYy6LdB0qwxjz70jXoTzRsE/F3svkTmBidQKK2HsbnIo9m90MOxrOR1UtT0WPasapH4BUEWlqjNmBHZxnYQW3W1qc+hr4RESeM8Zsd67JSDHGlHVBfoVpnKq6aDim1jbRsE81ToVXnWv5EZEJ2ObDJti+mCOwB6+Xsd3XYrBfjkcqWF57bP/lNsaYYCnLlHRGrTk2ADXA9o3Oxg5nHZZsvK4SkZnYPqdXGGO+inB1lCqTiCRhjyPrsUPSljTyTUXLSsSe7e6C7eL0OXBbfT8m1Ec1EKcGAs9gL1pehL2+prDYMpWKUyJyCfaknwfb7eVmY8x8Efkn9v45LbFd4141xoys5C6o1TROqbpE41T41bnkRymllFJKKaWqos4Nda2UUkoppZRSVVGnrvlp0qSJad++faSroZRS9dqiRYt2GmNq/Y3sIkHjlFJKRV5ZcapOJT/t27dn4cIKXeeplFKqhohIWC6Mj0Yap5RSKvLKilPa7U0ppZQqg4h4RWSxiEyOdF2UUkpVjyY/SimlVNluw968TymlVB2nyY9SSilVChFpDZwDvBrpuiillKq+OnXNT0mKiorYtGkT+fm19ibStVJ8fDytW7cmJiYm0lVRSqnabDRwD5BS2gIich1wHUDbtm0PmK9xqmo0TimlakKdT342bdpESkoK7du3x940W5XHGMOuXbvYtGkTHTp0iHR1lFKqVhKRc4HtxphFItK/tOWMMWOBsQC9e/c+4OZ5GqcqT+OUUqqm1Plub/n5+TRu3FgDSiWICI0bN9azkEopVba+wHkisg6YCAwQkXcqW4jGqcrTOKWUqil1PvkBNKBUge4zpZQqmzHmPmNMa2NMe2AoMMMYc3lVytJjbuXpPlNK1YQ63+2tonIK/OQU+PF6hLyiAALEx3gJBM0B08qbX5vXqUyZGbmFjF+wgZ//2IMAR7ZsSHpuIamJseVOq8vr1JZ61OZ1aks9avM64S6zc/wU1myfCr5EyNkKCCQ12/+5P/fA+SVNK2O+STyE7gmNGHLcLdDmuKoeUpVSSqlK2Zy5mVd/fJWACZS7bLuG7bim5zU1Uo96kfzkFPhZszMHYw7oil2vZRcEuP/TZZGuhlL1Xk9ZyeS4+1gqAaSGDlMmAHwPLIchV/m4cMVXeIZ/pglQBRljZgIzI1wNpZSqs15f/DojZ41EKL9Vt1+7fpr8VEdGbmGtTXz8fj8+X734GJRSpbjAO4eHCHKFieEtEsJe/rwNfm78PJ9l24Oc3cnHSwXxBD2FbFkylVaa/KhyaJxSSoXDrrxdpMSmkHlfZkTrUS+OZkWB/ROfX7dksmxzJke1akCXFg3Cso3brxnG1i2bKSgoYNjV13PRsOFMmvg2b7z0PIc0a07bDh2JiY3l/sf+xUN33ESDRqn8unwpXbsdzSVXXsPjD95N+u6dxMcnMOKfz9Oh02Hs3rWTx+67k62bNwFw98jHOebYPmGpr1Kq9mjCHrKA5Booe9pqP2e8k0vrBsKkixM4/3AfiFCAj8/2dOSGGtimqr5F69OZv2YXfQ5tTK92qWEpc/DgwWzcuJH8/Hxuu+02rrvuOl577TWeeuopWrZsSefOnYmLi+PFF19k+PDhpKWlsXjxYnr27MlNN93EzTffzI4dO0hMTOSVV16hS5cu7NixgxtuuIENGzYAMHr0aPr27RuW+iqlokt6fjqN4htFuhr1I/lx+3VLJg9+shx/IIjP6+Gx848MSwL0j6dfpGFqKvl5eVx27gD6DTiDV57/FxO/mEVicjLXXnIehx3Rbe/y69euYuyEj/F6vVw79HwefOJZ2nXoyNLFCxn1wN949b1P+eeIe7n8LzfS87gT2LJ5IzdefhEff7Og2nVVStU+2RhSKtAVoCKCxrAm3dAxzcOpHbz8a2AcN/SOJSlGCAATA6cxKdCPJsHOYdmeCq9F69MZ9up8Cv1BYn0e3v1Ln7AkQK+//jppaWnk5eVx7LHHcs455/Doo4/y448/kpKSwoABAzj66KP3Lr9y5UqmT5+O1+vltNNOY8yYMXTu3JkFCxZw0003MWPGDG677TbuuOMOTjrpJDZs2MCgQYP45Zdfql1XpVT0ycjPIDUhPCdzqqPeJT/LNmfiDwQJGvAHgizbnBmW5Gf8G/9lxpTJAGzbspnJk96jV5++NEy1H/LAcwezfs2qvcufcc5gvF4vuTnZ/LTwe+6+YfjeeYWFhQDMnzuLNb//tnd6dlYWOdlZJCWXeq89pVQd5CdIgUCKqX7ys3RbgBs/z+f3XUFW3pJMowThrhPiMEAADw8WXcXE4GkAnFHtramaMH/NLgr9Nk4V+YPMX7MrLMnPCy+8wEcffQTAxo0befvttznllFNIS0sDYMiQIaxcuXLv8kOGDMHr9ZKdnc23337LkCFD9s4rKCgAYPr06axYsWLv9MzMTLKyskhJ0TillNpfel46qfGa/Bx0R7VqgM/r2dvyc1Sr6ic+P3w3l/lzZ/LWJ1NJSEjkmiHn0v7QzqxdtbLUdRISEwEIBoOkNGzI+1/NOWAZEwzy1sdTiU8I/zUASqnaIw878k11ur1lFRhGzCzghQWFpCYITw+Mo0Ec9kQPXt4P9GdSoB8/msPCU2kVdqFRSY9okUKM10ORE6cOb5bCruyCao32uXD+XL78aiqTp81EYuIY8qczadn2UBb9tIzN6bnEx3jJyi8ivyjApvRccgv9BL2xbM/MJzc7jwYNG/L5N9/ut51d2QUEAkEmT5sJvti9295TFCDTKbO6I5mGRiWtzSM/1obRIqNxndpSj9q8Tm2pR0XXWbd9PUfEJcHCcZC3CxIaw9YlgEDzo/d/nrcL2verkUF56l3y06VFAx47/8iwXvOTnZlJg4aNSEhIZO2qlSxdvJAL8nNZNH8emRkZJCYn8/UXn9KpyxEHrJuc0oBWbWWIUfoAACAASURBVNoydfLHnHHuYIwxrPzlZw4/4ihOOPlUJr75CsNvuBWAX5cvo8uRR1W7vkqp2iWU/FS129vW7CC9xuawJctwba8YnjgtntT4/bu4adJTu7lHJW2cHMejrjh1SIM4NmfkVav8dX/sJD65AemFwtoVP/Pjwu/ZvCuDb+fOYe3m7SQmJ/PRpEl06nIEu3MKKSgKsjunkK2Z+UAMLVq3ZcJ77x8Qp47v159nn3+hxuKUjkqqVHToKSsJxm2kRZ4PM/m2UqPd77sCdGrsxSDgjauRUUmj4ianldWlRQOG9G4dtsEO+vY/jYDfz0UD+/Kfpx+n+zG9OaR5S6655U6GnXc61186mEM7H05KSsnbe/yFV/ho4jsMOeMkLjjtBL6Z+iUAf3/kKZb/tISLBvblzwP68ME7r4elvkqp2iUPPwDJlUx+sgrsYC6HJAnDjorh22sSGXNOAo3ixenidg0P+q/RxKcOKD4qqcYppVQ0ucA7h3QMaaXEuVW7gwyemEvX/+Tw87YAHgxBfyGbl0wNe13qXctPTYiNi+Olt/93wPQju/fgomHD8fv93HHt5Zxw8gAAHn3upf2Wa922HS+/c+D6qWmN+dfLGkiUina5Emr5qZh8v+HJuQWMnl/IwuuS6Zjq4Z8D4zEGbe2po4qPShpuGqeUUpHUkHRyBRoVu7Y1s8AwanYBoxcUEuuFxwbE0SnNY695rKFRSetF8hMIRuYePy8/+xQL5s6koKCAE04+lQFnnhOReiilajcv2UDFur1NWeXnli/yWJ1uGHqkj+RYOz1oIFhsQIPyZOQWVrnOKrw0TimlopmXPQCkuuJcvt/Q/eVs1u8xDD86hsdPi6N5socAMN45iefLbqfJT1X4IxRU7nro0YhsVylVt3jEJj9ldXsLGMOwD/N4b7mfwxp7mHZFAqd18GGAoioOaLA7R5Of2kLjlFIqmonsS36WbgtwdDMvcV7hoZPj6N7MS++W3hJHJe1UA3GqXiQ/Po9QEOlKKKVUKbabOKDklp+gMXhE8CC0a+jhkf5x3H1iLHE+IYAwMTCgyl3c0pJiq113FR4ap5RS0Wwz8ZAOY6YVMndFgCnDEjmjo4+rj7FxqLR4VhNxql4kP15PeG4cqJRSNWG32ENx8Wt+5m30c/Pn+bx4djx92/h44vR4ggirgy1ZG2jB2MC51bqup1GiJj+1hcYppVS0Chbm8c68nfAd/CABRpwSR9+2XgKheGZKj2c1EacilvyISDwwG4hz6vE/Y8yISNVHKaUiJXfvfX7sP8C7coPcO72AVxcX0bqBkFekAxkopZSqe47hNxaPf4RZ2/bAUfDFgAT6NYzjvcCpTCqMTDyLZMtPATDAGJMtIjHAXBH50hgzP4J1Ukqpgy6fAB4DicA7S4u4fUo+ewoMfzshlodOiSMx1lupgQyUUkqpSOqw7WuGt1jDpTGz+aJ/IXMSY3m2XSFdg16+DvTkQf81EatbxJIfY29okO28jHEekbniM4xefvZJEhOTyM7OotfxJ9KnX/9IV0kpVcvl4icZEITtOUG6NvXw0tnxdD3Ea1t7InR2TEUvjVVKqZrgz9pJo1lPMnP5r1xyTjwxvWIZ3CWGn00Q2H+0t0iJ6DU/IuIFFgGdgP8YYxaUsMx1wHUAbdu2PbgVrIab/3Z/jZVtjMEYg8dTL+9Rq1RUOapwKT/P2omnJXAU3HpcLLceHwuirT2q5mmsUkqFQ7CogOQfXmH1/GnsDAa476RYLu8es3d+uhgSDMTV9+THGBMAeohII+AjEelmjPm52DJjgbEAvXv3DkvLUOK2RSRtmU9Oiz7kNutV7fJeeeFpPvvwPZq3bEVqWmOOOKoHD91xEyefPoiB55zP6CdGMmvaFLxeLyecPIC7HnqUmdO+5JUXnqGoqJBGqWk88cJYGjc9hN27dnLfX68lI303Rx59DN/O/JoJX8wkNyeHm68cwrEnnMRPP/7A6FffYerkj5n62ccUFhYw4Mxzuemu+wCYPOk9xr8+Fn9RId2O6cUDo57B6/VW+30qpcLHGMMxv49h4fQv2JxlSDsJAgaCHl+Vhq1W0SXccQo0Vimlak7MJ3/jl9VrubCrj3+ensyhafakR+gf9wxMrWj1gVoy2psxJkNEZgJnAj+Xs3i1JG5bxKFfXIYEizCeGNacPb5agWXF0iVM+XQS702ZRcDvZ+hZ/TniqB575+9JT2fGlM/5ZOb3iAiZe+w45z2PPYF3Pp2GiDBpwlu88fIL/O3hxxjz3FMcd2I/rrnlTuZ9M50P331zb1nrVv/OI8+8yAOPP8O3s2awYe0a3p38NcYYbr36UhbNn0dq4yZ89dlHvPnRFGJiYhh1/1188dEH/OmioVXfaUqpsDosYx5bp73GJ2u206O5hzYXeyhqbVga6Mij/is06aklIjUwT7jjFGisUkqFX8HWVfROzeGSpIW0O3k7gb6J9O/gw7iaKkLpjiY/gIg0BYqcxCcBOB14qqa3m7RlPhIsQkwAgvZ1dYLKj99/x4AzzyUhIRGAUwaetf/2UlKIi4tj5N230u+0MzjltEEAbNuymbtvupqd27dSVFREqzbtAFjyw3yefeUdAPqeejoNGjbaW1aL1m3o3vNYAL6b/Q3fzZ7BJWeeDEBuTg7r161h5a/L+WXpTww7dwAA+fn5pDVpWuX3p5QKn56ykgu8c4hLn8o1m3IYPSiOm4+L5VRPLvEI20yqJj61S0QG5gl3nAKNVUqp8Alkp+Od82+2Lf2ebifFc9mAWKSNFwnlNiXkOOma/ADQAnjTue7HA7xvjJlc0xvNadEH44mBIBhPDDkt+lS7TJHSP0yfz8e7n33NgnmzmPLpJCaOe4VX3/uUJx/+O1dcexP9zzibH76by5hnnwRsV5jShIJWaLmrb76DIZdftd8y498Yy5+GDOW2e3XUcKVqk+PXvU7/7C+5rFcMHO7h1NuSaZzgQQSyMbRBr4uobSI1ME9NxCnQWKWUqh7jLyJz4Sfkfjce4y/kjj6x/P3EGDxCia09bukYWteSOBexWhhjlhpjjjHGdDfGdDPGPHIwtpvbrBdrzh7P1l53haUrQa/jT2TGlMnk5+WRk53F7OlT9t9eTjZZWZn0G3AG94x4gt+WLwMgKyuTQ5q3BODTDybsXf6YY/swdfJHAHw7awaZezJK3O6Jpwzg4/feJTfHxuVtW/5g184dHN/3ZKZ//im7du4AbFeGPzZtqNZ7VEpVXdfs72n+6fW8/94kxiwsIGgMIkKTRM/eCJGFITmy1VSlEBGviCwBtgPTShuYR0QWisjCHTt2VHub4Y5ToLFKKVV9Mv1JMmaN44z2QX6+MYlnBsXTMN4JZOU06mjLT4TlNusVtgtIux51NIP+9GcuPvNkWrRqwzHHnbDf/JzsbG67ZhiFBfkYY7h7xOMA3HjHvfztxuEc0qwF3Xv25o+N6wG4/o6/c+8tf+Grzz6i9/F9aXpIc5KSksnNydmv3BNPGcDaVSu54vwzAEhMSubx5/9Lx8O6cPPdD3DjsAsIBoP4YmK4/7F/0bJ13RkpT6loYIIBOv34LPPmzKIwAP/oH8c9fWPxeWRv00EoDGSx7wanqnaJ1MA84YxToLFKKVU1HXfM5MrEefRplEHgpE1s7JbIGR19B3RxKy+C1aZrfqSspuvapnfv3mbhwoX7Tfvll1/o2rVrmeut25lDZn5RTVYtbAoLCvB4vfh8Pn5a9D2j7r+L97+aUyPb2rZhDdd+uqVGylaqPuspK+m1czIPvTqDQR29vHh2Aoemeiit11ESmdxALAP9J3GD/86DVs8zjmjG2Ct7V3o9EVlkjKn8inWciIwAcowxT5e2TFXj1Ort2eQU+sNSz4PhYMUqjVNKla+nrKSP5xd2m2S6edYB8HOwPWmSfcC08uaHpsXl7eSzWT/x05KlXNE9hjfOTwBAnC5uoXhmsIlP6C8lPA9i8EkWI0wsI0w8CwJdGOp/uELv7bj2qbx/w4mV3idlxal62fJTm235YxN333gVJhgkJiaWh596PtJVUkpV0JH5i2mz5mNeOGYNvpYBzr4uiR7NPYhIqReKBDDkCiTXnfNQ9cbBHJjHH6xbXwCNVUrVDj1lJefGPsRLkgfA9BKWmV7K85KmmYBh+w+wZZYhUABNj4Ul/f0cK9n7FqpkA07A+Rtq+YmTwgqvuzun4stWlCY/tUy7Dh15f8rsSFdDKVUJxgQ58ud/s+Cb6UwtMNx3aDLtGnno0Xzf6DelxYpQJ6EUUzu6A6j9HLSBeXweoaAmCq4hGquUqh0u8M7hAyngd4L0C8O/9SvnBNg0y9Cko9B1kIeUphKWzmodjIczja3fe4FTK7xeWlJsGLa+P01+lFKqGjrumMmmqa/z5abd9G3j5eVz4mnb0BlLpgIRI8tpE0qpJX2h1T7GmKXAMQdjW16Pfv5Kqcprwh7SMfTAy2ckHtD1rKzuaKH5v+0MUOCH7s287D4uyLctApzd2UehxPGPwivo7/mJZpLOGtOcJpLJTtOAbrIWQVhm2pc4raT5WyWTNwLHMTF4WoXfX6NETX6UUqpW6CkrOTvwDXePn4xX4LXz4hneIwaPHDigQVlCyY8OeKCUUqoqMjAcime/KFLSLXeKP0/PM4ycVcBLPxRycjsv069IIjXBw6DDYpgQ6M+kQD9+NIdVKlmpCzT5UUqpSjDGcOLGcbzVaTreWEPbCxPo1dJDWoKn3C5uJQn1ok4Jd0WVUkrVC5UdRtofNPx3UREjvikgPd9wbc8YHukfRwCYGDhtb9ITrTT5UUqpCjos41u2TXuNiWu2ccklCQzuEsNAZ8jPql6u7m75Cf9lnUoppaJdZZOfcUuKuOWLfPq39/LcGfF0b+4liIcHi66KulaekmjycxC9/OyTJCYm8X83/DXSVVFKVYLxF9H2+38y+9vviPXCc4PiOPcw5/BZhdYeN/c1P7uqX1WlqkXjlFJ1i58gOQKp5Qyas2p3kI2ZQU5t7+PKo2NoliSc3dlHQHyMd3Vxqw80+QkzYwzGGDweT6SrolRUct/PoKx7FFTlvgYlrTMp0I+5/3uZuet/55IjfTxzRjwtUw68Z09pF5KWd6Gpu9ubJj/qYNA4pVT0yMbeH6y0lp/MAsOo2QWMXlBIh0YeVtycRIxHOOuwGCbUgy5uJdHkJww2b9zAzVcO4dgTTuKnH3/gt+XL+GljOgDTPv+E2dO/4tHnXtpvnY3r1vL4g3eTvnsn8fEJjPjn83ToVL++fEpVVk9ZyTOxj/CQ5FCAYRU2iVjtWqakaeXNL2naz1mG2ASQuMmk9k3h8H4eAh3hdvLD+p7WEgRst7edNAxr2UqFaJxSKjqFkp9GxaYHgoZxS4p4YEYB23IMw3vEMOrUOEAI1KMubiWJquTn9im3s2TrkgOm5xcFCFTxBnKHNz6Ke/o8Ue5y61b/ziPPvMgDjz9Dn8Nbl7v8I/fezoNPPEu7Dh1Zunghox74G6++92mV6qhUfXGBdw5zyOddKaKT8RD+ATDBBA27v4cd3xganyQ07WfI6VzELoTdTqISboOMlzR8TAr0q5HyVe2hcUopFU7ZUgQc2PIzdU2Av3yWz4mtvUy+LJ5eLbwEgPH1tLXHLaqSn0hq0boN3XseW6Flc3Oy+Wnh99x9w/C90woL9VJnpcrThD2scZ7PJpEWeKrc3aykaQs2+bnx83y2bQ1yZicv/z4igfbGx8WFDwM2+YLqd6Uraf7l9TwYqZqncUqp6OPu9rYuI8jiLQH+3DWGQYd6mTIskYGHekG0tcctqpKf0WeOLnH6up05ZOYX1ei2ExIS9z4X18UABQUHdpEJBoOkNGzI+1/NqdE6KRWNit8Xp7L3NSht2r/mFfD36QW0ShE+GJLAn7v4MOLlwaKr9iYlP/pdyUlJjUDlTavoOipqaZxSSoVTNkVQAG/PLeKNb4toECec2clHvE8Y2NGHHy/v17MBDcqjVzvWgMZNmrLm998IBoPMmPL5AfOTUxrQqk1bpk7+GLAXn/62YtnBrqZSdVKWGMRAUhjKChpDbpFNpk5t7+POPrGsuCmZwV1jmBA8nYsLH9azZCoqaZxSqu47hl/5bdkmeBHGzCniwq4+Fl2XRLxP9nZxG1r4EA/6r9HExyWqWn5qi9vuG8Ffhw+lectWdDy8K3k5OQcs8/gLrzDq/rt45YWn8fv9DDrvAg4/4qgI1FapuiUbSAakyoNLW8u2Bbjpi3wOb+zh1fMS6N3SS6+W9eteB6r2qOr1PlWlcUqpum2o52uGpr9Kz0+yoCXMGJJI/9Y+DERVF7eM3PB3t9XkJwxatWnLpK+/2/t64DnnM/Cc8w9Y7sY77937vHXbdrz8zv8OSv2UiiZZmL1d3qoiu9AwcmYBo+cX0iheuKpHDEGDdg1QEeWv4eRH45RS0aFr9ve0WvcZo3qtwXOIcMlVPj5q4+cUfBRFYRzbnaPJj1KqnsvBkFLF5GfeRj9D/5fHpkzDX46J4YnT4miU6NHRb1TE+TxCQaQroZSqtYJFBbT74Wlmz/8OY+Cxw5NpnuIhqa2QhrAq0Ip7/ddGXRxLSwr/uK6a/Cil6pQsbLe3yjDGICK0SfHQtqGHiRfGcUIbn3ZxU7WG11O9bpxKqehkjKHZbx+w5psPmJuZx0VdffxzYDzNku1l++kYUhHWmBZRl/gANEqMouRHRNoAbwHNseMdjTXGPF+VskL/2KiKM8ZgOLh9zJUKh6xKtPwU+A1PzSvkhz8CfDo0gTYNPcy5Kgk/XsZHWdcAVbtpnKo8jVOqvuspKxmQP42/f/ElndM8/G9wIv072H/dQ7+MUPKjKi6SLT9+4C5jzI8ikgIsEpFpxpgVlSkkPj6eXbt20bhxYw0sFWSMwZ+byfqMmh1WVamakI2hVQUGqpy+xs9Nn+fz++4gFx/pI7cI4mJgonZxUweZxqnK0zil6rNAdjqdVozlvZOW4o01nDg8iaObe/C4jh+hZxkVjIlqn4glP8aYLcAW53mWiPwCtAIqlfy0bt2aTZs2sWPHjlKX2ZVdQF6R3kwjxGBYn1HEvxekR7oqSlVaed3eduYG+euX+Uz82U+nNI+9yVtH7eKmIkfjVOVpnFL1kfEXkbLoVVZ/+xXb/H5+PTyJo5p5OaaFFxFKbAdNx9BNW34qpVZc8yMi7YFjgAUlzLsOuA6gbdu2B6wbExNDhw4dyiz/urcWMnXFtjDUVCkVaWV1ezNAnFf4YXOAkafEcU/fWGJ8ogMaqCoJV/dsjVNKqbIYY8j7fT5F37zIhow9nHuYj2cGJnFYE69dQPb7s590DA01+amUiCc/IpIMfAjcbozJLD7fGDMWGAvQu3dv7fyrVD2XXULys2CTn2fnF/LW4ARS4oTlNyUT4xVt7VHVFZbu2UopVZYegeXMmf4MLeMLmTgskUGdfBjXf7ylpTYBDHsEUvW/40qJaPIjIjHYxOddY8ykSNZFKVX7BTHkCCQ7B/rdeYZ7p+fz6o9FtEwRVu0O0rWpF/H6dEADVW3h6p6tlFLFBXL3kLRoHPeenMhlSbNZfYWXTmlJxHjLaOYpJtRikGq05acyIjnamwCvAb8YY56NVD2UUnVHHgHAJj/jfirknmkFpOcZ7ugTy4hT4kiM0y5uqmZUp3u2UkqFmICfrB8/J3feW2wpLKB1x0RiOvjo2tRbodYet3TnKiAd7a1yItny0xe4AlgmIkucafcbY76IYJ2UUrVY/t7kR3jx+0I6p3l46ex4ujf3ahc3VWO0e7ZS9U+ATHBiTrjkrf6J/BnjyNm9k1MO9fKPQYl0OcTDNhNEACMVS3pCVmMHSdHkp3IiOdrbXCr3GSul6rFgYR4T5q6FvtAgwcMXlyXSOFEIinZxUzVHu2crVf809U5gYey74S00CMxznl8Ksw4L0F9y7etq/jfcFOGAszKqVBEf8EAppcpijKH57x+yavp7fJ6VB4dA8lGQluRjYuBUTXpUjdHu2UrVPz1lJV1jPmSRgX+b+GrlJbl5hqnz/Jx+oo+kRGHXxdAw2RDrE4zZl/MYgx3K2vnrnlbe/BTgOLxMpGE1alq/aPKjlKq1ijK2Ej99FN+vXkv3Zh5GXhTHre0KSA4KXwd68qD/mkhXUUW3g9Y9OyO3MNxFKqWq4DrvZCYToCFwE7FVSkoCxvDfhUU8ObOQ9HzDVc1jufSoGPwNBYMHMUG8mP1u3BM02FuVujvOVnB+EV4mBfqFcS/UHjVxbNTkRylVK/WUlfwx+xmWb9zMM2fEcevxsXwhfgBSEHZHuH4q+h3M7tm7czT5Uao26CBb2INzHU3o1+8+CpT03DVt+lo/d36Vz8/bg/Rv72X0oHi6N/MSNFBEDP8ouoI0yWa3SaabZx0APwfblzitovOjuQdETRwbNflRStUqrddPZnDqam5tupBtg4oQkmnd0ANAtrNMCmjyo6JKWlIs7MiJdDWUqvfSTQrpmP0GEahE7sOYHwrJKTT8b0gCf+7iQ0QIIEwMDDgwSQmWUIFgKc8rOj/KpCXFhr1MTX6UUrWCP3s3Db4ZxbwVv9G5Rwwx5yXQpqFnv6E/s5w2/mQdK0VFmUaJ4Q/wSqnKyyD5gOSnLJkFhsdmF3D1MTF0aeJlzLnxJMUKsT4PvwdbsjbYgrGBc6O2Zaam1cSxUZMfpVREmWCARovH8fucz9jp9zPilDjuPcl1sHPFn1Dyk6LJj1JKqRqSjqGlvcKmVIGg4Y0lRTwwo4DtOYbWDYTDG3tJTfQwMXAakwqjtytaXafJj1IqYnrKSuIWvcbEGcsZeKiXF89K4rAmXmDfNZ3uNCfU7S35YFZSKaVUvZKOoVEZJ9nmrPdz25R8Fm8NcmIbL5MvjadXSy8Bvd9cnaDJj1LqoAvkZTEo70vGtPiUnGMDXNg4gQu7+qCUPtYhWRgSDHi15UcppVQNKavbmwE++c3PjlzD+AsSuPhIHwG931ydosmPUuqgMcbQZPl4fv/mQ75P9uO5PomG8cKFXWPscKHlrJ+F0S5vSimlakwhAQoEUs2+WJNdaHhqbgGndvBxansfI/vH8Y/+ccTFCBMCp2nSU8do8qOUOigKd6zDO+0Jfty4mRNae3np7AQ8Hie47P+nVDkYUmq0lkoppeqzbOwtFVIRgsYwfmkR935dwB9ZBhE4tb2PxBghqF3c6ixNfpRSNa7d5q+YN/5FGsbBK3+K5+pjYpByuriVJAsd6U0ppVTNyXKSn52bDX2/zGXB5gC9W3r4YEgCJ7T2EQA7oIG29tRZmvwopWqEMYYjcn5gWKNlXND+G546KYZbjoulaZIdQae8Lm4lydZub0oppWpQthQBsGVzkA17gow7P57Lu8c49+vR1p5ooMmPUirsijK2kjB9FAu3rOPtm5NJSBD+cWr8fvfsqUoKk4WhaTnDjyqllFKVFSwqIPP7ScxN2wE9YVjvGJ7oHk9ynODHy/s6oEHU0ORHKRU2xl9E8g9j+f3br4jzBBl5ShyN4l0LVLPRJgvoUL0ilFJKqb2MMeT+Ooecma+Ql5lORi8f9IQmIiTEeRkfOFWTniijyY9SUaynrKSP5xd2m2S6edYB8HOw/X7P0yS70vNLmhafv5N/vzmZDbvTubCrj+cGJdKmYeld3Az7cqHQ8/Kmabc3pZRS4dJx+zdsm/4qGzbuoXszD88PTmRp+yAz8ZOK8HWgJw/6r4l0NVWYafKjVJTqKStpFXcfb2L7L3/mmvdZCctXZr57WtBv8MQKxILpFKRNJ+GXzkHOJLfKdS/NFszeAQ920jDs5SsVKRm5hZGuglL1Rk9ZyQXeOTTM/4prduXx33PjubpHDD6vMMsUANAQodHeW2urSKmJY6MmP0pFqQu8c7ibQhKBnnjDXr4JGlb/YPhljqH/VR5SGgtdz/JgEARzQPuMuwWnxPJKmF98Wjc8DDUxFOJjUqBfGN6FUrXD7hxNfpSqacZfRIdFz9BTFnJZv1iks481tyWTHCt7r0lNF0OygRiEVMmKbIVVjRwbNflRKko1YQ/ZGC4llmeIP6A7mft5SdPKmv/D5gA3TM5jydYgAw/18pIk0N54KCCWfxRdUeGuclXpXjdHsvlXsKv2v1ZRJS0pFnbkRLoaSkUlYwwtVk1i7Yz3mZWRwyFH+BBiACE5dv8bzWVgSHVepBu9s1ykpSXFhr3MiCY/IvI6cC6w3RjTLZJ1USraBDFkCySb/VtPSnpe0fnGGG75Mp+XfyiiebLw3kUJXNTVR1CE8SXd9yBYYsUqPr+saUpFkUaJ4Q/wSinovHsuf0x7jQXrdnBEUw9vDUtkUCf776/7etRQnEt3JT8ZJB/cyqoD1MSxMdItP+OAF4G3IlwPpaJOPgGAsAwQYIxBRBAR4rzCbcfHMrJ/HClxepdrpZRStdNQz9cM9b7KoB3ZvHBmPDceG4NXyr7Btjv5UdEposmPMWa2iLSPZB2UilbhSn6Wbw9w8xf5PHJqHCe38/H0wDgQe9+D8XrfAxXltIeCUnWLCfhpuPgNmqYvZdS5u/EcIqy/PZk4ryBS/g22MzAcqveTi2qRbvkpl4hcB1wH0LZt2wjXRqm6I9dJfqraaJ9TaHhkdgHPfldIgzhhZ67BGAiKMLGkLm5KRadxaA8FpeqElms+Zt2MiSzblc0ZHb34A4nE+YR4n+xNeso7HagtP9Gv1ic/xpixwFiA3r17l5ewK6Uc1Wn5+XxlETd9kc+GPYare8Tw5OlxNE70ENAubqqe0R4KStV+/sztxH31CN+tWcdhjT2MHZrAOYf5cKc6FY2EmvxEv1qf/CilqiZX/EDlkx8DrNodpGGcMGd4Aie29WkXN6XKoD0UlKqYrvI9yb6Z5Jh4WstOADaZJiRJ/gHTypsfmpYk+eyOFZbsWs/FA32cfryX7R7DOCmq9OimBsgRSDWa/EQzTX6UilJ5e7u9lX8QL/Abnv62kENTPQzt7DZWgwAAIABJREFUFsPNx8VyY+9YPN5SRnFTSu2lPRSUKl9PWUmDuCd5U8Jw35YA8CPwO3ApkArcCu97/byPv9rFd3Su+dGbaUenSA91PQHoDzQRkU3ACGPMa5Gsk1LRIm9vt7eyzVjr56bP8/ltV5Dre8UwtFsMHhHwahc3pZRS4XGBdw4TCdLNePjMJBIadM0Y7EAEzl/3tJLmz1vj55GvCvlte5A+7byMyYsnOd4DIniD++6LEIQDhi0oaVrx+XFAczx6M+0oFunR3i6N5PaVimZ5ztmv0lp+tmYHuWtqPuOX+Tk0VfjisgTO7BRDAHRAA6WUUmHVhD2kYzgEoZ149nU3E6c7mnDANPfz7blBrvssn09+89OhkfDhxQkMPtwHIntvsF2VG2eXND9NspmvN9OOWtrtTakolSdlD3iwYFOA/63w8/DJsfy9bxzxMaIDGihVjPZQUCp8MjB0Ldb2Ut7NtkP3mUuJE9akB3l8QBy394klzmdvufC++3rUqtw4W2+iXe9o8qNUlMorYajrHzYHWLY9wNXHxHLe4T5W/TWZVg08OqCBUqU4WD0UMnLDcB2EUrVYI7IrNZJaIGgYt6SIsYsKmTk8iXifsPj6JDwiBECvR60nauLYqMmPUlEqjwDxBnwI6XmGB2bkM2ZhER1Shcu7xxDjEVo00AENlKoNdudo8qOiW6pkVTj5mb3ez+1T8lm8NciJrb3syDW0aSCIaA+F+qYmjo2a/CgVpfLwk2zg7aWF/G1aATtzDbcdH8vI/nH4PBpAlKpN0pJiYUdOpKuhVI3ZapLIF2hUxjDS2YWGaz7N4/3lfto0+P/27jvOqvLa//hn7dOmAUOTIgIqigg2RNRYgorlJkYTYouJmsTEFNN+NybRaBKN19wQvSk38XrjtcTEGhONJlYEjKBiDWJBsSNVygwwTDllr98fcwYGOMwMw5wyM9/362Vmn73P2WcNL7IXaz9rP49x+7Ryzhzf/FxPausWN+kVBlTGu/ycKn5EeqgGy1C2Bj5/XyOTh0d45HNlHDAkonYBkRJUXdH1CV6klCwlAZBz5CfMPtdTGYOaBufyjyb47kfilMeMezNH8LaP0AQEvVQ+ro0qfkR6mDDZyLB37yfcv4EBgwLu+kIZh+4aUbuAiIgUzYbsDKSti5/QnVsXpPjPuUlmnVvBsD4BD3+2gtCsedbRpG7SSddT8SPSQ7g7DW/Oo2nmf7Nk/QYmjwjoM9A4dESUjNoFRESkiDbalsXPvCVpvvNwE88szTBpeEBNgzOkCkKL6Cad5JWKH5EeIL1uJZkZ/8Wqt19jwi4B136qgosGNtIHWBDuyZXpc1T0iIhI0dSRAqBvCOfd18CfFqQYVmXcfGoZn9s/RmhRzToqBaHiR6SbOyDzKo//6cdkkk38YmqCbx8aJx41NgCjMFZ6fyUSEREpqvVhc/EzMDBiEfjhkXEuPjJBedy0sLYUlIofkW6qafmbnDv8fa6q+AMPfiLgwCFVjKwOcG8+XodT1cH1FERERPLB3al/fQ7XP/EmnAX9hxj/d3IZmBHqOVQpAhU/It1Mpq4Ge/xXrHj1RQ76dDmR8TFOGRvbVPS01DsbVPyIiEgRNa14i9TM37BmybsMGWJsCKGfGxmLcFfmGI32SFGo+BHpJjzMUDf/ITY+cTOebuKyo+KcsncUa6lvbPMPx9kA9ClSrCIi0rtFZvyclS/OZVCF8b8nl/HqQRluDlLE3HgkM5HL0ucXO0TppVT8iHQTqfsuY+2ilzlu9yjXfqySsYMim0d7YIsxnkYgNOgTauRHREQKwzMpCKJ8JjKL8r7Ps+HwOJcdlaC63PgCDVSrG0FKgIofkRIWNtZxUGwxpyeepu/B77Jxv3LO3DdKELQa5slhA81VkdreREQk31qWWqif/b985YS9uGqfhQRHxzFj0026GjznAqcihabiR6QEuTsbX3uchlnXMXFyyNlHx7G9AsyC7Y72tLYh+1NtbyIikk97rnqcNbNuZPF7New7OOCU8gUEbNuSreJHSoWKH5ESk1y9mNSj/8WaD97mkOERTt6rjKDV3bOO5I667MhPHyUakW6htj5Z7BBEdshEW4TP/T33P/kG1WXGf59UxlcnxYhFLOdNuhqcPQgAqKau8AFLt5SPa6OKH5ES0v+lW3j50b/QNw7XfbyML0+MEdmqxa0j5Uzrtjdv570iUnxrN6r4ke7BM2nOjMzmZ/FbuHVgIyMOiXPFlAQDyq3Nm3StR37624Zt3yCSQz6ujSp+REqAZ1J8JvYEnxrxENftF2X61ARDqjrW4pbLhk0jP7C+SyMVkXwYUBmHVRuLHYZIm4a/8zfem3UnwyeliRwa5/MHxjnvAHLOOrq1WnzThAc1rqZs6ZgBlfEuP6eKH5EiSq9bSeaxX7J3ZR1XnVpLMDzg0E+W71CLWy4tDQV9MBU/It1AdUXXJ3iRrjJmzRxWzfoDT7+zkr0GBOwzsGybgmerzS2kcOoM+nvzO2qpymu80nPk49pY1OLHzE4CfgNEgBvc/efFjEekUDyTYv1zf6PuydtIWJpPTElgHsc60eKWi2Z7E+kaylPS2+35/NU8PuufVMXhmuMTfPPQOLFgc27pSJapzeYkTXggpaBoxY+ZRYBrgeOBJcBzZna/u79WrJhECiH54TvU3X8VG9as5FP7RPn1iVWMrO58i1suda3a3kSkc5SnpLfyMMMB4ULOKHuGYbs+z5iJMf7jmASDKoLm6at38Hw1m4ofkeJrt/gxs28At7l7TRd/92TgLXd/J/s9dwKnAkoq0i0Mj/yNZ2M3kbFwxz5YTfP/886Ge/dOc29Lk1oX3xAz12xv0nvkKVcpT0lJ2yuYy6ro3TRgxC1D0iP0s3oA1nnFFtu5jufal3y3juWPrCW2R5p7Twqw3YHd4Ws0djpOjfxIKenIyM9Qmu92vQjcBDzi7l0xgdSuwAetXi8BDt36TWZ2AXABwMiRI7vga0V23kRbxLjYrcwj5DKPt3k5D0PnxRdC3nkn5LQzYtA3gK+ERLLTV7d81tl2u6P7ch3fi4A4xmr6dcWvLFLq8pGrlKekZE20RRwS+w0/DBoY5wEOxAzqs8e33s51vPW+prXOykedDW9ArBqSo4w32MGbe2041CMcRARAeUmKqt3ix90vM7MfAScAXwB+Z2Z/Bm5097d34rtz/Xtxm0Tl7tcD1wNMmjRJs/ZKSZgWmcM/yTAY46detmkV65YHQFu2n1+W4av/aOCF5SHH7R7he00JKhMBToB5SKSN5oEQsisitL2vreMpItyTOapTv6NId5KnXKU8JSVrWmQOr1qGiMMrXklgljMPtd7e3r5bFyQ5//5GElH42bEJvnlYgkQ0kjNP7Wgear0vBJJElZekqDr0zI+7u5mtAFYAaZrbNv9iZjPc/fud/O4lwG6tXo8AlnXyXCIFNYh1rMAZjm3+51GrfyatTzo/fKyR655PMaTKuH1aOWeOj4IZTcS4InUOA6yOtV7FhOA9AF4JR2+xnev4jn7mnsxRvOh75/XPQqRU5CFXKU9JyRrEuk3TR1tLRdO6XM+13Wpfxp26JuhXZhw6IsI5+8e48pgEQ/sENBHnR9vJUzuTuwZYHfPCccpLUlQdeebnW8B5wGrgBuB77p4yswB4E+hs8fMcsJeZ7Q4sBc4Czu7kuUQKbjkhw1rd32qdZwKDB95M843JcX46JUHfMiNNhD9npmxbkLTuKsjVYdDevo5+RqQHy1OuUp6SklbbauFQ6Hjt88T7ab7zcCMj+wXce2YFew+McMMp5WSA2zPHtZ2ncu1THpJupCMjP4OAae7+fuud7h6a2cmd/WJ3T2cfUH2E5ilEb3L3Vzt7PpFCW4ZzQKv0snBVhmueSvI/Hy+jKma8+vUqKmK2/WQiIl2py3OV8pSUuhp8h2ZQe6825PszGrn7tTS79TW+f0QMd8cxQgIuS32BO8Pj8havSCnoyDM/P27j2MKd+XJ3fxB4cGfOIVIMGZyVOMMw6lPOVU80cc1TSaricOHkOAcNjVAeMzJKJiIFka9cpTwlpaxmq5Gftjz4ZoppdzUQGFwxJcF3D49THmujK0GkhyrqIqci3dU6koQGa153xj9Ux/vrnM8fEGP68QkGVwRkgDs12iMiInlUC+zeRvETurNqo7NLVcBhI6Kcc0CMHx+dYETfQF0J0mup+BHphLUkIYQZT6SpihtPfL6cI0dGcdBoj4jssNr6ZLFDkG6mmjpqshMe5PL0kjT/7+EmmjLOc1+qZEC5cf3J5cpT0q3k49qo4kdkB3gmxYYX/s4HB22EvvDLMxOcVBEjGjFSah0QkU5au1HFj+yYalufs+1t6fqQi2c2ceuCFMOqjP88LoEZhI5a3KTbyce1UcWPSAc1Ll5A/aO/YcOalSwui8GhcECfKEaE2zPHKJmISKcNqIzDqo3FDkO6kWVeSdqgv28ufp5ZmuHYWzaSCeGSI+NccmSCqriRwbgjc6zylHQ7AyrjXX5OFT8i7chsrMFm/4aVrz7PqOqAW88qZ/7ezXN4DsWYmZnIZenzixyliHRn1RVdn+ClZ1tKAoBqh/fXhYyuDjhoSMCXDorz7UPjjOwf8Ha4K+9mhnF95mQVPdIt5ePaqOJHpB3Vj/+MNxYu5IdHxvnhUQkq48aDNDDQjXgHZ9kRERHpSnWkYRn86uEUP1mbZNE3qqiKG786qUzTVou0QcWPSA5NK95iv7KVnDvodY6euoSNR1cybnAE9+bjK7LTXIuIiBRapq6Gm+e+BS/BioqQ6ceWURZFz56KdICKH5FWwsY6aufcSt2/HuDofaOc/elyrK9hFml+Q7beWU7IcBU/IiJSYGPXPc0TN01nRToNH4F7j6zgiLI4d2WO4Z6kih6R9qj4EQHcnY2vPU7d7OtJ1m/gwkPiXDklQWBsGu2BTbUPy3DGESlKrCIi0ru4O3vXPsl5g9/g9MGz+dlhAeX7xblkcJLdwkDPnorsABU/0uPsa8+zIfYX6omQIEUTMQawAYC19Nliu+V4zfMrWfPQCnbZ1fjoZ6OEw5zLaATAbXPR4zRvq+1NREQKIbnqPeIzp/Pk0g+44cIq4v0CrjimjF96E8A2U12LSNtU/EiPMtEWcUz8F3wrqKe/Q5BNCu+3ek/LtqeccD1EBhp+gFMZg/QBzqwg0+73DMQ4Ojvys5p+XfxbiIhIb5epX0ds7rWsmP8U1Qlj+tQydu27udCpNcccZSCRHaTiR3qUaZE5vG5pAocPvQ9RM9zBsvmiZfsfi1J886FGyqPGgq9WEk0Y6QMNJ8A8JIJv9ztCIMj+TBLlnsxRhfjVRESklwgb61j9f+eTamrkwkPiXP7RBAMrmhNZS3aqobnwCTTyI7JDVPxIjzKIdSzDGYIRaal4WuWFxetDvv1QI/e9kWbfwQH/87EyIoEROqSIcUXqHAZYHWu9ignBewC8Eo7eYrvl+ACrY144Tg+XiohIl0h++C6HDUkxrWoOa6fAcbtXMn6XSM5nT2txqlX4iOwwFT/S42z9PE7L1r+WZzjy5uYV1KdPTfDtQ+PEIrb9qUFDcm+LiIh0odTqD8jM/g0r33md73+pD5OHGzY5vqlrIVeNU4PreR+RTlDxIz3OckJGEGx6vaY+ZGBFwP5DAr42Kc43J8cZ2S8gA9yeOU7rIYiISFFMaJpP7dw7ePqF1+gTd645PsFBQ9juTKOt1ar4EekUFT/S4yzHOQTjw40h35/RxENvpll4YSUDKwKuPr4MBzJa/VpESkhtfbLYIUgBTbRFnMI/ufzmv/PB+pAvTYxx5ZQEu1QFm4ueduqaGpxx2Rt91dTlN2CRIsnHtVHFj/QoGUJWhs7SF0P2mVnHxiR87yNxymPNEx9kgDs12iMiJWbtRhU/vcXRy2/lxlEPETEncVyCfQcH7D8ksk2LW3tjOq3b3vrbhrzFK1JM+bg2qviRHmVZUwPcAQ8uzXDs6AjXfryMsQMjGu0RkR1iZqcDlwPjgMnu/nw+v29AZRxWbcznV8gOmGiLOCxYuM3kN7kmxOnoJDlhzVL+NvMF/vTm23zyjHKmjYtx1oQYtlWLW4uWdeW2t926+KnxPl3+ZyBSCgZUxrv8nEUpfgqdVKTn8zCDBREayjIwFP790BhXjy8Da2NCAxGR7XsFmAb8vhBfVl3R9QleOmeiLeKo+GVcZvVtLHrQcd4E6Scg/QwQQPRY+OxeDRgNmyuaTjy602jQ35s/+Ba7dkGkIqUnH9fGYo38FDSpSM/l7tQv/Cf1/7yRy88+mBG7LIRPwJlhnAwR7soco6JHRHaYuy8EMNMD5b3NtMgcHrAkCeB84tuMuOQahdneKE3ozm1/TLNimTPhwIAjjo1Q1SfAWpVVrd/f1r6tj8cczvaY1psT2UFFKX6UVKQrpNZ8wNoZ19H4/gIOHh7hJJ7mSTIADMOYmZnIZenzixyliPR0ZnYBcAHAyJEjixyN7KxBrKMWZ08CfkFZp4qfpxanmTQ8QjxinHRcmn4J4+DhEZqIc0XynC5rpbtL682J7LCSf+ZHSUVyqZ17G+uf/jPlsYDffayMr0yMEY0YfyGFOQzBeLXYQYpISTOzx4ChOQ5d6u73dfQ87n49cD3ApEmTuqJTSoqsBraZRjpXh9rW+96rDfn+jEbufi3Nr09M8K1DExy7e5Q0EW5v3X6da+249vZpvTmRLpG34kdJRfJhoi3igsg/uDM9n/SEgGumJhhSFWyaJWc5zmCMmNY+EJF2uPvUYscgpakGZ1Sr9eLaU5d0ps9t4uqnkgQGl380wZcmxjXDqEgJylvxU0pJResndH/7rH+GNbNu4MJD13Ps6AjHn+AEVr7NLDnLcYZlCx+teyDSNl0bRXKr2cEFRD93TwP3vZHm7P2i/OexZYzoFxBqhlGRklTybW9dQesndF8Hhgspe+EP/H1OcxPb4rFlmEWImOVcCG454abiR+seiLRN18btM7NPAb8FBgMPmNl8dz+xyGFJATjeoeLnmSVpdu8fsEtlwI+PTvCDI+IcNiJKBrhdoz0iJatYU10XNKlo/YTim2DzOSoyG4A3fVf6Uc86KtjLlm5335zFUV5+eAbvrAo5dmyES06KM7xfwMLspAZu2z5ougTnACKA1j0QaU8+1k/oKdz9XuDeYschhddESNqg2nMXP0vXh1w8s4lbF6T47uFxrjmhjIOGaT05ke6iWLO9FTSpaP2E4ppoi3gm8SMesB18ZGsVkAQ+A7PGZphFQ4c+Nsqb+7S17oFI23RtFNnWBlLAthMeNKSca55K8vMnm8iE8MMj41x8ZILQIa315ES6jV7R9ibF9W+RWdxrzjke4+NEcWfTszotExW4N7cazHwhQ2UZfGRClPQkp+mggLKYE4QdWwshAhxHVOseiIhIp9SRBrYtfr77aCPXPZ/i0+OiXH18GaOrA7W4iXRDKn4k74zVABxPhDOJbW5Xs82FywsrMnz9gQaeXRpyxvgoZ4yPkQkCLst8gQHp5vUMOrIWwvxwNO9q3QMREemkOts88vPi8gx94rD3wAjf/0iCM8bH+OioqFrcRLoxFT+Sd2utCYDh2WlDW6+LsK7R+dHsJq59LsmgCuNPnyrnMxOibSeVjq6PICLSTWjmvdLh1MEG+O3MJH+fn+aM8VHuPK2CUdUBI6sDUmpxEymYfFwbVfxI3q2lufgZtlULgQNzF6f53bNJvnZIjCuPKaOqLModSioi0sto5r3S4OkUs59bAXPhoXSafz88zo+OTuCO1uwRKYJ8XBtV/EjerbXmv7jDsiM/b6zJ8PzSkLP3i/HxvWMsvDBgz4GR5qSSVFIRkd5Hs5IW30RbRPSFG7j78Q2wN8w9vpJDBmoWN5FiysespCp+JO/WkqTMIZFyfjSniV88laR/mfHJfaKUx4w9B8aUVESkV9PMe8Wz56rHOSp8jh+OXEDDoWniI6LcNibNxDDg1cwoHvTD9BypSJHk49qo4kfybq010e9NmPDgRt6tdc7ZP8b0qQlisSi3q8VNRESKIFO/jsFzp/P4/AUkR0T4yRcqiZcZ/fcM6OcQwVjCYP4nc2qxQxWRLqTiR/Jqoi3irZoNrLwDxg00Zp1bzlGjo2pxExGRovBMmn7/upm3n3yQ5U0pvn5InCumJDYdX4dvM821iPQcKn4kLzyTZvL7N3PHuH+yX6KRIz8X8OjISmKRiFrcRESkKCbaIoYsuo3/nfkCx+8R4VcnVjJ+lwjQPAkPQI2KH5EeTcWPdLmRSx7mnUdv4S+rNvCjr1SyfGjI1D3ivJ4Zw5XJczTaIyIiBZVa/QEfWf8Id4x7HN8/w7S+FUzdI0LrZbJbtlT8iPRsKn6ky4xveJH1j9/AnAWLGdXP+NuZ5YwZGrDOYFhorPT+KnxERKRgMo11JJ68liUvzmV+tcHYSmIRY+oeUcw2j/a0VoOzT3Z2UhHpeVT8SJc43R/l7lt+y9INzg+OaF4XoSJmvJNdfXTrNX5ERETyxcMMdfMfpmHuzTQ1NvKliTGunJIgGsnmoi1/bEEjPyI9m4of2Sl7rZ3DuYPf4OzobA4/sYx9BgWMGxTZdEdtebb4GU6Q8w6biIhIVxu19BHmzLiOj46K8OsTKzlwWARvlYTaKm1qVfyI9GgqfqRT9ksuIDn3Rh57/m3O/WQ5wX4xpo2LAZvbCAxYnn01DGNZcUIVEZFeIFWzjGHLHuc7BzRwxpjHmff5Co7cLUIQtDHMs5UmnAaD/q7iR6SnUvHTy020RUyLzAHglXA0A6yOtV7FhOC9nPvcnbtfTfLczIdZWRfy1UkxPrF37r9GDixr1fam4kdERLpa2FTPuqfuZOML99EUDzllQhWxiHH0qGiHR3ta1GRv2GnkR6TnUvHTi020RYxN/JCbSG1z7Nkc738WWHhfyIr5TtUwmPiZgNeHh0yjfrvf8S4hMYeBGKvp13XBi4hIt3FGMINRkVmsppx+Vs86r2B3W45hvONDt9jOdTzXvqG+mhnz09w/exWp+gZOPDDKl44p48VEBvfmYsdtc9HjbLu99b4l2Rt21Sp+RHosFT+92KciT/AVGhmEMbqNmW0yKccMgqgxcF+jchgMnRRgAaTZMnm0aNm3GwHTiJAmyj2Zo/L3y4iIdCEzuxr4BJAE3ga+4O61+fq+2vpkvk5ddGcFMxkf+z3nBo3becfi7Wy3s2818CAwAvgsPLJrmkdINx/eydplRPYEumknUlz5uDaq+OnFKlhLg8G3Pc53SeS8E/bAmym++WAj5x4Q5/IpCXwMZAi4LPWFTe1w7bXKAZyVOUrTXItIdzIDuMTd02Y2HbgE+EG+vmztxp5b/JwZeZyHs+1kD4cVJIzmkZlsosm1vb19K9eFzH09w6cPjWEDYdGXQ/YcYszyg/lo+BIxMpu+N4Q2J6zOdTwE+mBMJCCpm3YiRZePa6OKn15sDU0ADMte/lsKHgM+WBfy7Ycbuff1NGMHBhw9MkLoEGYLnzvD47Y9YZjjS3LtExEpce7+aKuX84DT8vl9AyrjsGpjPr+iaJo8Rq05cYfjLUKAbdmOlmN7630bk87P5zZxzVNJIgH8YFyCEX0DPjoUUkS4NjWNhUxr9xnWtm7Std73uNUxLxynm3YiRTagMt7l5yxK8VPodgLJba21FD9b9gfc8UqKL9/fQOhw1bEJ/v3wOEEkyu2ZKdyjERwR6X2+CNy1vYNmdgFwAcDIkSM79QXVFV2f4EtFLVWb1s6xbL5pnXVybbf8DN25dUGKS2Y2sWyDc/Z+Uf7z2DKG9Q1YFO7Kuz6M6zMnb8pLL6Zz5KdwO9tt7RORkpCPa2OxRn4K2k4gua2leShxeDbNZNyJmDF2QMDUPaL88oQyRvYPuDNzHPckVfSISM9iZo8BQ3McutTd78u+51KaH2+8bXvncffrgesBJk2apCXNcujs2jk1Dc63Hmpkr4EBfz6tnMN3i7bdgSAi0o6iFD+FbieQ3FpGfmIb4YuPNeDAzaeWc9CwCPecWaEEIyI9mrtPbeu4mZ0HnAwc5+4qanZCDd7hGdSWrg/5/QtJLp+SYGBFwFNfrGTvQQGhqQNBRHZeKTzzk/d2AsltjTcRfx4mPbaRDUm46PA4mdDJWJQ/K8GISC9mZifR3JHwUXff/nz+0iE1OLu0Of0ANKScq59KMv3JJjIhfGqfGAcOjbD34EhzB4Jykoh0gbwVP2onKG171cxl9gPLSS6Fw0dFuPZjZYwdHOEOJRgREYDfAQlghjVPOzbP3b9a3JC6rxqcsds55u78+dU033+skcXrnNP2jTL9uDJG9w82zS6qDgQR6Sp5K37UTlC6zgpm8rWKG9mnPsPenzQe268CLKIEIyKS5e5jih1DT1IL233mpykDl85qpH+Zccup5Rw9OkqaiFrcRCQvijXbm9oJCszdGfLGn4m+NZv/mLaeSF8Y8Q3jwCDCy5kxXJk6RwlGRES6XIhvM+HBirqQq59M8tNjElTEjMfOrWREH4PAuF0dCCKSR8V65kftBAW0V81cls+4kefeXcXEYQE1DRUMrgxYYc5QAlZ6fyUZERHJiwYyhAbVbjSlnd/MS3LVnCYa03DimCjH7xFlZL9Ak+yISEEUa7Y3tRMUgKeTjJg3nSfmPUNZFH77b2V8bVKMwIwNOHUGw8Mdn3pURESko+pIgcO7r4eMf7SOd2qcT+wd5b9OSDBmQIQMaEIDESmYUpjtTfJgoi3iY8Fsfvrys5y+b4xrTkgwpDLADBxYnl3VbesFTkVERLrSBtIAzJ6XoTxqPPq5cqbuEcVBExqISMGp+Olhxm14lvC527jl+DVUxkOmfaWKARXNBU7LrBIGLM++GkZApjihiohIDza+4UVqn7yTpqM2QDVceVqCT5RHiQRGioiWVBCRolDx00N4Js2eL/6SOXOeIHSYP76Co0ZF6V++eWSn9RhPS/EzHOODAscqIiJbqq1CQJaUAAAVzUlEQVRPFjuELnNguJCq+X/kH0+8Ql3SmTQyBtWwR2WAEXB75lgVPSLSIfm4Nqr4KTH728v0j8xiPQmqaKSOMkbahwAs9l222G45Xv/BCuY9/AazP9zAwXsFfPHfYqysdv5KCrfNRY/TvO3AjGwbwjACFT8iIkW2dmPPKH4OefcGXp55P2+sCTlhjwi/OqmMpwZlgBTVGG+Hw7ksfX6xwxSRbiIf10YVPyVkoi3ioPhP+XHQ0PEPOTATaALOghfGhrxgTR366CA3qoHV9OtEtCIi0lUGVMZh1cZih9FpE20R0yJzmPHGA4QOf/9MOR8bEyUIjAe8+WZbf4yF3qfIkYpIdzKgMt7l51TxU0KmRebwhKUZ6MYsr2ienMDBskM3LduhO/f+K80xY6P0rzCWnRbStzygPB4Q8XDTwz0hEGz1Ha33DcVIE+WezFGF+QVFRCSn6oquT/CFkGmsY8iT07n4oDeZNCzg4yeWURmHeMQ2PWdaY07EoQ9QS1UxwxWRbiYf10YVPyVkEOtYgTMCYz+LNLeotW5bM3hpRYavPdDEvCUZyuqNHxyRYEK/CE3EuSJ1DhOC9wB4JRzNAKtjrVdtd98CUN+1iIjsMA8z9H/pj7w95+8sa0zy1MAEk4cnqC6zTTfsWnJXDU41hml2UREpASp+Ssxywi2mn27ZWt/k/Gh2E797NsnAcuMPp5bxuf1j286YE+Y4aUf3iYiItGO39x/gvZm38dKq9UwZFeFXJ1Zy4LBI88Ec9c06nOrChigisl0qfkrMMpz9iGyz/6JHG7nhxRRfOTjGVceW0bfcuEOLwomISAGdFcwksfxm/pRq4i+nlzNtXBRy3LBrrQanv0Z9RKREqPgpIRmclfimkZ8312QwM8YMCPjxRxOcf1CcQ3aNEGpROBERKZCwqZ6yp6/j5JENXDVuIckjYlxyZIxExDYtnN2WGlDxIyIlQ8VPCVlPiozB4JRx+dxGps9NctKYKH87q4Jd+wQM7QO3a7RHREQKwMMMdS/PpPGJG2ior6cyHicYV0Z5bNuFs9tSgzNqm+l3RESKQ8VPCVlDE7wJ0x9MsqLGOXu/KNccX0boaLRHREQKpnHJQhof+zXrVi7lI7tF+PXZlRyyawRvNczT0bEctb2JSClR8VNCZr+8Au6H+EB47JwKjtk9SpoIt7ee0EBERCRrTPAE6ejDNHiMQbYOgNXejzJL0diBfbmOl1mKJRvWs7FhGR/7dIR9xgf82VL8uY2Fs7fe13p7bXa2NxGRUqDip8g8k2afuuc5Z+CrrN13Ffc0wqOTKtgjGuP2zDEqekREJKeJtohB8d/wf9ZERXsP3rTDk5CaC9YHYoeAHwhMgMdjGR4ns1PnrgAmZyfy0aLaIlJsKn6KaNTSR3j30Vt4N1PHaV+t5Oq4w0dgVBgwMzORy9LnFztEEZFeycyuBE6leWGAD4HPu/uy4ka1pWmROdxPhrEesNCrtlkQO9ci2Vvvc5zbFqS4eGYTyzY4X50U4zrKSWN4NMA8JNLGlAa5FtPOdTwEklpUW0RKgIqfIsjUr6P/P3/GEwteZbe+xvSTykhEYJmFDHAjofYAEZFiu9rdfwRgZt8Cfgx8NV9fVluf3OHPjGEptS3P07ROG7bVz+3s+9eKDF9/oJFnlmaYNDzg7tPLOXxElNAhRYwrUufkXCy7vcW0cx0fYHXMC8epk0FEdkhnro3tUfFTYGPWzOGZ237JiqYUFx0e5ydTElTGmqcLXdFqmmsRESked1/f6mUl7c/ovFPWbtzxBN/fNlCDM3irsZcO1j7UNTmL14WbFs02s20Xzm7RemHs9hbO1iLaItJFOnNtbI+KnwIJkw2cXfYUVwy9ie+Mh69PqmS/Ic090C0ZdTnOcBU/IiIlwcyuAs4F1gHHtPG+C4ALAEaOHNmp7xpQGYdVG3foMzXehxqcjo6lNKScq59KUp9yfj61jKNGRXnnW1UkokYG447MsXrOVERKyoDKeJefsyjFT3fope4qYVM98SevZfVr8/j3r8WJx4zrPl6ec7rQZYSMVT0qIlIQZvYYMDTHoUvd/T53vxS41MwuAb4B/CTXedz9euB6gEmTJnVqhKi6YscTfC1V1EC7M6m5O3e9muYHjzWyeJ1z1oQoYeiEZrwfjODdzDCuz5ysokdESk5nro3tKda/tAvaS72zJtoipkXmAB3vcV4TVrL0jZe5b8Y8NtZt5IKDY8SCzQ+ats5Vnv1ftb2JiBSOu0/t4FtvBx5gO8VPsYT45md+tuP11Rm+/PdG5i7OcMCQgFtOLefo0VGtHScivVZRip9C91LvjANtIR8kLuaiHWhi9pRTezck34boUOh/JvxtRJq/Ubf9zwApg2HenMQ0HaiISPGY2V7u/mb25SnA68WMJ5cGMoQG/T138eNALDDeqw35/cllfOHAGB5EtXaciPRqReuxKmQv9c44OjKD71qGYz3CXgRtLurm2TlELQaz+6QZfJKxzyERgqD5ndZOjRd341Me03SgIiLF93MzG0tze/b7lGB3Qh0pgC1GfprSzq/mJVmwMsNt0yrYc0DA29+sIogYd2aO456kih4R6d3yVvyUUi/1znBbDcD3SHAS0e0WP4++lebfH23kr6eXs8/gCH5K8/4m4lyR7Ph0oXdqOlARkaJz908XO4b21JEGmosfd+e+N9J899FG3qlxPrF3lIaUUxYzgkhELW4iIll5K366ey91i7U0T7HX8izO1o/sLF0f8p1HGvnLa2n2HhiwrglCh3RnpwsVERHpgDprLn4aa53j769n1rsZ9h0c8Mhny5m6Z5Q0EbW4iYhspVizvZV8L3WLtdYEkHMK6v9+polLZzWRDuHKYxJcdHicaNS4PXOcko2IiOTVBm++OTeiLGDpeud3/1bGBQfHsEB5SERke4r1zE/J91K3WEuSqMPArYofB96vdY4eFeW/Typj9/6BZs8REZG880yKDS8+wB/eegfOg5FlAa9+vRIzUx4SEWlHsWZ7K/le6hZrrYlhGAHGmvqQHzzWxGf3izFldJTpxycIgNB0l01ERPKv4e3nqJ91HXVrP2TwngE0QnW5EVqEuzLHKA+JiLRDK2q2Yy1Jhjrc+K8kP3isiXVNzn67BEwZHSXQXTYRESmATP06Ug9cyYfvvM5eAwP+66xynt47zXQLqXKYkZnIZenzix2miEjJU/HTjhUfNtD4gPOlDxo5amSEaz9WxvhdIqS2N6GBiIhIFzmI1zk88gajKhfzm+SbfO/4BN+YHCcRNR4iTXW2M0FERDpGxU8bJtoiHn6/EV8Dfzi1jHP2j6nFTUREulxtfXKL1wf6QqpfupXnXnyZm79YSb+EcfoXKggCw7OLPtTi9M++v7qNRbRFRLqrra+NXUHFz1bcnaGL/sLkYCE/m7CIvoc4F0+I87nyuFrcREQkL9Zu3JzgD3v/Jl6Z9Tde/TBkyqgI6xqdfgnbtGB2y0BPDb5pgdP+tqHQIYuI5F3ra2NXUfHTSqpmGYkZV/Hsu+/Td48IayaUQwB7lAcsCPfkyvQ5Gu0REZEuN6AyTrhsDem/X85db77C7tXGX88o55Njo1uM9sDmdeZqYFPxU+N9Ch6ziEi+DaiMd/k5VfwAnk5S8czvWfb0DMoiIb8+McGFk+M8RwZoXuNnpfdX4SMiInkxZkgfnnl3LYMiG7nw2ATfPTxOWdTYVPPkeKynFmckAQBvsWvBYhURKZQxQ7r+xk7Q5Wfshg5d8iden/sI0/YJWHhhFd8+LEE0MJZbc9oZpj8mERHJo09PHEEiGrDnqd/goiMrSWQLn5aaJ9eUBjU41RhJotyTOaqA0YqI5JcB8Yjx6YkjuvzcvXbkJ71hNbsum803x6/nM2NncfGXK5k4PLJFa8FyWoof48MixSkiIj3fwaP6c8cFhzPvnb15t2p/9ln5D8Bg6AHQsAbKB8KK+Zv2ef1qah6/mNguh/H3od/htGGT2GfZOgwYP7wfNfVJ+lfEeaWdfe0d78xn8nHOnvaZUomjlD9TKnGU8mdKJY58feawPQZy8KiWaV26Tq8rfjzM0O+Fm3hz7gPUWYaTx1YRRIyJwyPNb2h1e205IRGHwZpGVERE8uzgUf2ziX4MMLXN99YnN5Ka/T1GTvg4px05rSDxiYj0BL2m+BkSuRtfNo/XHvqAxSvrGTMm4OP/FuO3ZUncN9c8rdsMHiHNEIyIih8RESkhNY01APQv7/q7oiIiPVmvKH4OCt5kacPtPPjHFFQBZ8Bb40J+Y9np89qobaZ58x/RavrlP1AREem1fvHkL7jlpVs69N6mdBMA1WXV+QxJRKTH6RXFzyn93ub8PhU8eEaSo0ZHqYxHMA+JuBPS/qwPephURHqiQX0SxQ5BWhlSOYR9B+/b4fcfMfIIpoyekr+ARER6oF5R/Ox64AmE83/LJ8YaSY9yeeocBlgda71q088JwXsAvBKO3mJ7gNUxLxynaa5FpMcwIJanWXSk88478DzOO/C8YochItKj9Yrih90mE3z+7/DeHN4vO4BgyRDWAftnZ5MY0Wq2if1bzTbRcvy0ini7s+iUyuwZpRJHKX+mVOIo5c+UShyl/JlSiaOzn8nXLDo9jZldBFwNDHb31cWOR0REdk7vKH4AdpsMu01mH+BnhxQ7GBERKXVmthtwPLC42LGIiEjX0OqdIiIiuf0K+D7g7b1RRES6BxU/IiIiWzGzU4Cl7v5SB957gZk9b2bPr1q1qgDRiYhIZ/WetjcREZFWzOwxYGiOQ5cCPwRO6Mh53P164HqASZMmaZRIRKSEqfgREZFeyd2n5tpvZvsBuwMvmRnACOBFM5vs7isKGKKIiHQxFT8iIiKtuPvLwC4tr83sPWCSZnsTEen+9MyPiIiIiIj0CubefdqTzWwV8H6x4+igQUB3u0uomAtDMReGYs6fUe4+uNhBlCLlqbxTzIWhmAunO8bdHWLebp7qVsVPd2Jmz7v7pGLHsSMUc2Eo5sJQzCJt645/3xRzYSjmwumOcXfHmFtT25uIiIiIiPQKKn5ERERERKRXUPGTP9cXO4BOUMyFoZgLQzGLtK07/n1TzIWhmAunO8bdHWPeRM/8iIiIiIhIr6CRHxERERER6RVU/IiIiIiISK+g4iePzOxKM1tgZvPN7FEzG17smNpjZleb2evZuO81s+pix9QeMzvdzF41s9DMSnrqRTM7yczeMLO3zOziYsfTHjO7ycw+NLNXih1LR5nZbmY228wWZv9efLvYMbXHzMrM7Fkzeykb8xXFjkl6B+WpwlCeyh/lqcLoSXlKz/zkkZn1dff12e1vAfu6+1eLHFabzOwEYJa7p81sOoC7/6DIYbXJzMYBIfB74CJ3f77IIeVkZhFgEXA8sAR4DviMu79W1MDaYGZHA3XAH919QrHj6QgzGwYMc/cXzawP8ALwyRL/czag0t3rzCwGzAW+7e7zihya9HDKU4WhPJU/ylOF0ZPylEZ+8qgloWRVAiVfabr7o+6ezr6cB4woZjwd4e4L3f2NYsfRAZOBt9z9HXdPAncCpxY5pja5+xPA2mLHsSPcfbm7v5jd3gAsBHYtblRt82Z12Zex7H8lf72Q7k95qjCUp/JHeaowelKeUvGTZ2Z2lZl9AHwW+HGx49lBXwQeKnYQPciuwAetXi+hxC923Z2ZjQYOAp4pbiTtM7OImc0HPgRmuHvJxyw9g/KUtKI8VWDKU4Wn4mcnmdljZvZKjv9OBXD3S919N+A24BvFjbZZezFn33MpkKY57qLrSMzdgOXY1y3vmnQHZlYF/BX4zlZ3t0uSu2fc/UCa72JPNrNu0b4hpU95qjCUp2RHKU8VR7TYAXR37j61g2+9HXgA+Ekew+mQ9mI2s/OAk4HjvEQeCtuBP+dStgTYrdXrEcCyIsXSo2X7kf8K3Obu9xQ7nh3h7rVm9jhwEtBtHuCV0qU8VRjKU7IjlKeKRyM/eWRme7V6eQrwerFi6SgzOwn4AXCKu9cXO54e5jlgLzPb3cziwFnA/UWOqcfJPpR5I7DQ3X9Z7Hg6wswGt8xYZWblwFS6wfVCuj/lKdmK8lQBKE8Vl2Z7yyMz+yswluYZXt4HvuruS4sbVdvM7C0gAazJ7prXDWb++RTwW2AwUAvMd/cTixtVbmb2MeDXQAS4yd2vKnJIbTKzO4ApwCBgJfATd7+xqEG1w8yOBOYAL9P8/z2AH7r7g8WLqm1mtj9wC81/LwLgz+7+0+JGJb2B8lRhKE/lj/JUYfSkPKXiR0REREREegW1vYmIiIiISK+g4kdERERERHoFFT8iIiIiItIrqPgREREREZFeQcWPiEgJMbObzOxDM9vptRPM7Bgzm9/qv0Yz+2QHP7uPmT1tZk1mdtHOxiIiIqWpK/NO9nwjzexRM1toZq+Z2egOfm6H846ZXWVmH5hZXYfj02xvIiKlw8yOBuqAP7p7l62ebWYDgLeAEVuvjWJm77n76K327QKMAj4J1Lj7NV0Vi4iIlI6uzjvZBVCvcvcZZlYFhPnKO2Z2GM3T9L/p7lUdiU8jPyIiJcTdnwDWtt5nZnua2cNm9oKZzTGzfTpx6tOAhzq6KKS7f+juzwGpTnyXiIh0E12Zd8xsXyDq7jOy567rirxjZp8zs2ezXQy/N7NI9jPz3H15R87fQsWPSAGY2SFmtsDMysys0sxeNbMuu6svPd71wDfd/WDgIuB/OnGOs4A7ujQqEekxlKdkK53NO3sDtWZ2j5n9y8yubilUOsvMxgFnAke4+4FABvhsZ88X3ZlgRKRj3P05M7sf+A+gHLjV3bukt1Z6tmzLwEeAu82sZXcie2wakGuF7aWtV483s2HAfsAjrfZdCxyRfTnczOZnt+8u9RXdRaTrKU9Ji53MO1HgKOAgYDFwF/B54MadyDvHAQcDz2XjKQc+7NQvh4ofkUL6KfAc0Ah8q8ixSPcRALXZu11bcPd7gHs6cI4zgHvdfVMrgbtf2LKd7b3e5vwi0usoTwnsXN5ZAvzL3d8BMLO/AYcBN+5E3jHgFne/pKO/QFvU9iZSOAOAKqAPUFbkWKSbcPf1wLtmdjqANTtgB0/zGdTyJiLtU56Snc07zwH9zWxw9vWxwGs7GdJM4LTshAiY2QAzG9XZk2m2N5ECybYT3AnsDgxz928UOSQpQWZ2BzAFGASsBH4CzAKuA4YBMeBOd8/VdpDrfKOBJ4Hd3D3czntyzbozFHge6AuENM8EtG82KYpID6Q81TvlIe8cD/wXzSM2LwAXuHtyq/fsUN4xszOBS2geuEkBF7r7PDP7BXA2MBxYBtzg7pe3GZ+KH5H8M7NzgU+6+7Tsg39PAZe4+6wihyYiIqI8Jb2Gih8REREREekV9MyPiIiIiIj0Cip+RERERESkV1DxIyIiIiIivYKKHxERERER6RVU/IiIiIiISK+g4kdERERERHoFFT8iIiIiItIr/H+WOiP+GChwnAAAAABJRU5ErkJggg==\n", "text/plain": ["
"]}, "metadata": {"needs_background": "light"}, "output_type": "display_data"}], "source": ["fig, ax = plt.subplots(1, 2, figsize=(14, 4))\n", "ax[0].plot(xst1, yst1, '.', label=\"agree\")\n", "ax[0].plot(xsf1, ysf1, '.', label=\"disagree\")\n", "xs = list(sorted(set(xst1)))\n", "ys = [numpy.float32(x) for x in xs]\n", "ax[0].plot(xs, ys, 'g', label='rule')\n", "ax[0].set_title(\"Factor=1, Region where\\n(float)x <= y and (double)x <= (double)y agree\")\n", "ax[0].set_xlabel(\"x\")\n", "ax[0].set_ylabel(\"y\")\n", "ax[0].plot([min(xst1), max(xst1)], [min(yst1), max(yst1)], 'k--')\n", "ax[0].legend()\n", "ax[1].plot(xst, yst, '.', label=\"agree\")\n", "ax[1].plot(xsf, ysf, '.', label=\"disagree\")\n", "xs = list(sorted(set(xst)))\n", "ys = [numpy.float32(x) for x in xs]\n", "ax[1].plot(xs, ys, 'g', label='rule')\n", "ax[1].set_title(\"Factor=%f, Region where\\n(float)x <= y and (double)x <= (double)y agree\" % factor)\n", "ax[1].set_xlabel(\"x\")\n", "ax[1].set_ylabel(\"y\")\n", "ax[1].plot([min(xst), max(xst)], [min(yst), max(yst)], 'k--')\n", "ax[1].legend();"]}, {"cell_type": "markdown", "metadata": {}, "source": ["Let's fix it in a similar way. Let's first define a function which finds the split double which defines the border between doubles, below the are rounded to one float, above it, they are rounded to another float. And it is not always to middle of it."]}, {"cell_type": "code", "execution_count": 22, "metadata": {}, "outputs": [{"data": {"text/plain": ["1.0000000596046448"]}, "execution_count": 23, "metadata": {}, "output_type": "execute_result"}], "source": ["def find_switch_point(fy, nfy):\n", " \"Finds the double so that ``(float)x != (float)(x + espilon)``.\"\n", " a = numpy.float64(fy)\n", " b = numpy.float64(nfy)\n", " fa = numpy.float32(a)\n", " fb = numpy.float32(b)\n", " a0, b0 = a, a\n", " while a != a0 or b != b0:\n", " a0, b0 = a, b\n", " m = (a + b) / 2\n", " fm = numpy.float32(m)\n", " if fm == fa:\n", " a = m\n", " fa = fm\n", " else:\n", " b = m\n", " fb = fm\n", " return a\n", "\n", "find_switch_point(1, 1.0000000876)"]}, {"cell_type": "code", "execution_count": 23, "metadata": {}, "outputs": [{"data": {"text/plain": ["(1.0000000596046448, 1.0)"]}, "execution_count": 24, "metadata": {}, "output_type": "execute_result"}], "source": ["def good_threshold_double(dy):\n", " fy = numpy.float32(dy)\n", " eps = max(abs(fy), numpy.finfo(numpy.float32).eps) * 10\n", " afy = numpy.nextafter([fy], [fy - eps], dtype=numpy.float32)[0] \n", " afy2 = find_switch_point(afy, fy)\n", " if fy > dy > afy2:\n", " return afy2 \n", " bfy = numpy.nextafter([fy], [fy + eps], dtype=numpy.float32)[0]\n", " bfy2 = find_switch_point(fy, bfy)\n", " if fy <= dy <= bfy2:\n", " return bfy2 \n", " return fy\n", "\n", "good_threshold_double(1.0), numpy.float32(1.0000000216)"]}, {"cell_type": "code", "execution_count": 24, "metadata": {}, "outputs": [{"data": {"text/plain": ["'factor=1.0, error area 0.0000%'"]}, "execution_count": 25, "metadata": {}, "output_type": "execute_result"}], "source": ["xst1, yst1, xsf1, ysf1 = area_mismatch_rule_double(100, delta, 1., good_threshold_double)\n", "\"factor=%1.1f, error area %1.4f%s\" % (1., len(xsf1) * 1.0 / (len(xst1) + len(xsf1)) * 100, \"%\")"]}, {"cell_type": "code", "execution_count": 25, "metadata": {}, "outputs": [{"data": {"text/plain": ["'factor=1e+20, error area 0.0000%'"]}, "execution_count": 26, "metadata": {}, "output_type": "execute_result"}], "source": ["xst, yst, xsf, ysf = area_mismatch_rule_double(100, delta, 1e20, good_threshold_double)\n", "\"factor=%1.1g, error area %1.4f%s\" % (1e20, len(xsf) * 1.0 / (len(xst) + len(xsf)) * 100, \"%\")"]}, {"cell_type": "code", "execution_count": 26, "metadata": {}, "outputs": [{"data": {"text/plain": ["'factor=10.0, error area 0.0000%'"]}, "execution_count": 27, "metadata": {}, "output_type": "execute_result"}], "source": ["xst, yst, xsf, ysf = area_mismatch_rule_double(100, delta, factor, good_threshold_double)\n", "\"factor=%1.1f, error area %1.4f%s\" % (factor, len(xsf) * 1.0 / (len(xst) + len(xsf)) * 100, \"%\")"]}, {"cell_type": "code", "execution_count": 27, "metadata": {}, "outputs": [{"data": {"image/png": "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\n", "text/plain": ["
"]}, "metadata": {"needs_background": "light"}, "output_type": "display_data"}], "source": ["fig, ax = plt.subplots(1, 1, figsize=(12, 4))\n", "ax.plot(xst, yst, '.', label=\"agree\")\n", "ax.plot(xsf, ysf, '.', label=\"disagree\")\n", "xs = list(sorted(set(xst)))\n", "ys = [good_threshold_double(x) for x in xs]\n", "ax.plot(xs, ys, 'g', label='rule')\n", "ax.set_title(\"Region where (float)x <= y and (double)x <= good_threshold_double(y) agree\")\n", "ax.set_xlabel(\"x\")\n", "ax.set_ylabel(\"y\")\n", "ax.plot([min(xst), max(xst)], [min(yst), max(yst)], 'k--')\n", "ax.legend();"]}, {"cell_type": "markdown", "metadata": {}, "source": ["## All doubles equivalent to the same float\n", "\n", "We can use the previous code to determine a double interval in which every double is converted into the same float."]}, {"cell_type": "code", "execution_count": 28, "metadata": {}, "outputs": [{"data": {"text/plain": ["(0.9999999701976777, 1.0000000596046448)"]}, "execution_count": 29, "metadata": {}, "output_type": "execute_result"}], "source": ["def double_interval_for_float(dy):\n", " fy = numpy.float32(dy)\n", " eps = max(abs(fy), numpy.finfo(numpy.float32).eps) * 10\n", " afy = numpy.nextafter([fy], [fy - eps], dtype=numpy.float32)[0] \n", " afy2 = find_switch_point(afy, fy)\n", " eps64 = numpy.finfo(numpy.float64).eps\n", " bfy = numpy.nextafter([fy], [fy + eps], dtype=numpy.float32)[0]\n", " bfy2 = find_switch_point(fy, bfy)\n", " return (afy2 + eps64, bfy2)\n", "\n", "double_interval_for_float(1.)"]}, {"cell_type": "code", "execution_count": 29, "metadata": {}, "outputs": [{"data": {"text/plain": ["(0.9999999701976777, 1.0000000596046448)"]}, "execution_count": 30, "metadata": {}, "output_type": "execute_result"}], "source": ["double_interval_for_float(1. + 1e-8)"]}, {"cell_type": "code", "execution_count": 30, "metadata": {}, "outputs": [{"data": {"text/plain": ["(1.000000059604645, 1.000000178813934)"]}, "execution_count": 31, "metadata": {}, "output_type": "execute_result"}], "source": ["eps = numpy.finfo(numpy.float64).eps\n", "double_interval_for_float(1.0000000596046448 + eps)"]}, {"cell_type": "markdown", "metadata": {}, "source": ["## Verification\n", "\n", "Let's check the rules works for many random *x*."]}, {"cell_type": "code", "execution_count": 31, "metadata": {}, "outputs": [{"data": {"text/plain": ["[]"]}, "execution_count": 32, "metadata": {}, "output_type": "execute_result"}], "source": ["def verification(rnd):\n", " errors = []\n", " for x in rnd:\n", " skl = numpy.float32(x) <= x\n", " flo = numpy.float32(x) <= good_threshold(x)\n", " dou = numpy.float64(x) <= good_threshold_double(x)\n", " if skl != flo or skl != dou:\n", " errors.append((x, skl, flo, dou))\n", " return errors\n", "\n", "rnd = (numpy.random.rand(10) - 0.5)\n", "verification(rnd)"]}, {"cell_type": "code", "execution_count": 32, "metadata": {}, "outputs": [{"data": {"text/plain": ["[]"]}, "execution_count": 33, "metadata": {}, "output_type": "execute_result"}], "source": ["rnd = (numpy.random.rand(10) - 0.5) * 10\n", "verification(rnd)"]}, {"cell_type": "code", "execution_count": 33, "metadata": {}, "outputs": [], "source": []}], "metadata": {"kernelspec": {"display_name": "Python 3", "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.7.2"}}, "nbformat": 4, "nbformat_minor": 2}