{"nbformat":4,"nbformat_minor":0,"metadata":{"colab":{"provenance":[],"toc_visible":true,"authorship_tag":"ABX9TyPsEsk5nv7/WNJT6uaxN6nc"},"kernelspec":{"name":"python3","display_name":"Python 3"},"language_info":{"name":"python"}},"cells":[{"cell_type":"markdown","source":[""],"metadata":{"id":"jn6Iiamq5qLc"}},{"cell_type":"markdown","source":[" The following notes written by Sergio Gutiérrez Rodrigo () . Distributed under License Creative Commons Atribución-NoComercial-CompartirIgual 4.0 Internacional"],"metadata":{"id":"tYZjdh8TvE7-"}},{"cell_type":"markdown","source":["```\n","Departamento de Física Aplicada\n","Universidad de Zaragoza\n","Instituto de Nanociencia y Materiales de Aragón (INMA)\n","C/ Pedro Cerbuna, 12, 50009, Zaragoza, España\n","```\n","\n","\n","\n","\n"],"metadata":{"id":"j2H5UHGe1Uf8"}},{"cell_type":"markdown","source":["---\n","# **Óptica - Tema 1 - Fraunhofer Diffraction: rectangular aperture**\n","\n","---"],"metadata":{"id":"D7vYGeB21ZQU"}},{"cell_type":"markdown","source":["# Diffraction by an aperture (numerical)"],"metadata":{"id":"j-M41YaeL6pm"}},{"cell_type":"markdown","source":["For $r_p,r_s \\gg \\lambda \\Longrightarrow$\n","$E_{cP}=\\dfrac{\\imath k A}{4\\pi} \\int_\\sigma \\dfrac{e^{-\\imath k (r_p+r_s)}}{r_p r_s} \\left( \\cos(\\theta)+\\sin(\\chi)\\right ) d\\sigma$"],"metadata":{"id":"Ppg5Zso5jqu6"}},{"cell_type":"markdown","source":[""],"metadata":{"id":"QvpjvrMm_GBy"}},{"cell_type":"markdown","source":["# Fraunhofer diffraction by an aperture (numerical)"],"metadata":{"id":"x_TfJJ2IME4j"}},{"cell_type":"markdown","source":["For $l_p,l_s \\gg \\text{aperture dimensions} \\Longrightarrow$\n","$E_{cP}=cte \\int_\\sigma e^{-\\imath k [(\\alpha_s-\\alpha_p)\\xi+(\\beta_s-\\beta_p)\\eta]} d\\sigma$"],"metadata":{"id":"K_jROSgtME4q"}},{"cell_type":"markdown","source":[""],"metadata":{"id":"MAY7nJdYMDOJ"}},{"cell_type":"code","execution_count":null,"metadata":{"id":"H6mQ5eVnKq8j"},"outputs":[],"source":["import math\n","import numpy as np\n","\n","def diff(theta, phi, k, rs, rp):\n"," coss = (np.cos(theta) + np.cos(phi)) / (rs * rp)\n"," E = coss * np.exp(-1j*k* (rp + rs))\n"," return E\n","\n","def diffraction_intensity_rectangle_numerical(xs, ys, xp, yp, S, P, A, a,b,lambda_nm):\n"," k = 2.0 * math.pi / (lambda_nm*1e-9)\n"," dx = a/100 # cartesian mesh (X and Y directions)\n"," Nx = round(2 * a / dx) # Number of points in X-direction\n"," Ny = round(Nx*b/a) # Number of points in Y-direction\n"," E = 0.0+0.0j\n"," for i in range(Nx):\n"," xa = a * (Nx - 2 * i) / Nx\n"," for j in range(Ny):\n"," ya = b * (Ny - 2 * j) / Ny\n"," rs = np.sqrt(S**2 + (xa - xs)**2 + (ya - ys)**2)\n"," rp = np.sqrt(P**2 + (xa - xp)**2 + (ya - yp)**2)\n"," # S=|zs| y P=|zp| cos(theta)=cos(N,-rs)=/|rs| & cos(phi)=/|rp|\n"," theta = math.acos(S / rs)\n"," phi = math.acos(P / rp)\n"," E+= diff(theta, phi, k, rs, rp)\n"," E = 1j*E * k * A * dx * dx / (4 * np.pi)\n"," return np.real(E*np.conjugate(E))"]},{"cell_type":"markdown","source":["# Fraunhofer diffraction (analytic)"],"metadata":{"id":"msMRElpxqPG9"}},{"cell_type":"markdown","source":[""],"metadata":{"id":"SnyvhdNzltPD"}},{"cell_type":"markdown","source":[""],"metadata":{"id":"XYoS2oO6o2l8"}},{"cell_type":"code","source":["import numpy as np\n","def diffraction_intensity_rectangle_analytic(xp, yp, P, a,b, lambda_nm):\n"," '''\n"," For (xs,ys)=(0,0)\n"," '''\n"," k = 2.0 * math.pi / (lambda_nm*1e-9)\n"," alfa_p=xp/np.sqrt(xp**2+P**2) #sin(theta)\n"," beta_p=yp/np.sqrt(yp**2+P**2) #sin(phi)\n"," tolerance=1e-9 # To avoid Zero Division Errors\n"," U=k*a*alfa_p + tolerance\n"," V=k*b*beta_p + tolerance\n"," Ip=(a*b)**2*(np.sin(U)/U)**2*(np.sin(V)/V)**2\n"," return Ip"],"metadata":{"id":"1DGR2OI_oNnI"},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":["# Parameters (geometry)"],"metadata":{"id":"31WL-PawSmg-"}},{"cell_type":"markdown","source":["Infrarrojo lejano con abertura rectangular\n","+ 𝑆 = 100.0 𝑚 (distancia al emisor)\n","+ 𝑃 = 10.0 𝑚 (disancia a la pantalla)\n","+ 𝑎 = 1 𝑚𝑚 (anchura abertura horizontal)\n","+ 𝑏 = 1 𝑚𝑚 (anchura abertura vertical)\n","+ λ= 600.0 n𝑚\n","+ 𝑑𝑥 = 0.01 𝑚𝑚"],"metadata":{"id":"_r612Tx2Q3eY"}},{"cell_type":"code","source":["xs, ys = 0.0, 0.0 # meters\n","S, P = 20.0, 10.0 # m\n","A = 1 # Amplitude (arbitrary units)\n","a=1e-3 # m\n","b=a # m\n","lambda_nm = 600.0 # nm\n","k = 2.0 * math.pi / (lambda_nm*1e-9)\n","tolerance=1e-9 # To avoid Zero Division Errors"],"metadata":{"id":"zeQjDEdwSplf"},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":["# Diffraction pattern at $\\varphi=0$ (both analytic and numerical)"],"metadata":{"id":"Hs2F_KgvDsaS"}},{"cell_type":"code","source":["def calc_diff_pattern_phi0():\n"," Xp=100\n"," m=5\n"," xpm = m*P*(lambda_nm*1e-9)/(2.0*a) # Plot the first m minima (direction a)\n"," diff_pattern = []\n"," for i in range(Xp):\n"," print(\"iteration\",i,' of ',Xp)\n"," xp=xpm * (Xp - 2 * i) / Xp + tolerance\n"," yp=tolerance\n"," I_numerical= diffraction_intensity_rectangle_numerical(xs, ys, xp, yp, S, P, A,a,b, lambda_nm)\n"," I_analytic= diffraction_intensity_rectangle_analytic(xp, yp, P, a,b, lambda_nm)\n"," diff_pattern.append([xp,I_analytic,I_numerical])\n"," return np.array(diff_pattern)"],"metadata":{"id":"wPzGpwenEAp2"},"execution_count":null,"outputs":[]},{"cell_type":"code","source":["diff_pattern=calc_diff_pattern_phi0()"],"metadata":{"id":"xMTYICw6NYUh","colab":{"base_uri":"https://localhost:8080/"},"executionInfo":{"status":"ok","timestamp":1694435043037,"user_tz":-120,"elapsed":23705,"user":{"displayName":"SERGIO GUTIERREZ RODRIGO","userId":"07959720391705098820"}},"outputId":"b5678ca0-0bc0-44ec-fff8-f2ca8d646ad3"},"execution_count":null,"outputs":[{"output_type":"stream","name":"stdout","text":["iteration 0 of 100\n","iteration 1 of 100\n","iteration 2 of 100\n","iteration 3 of 100\n","iteration 4 of 100\n","iteration 5 of 100\n","iteration 6 of 100\n","iteration 7 of 100\n","iteration 8 of 100\n","iteration 9 of 100\n","iteration 10 of 100\n","iteration 11 of 100\n","iteration 12 of 100\n","iteration 13 of 100\n","iteration 14 of 100\n","iteration 15 of 100\n","iteration 16 of 100\n","iteration 17 of 100\n","iteration 18 of 100\n","iteration 19 of 100\n","iteration 20 of 100\n","iteration 21 of 100\n","iteration 22 of 100\n","iteration 23 of 100\n","iteration 24 of 100\n","iteration 25 of 100\n","iteration 26 of 100\n","iteration 27 of 100\n","iteration 28 of 100\n","iteration 29 of 100\n","iteration 30 of 100\n","iteration 31 of 100\n","iteration 32 of 100\n","iteration 33 of 100\n","iteration 34 of 100\n","iteration 35 of 100\n","iteration 36 of 100\n","iteration 37 of 100\n","iteration 38 of 100\n","iteration 39 of 100\n","iteration 40 of 100\n","iteration 41 of 100\n","iteration 42 of 100\n","iteration 43 of 100\n","iteration 44 of 100\n","iteration 45 of 100\n","iteration 46 of 100\n","iteration 47 of 100\n","iteration 48 of 100\n","iteration 49 of 100\n","iteration 50 of 100\n","iteration 51 of 100\n","iteration 52 of 100\n","iteration 53 of 100\n","iteration 54 of 100\n","iteration 55 of 100\n","iteration 56 of 100\n","iteration 57 of 100\n","iteration 58 of 100\n","iteration 59 of 100\n","iteration 60 of 100\n","iteration 61 of 100\n","iteration 62 of 100\n","iteration 63 of 100\n","iteration 64 of 100\n","iteration 65 of 100\n","iteration 66 of 100\n","iteration 67 of 100\n","iteration 68 of 100\n","iteration 69 of 100\n","iteration 70 of 100\n","iteration 71 of 100\n","iteration 72 of 100\n","iteration 73 of 100\n","iteration 74 of 100\n","iteration 75 of 100\n","iteration 76 of 100\n","iteration 77 of 100\n","iteration 78 of 100\n","iteration 79 of 100\n","iteration 80 of 100\n","iteration 81 of 100\n","iteration 82 of 100\n","iteration 83 of 100\n","iteration 84 of 100\n","iteration 85 of 100\n","iteration 86 of 100\n","iteration 87 of 100\n","iteration 88 of 100\n","iteration 89 of 100\n","iteration 90 of 100\n","iteration 91 of 100\n","iteration 92 of 100\n","iteration 93 of 100\n","iteration 94 of 100\n","iteration 95 of 100\n","iteration 96 of 100\n","iteration 97 of 100\n","iteration 98 of 100\n","iteration 99 of 100\n"]}]},{"cell_type":"markdown","source":["## Plot static figure (both analytic and numerical)"],"metadata":{"id":"-4fIGoHKPuTZ"}},{"cell_type":"code","source":["import matplotlib.pyplot as plt\n","\n","x=diff_pattern[:,0]\n","y_analytic=diff_pattern[:,1]/np.max(diff_pattern[:,1]) # Normalized to 1\n","y_numerical=diff_pattern[:,2]/np.max(diff_pattern[:,2]) # Normalized to 1\n","plt.plot(x,y_analytic,label='Analytic')\n","plt.plot(x,y_numerical,label='numerical',linestyle='--')\n","\n","plt.xlabel('X (m)')\n","plt.ylabel('Intensity (normalized to unity)')\n","plt.legend()\n","plt.show()"],"metadata":{"id":"T6Py4-VcDspb","colab":{"base_uri":"https://localhost:8080/","height":449},"executionInfo":{"status":"ok","timestamp":1694435043502,"user_tz":-120,"elapsed":468,"user":{"displayName":"SERGIO GUTIERREZ RODRIGO","userId":"07959720391705098820"}},"outputId":"264e6c77-a670-444a-9ef1-a593475ad33e"},"execution_count":null,"outputs":[{"output_type":"display_data","data":{"text/plain":[""],"image/png":"iVBORw0KGgoAAAANSUhEUgAAAjcAAAGwCAYAAABVdURTAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjcuMSwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/bCgiHAAAACXBIWXMAAA9hAAAPYQGoP6dpAAB5k0lEQVR4nO3dd3gU1frA8e/2zSbZTa8EEnovgiBgAUURUOzyUxTEil25FrhXRVABG2DnqoDiVRFFEQVFCCBSBEGqdAgCIZX0usnu/P5YEo1JIJvsZjeb9/M8eXRnz8y8MwmbN2fOOa9KURQFIYQQQggfofZ0AEIIIYQQriTJjRBCCCF8iiQ3QgghhPApktwIIYQQwqdIciOEEEIInyLJjRBCCCF8iiQ3QgghhPApWk8H0NjsdjunTp0iMDAQlUrl6XCEEEIIUQeKopCfn09MTAxq9dn7ZppdcnPq1Cni4uI8HYYQQggh6uHEiRO0aNHirG2aXXITGBgIOG6O2Wz2cDRCCCGEqIu8vDzi4uIqf4+fTbNLbioeRZnNZkluhBBCiCamLkNKZECxEEIIIXyKJDdCCCGE8CmS3AghhBDCpzS7MTdCCCF8h81mo6yszNNhCBfR6/XnnOZdF5LcCCGEaHIURSE1NZWcnBxPhyJcSK1Wk5CQgF6vb9BxJLkRQgjR5FQkNhEREZhMJlmU1QdULLKbkpJCy5YtG/Q9leRGCCFEk2Kz2SoTm9DQUE+HI1woPDycU6dOUV5ejk6nq/dxZECxEEKIJqVijI3JZPJwJMLVKh5H2Wy2Bh1HkhshhBBNkjyK8j2u+p5KciOEEEIIn+LR5GbdunVcffXVxMTEoFKpWLJkyTn3Wbt2Leeddx4Gg4G2bdvy0UcfuT1OIYQQQjQdHk1uCgsL6dGjB++8806d2iclJTFixAgGDx7Mjh07eOyxx7j77rtZsWKFmyMVQgghmo74+Hhmz57doGOsXbsWlUrVJKfbe3S21LBhwxg2bFid28+ZM4eEhARef/11ADp16sT69euZNWsWQ4cOdVeYQggvV2azA6DTyJN20TRs2rSJCy+8kCuvvJJly5Z5OhwGDRpEz549qyREAwYMICUlBYvF4rnA6qlJfRJs2rSJIUOGVNk2dOhQNm3aVOs+paWl5OXlVfkSQviOkjIbQ2evY+jsdZSUNWyGhRCNZe7cuTz88MOsW7eOU6dOeTqcGun1eqKioprkwO0mldykpqYSGRlZZVtkZCR5eXkUFxfXuM/06dOxWCyVX3FxcY0RqhCikWz/YS6P5LyMOXMn3+9K8XQ4wkMURaHIWt7oX4qiOB1rQUEBX3zxBffffz8jRoyoMna04lFQYmIiffr0wWQyMWDAAA4cOFDZ5siRI1xzzTVERkYSEBDA+eefz6pVq2o935133slVV11VZVtZWRkRERHMnTuXO+64g59//pk33ngDlUqFSqXi2LFjNT6W2rBhA4MGDcJkMhEcHMzQoUPJzs52+h64m88v4jdp0iQmTJhQ+TovL08SHCF8iGXXfPpr9nLEHsMnm3pzY+8Wng5JeEBxmY3OzzX++Mu9U4di0jv3q3TRokV07NiRDh06cNttt/HYY48xadKkKj0k//nPf3j99dcJDw9n/Pjx3HnnnWzYsAFwJEfDhw/npZdewmAwsGDBAq6++moOHDhAy5Ytq53v7rvv5uKLLyYlJYXo6GgAvv/+e4qKihg1ahQ33ngjBw8epGvXrkydOhVwLKZ37NixKsfZsWMHl112GXfeeSdvvPEGWq2WNWvWNHhNGndoUslNVFQUaWlpVbalpaVhNpvx8/OrcR+DwYDBYGiM8IQQjezAzs10Lt9LuaImXRXGxLQnObrhCVoPvMHToQlRq7lz53LbbbcBcOWVV5Kbm8vPP//MoEGDKtu89NJLXHLJJQBMnDiRESNGUFJSgtFopEePHvTo0aOy7QsvvMA333zD0qVLeeihh6qdb8CAAXTo0IFPPvmEp556CoD58+dz0003ERAQADgeQZlMJqKiomqN+5VXXqFPnz68++67ldu6dOlS/xvhRk0quenfvz/Lly+vsm3lypX079/fQxEJITwpY+0cOgB7zQO5UpdN/6y9HNr4Nkhy0+z46TTsndr4E0v8dBqn2h84cIAtW7bwzTffAKDVahk1ahRz586tktx079698v8relvS09Np2bIlBQUFPP/88yxbtoyUlBTKy8spLi7m+PHjtZ737rvv5v333+epp54iLS2NH374gdWrVzsV+44dO7jpppuc2sdTPJrcFBQUcPjw4crXSUlJ7Nixg5CQEFq2bMmkSZNITk5mwYIFAIwfP563336bp556ijvvvJPVq1ezaNEirxhpLoRoXFnZ2XTP+hFU4DfgHkLNbShf9CXtCn8n7+g2zK17ezpE0YhUKpXTj4c8Ye7cuZSXlxMTE1O5TVEUDAYDb7/9duW2v9dVqnhcZbc7ZgU+8cQTrFy5ktdee422bdvi5+fHjTfeiNVqrfW8Y8aMYeLEiWzatImNGzeSkJDARRdd5FTstT0h8UYeHVC8detWevXqRa9evQCYMGECvXr14rnnngMgJSWlSiaakJDAsmXLWLlyJT169OD111/nww8/lGngQjRDO1fMw6wqIkUdRdt+V9Gtcxc2GC4EIOWnmR6OTojqysvLWbBgAa+//jo7duyo/Nq5cycxMTF8/vnndTrOhg0buOOOO7juuuvo1q0bUVFR1cbH/FNoaCjXXnst8+fP56OPPmLcuHFV3tfr9eccO9O9e3cSExPrFKOneTTNHTRo0FlHmte0+vCgQYPYvn27G6MSQng7m10h8oDjF0FG+1uIVjseDVjPHw8b1tE69UdsuafQWGLOdhghGtX3339PdnY2d911V7W1Y2644Qbmzp3Lq6++es7jtGvXjq+//pqrr74alUrFs88+W9mrczZ33303V111FTabjbFjx1Z5Lz4+ns2bN3Ps2DECAgIICQmptv+kSZPo1q0bDzzwAOPHj0ev17NmzRpuuukmwsLCznn+xtSkpoILIQTA2n0pfGvtwxFa0G7o+MrtF15yJb/TER3lnPhxtucCFKIGc+fOZciQITUuinfDDTewdetWdu3adc7jzJw5k+DgYAYMGMDVV1/N0KFDOe+8886535AhQ4iOjmbo0KFVHouB41GXRqOhc+fOhIeH1zh+p3379vz000/s3LmTvn370r9/f7799lu0Wu97HKhS6jNJvwnLy8vDYrGQm5uL2Wz2dDhCiHoYO28LPx/M4J4L4/nPVVVnayz65D1uPjKRAnUgARMPgN7fQ1EKdykpKSEpKYmEhASMRqOnw2kyCgoKiI2NZf78+Vx//fWeDqdGZ/veOvP7W3puhBBNyrHMQn4+mIFKBbf1j6/2ft+ho/nRdj7PlN7OnzlljR+gEF7GbreTnp7OCy+8QFBQECNHjvR0SG7nfX1JQghxFttWfc5I9VGK2g6nVWj1Xpn4CDOTE6bx88EMYren8uTQoMYPUggvcvz4cRISEmjRogUfffSRVz5GcjXfv0IhhE9pcfw73tSvZbtRB1xYY5vLO0fy88EM9p6SWnJCxMfH16tMRFMmj6WEEE1KcIljoKMxpnOtbVqHGOmtOkDH1KVQh1kkQgjfIj03Qogmo6zcRqwtGVQQ1qr25CYh3MTn+hfRl9ooy74bXWh84wUphPA46bkRQjQZp04ew19Vik1RERbXvtZ2kZYAjuOokZP5597GCk8I4SUkuRFCNBkViUq6JhKVtvaCuGq1inSdozp43klJboRobiS5EUI0GUUpBwDIMrY8Z9uCwAQAytMPuTUmIYT3keRGCNFkKKePAFBijj9nW1twGwD0uUfdGZIQPu3555+nZ8+eLjveRx99RFBQkMuOVxtJboQQTcZizZXca32c7HY3nrOtIaoDAEFFf7o7LCF81hNPPNFkimX+nSQ3Qogm47fsAH6yn09w2/PP2TakpWM2VagtHcqK3R2aED5FURTKy8sJCAggNDTU0+E4TZIbIUSTUGy1cSq3BICEsIBzto+LjePfZXdxu3UiJTZ3RydE3QwaNIhHHnmEp556ipCQEKKionj++ecBOHbsGCqVih07dlS2z8nJQaVSsXbtWgDWrl2LSqVixYoV9OrVCz8/Py699FLS09P54Ycf6NSpE2azmVtvvZWioqLK49jtdqZPn05CQgJ+fn706NGDr776qvL9iuP+8MMP9O7dG4PBwPr162t8LDVv3jy6dOmCwWAgOjqahx56qPK9mTNn0q1bN/z9/YmLi+OBBx6goKDA5ffxXGSdGyFEk3Dy5DHGa5aSrGtJsGn4OduHBBj4TjeU/JJy/swpp0NUIwQpPM9aWPt7Kg3ojHVsqwad39nb1rMo68cff8yECRPYvHkzmzZt4o477mDgwIG0a9euzsd4/vnnefvttzGZTNx8883cfPPNGAwGPvvsMwoKCrjuuut46623ePrppwGYPn06//vf/5gzZw7t2rVj3bp13HbbbYSHh3PJJZdUHnfixIm89tprtG7dmuDg4MqkqsJ7773HhAkTmDFjBsOGDSM3N5cNGzZUvq9Wq3nzzTdJSEjg6NGjPPDAAzz11FO8++679bpX9SXJjRCiScg5+jsTdQs5rmmJSvWfc7ZXqVS0DvNn58lckjIL6BAV2AhRCo+bFlP7e+2ugNFf/vX61bZQVlRz21YXwrhlf72e3Q2KTldt83xuvULs3r07kydPdoTUrh1vv/02iYmJTiU3L774IgMHDgTgrrvuYtKkSRw5coTWrVsDcOONN7JmzRqefvppSktLmTZtGqtWraJ///4AtG7dmvXr1/Pf//63SnIzdepULr/88rOe91//+hePPvpo5bbzz//rMfFjjz1W+f/x8fG8+OKLjB8/XpIbIYSoSXHqQQBy/eLqvE8PSyFtTq1DtfckdL3PXaEJ4ZTu3btXeR0dHU16enq9jxEZGYnJZKpMbCq2bdmyBYDDhw9TVFRULWmxWq306tWryrY+ffrUes709HROnTrFZZddVmubVatWMX36dPbv309eXh7l5eWUlJRQVFSEyWRy6hobQpIbIUSToM5yTAMvtbQ+R8u/9NUlcZV+DseTOgGS3DQL/z5V+3sqTdXXTx4+S9t/DEl9bHf9Y/oHnU5X9VQqFXa7HbXacc6/F7ksKys75zFUKlWtxwQqx7wsW7aM2NjYKu0MhqqLYfr71/6ozc/Pr9b3wDFm6KqrruL+++/npZdeIiQkhPXr13PXXXdhtVoluRFCiH/yL3BM6daGt63zPqaYjrAfQkuOg6KASuWu8IS3cGYcjLva1lN4eDgAKSkplT0qfx9cXF+dO3fGYDBw/PjxKo+gnBUYGEh8fDyJiYkMHjy42vvbtm3Dbrfz+uuvVyZqixYtqvf5GkKSGyFEkxBuPQGAObZT3fdp2RG7osKfQijMgIAId4UnRIP5+flxwQUXMGPGDBISEkhPT+eZZ55p8HEDAwN54oknePzxx7Hb7Vx44YWVA4HNZjNjx46t87Gef/55xo8fT0REBMOGDSM/P58NGzbw8MMP07ZtW8rKynjrrbe4+uqr2bBhA3PmzGlw/PUhU8GFEF4vr7CQaMUxJiEiofZq4P/UKiqUZCUMgKJT+9wSmxCuNG/ePMrLy+nduzePPfYYL774okuO+8ILL/Dss88yffp0OnXqxJVXXsmyZctISEhw6jhjx45l9uzZvPvuu3Tp0oWrrrqKQ4ccJU569OjBzJkzefnll+natSuffvop06dPd0n8zlIpf3+41wzk5eVhsVjIzc3FbDZ7OhwhRB0c2LOVDl9dRiFG/CenOvV4aeOUSxig7ODkhS/TYsh4N0YpGktJSQlJSUkkJCRgNBrPvYNoMs72vXXm97f03AghvN4BayjDSqczK/hZp8fN5Pi1AqA4db87QhNCeCFJboQQXu9oVhn7lFbkxV7k9L6lZke3uybrLDNjhBA+RQYUCyG8XlKmY3XYupRd+Kf8+CGMPW4gIfg8nndxXEII7yTJjRDC6/U4/gnhmhI6ms6y+mwtwmPb8rM9j5w8WaFYiOZCkhshhFdTFIURRd8QqcviT8Mop/dPCHesT5KUUYCiKKhkrRuf0czmwzQLrvqeSnIjhPBqWdnZRJIFQGRCF6f3jw/15xL1Ts4rP0Te0RAsbc4/907Cq1WsxltUVHTOVXNF02K1WgHQaDTnaHl2ktwIIbxa6rG9hALZmAk2hzm9v1Gn4XbjLwyxb+TE/o6S3PgAjUZDUFBQZT0mk8kkPXI+wG63k5GRgclkQqttWHoiyY0QwqvlnnRM4c7QtyC4nsfI84+H/I2UpR10WVzCs6KiogCcLjgpvJtaraZly5YNTlYluRFCeLXyDMfqpwX+rep/jOC2kA+67COuCkt4mEqlIjo6moiIiFqLS4qmR6/XV9alaghJboQQXk2XkwSAPaRNvY+hj2wPx8FcdMxFUQlvodFoGjw+Q/geWcRPCOHVLEWOauCGyHb1PkZQnKMelcWWDSW5LolLCOG9JLkRQngtu13hduvTjCh9CXPnIfU+TsvoSDIVRy0aJfuYi6ITQngrSW6EEF4rLb+E02UG9qtaExPt/AJ+FeJCTKQpjuHI2WknXRWeEMJLyZgbIYTXOpVTAkCU2YhOU/+/xXQaNS8bH+Nkvo3XzecR4qoAhRBeSZIbIYTXKj2+jee1H5Gn6wJc2qBj5Vk6cDQvh7QiWQ9FCF8nyY0Qwnul7uIO7U/ssjV8EHBEoAGAjPySBh9LCOHdZMyNEMJr2fNSAbAaIxp8rC76Uzym/Yrog582+FhCCO8myY0QwmtpCh3JjT0gqsHHaq1O5zHt13RI/a7BxxJCeDdJboQQXstQnAGA2tzw5MYQ5Jht5W/NaPCxhBDeTZIbIYTXqkhEKhKThjCFxQJgsWWB3dbg4wkhvJckN0IIr2WxZQFgCo1t8LGCwltgV1RosEPR6QYfTwjhvSS5EUJ4pfLyckKVHAAskXENPl6ExZ/TOFYpLs851eDjCSG8lyQ3QgivdLqwjPNL3+VK68sER7Rs8PFCAwyVqxTnZ55o8PGEEN5LkhshhFdKyy8lh0Cy/Nui0TZ8SS6NWkW2JhSAwszkBh9PCOG9JLkRQnil9LxSACLNRpcd83+Wexhc+jqHIoe57JhCCO8jyY0Qwiupjq1jinY+I9QbXXbMsqC2JCnRpBZLCQYhfJmUXxBCeCVj2jbGalfyW7neZcesKMFQ0SskhPBN0nMjhPBKmgLH6sQ2/0iXHbONPpvHtF/R+fB/XXZMIYT3kZ4bIYRX0rtwdeIKMfoiRmi/JjsjFHjNZccVQngX6bkRQnilitWJ9S5YnbhCxWKAZlu2rFIshA+T5EYI4ZXM5Y5VhF2xOnGFoLAYbBWrFBdmuuy4QgjvIsmNEMLr2G12QpVsACzhDV+duEJEkD+ZWBznyJNVioXwVZLcCCG8Ts7pVPQqx2OjYBeUXqgQ/rdVigsyT7rsuEII7yIDioUQXiet3J9LS/5LG1MRiw2uW8RPr1WTrQ4BkijMPHmm0pQQwtdIciOE8DrpBVZyCKTQ7LrBxBUK9GFghdJsKcEghK/y+GOpd955h/j4eIxGI/369WPLli1nbT979mw6dOiAn58fcXFxPP7445SUlDRStEKIxpCe5/g3HeHC0gsVVobexuDS1/k9bozLjy2E8A5O99wkJSXxyy+/8Oeff1JUVER4eDi9evWif//+GI3OfRB98cUXTJgwgTlz5tCvXz9mz57N0KFDOXDgABEREdXaf/bZZ0ycOJF58+YxYMAADh48yB133IFKpWLmzJnOXooQwksFHP2BKdqfKOcyoK9Lj60JbkVSkoaUIo//bSeEcJM6Jzeffvopb7zxBlu3biUyMpKYmBj8/PzIysriyJEjGI1GRo8ezdNPP02rVq3qdMyZM2dyzz33MG7cOADmzJnDsmXLmDdvHhMnTqzWfuPGjQwcOJBbb70VgPj4eG655RY2b95c6zlKS0spLf1rqfW8vLy6XrIQwkNC0n9lmHYlm8pdNw28QoTZUYIhI19KMAjhq+r0p0uvXr148803ueOOO/jzzz9JSUlh27ZtrF+/nr1795KXl8e3336L3W6nT58+fPnll+c8ptVqZdu2bQwZMuSvYNRqhgwZwqZNm2rcZ8CAAWzbtq3y0dXRo0dZvnw5w4cPr/U806dPx2KxVH7Fxblu5oUQwj10Z1YnVgW6bnXiCnGGYh7XfsWFR2e5/NhCCO9Qp56bGTNmMHTo0FrfNxgMDBo0iEGDBvHSSy9x7Nixcx4zMzMTm81GZGTVujGRkZHs37+/xn1uvfVWMjMzufDCC1EUhfLycsaPH8+///3vWs8zadIkJkyYUPk6Ly9PEhwhvJzJ6lhgTx8c7fJjR5jU3Kr9GluOGmxzQCPzKoTwNXXquTlbYvNPoaGh9O7du94Bnc3atWuZNm0a7777Lr///jtff/01y5Yt44UXXqh1H4PBgNlsrvIlhPBu5nJHcuMX4vrHUpbwv69SnOHy4wshPM/pEXWXXHIJCxYsoLi4uEEnDgsLQ6PRkJaWVmV7WloaUVE1d0U/++yz3H777dx9991069aN6667jmnTpjF9+nTsdnuD4hFCeAfFbifU7lid2Bze0uXHj7CYyCDIca78VJcfXwjheU4nN7169eKJJ54gKiqKe+65h19//bVeJ9br9fTu3ZvExMTKbXa7ncTERPr371/jPkVFRajVVUPWaDQAKIpSrziEEN4lPycTg6oMgNCoFi4/fkSgsXKV4qIsWaVYCF/kdHIze/ZsTp06xfz580lPT+fiiy+mc+fOvPbaa9V6Yc5lwoQJfPDBB3z88cfs27eP+++/n8LCwsrZU2PGjGHSpEmV7a+++mree+89Fi5cSFJSEitXruTZZ5/l6quvrkxyhBBNW076cQBy8cfo5+/y4/vpNWSpQgAolBIMQvikeo2k02q1XH/99Vx//fWkp6fz/vvv8+yzz/Lvf/+b4cOH88gjj3DppZee8zijRo0iIyOD5557jtTUVHr27MmPP/5YOcj4+PHjVXpqnnnmGVQqFc888wzJycmEh4dz9dVX89JLL9XnMoQQXuikphVXl7xP91A7n7jpHPn6MCiD0iwpnimEL2rQNIEtW7Ywf/58Fi5cSEREBHfccQfJyclcddVVPPDAA7z22mvnPMZDDz3EQw89VON7a9eurRqsVsvkyZOZPHlyQ8IWQnix9AIruQRQbgl12zlKjOFQBra8FLedQwjhOU4/lkpPT+f111+na9euXHTRRWRkZPD5559z7NgxpkyZwocffshPP/3EnDlz3BGvEMLHpedXlF4wuO0cOyOuZVDp66yOf8xt5xBCeI7TPTctWrSgTZs23Hnnndxxxx2Eh4dXa9O9e3fOP/98lwQohGheoo9+xQvaLai5FujllnOYQmI4ppRyqlBKMAjhi5xObhITE7nooovO2sZsNrNmzZp6ByWEaL5anN7I1dq1bLK7J7EBx4wpgHQpwSCET3L6z5bJkyeTk5NTbXteXl6dBhELIcTZ+JU6FtbTWly/OnGFKH94XPsl156YDrYyt51HCOEZTvfc/Pzzz1it1mrbS0pK+OWXX1wSlBCi+TKXnQbAL8T1a9xUCLUEMEzzLdqiM6sUm2Pcdi4hROOrc3Kza9cuwLFY3t69e0lN/WtlT5vNxo8//khsrOuXShdCNCOKQrA9C1QQGO6+5CbCbCKdIGLIgvwUSW6E8DF1Tm569uyJSqVCpVLV+PjJz8+Pt956y6XBCSGal6L8LEwqR89wSKT7CtxGmA0cVYKIUWVRmp2MIdY99fCEEJ5R5+QmKSkJRVFo3bo1W7ZsqTJLSq/XExERIasECyEaJDv1BCYgTzERGBDotvMEGrRkqkKAoxRkJuO+SedCCE+oc3LTqlUrAClQKYRwm7zMk8QCWeoQzCqV286jUqnI14VBOZRkJbvtPEIIz6hTcrN06VKGDRuGTqdj6dKlZ207cuRIlwQmhGh+jvj3YlTJBwyM0/Gem89VYoiAcrDlSgkGIXxNnZKba6+9ltTUVCIiIrj22mtrbadSqbDZbK6KTQjRzKTnW8nDH3WQ+6aBV7D5R0AhqApSz91YCNGk1Cm5+fujKHksJYRwl4pF9cID3T8K5mTUEC4+Ecu1CT2Y4PazCSEaU4MKZwohhCt1OvYxL2gPYuJ2oItbz2UOCee4ksXJIpkIIYSvqVdyk5iYSGJiIunp6dV6cubNm+eSwIQQzU+7nA101u5kM1e4/VzhAY7eoQwpwSCEz3E6uZkyZQpTp06lT58+REdHo3LjjAYhRPPiX54NgMES6fZzhZm0PKH9grbpxWD9GPQmt59TCNE4nE5u5syZw0cffcTtt9/ujniEEM1YoC0HAFNwlNvPFRJg5G7NcoylZVCYDvp4t59TCNE4nC6cabVaGTBggDtiEUI0Y4qtnCAlH4CAkMZIbgxkYnGcuyDD7ecTQjQep5Obu+++m88++8wdsQghmrHCnHTUKgWA4DD3TwUPDdBzWjEDUJwj08GF8CVOP5YqKSnh/fffZ9WqVXTv3h2dTlfl/ZkzZ7osOCFE85F3OpUAIEcJIMjo/qngJr2WHJUjuSnKSUNG3AjhO5xObnbt2kXPnj0B2LNnT5X3ZHCxEKK+CrJTAMhRWwhqpHMWaoLBDqU5aY10RiFEY3A6uVmzZo074hBCNHPHA3pzY8n79InW01gLSpTog6EEyvPTG+mMQojG4PSYGyGEcIfTRVbyCEAxxzbaOcuMoQAohZmNdk4hhPs53XMzePDgsz5+Wr16dYMCEkI0T6cLrQCE+Lt/vE2FPRFX8XZaZ25vfT73NtpZhRDu5nRyUzHepkJZWRk7duxgz549jB071lVxCSGamVZJX/Ki9jdU9uuAHo1yTqMlghNKIenFUoJBCF/idHIza9asGrc///zzFBQUNDggIUTz1CJrEyO0P/OLrU+jnbOilyjrTK+REMI3uGzMzW233SZ1pYQQ9Wa0ZgGgCQxvtHNGGsp5UruQkcdfBkVptPMKIdzLZVXBN23ahNFodNXhhBDNjKkR60pVCPI3cr12KRQCpXlgtDTauYUQ7uN0cnP99ddXea0oCikpKWzdupVnn33WZYEJIZoX85m6Uv6NUFeqQnCQmQLFSICqBAozJbkRwkc4ndxYLFX/8avVajp06MDUqVO54oorXBaYEKL5UMqtWHCM2QtshLpSFUL9DWQpgQSoSlAK0lGFtmm0cwsh3Mfp5Gb+/PnuiEMI0YwV52ZgAuyKiqDQxnssFRKg5xAWWpJBaV468mBdCN8gi/gJITwu77Sj9EI2gZiM+kY7r79eQ9aZyuBF2VI8Uwhf4bIBxUIIUV+pxjZcXvIh7czlfN2INepUKhVF2iCpLyWEj5HkRgjhcVlFVvIxYQ00N/q5iyvqSxVkNPq5hRDuIY+lhBAel1ngWEQvtBFLL1T4JfQmLiydzW9tHm70cwsh3KNBPTfKmUWvzlZrSgghziXk6FKmaVdRZL8c6Nuo59aaozip2MgokRIMQviKevXcLFiwgG7duuHn54efnx/du3fnk08+cXVsQohmIjRjC7dqV9POfqTRzx3i7xjALCUYhPAdTvfczJw5k2effZaHHnqIgQMHArB+/XrGjx9PZmYmjz/+uMuDFEL4Nm3Jacf/+Ic1+rlj9IU8qV1I18MG4MNGP78QwvWcTm7eeust3nvvPcaMGVO5beTIkXTp0oXnn39ekhshhNMMZ+pKaQMjGv3cYUa4RrsUW5Ya7O+DWoYiCtHUOf2vOCUlhQEDBlTbPmDAAFJSUlwSlBCiefEvc9SV0jdiXakKpmDHOTXYoSSn0c8vhHA9p5Obtm3bsmjRomrbv/jiC9q1a+eSoIQQzYvZngOAX1DjJzch5gByFZPjRaFMBxfCFzj9WGrKlCmMGjWKdevWVY652bBhA4mJiTUmPUIIcVblVgIpAsAS2nh1pSqE+hvIVCxYVEWO4pnhHRo9BiGEazndc3PDDTewefNmwsLCWLJkCUuWLCEsLIwtW7Zw3XXXuSNGIYQPK851rAxcrqgJCm38MTchAXqyCASgNFdWKRbCF9RrnZvevXvzv//9z9WxCCGaodOqEIaVfEiEppBVjVhXqkKgQUt2RX2pnDQafxlBIYSrOd1zo9FoSE9Pr7b99OnTaDSyCJYQwjlZRWXkY6LQP84jC4KqVCoKtMGA9NwI4SucTm4qViX+p9LSUvT6xv+rSwjRtJ0+s3hexWJ6nvB14K1cWPoGB9rc6bEYhBCuU+fHUm+++Sbg+Cvnww8/JCAgoPI9m83GunXr6Nixo+sjFEL4NP3hFUzTLua0egBwkWeCCIzhZJqezBJZ40YIX1Dn5GbWrFmAo+dmzpw5VR5B6fV64uPjmTNnjusjFEL4NFP6Nm7VruFne4jHYggNkBIMQviSOic3SUlJAAwePJivv/6a4OBgtwUlhGg+VEWZANj9Qj0WQ7wum6e1n9Nlfyhc/IbH4hBCuIbTs6XWrFnjjjiEEM2UrsRRegH/cI/FEKUv5RbtdxSkWQBJboRo6uQBsxDCo4yVdaU8l9wYzpR9MNnywFbusTiEEK4hyY0QwqP+qivV+Av4VcYQFIFdUaFGgeIsj8UhhHANSW6EEB4VaM8FwOSBulIVQswmsjkzA7Qw02NxCCFcQ5IbIYTnlJXgTzEA5rAYj4UR6q8nSzE7XkjxTCGavDoNKN61a1edD9i9e/d6ByOEaF5KFC19Sj4kVJXH0uAwj8UR6m9gH2bakUxZfjo6j0UihHCFOiU3PXv2RKVSoSjKOZdHt9lsLglMCOH7sorKKMBEqdofs5/nUgqzn7ay56YoO/VMpSkhRFNVp8dSSUlJHD16lKSkJBYvXkxCQgLvvvsu27dvZ/v27bz77ru0adOGxYsXuzteIYQPqVg0L9ik90hdqQoqlYr3DHdwYekbnEy42WNxCCFco07JTatWrSq/pk2bxptvvsl9991H9+7d6d69O/fddx+zZ8/mhRdecDqAd955h/j4eIxGI/369WPLli1nbZ+Tk8ODDz5IdHQ0BoOB9u3bs3z5cqfPK4TwvPKj65im/YBR2nWeDoWygBacVMLJLJWhiEI0dU4v4rd7924SEhKqbU9ISGDv3r1OHeuLL75gwoQJzJkzh379+jF79myGDh3KgQMHiIioPi3UarVy+eWXExERwVdffUVsbCx//vknQUFBzl6GEMILqFN2cqt2Des92GtToaJwZ1ZhqYcjEUI0lNN/onTq1Inp06djtf5Vg8VqtTJ9+nQ6derk1LFmzpzJPffcw7hx4+jcuTNz5szBZDIxb968GtvPmzePrKwslixZwsCBA4mPj+eSSy6hR48etZ6jtLSUvLy8Kl9CCO+gnJmZVGbwXF2pCh11aUzUfk6LPe95OhQhRAM5ndzMmTOHFStW0KJFC4YMGcKQIUNo0aIFK1ascKpwptVqZdu2bQwZMuSvYNRqhgwZwqZNm2rcZ+nSpfTv358HH3yQyMhIunbtyrRp0846iHn69OlYLJbKr7i4uLpfrBDCrSrqStn8PDdTqkKcLp/x2u9ok7zU06EIIRrI6cdSffv25ejRo3z66afs378fgFGjRnHrrbfi7+9f5+NkZmZis9mIjKy6cFdkZGTlcf/p6NGjrF69mtGjR7N8+XIOHz7MAw88QFlZGZMnT65xn0mTJjFhwoTK13l5eZLgCOEldCWnAVD5ez650Zodj8L9rLJCsRBNndPJDYC/vz/33nuvq2M5J7vdTkREBO+//z4ajYbevXuTnJzMq6++WmtyYzAYMBgMjRypEKIuDFZH6QWNB+tKVTCeKf/gZy+Acito9R6OSAhRX/WaFvDJJ59w4YUXEhMTw59//gnArFmz+Pbbb+t8jLCwMDQaDWlpaVW2p6WlERUVVeM+0dHRtG/fHo1GU7mtU6dOpKamVhkDJIRoGirqShk9WFeqQkBQODblzMDmotOeDUYI0SBOJzfvvfceEyZMYNiwYWRnZ1eOdwkODmb27Nl1Po5er6d3794kJiZWbrPb7SQmJtK/f/8a9xk4cCCHDx/GbrdXbjt48CDR0dHo9fJXlhBNjdmeA4BfULRnAwFCAoxkISUYhPAFTic3b731Fh988AH/+c9/0Gr/eqrVp08fdu/e7dSxJkyYwAcffMDHH3/Mvn37uP/++yksLGTcuHEAjBkzhkmTJlW2v//++8nKyuLRRx/l4MGDLFu2jGnTpvHggw86exlCCC8wWPkvF5fOwj8i3tOhEBqg57TUlxLCJzg95iYpKYlevXpV224wGCgsLHTqWKNGjSIjI4PnnnuO1NRUevbsyY8//lg5yPj48eOo1X/lX3FxcaxYsYLHH3+c7t27Exsby6OPPsrTTz/t7GUIITystNxGaqkeiCTMUvfJCO4S6m9g75nkpjw/o34DEoUQXsHpf78JCQns2LGDVq1aVdn+448/Or3ODcBDDz3EQw89VON7a9eurbatf//+/Prrr06fRwjhXbILywDQqFWYjZ4vVWnx0/Ef2z2Ulan4utUwIs+9ixDCSzmd3EyYMIEHH3yQkpISFEVhy5YtfP7550yfPp0PP/zQHTEKIXxQ4bEtTNd+wJ/6tqjVwz0dDmq1igJTCzILrJwuUUlyI0QT5nRyc/fdd+Pn58czzzxDUVERt956KzExMbzxxhv83//9nztiFEL4oPKUvdyiXcNWda6nQ6kU4q8ns8BaWdBTCNE01eux8ujRoxk9ejRFRUUUFBTUWAdKCCHOpjw/HYBiXbCHI/lLL/0Jrtf+gHnXHmgnY/mEaKqcni01depUVq9eDYDJZKpMbAoLC5k6daproxNC+CxbgaP0gtXo+bpSFdppMhiv/Z7I48s8HYoQogGcTm6ef/55hg0bxsyZM6tsLygoYMqUKS4LTAjh29RnFsqzGUM9HMnfBDjKQOhLpQSDEE1ZvVYoXrBgAdOmTWPcuHGyMrAQol60Z+pK4QV1pSpoAx090cYzKycLIZqmeiU3gwcPZvPmzWzevJlBgwaRnp7u6riEED7OeKZApdYL6kpVqKwvZSsAW5mHoxFC1JfTyY1K5ai90qZNG3799VfMZjO9e/dm69atLg9OCOG7TOU5AOjM3jMhwST1pYTwCU4nN4qiVP6/2Wxm+fLlXHfddVx77bWujEsI4ePuMr3BRaWz0Mb08HQolUIDjGQR6HhRmOnZYIQQ9eb0VPD58+djsVgqX6vVat5880169erFunXrXBqcEMJ3JRdpyVIiCbYEejqUSiH+erIUM+GqPCiS5EaIpsrp5Gbs2LE1bh83blxlwUshhDgbm10hu8gxGSHEX+/haP4S6q9nVNnjlKFjXdyA+g1KFEJ4XJ2SmzfffJN7770Xo9HIm2++WWs7lUrFww8/7LLghBC+KS95P9M175OkRBNsGubpcCoFmfQkKdEA5Foh2PMlr4QQ9VCn5GbWrFmMHj0ao9HIrFmzam0nyY0Qoi6KUw/wf9q17CMBncZ7+kf0WjWBRi35JeWcLrQS7EW9SkKIuqtTcpOUlFTj/wshRH0U5ziWjyjQWM7RsvFdYjxCt/L1qHeegsvv8XQ4Qoh68J4/mYQQzUZZniO5KdR6T12pCt21x7lPuwxT0gpPhyKEqKc69dxMmDChzgf8Z1kGIYT4p8q6UgbvqStVwWYKgwJQF8s6N0I0VXVKbrZv316ng1Us8CeEEGejOjPN2ubnRXWlzlCZHOUgdCWS3AjRVNUpuVmzZo274xBCNCPaYu+rK1Whor6UwSr1pYRoqmTMjRCi0enPJA4aL0xu9BZHrSuTLU/qSwnRRDm9iB/A1q1bWbRoEcePH69WFfzrr792SWBCCN/1YugM9h9N4okWAzwdSjWmoAjsigq1SoGiLAiM9HRIQggnOd1zs3DhQgYMGMC+ffv45ptvKCsr448//mD16tVVyjIIIURtThVpOKlEYAnyvtlSoQF+ZBPgeCElGIRokpxObqZNm8asWbP47rvv0Ov1vPHGG+zfv5+bb76Zli1buiNGIYSPySo8U3rB5H2L5AX76/k/67Nco38fwjp4OhwhRD04ndwcOXKEESNGAKDX6yksLESlUvH444/z/vvvuzxAIYRvUfLT+FfJmzyu/dKr6kpVCPXXc0hpwf4iM4pa4+lwhBD14HRyExwcTH5+PgCxsbHs2bMHgJycHIqKilwbnRDC5xSfPs5N6rWM0qwlNMD7kpuKhKu03E6R1ebhaIQQ9eH0gOKLL76YlStX0q1bN2666SYeffRRVq9ezcqVK7nsssvcEaMQwocUnE7FBGRjJkpfrzkNbmXSa7hUt5sLlF0U7yrG//wbPR2SEMJJTn+yvP3225SUlADwn//8B51Ox8aNG7nhhht45plnXB6gEMK3FOekAZCvDvJsILVQqVRcqD/MnbZlZB4JBkluhGhynE5uQkL+Wi5drVYzceJElwYkhPBt1nxHXakiXZBnAzmLUkMIFIG9IMPToQgh6qHefcLp6emkp6djt9urbO/evXuDgxJC+C5bvmN6dakX1pWqYPMLhSJQFUkJBiGaIqeTm23btjF27Fj27duHoihV3lOpVNhsMgBPCHEWhY7ekHIvTm4whcFp0Ep9KSGaJKeTmzvvvJP27dszd+5cIiMjpVimEMIpmjMJg2LyvtILFTSBjhIMBmuWhyMRQtSH08nN0aNHWbx4MW3btnVHPEIIHzc/ejLr0vZxRwvvfYRtMDuSG2N5HthtIOvdCNGkOL3OzWWXXcbOnTvdEYsQohlIK1ZzUgnHP8h7e278LI56UmrO1JcSQjQpTvfcfPjhh4wdO5Y9e/bQtWtXdDpdlfdHjhzpsuCEEL7n9JnSC8FeWHqhQnCgH8NKpxMbE8uHJi8eGySEqJHTyc2mTZvYsGEDP/zwQ7X3ZECxEOKsyku5N/t1jmtNhPn19nQ0tQrxN7BPaUVxiUkeSQnRBDn9WOrhhx/mtttuIyUlBbvdXuVLEhshxFkVZjK8PJE7NcsJDvT3dDS1qijBUNHLJIRoWpzuuTl9+jSPP/44kZGR7ohHCOHDrHlp6IFsAgnxN3g6nFqF+Ou5Qv0b55cfoOygDl37Sz0dkhDCCU733Fx//fWsWbPGHbEIIXxcQZaj9EKWYsbipztHa88J8tMxSLOLe7TLsR7d4OlwhBBOcrrnpn379kyaNIn169fTrVu3agOKH3nkEZcFJ4TwLRV1pfI0QajV3rtGllqtokgbBAqU5qXjvQ/QhBA1qddsqYCAAH7++Wd+/vnnKu+pVCpJboQQtSrNddSVKtQGeTaQOijVh0Ap2AsyPR2KEMJJTiU3iqKwdu1aIiIi8PPzc1dMQggfVV7gSG5KdMEejuTcyv0cyQ1FktwI0dQ4NeZGURTatWvHyZMn3RWPEMKXnekFKfdrAmvHnCkPoS2W5EaIpsap5EatVtOuXTtOn5ZickII5/0Y9zgDS95gT/QNng7lnNQBjuRGb832cCRCCGc5PVtqxowZPPnkk+zZs8cd8QghfFhaiZpkwjGaIzwdyjnpzI7lLoxluWC3ezgaIYQznB5QPGbMGIqKiujRowd6vb7a2JusLKnDIoSoWdaZRfEqFsnzZsagSEaUTqN7xzZMV3nvzC4hRHVOJzezZ892QxhCiObgulOv00OrIlL/jKdDOafgAD/+UOIJLLWAJDdCNClOJzdjx451RxxCCF9XXsoVRctAC5tNUzwdzTmFnllBOUtKMAjR5Did3ADYbDaWLFnCvn37AOjSpQsjR45Eo5ECc0KIWhSemSmlqAkMCvNwMOcW7K/jGvV6+uYdh5MB0MJ7C30KIapyOrk5fPgww4cPJzk5mQ4dOgAwffp04uLiWLZsGW3atHF5kEKIps9ekIEayMJMaKDR0+GcU6i/geGaLQxVtmI/NRi1JDdCNBlOz5Z65JFHaNOmDSdOnOD333/n999/5/jx4yQkJMjqxEKIWhVmO0ovnFYCCTZ5/4DiYH8dp5VA4K+VlYUQTYPTPTc///wzv/76KyEhfy3CFRoayowZMxg4cKBLgxNC+I7CnDQCgVyVBb3W6b+rGp1Bq6FAEwSANS8dWZNdiKbD6U8Yg8FAfn5+te0FBQXo9d7/15gQwjP+qivl/aUXKpTqHbGW52d4OBIhhDOcTm6uuuoq7r33XjZv3oyiKCiKwq+//sr48eMZOXKkO2IUQviA8jxHclOsbzrJTZkx1PE/hZLcCNGUOJ3cvPnmm7Rp04b+/ftjNBoxGo0MHDiQtm3b8sYbb7gjRiGED/it1T0MKHmTNWGjPR1KnSln6ktpiqXkjBBNidNjboKCgvj22285dOgQ+/fvB6BTp060bdvW5cEJIXxHZgmcIgy1OdrTodSZEhABaWAoleKZQjQl9VrnBqBdu3a0a9fOlbEIIXxYVmEZACEBTWdsnj24NcNLp3F592487ulghBB15nRyY7PZ+Oijj0hMTCQ9PR37PwrKrV692mXBCSF8x4VJs4nQFhGgfcjTodSZJTCQvUo8HcrMng5FCOEEp8fcPProozz66KPYbDa6du1Kjx49qnzVxzvvvEN8fDxGo5F+/fqxZcuWOu23cOFCVCoV1157bb3OK4RoPP2zlzJe+x2hunJPh1JnwWcKfJ6WEgxCNClO99wsXLiQRYsWMXz4cJcE8MUXXzBhwgTmzJlDv379mD17NkOHDuXAgQNERETUut+xY8d44oknuOiii1wShxDCjUoL8FOKATCFNp0xN6H+em5Qr+Oi9BRIeQKiu3s6JCFEHTjdc6PX6106eHjmzJncc889jBs3js6dOzNnzhxMJhPz5s2rdR+bzcbo0aOZMmUKrVu3dlksQgg3KXRMAy9SDARZQs7R2HuEBhgYqdnItSXfQupuT4cjhKgjp5Obf/3rX7zxxhsoitLgk1utVrZt28aQIUP+CkitZsiQIWzatKnW/aZOnUpERAR33XXXOc9RWlpKXl5elS8hRONS8h2lFzIUC2Fm768rVSEsQE8GQQAoBWmeDUYIUWdOP5Zav349a9as4YcffqBLly7odLoq73/99dd1PlZmZiY2m43IyMgq2yMjIyunmdd0/rlz57Jjx446nWP69OlMmTKlzjEJIVyvKOsU/kAGQXT1bzqzpcICDGQqFgCsOakYPByPEKJu6rXOzXXXXeeOWM4pPz+f22+/nQ8++ICwsLA67TNp0iQmTJhQ+TovL4+4uDh3hSiEqEFhdgr+QLY6CKNO4+lw6syo05CncayobM2V5EaIpsLp5Gb+/PkuO3lYWBgajYa0tKrdvWlpaURFRVVrf+TIEY4dO8bVV19dua1iKrpWq+XAgQO0adOmyj4GgwGDQT6ShPAka3YqAEXaUA9H4rxSYziUgj1fHksJ0VR4tDSvXq+nd+/eJCYmVm6z2+0kJibSv3//au07duzI7t272bFjR+XXyJEjGTx4MDt27JAeGSG81I7Wd9O/5C2WB9/m6VCcZjeFA6AukvpSQjQVdeq5ufLKK3n++ee54IILztouPz+fd999l4CAAB588ME6BTBhwgTGjh1Lnz596Nu3L7Nnz6awsJBx48YBMGbMGGJjY5k+fTpGo5GuXbtW2T8oKAig2nYhhPfIKFJIIZReQdV7ZL2dKjACskFfLMmNEE1FnZKbm266iRtuuAGLxcLVV19Nnz59iImJwWg0kp2dzd69e1m/fj3Lly9nxIgRvPrqq3UOYNSoUWRkZPDcc8+RmppKz549+fHHHysHGR8/fhy12qMdTEKIBsosKAUcA3SbGiU4geGHpnFV75484OlghBB1olLqOKe7tLSUL7/8ki+++IL169eTm5vrOIBKRefOnRk6dCh33XUXnTp1cmvADZWXl4fFYiE3NxezWZZUF6Ix/PLWXfyRVoJ24EPcPaz6I2dv9mbiIWauPMioPnG8fKMs4ieEpzjz+7vOA4oNBgO33XYbt93meGaem5tLcXExoaGh1aaDCyFEJUXhgtPfcpG2jCV+D3s6GqdV9DZV9D4JIbxfvauCWywWLBaLK2MRQviikhx0OCqCB4Q0ndILFcIC9FyvXseg1BQ4NQFieno6JCHEOchgFiGEexU4Si/kKiZCgpreo+CwQANXaX5lZMm3kLrL0+EIIepAkhshhFtVlC3IUIIIb4IDisMDDGQoQcBfZSSEEN5NkhshhFsVZ6UAkImF8MCml9yEBRjI4EwJhjxJboRoCiS5EUK4VVH2KQCyVcFNqvRCBT+9hjy1owRDWU6Kh6MRQtSF08nN2LFjWbdunTtiEUL4IGu2IyEo1IV4OJL6s/o5atlJCQYhmgank5vc3FyGDBlCu3btmDZtGsnJye6ISwjhI3a0e5ALSt7ix6BbPB1KvdmkBIMQTYrTyc2SJUtITk7m/vvv54svviA+Pp5hw4bx1VdfUVZW5o4YhRBNWEaRQiqhaC1Nbxp4BVWAY8V0fUmmhyMRQtRFvcbchIeHM2HCBHbu3MnmzZtp27Ytt99+OzExMTz++OMcOnTI1XEKIZqoytILgXoPR9IAQa0YVjqdeT0XeToSIUQdNGhAcUpKCitXrmTlypVoNBqGDx/O7t276dy5M7NmzXJVjEKIJmzAgRlM0n5KnKHI06HUW7A5gH1KK/60Nr11eoRojpxObsrKyli8eDFXXXUVrVq14ssvv+Sxxx7j1KlTfPzxx6xatYpFixYxdepUd8QrhGhK7Db6nl7CfdplhPk1vZlSFcICpQSDEE2J0+UXoqOjsdvt3HLLLWzZsoWePXtWazN48GCCgoJcEJ4QokkrykKDHbuiIiAkytPR1Fv4mRIMg1NSIPkxiD3P0yEJIc7C6eRm1qxZ3HTTTRiNxlrbBAUFkZSU1KDAhBA+4MzqxFkEEmYxeTiY+gsLMDBM8xuXF2+DlMGS3Ajh5Zx+LLVmzZoaZ0UVFhZy5513uiQoIYRv+Kv0gqWyunZTFBZgIEM5M97mTK0sIYT3cjq5+fjjjykuLq62vbi4mAULFrgkKCGEbyjNSQUgs6knN4EGMggCoCxXVikWwtvV+bFUXl4eiqKgKAr5+flVHkvZbDaWL19ORESEW4IUQjRNRVmnMOIoveBvcPopuNfw12vIVQcBjvpSOs+GI4Q4hzp/2gQFBaFSqVCpVLRv377a+yqViilTprg0OCFE02Y908tRqG+6pRfA8flWagwHq1QGF6IpqHNys2bNGhRF4dJLL2Xx4sWEhPz1YaXX62nVqhUxMTFuCVII0TTt7PAY12zrRacWwTTd4gsOdpMjuVEVSgkGIbxdnZObSy65BICkpCRatmyJSqVyW1BCCN+QXqSQRgjdzZGeDqXBVAGRkAP6EkluhPB2dUpudu3aRdeuXVGr1eTm5rJ79+5a23bv3t1lwQkhmrbM/DOlF5rwYOIKquA4rjwyg+sv6sm9igLyB54QXqtOyU3Pnj1JTU0lIiKCnj17olKpUBSlWjuVSoXNZnN5kEKIpmngvhcI0JZTZnjM06E0WEigP/uVlhy3BkhiI4SXq1Nyk5SURHh4eOX/CyHEOdnK6Ju1lL5a+CLgKU9H02AVvU+Z+VYPRyKEOJc6JTetWrWq8f+FEKJWZwbelikaAoOb/jIR4YEGrlevY8ipU3DyUWjRx9MhCSFqUa9F/JYtW1b5+qmnniIoKIgBAwbw559/ujQ4IUQTdmZ14kwshAX6eTiYhgsLMHCFZhvDi5fCqe2eDkcIcRZOJzfTpk3Dz8/xQbVp0ybefvttXnnlFcLCwnj88cddHqAQook6U6YgUzETFqD3cDANFxagJ7OiBINMBxfCqzm9ZOiJEydo27YtAEuWLOHGG2/k3nvvZeDAgQwaNMjV8QkhmihrTgp6IEMJolVg058tFRZoIEMJAqA8L9X5D08hRKNxuucmICCA06dPA/DTTz9x+eWXA2A0GmusOSWEaJ6Ksk8BcFoVRGATLr1QIdCgJbuiBENuqmeDEUKcldOfOJdffjl33303vXr14uDBgwwfPhyAP/74g/j4eFfHJ4RooqxnimYW6UJ9YtFPlUqF1RgOZVKCQQhv53TPzTvvvEP//v3JyMhg8eLFhIaGArBt2zZuuaWpL7AuhHCVnZ2fpG/JO6yy3ODpUFzGZnIsiaGWMTdCeDWne26CgoJ4++23q22XoplCiL/LKFJIJ5hu5qY/DbyCOiACckFXkgmySrEQXqteD8JzcnLYsmUL6enp2O32yu0qlYrbb7/dZcEJIZquzALfKb1QQR3UgiuOvsxNF5/HPZ4ORghRK6eTm++++47Ro0dTUFCA2Wyu8ixdkhshRIUL/5iMn1ah2G+Cp0NxmRCziYNKHCetJum1EcKLOT3m5l//+hd33nknBQUF5OTkkJ2dXfmVlZXljhiFEE2NtYjzspZxj3Y5IQFGT0fjMpUlGAqkBIMQ3szp5CY5OZlHHnkEk8nkjniEEL6g0LGAX7Gix2IJ8XAwrhMWYOBa9XquSp4FJ7Z4OhwhRC2cTm6GDh3K1q1b3RGLEMJXVK5ObCEs0Ld6bi7T/M6woqVw8jdPhyOEqIXTY25GjBjBk08+yd69e+nWrRs6na7K+yNHjnRZcEKIJupMXakMLIQHNv3SCxXCA/XsVMIcL3JPejYYIUStnE5u7rnHMUdg6tSp1d5TqVTYbLaGRyWEaNLKck6hA9KVYFr70GypsAADpxTH2l62nONoPByPEKJmTic3f5/6LYQQNSnJPIYOSCEMi5/unO2bCoufjjSVo+fGln1SkhshvJTTY27+rqSkxFVxCCF8SHm245FNrj7KJ0ovVFCpVBQZYxz/n5fs4WiEELVxOrmx2Wy88MILxMbGEhAQwNGjRwF49tlnmTt3rssDFEI0Pb/3fpl+JW/zq/kKT4ficmWBjuRGV5wBZfIHnhDeyOnk5qWXXuKjjz7ilVdeQa//a6Bg165d+fDDD10anBCiacooLCeNEPzMYZ4OxeX8AkMpVM6MI5LeGyG8ktPJzYIFC3j//fcZPXo0Gs1fT5x79OjB/v37XRqcEKJpOpXr6NGIsvh5OBLXiwoyMdL6Iu/2S4SQ1p4ORwhRA6cHFCcnJ9O2bdtq2+12O2VlZS4JSgjRhOUmc+nup9BpLaiCnvF0NC4XYzFyRIklqUAnJRiE8FJO99x07tyZX375pdr2r776il69erkkKCFEE5Z1lJ55axih/pVoH+y5iQlyXFNKroy3EcJbOd1z89xzzzF27FiSk5Ox2+18/fXXHDhwgAULFvD999+7I0YhRFNyZnG7U0oo0UG+szpxheggI+epDnJj2v9gy6XQV+qDC+FtnO65ueaaa/juu+9YtWoV/v7+PPfcc+zbt4/vvvuOyy+/3B0xCiGaECXnOADJSjgxvthzY/EjQZXKtWXLUQ4s93Q4QogaON1zA3DRRRexcuVKV8cihPAB1qzjGHD03ERZfK/nJspi5BSOVYrt2SdkIT8hvJDTPTetW7fm9OnT1bbn5OTQurXMHBCiuSvLcvTc5OojMep871e/UaehyBgNgCrvJCiKhyMSQvyT08nNsWPHaqwfVVpaSnKyrPkgRHOnOjPmxhoY6+FI3EcV5Lg2dXkxFGd7OBohxD/V+bHU0qVLK/9/xYoVWCyWytc2m43ExETi4+NdGpwQoolRFMfKvQCWOM/G4kbhQWYyTlsIV+VC7gkwhXg6JCHE39Q5ubn22msBR22VsWPHVnlPp9MRHx/P66+/7tLghBBNjErF7N4rWPzz74wIi/d0NG4TYzGSrISeSW5OQnQPT4ckhPibOic3FdXAExIS+O233wgL871l1YUQDZecayWNECKDAjwdittEB/lxSgmjJ0chVx7HC+FtnB5zk5SUJImNEKJWKTmOxe2ig3xvGniFaIuRyWVjGRf5paxzI4QXqtdU8MTERBITE0lPT6/s0akwb948lwQmhGiC/viG+zI+IEbdgxhLf09H4zaxQX5kEMzhfK2UYBDCCzmd3EyZMoWpU6fSp08foqOjUck/bCHEGcqJ37jMtoEj6iDf7rk5c22puSXY7QpqtXwOCuFNnH4sNWfOHD766CM2b97MkiVL+Oabb6p81cc777xDfHw8RqORfv36sWXLllrbfvDBB1x00UUEBwcTHBzMkCFDztpeCNF4Sk871rg5pYQRGWjwcDTuExloIEKVyzOqeZQuvs/T4Qgh/sHp5MZqtTJgwACXBfDFF18wYcIEJk+ezO+//06PHj0YOnQo6enpNbZfu3Ytt9xyC2vWrGHTpk3ExcVxxRVXyBo7QngBW7YjuSn0i0arcfrjpcnQatSEBRgYq12J8Y9FYCvzdEhCiL9x+tPn7rvv5rPPPnNZADNnzuSee+5h3LhxdO7cmTlz5mAymWodu/Ppp5/ywAMP0LNnTzp27MiHH36I3W4nMTHRZTEJIepHm+/4I8Pmwwv4VTAGRVCq6FChQN4pT4cjhPgbp8fclJSU8P7777Nq1Sq6d++OTqer8v7MmTPrfCyr1cq2bduYNGlS5Ta1Ws2QIUPYtGlTnY5RVFREWVkZISE1L6JVWlpKaWlp5eu8vLw6xyeEcEJZCYbSTAC0Ib67gF+F6CB/UtJCiFelOda6CW7l6ZCEEGc4ndzs2rWLnj17ArBnz54q7zk7uDgzMxObzUZkZGSV7ZGRkezfv79Ox3j66aeJiYlhyJAhNb4/ffp0pkyZ4lRcQoh6yHP02hQqBizBER4Oxv2iLUZOKaHEcya5EUJ4DaeTmzVr1rgjjnqZMWMGCxcuZO3atRiNNVcfnjRpEhMmTKh8nZeXR1yc7/9VKUSjK0jHhoZTShjRQSZPR+N20UF+nOLMml95ktwI4U3qtc6Nq4SFhaHRaEhLS6uyPS0tjaioqLPu+9prrzFjxozKx2O1MRgMGAy+O2tDCK/Rqj83hS3hyMkUXg6q+Y8NXxJjMXJQCXW8kJ4bIbxKnZOb66+/vk7tvv766zqfXK/X07t3bxITEytrV1UMDn7ooYdq3e+VV17hpZdeYsWKFfTp06fO5xNCuFdynpVcAoi2+O4aNxVigvxYq5zpuSmoeXanEMIz6pzc/L0KuCtNmDCBsWPH0qdPH/r27cvs2bMpLCxk3LhxAIwZM4bY2FimT58OwMsvv8xzzz3HZ599Rnx8PKmpqQAEBAQQEOC7tWyE8HZlNjvp+Y7B+9HNoOcmOsjId7b+rLCfz9Ybb/RsN7gQooo6/3ucP3++WwIYNWoUGRkZPPfcc6SmptKzZ09+/PHHykHGx48fR63+a8b6e++9h9Vq5cYbb6xynMmTJ/P888+7JUYhxLmVLv0Xb2n38qH9asL8ff9RcJi/gTKNH0U2hbQCK7E+vCKzEE2NV/yx8dBDD9X6GGrt2rVVXh87dsz9AQkhnKY9upqrNMdYYRrRLMoRqNUqoixGTmQVk5JTLMmNEF7Ed5cQFUI0HrsdXaFjITvF3HxmI0Zb/HhSu5DYH++C00c8HY4Q4gxJboQQDVeYgcZuxa6oMIQ2n+QmxmJkkHon0amrJbkRwotIciOEaLgzU6HTCCYyqPkM7I8O8uNUxYyp3BOeDUYIUUmSGyFEw535xZ6shBHdjMaexFiMJMtaN0J4HUluhBANdya5OaWEEmPx/WngFaItfpyS5EYIryPJjRCi4UoLKKsovdAMFvCrEB1k/NtjKUluhPAWXjEVXAjRtJVc+BSdV3RFRzn/1wwW8KsQG/RXz42ScxzfnwAvRNMgPTdCiAZLyS3Bjhq1zg+Ln87T4TQai5+ONG0MAPayYii3ejgiIQRIciOEcIGUnGIAYoKMqFTNp/9CpVJhCIrk/JJ32HzDZtDqPR2SEAJJboQQDZWfSqelI3hF+99mNZi4QozFjwyCSckt9XQoQogzJLkRQjRM2h6C8/ZznvpQs5oGXiH6TEKXklvs4UiEEBUkuRFCNEzaHwDsV+Ka1UypCtFBfnRXHeGyHY/Ctw96OhwhBDJbSgjRUGl7Adhvb0lcM5opVSHGYkSLjU55G+BwkqfDEUIgPTdCiIY603NzoBn33BxUWjhe5J+C4mzPBiSEkORGCNEAtjKUzAOA47FUTDMccxMb5EcBJpKVcMeG9H2eDUgIIcmNEKIBTh9GZbNSoBhJU0fQKtTk6YgaXcsQE1q1iv32M7036Xs9G5AQQpIbIUQDlORSFJjAPqUl8WGB6DTN7yNFr1WTEOb/16OpNEluhPC05vdJJIRwnZYX8EmfxYyyPke7yEBPR+Mx7SMDOWCPc7yQx1JCeJwkN0KIBjmYVoAdNe0jmm9y0y4ygANKHKVqP9A1vxljQngbSW6EEPWnKBxKzwegfWSAh4PxnPaRgexX4hgVvAhu/8bT4QjR7ElyI4Son5JclBktmZLxOHrKmvljqQAU1BzMKMJuVzwdjhDNniQ3Qoj6Sd+HqjSPKDJBYyC+Gc6UqtAq1B+dRkWR1UZyTjEokuAI4UmS3Agh6qei7II9jtbh/mib4UypCjqNmtZhAQxTbybkowvhu0c8HZIQzZqUXxBC1E/lysQtm/UjqQrtIgMoy1Djn3cEUs2eDkeIZq35/qklhGiYM4vV7bPH0T6i+Q4mrtA+MpADFWvdpO8Hu82zAQnRjElyI4RwnqJULlYnPTcO7SMDOK5EUooeyosh+5inQxKi2ZLkRgjhvNyTUJpLmaLhiBLTrKeBV2gXGYgdNYeVWMcGWcxPCI+R5EYI4bzyEorih7DJ3hmVVk+rUH9PR+RxrUJM6DXqv9WYkuRGCE+R5EYI4bywdmzo+y5jyibRJjwAjVrl6Yg8TqtR0zrcn/2VZRj+8GxAQjRjktwIIerlYJqsTPxP7SMD2au0ItO/HQS18nQ4QjRbktwIIZxXlMWhyuRGBhNXaB8ZwAZ7N15q+SFcPsXT4QjRbElyI4RwTrkVXmvH8weuIYQ82sk08EoVs8YqerWEEJ4hyY0QwjmZB8FejtpeRhaB0nPzNxX34nB6AbbycrAWejgiIZonSW6EEM45s3jffiUOg1ZDXEjzrSn1Ty1DTBi0au5QvkU1PRZW/MfTIQnRLElyI4RwTtI6AP6wx9M2QmZK/Z1GraJNeAB7lVaobSWw/3tZqVgID5DkRghRd+VW2LcUgJ/sfeSRVA3aRwawyd6ZEq0ZCjPg+CZPhyREsyPJjRCi7o6ugZJccjUhbLZ3op1MA6+mXWQg5WjZ6T/AsWHvt54NSIhmSJIbIXyB3Q6ljTBDZ8/XAKzVDMCOmg7Sc1NNxT1ZZuvn2LDvO8f3RwjRaCS5EaIpK8mFjW/BG91hegv4+Gr3nq/vPdjPv5cFRf0BWeOmJhX3ZHFOWxSDGfJT4ORvrj1JeSkc/RlsZX9t+3MTrH7RUfdLiGZOkhshmqKsJPjhaZjZGX56BnJPOLb7h1dtt/1T1/botOhDUt/JbCtPwE+nITbIz3XH9hEtgv3w02koLNdQ0GqIY6OrHk3ZbfDTs/ByPCwYCSe2/PXer+/Auldhdjf4/BY4stpRvV2IZkjr6QCEEE7a/j9Y+ggoZ2bhhHeECx6AdpdX/Ut+28fw3SPw67twy0IIinPJ6Q+mOpKldpEBqGWmVDVqtYq2EQHsTs5lb/S19GvZAzpf0/ADWwvhq7vg4A+O1/4RUJj+1/vdbobiHDj2CxxY7vjq/xBc8SKo5PskmhdJboRoagrSHYlNwiUw8FFoc2nNv7wiuzp+AabtgQ8udSQ4LXrX75zWQlj5HHS+hl0nHb1D7SLkkVRt2kcGsjs5l59LO9BvsAsSm/w0+OxmSNkBWiNc8w50uR7Uf+t87zzS8ZVxELb8F377EDa97ei5u2oWqDUNj0OIJkIeSwnR1Fw0AUZ/BWO+hbaX1f5XeYvecM9qiOji+Av/o+Hwx5L6nfPgCscvy6UPs3JvGgAXtw+r37GagYvaOe5Nxb1qkPT98OEQR2JjCoWx30G3G6smNn8X3h5GvA4j3waVGn7/GPYsbngcQjQh0nMjhLdTFMejqC7XgiEQRVHY49eXg78nczK7mBPZRZzMLkKjVnHPRa0Z1CHir32D4uCuFY7HGYdWwJdjoXg29BnnXAxnfjlmx1/F4U2F6DQqBneMOMdOzdfgjhFo1SoOpRdwNCWT1umJcHwjXDXb+UdE2ccg7ySEtIHRX0Jomypv/3wwg/fXHcFmV2gRbCIu2ESLYD/aR46k6w0BqP7cAN1uctm1CdEUSHIjhLdb85JjoOjOzzl9w5c8s3Q/P+xJrbHphsOnuahdGP8e3olO0WbHRkMg3PI5/DgRtrwP3z8OLS+AiE51O39JHhxaCcAK9UBAoX+bMMxGnQsuzjdZ/HT0bxPKL4cyWfXHKe799VEoL4Y+d0F0d+cO1uFKuOkjaHUh+IdWbt6Xkse05fv45VDm3xpnVdl1eLeWvHDNcEIrEiq73fFIUyPfO+HbJLkRwpv9NteR2AAHgi5i9JsbySywolWr6JsQQlywibgQP1oEm9idnMuCTcf45VAmw9/8hRvPa8GTQzsQYTY6xlsMe8VxzNC2dU9swDEw1VYKoe34/FggkMeVXaJcf60+5squUfxyKJNlB/K5t90Qx3o3e7+tW3KTvh+MFjBHO17/bUByen4Jr604wJfbTqIooNeoGdO/FV1jLZzMLuJElqM3b0tSFst3p7IlKYvp13fn8nZm+PpeR7J7zTsyyFj4NJWiNK+5gnl5eVgsFnJzczGbzZ4OR4jaHVrlGESq2Pgh/E7uP+GYVtw+MoDXb+pJtxaWarscP13Eyyv2s2xXCgCxQX4svn8AURZjzedQlHP/kvv0Zji0gvx+E+j2cx9UKtjy7yGEBxoadHm+Lj2/hH7TElEU2HFdLkE/3A/BCXD/RtCfpdho5mGYPwz0/o7xNX+b5ZaaW8IN720kOacYgKu6R/PU0I60DK1+vN0nc/nXlzs4mFYAwJMdMnng+GOoFDtc+gxc/KRrL1gIN3Pm97cMKBbCG6XugS/vAMXGj9rB3H/iMlQquO+S1ix96MIaExuAlqEm3rn1PBbfP4D4UBPJOcWMnbeF3KKy6o2LsuCjq+Do2trj2PE5HPoJgETNhQD0bhksiU0dRAQaOa9lMAA/WLuDwQzZSfDRCMeMt5pkH3OsX1OYDvoAR4JzRm5RGWPnbSE5p5j4UBNfPzCAt289r8bEBqBbCwtLH7qQ+y5pjUoFrx4IY5buHsebq1+E3V+58nKF8CqS3AjhbfJSHD021ny2qbrycME4YoNMfDW+P5OGdcKoO/eU3t6tgvnkrn5EBBo4kJbPXR//RknZP6pT//I6/LkeFlwL39wPucnVD9R6kGNhwAseZNGfjl+0Q+WRVJ0N7RIJwPcHChyDgf2C4dTvjtlPGQf/alhaAL/MhPcHQV4yhHWA278BUwgAJWU27vr4Nw6k5RNpNvDJXf0qE6ezMeo0TBrWiS/v609skB9v5l3C55ozq1gvud+xqrEQPkiSGyG8TUEa5WWlHCOGccWP0DLcwuL7B9C7VYhTh4kLMfHxnX0JNGrZ+mc2D332O+W2v9U4uvRZ6HEroMDOz+Ct3pD4Apw+8lcbczTcv5Hsi55nc5JjsKokN3VXca9+PZpFTth5cNcqCI53LLannPlebH4f3ugBiVOgONuxPtGYbyHAsZ5Quc3OQ5/9ztY/szEbtXx8Z1/iQs7yWKsGfeJDWHz/ANqE+/OfwlGsVvUDmxUW3uJ4DCaEj5HkRggvs8MWz8ji57m99ElaRMew6L7+tY+ZOYdO0Wbmjj0fvVbNqn3p/Pub3VQOs9MZ4br3HGvhtBzgmM3zy2vw1nnwxzd/HSQgnFX70rDZFTpFm2t9DCKqaxXqT8eoQGx2hVX70iGsLdydCLcthoiOjkZZR6AoE0Jaw3Xvw33rKgcSK4rCv7/Zzap96Ri0aj4cez4do+o3VjDKYuSL+/rTMTqIB4rHs4c2jmRq4a2Osg5C+BBJboTwBuVWSNnJxsOZjP7gV/aWhBAe14HP772A0ICGjW/pmxDC27f0Qq2CRVtP8tbqf/ylHtsbxi2HUZ861lKBarWQVvzhWIyu4jGLqLuK3psVf5yZvu8fBnHn/9XgwgmOBfce/A16jKqykvBbqw+zaOtJ1Cp4+9bz6JvgXO/dP4UFGPj83gvo3DKSsSVPsFNpy+7eL8jqxcLnyGwp0XzZyiF1l6PopGI/U2TwzD+HhEscv4QaJY4y+PIOyg+t4p7Sx1lT3o2BbUN5//Y++Btct1rDZ5uP8+9vdgPw3ujzGNYtunqjciucPgThnSpXwC2yltNr6kpKy+388OhFf62fI+pk76k8hr/5Cwatmu3PXY5JX7fv6Q+7U7j/098BmHZdN27t19JlMRWWlnPvJ1vZcDgTnUbN6zf3ZGSPGJcd32mHVkFpruPfoDkWYnqCToqyiqqc+f0t69yIZqlk+TPofp+Lpryoxvc3DfuBzt0tWPx0kLILUCCqu+vXBrHb4Jv7YP/32BQdZXYY0S2a12/uUaeBw864tV9LDqXnM3/DMR5ftIO4EBNdY/8x60qrh8guVTb9fCCD0nI7LUNMdIySelLO6hQdSFyIHyeyill3MIMru9aQVP7DnuRcHl+0A4A7Bya4NLEB8DdomTv2fCYs2sHy3ak88vl27Mk7uPb0B3DjfPALcun5AMg5Dkd/hmO/YLUp/NL1RQ6k5WMtt3P7ticILU6qbGpX67BHdkfb6gLHgpMdhoNGfl2JupOfFuH70vdRsu0zloWMYeXBPHYn53JzQTKPaovIVUwcUlpgQ42CCruiogQ9d36ThXrJT3SOMfOyfRZdshNRIruhOv9Ox1L2Bhf8krcWonz3GKo9iylTNNxf9ihtL7ia567q7LZq2/8Z3okjGYWsO5jBPQu28u2DAx2L/J3Fj2cepwztEolKFn5zmkqlYmjnKD5cn8SKP9LOmdyk55Vwz4KtlJTZuaR9OP8e3tEtcRl1Gt665TwiAveyYONRuv36JKhTUBZcg+qm+Y4xQA1lK4cDy7H/9iHqpJ//2qzouX/bCKw4VkpuoYsjBj9UQFt1MuH2XNQp2yBlGxlbv2bt0J5c3iWKIJO+4TGJZkEeSwnXyTkOZcWg1jqWd9foHUnA39bqaDRFWRRtW0jJb58QkrcXgEesD7HUPgCAGDLpEGzHv0U3WoQEYLPbKbMplNnsFFlt7DyRw9HMQgBmaN/nWs0GjCrHWjF2nT/qHqOg9zjnl9KvkPQLtiUPoMk9Trmi5qGyR+g5dAz3Xdza7QlEbnEZ1727gaMZhfSMC2LhvRfU2ku062QOt7z/K4VWG1+N70+f+IaN+WiufjuWxU1zNuGv17Dw3v61rlNUUmbj/97/lR0ncmgT7s83Dw50e5kLRVGY8/NRvl3xE5/rXyRYVYCiM6G64kXoc2f9eyu3zqd8zQy0hY7k2K6o+F1pxyZ7ZzbZO5Me3IduLUMx6TXoNGp0GhUatZoTWYWcPnmIyNyd9FYf4qDSgv/ZLkerVnFxGzOv5T6BX5dh+J1/u2sSMGeVlzoqrZeXOlbuLrc6Hmv7hzsKm9ZW0FQ0mDO/v70iuXnnnXd49dVXSU1NpUePHrz11lv07du31vZffvklzz77LMeOHaNdu3a8/PLLDB8+vE7nkuSm/pT8VHKP7SAnaTvlKXvQF5zkjdiZpBeWc7rAyoTcaQyxb6y2X742hHxTHH8MmE1EbGvaRQZg0iiur29jK6dw3wqy188nKnUNWsoBKFM0rLb3YoXlJuJ7XUbfhBA6x5jP+UsjLa+EX4+e5tejWWz+4xCDSlYzWrOKNuqUyjblnW9Ae/M858JM3o7mg0EAnFTCmFR+H9fdcCvXn9fCuettgKTMQq59ZwO5xWUM6RTBtOu7ERFYtQdnzf50Hvj0d4rLbPSIC+Lr+wegcVOPkq+z2RVueG8jO07kYNJreOfW86oVHk3PL+HfXztmRgWZdCx5YCDxYY33h8HXv5/kja8SeVn7Hheo9wGgtBmC6pq3wFyH8Ti2clDsFNnVrPgjlbw1bzE2bw6ZiplFtkH8aBhKly49uKB1CBe0DiXyHD2GeSVl7D2Vx+ajWfywJ4X9qfkMVW/hv/rZlW0yQvrg328Mpp43gCGgIZdfXUkuJce3kZqawm7LYI5nFfHn6UIm7r2OEPvpmmNWW3i+w1LCAg3EWIxcULqRqCA/LK16ogqOl8SngZpUcvPFF18wZswY5syZQ79+/Zg9ezZffvklBw4cICKietXhjRs3cvHFFzN9+nSuuuoqPvvsM15++WV+//13unbtes7zeTK5sdsVslOPkX9iD8WnT1Cekwx5KWiL09GV5aMrL+TNkH9z1B5JuU3h6tLvubHoC2wqLXaVlhKthRJDKDa/UPCPILfDjQS37ExMkB9mg9al40HySso4kJpP2dYFhB9bRnjRQYLsOdXa9Sl5j0wcf4X+S7uI2zSr0FGODhtaytGo/vrx6lQyj2KMqFXweuBnDLJvJie4O5oW5xHa9nz8W51XubZHXdmtJRzKKmNL0mn2/bGTaSfHVL632x7PhoAr0PW4mcHndaJ1eP0//MpsdhL3pbNwy5+UHF7HaM0qhqp/Y7ZyKxnd7uGG3i3oG1yI+tgvENUVwjuC9swsp4J0OLUd2l7OthM5PPvNHh46/QJZSiBLwu/jP9f1pVcdFmRztY2HMxkzbwvldoVAg5ZHh7Rj7IB4dBo1n285zjNL9mCzK1zULox3R59HoBTKbJD8kjIe+PR3fjmUiUat4qVru/J/fVtSZrPz8cZjvLHqEPml5WjVKhbc1ZcBbRppQPvfbD+ezbPf7KJv+pc8rV2IQVWG1RSN/sl91T9fbOWOFZfT96Gc3EbZ9s/5JvgOpp48j0KrDTOFDNbspKjNMG7o25bLOkWg09T/l/vRjAJ+2nmMnO3fckHeCi5W70J95vOlRGUkI+wCygf9h1adznf+sW5pPgV/7iTj8G+Un9iK+fQuIq3HAccfIBeWvlnZ9Av9VPqp92NVNJShrXy0Fqwq4KA9liusr1a2/VH/NB3VJwAoVhlJ92tHcVgXDHG9CG/fj4BWvep9P6opL6UgPYm0vBL+JJqM/FKy8goZvPtp9KWnMZblolWsaJVyNEo5GsrZr+vMG5EvYdJr8DdoGZsyDa3eAIHRaINiMYa0wBzVCktka9SmYI/XI2tSyU2/fv04//zzefvttwGw2+3ExcXx8MMPM3HixGrtR40aRWFhId9//33ltgsuuICePXsyZ86cc57PXclNfkkZh44dR530M+V5aSiFGaiLMtEXZ/C26X7+KAggLa+Ex1Sf86B2aa3HubZ0KjuUtgA8qFnCk7pFtba9oXQy25QOANxlWM3D6kXkaCMoNEZR5h8N5hi0lmg0fmZKWwzAEOjoArbnnsKWlUR5UR7lJfmU5Z/GnnUMfd4xLMUneED1DHvyHWuZTNR+xnit417bFBXHlChO6FuTE9ie8uA2ZMcOJshiISzQQMiZ5+FWm52ycjtWm52C3EzyTx2mJPMYy8v7kJRZRGZBKYv1k+mtPlTtmrI0YWSYu7Kl35sEm3QEm/REF/yBn72Q4twMrLnp2PLToCCNoKxdnCwLZFTJpMr939PNosgvhtKu/0f/AZeQ4Ia/fE/lFPPl1pMkbtvD0exyCnDcq7sDNvBM+TsA2FVarEGtwVqAsfAUAGNNb/NzluOxTrBRxYQru3Br35Ye7Q3ZcSKH577dw66TuQC0jQigb0IIn212fLDfcF4LZtzQrUG/lMRfymx2Ji7ezeLfTwIwul9LNidlcTjdUf+pRwsLU67pSs+4II/FaLMrfLb5TxavSGSq/S3yFRPPWKbRJcZMt1gLo/Y+gMGagz73CBp71bIea2w9GFf2NC1DTNxwXgtu6tOCmCDXz3pKyixkzZbtsPNzBhevJEHtWKpgUOnr5Pq15Pz4EG7UbaCl9QhqcxRaSwx+QRGUlRRSmpeJtTCb32NHk5xdzIHUPP51/AG6KtU/j07Yw9mvacsHEc/QIjSAViH+JFgUzIFm9FotOq0a/Zl/G9kFheRmZ3HKaiKzoJTjpwu55sQrtLIepL0qGYOq6r06ZI/lduNbtAwxERdi4obChfgHmtEGhKHxs6DzC0TvH4RGq6PYriXH1IqSMhtFxSWE/jEfJe8UuoIUTCWpWMrSCbVnoVYp/GTrzb1l/zpzFoV9hnH4qaw13seK71eFPwzj8FeV1th2l7ojL0TMIsriR6i/niuyPsVo9ENjjkQfEIbG4IdGb0JnMKIxhWAIa0lYA5ex+Kcmk9xYrVZMJhNfffUV1157beX2sWPHkpOTw7ffflttn5YtWzJhwgQee+yxym2TJ09myZIl7Ny5s1r70tJSSkv/+mbl5eURFxfn8uRm05HTTPvwM74zPFPtvZtKn+M3xTEo8AbNOh7QLSNHF06hPgKrKRJ7QBQqvyDUfmaKIs5DHxCCTqNCVZiJtjANu82KrayU8vxMbAXpUJiBrjiTD9U3cyBfT3ZRGRO1nzNe+12t8Y0sfYFdimMNk0c0XzNBV3tdmZtLn2WL0okYi5ErQ07Rz3gCY8teRLY5j/josAbP4knPK2Hfn6fIOPQbysltBOf8QUL5ERJUqahVCqlKMBeUvlPZfpF+Cn3VB2o8VrGip599Ht1bRdAvIYQrukTRoZFm9CiKwm/Hslm87STLdqcwsGwTd2hW0En9J0Gqwsp2dkXFESWGSWV3sY2O3Nw7jqeu7NDg9WtcxW5XWLT1BK+sOEBW4V8fgo9c2pbHL28vg4hdTFEUZq08yJt/W28o1F/PU1d24KbecW4bTO6s0wWlvPrDHn7b/jtH7I7HUsHksd04vrJNkWLgkBLLYSWWjeo+GLtezbXnJ9CnVXCj/dwcTM3j91/XUpa0kWlZl1Bc5lj5+W3dm1yl+bXW/TqUfEQpjj/IXtLO5VLNdo5qEjht7oISex6h7S6gfZuEao9rnVVSZiMpPZeUI7spOr4dbfoewvP3sbcsimfL7wRAhZ29hjtrTULW2boxpqzijziFvYY7MdWQhBQpBjapevB68HNEmg2EBhi4pHgVRlMg2sAwNDojKq0BtVaHRqujROVHliaMQquNwtJyWh1fjCo/FX1RGv6l6ZjLMglXMglT5fGj7XzGlz1eGcMBwx3VErYKG22deTnqNb59cGCD7t0/NZmp4JmZmdhsNiIjqy4MFhkZyf79+2vcJzU1tcb2qampNbafPn06U6ZMcU3AZxFhNqANiuGP8i4U60KxGkOw+YWjCgjnvtaXMjGqFVEWPyICh6HTvFzHo0YCXWp9d8iZ/xaWlpOacR5bk++jOONPynJOoMpLRl+Yisl6Gr29GKMljLByPUVWG/nqUP5UxVKi8sOq9sOq9afIPw57cGv0EW14tvUFtIyJwWJyz2OICLORiG6toVtrYBTgeAy240QK6Ye3kZv6J0O1kWQXlZFTZCUnL4xD9iIKNGYKdcGU6kMpN4ZBeAeiel7OtjbxHulZUKlU9E0IoW9CCM+P7MK2P3tzIH0sy9LzyUo5hi5zH3adH7rYnrSJi+GRWAvdYi0E+3vXjA+1WsX/9W3JsK7RzFp1kJ/+SOXRIe0Ydb5rpx8LB5VKxYQrOhAb7Mcbqw5xRZcoHr+8vWPZAS8SGmBgxk29yR7ejd3JuexOzmV/ciYPnXgRTVkRttD2BMe0pk2EmbYRgbzYKhg/feMvBtg+ykz7a0cCIxlVbmfPqVw2H80i+/CVrMiLw1iaQUBZJmZbLqVqI4UaCyU6C1cmhGC2hNIhKpCOEe/hHxPCQDc8ejXqNHSKDaFT7CXAJZXb2xaV0e10IcezijiVmc3mfTfiV3gCQ3k+BlsRRqUIk1KEVinHqvUnLtAPk06Ln17D+tKrMBoMKIExaINi8QtrSXBMGyKiWnCZUcdlVSLo4US0T1XbUmazk5ydQ9TpLN4uNZGaW0JWXhFbjl6DvuQ0JutpjLZ89IoVnWLFgJV8dSB+Os/29nq05+bUqVPExsayceNG+vfvX7n9qaee4ueff2bz5s3V9tHr9Xz88cfccsstldveffddpkyZQlpaWrX2jdVzI4QQQgj3aTI9N2FhYWg0mmpJSVpaGlFRNRfni4qKcqq9wWDAYPCO7n8hhBBCuJ9H+430ej29e/cmMTGxcpvdbicxMbFKT87f9e/fv0p7gJUrV9baXgghhBDNi8dXKJ4wYQJjx46lT58+9O3bl9mzZ1NYWMi4ceMAGDNmDLGxsUyfPh2ARx99lEsuuYTXX3+dESNGsHDhQrZu3cr777/vycsQQgghhJfweHIzatQoMjIyeO6550hNTaVnz578+OOPlYOGjx8/jvpvCx8NGDCAzz77jGeeeYZ///vftGvXjiVLltRpjRshhBBC+D6Pr3PT2GSFYiGEEKLpceb3t6zMJYQQQgifIsmNEEIIIXyKJDdCCCGE8CmS3AghhBDCp0hyI4QQQgifIsmNEEIIIXyKJDdCCCGE8CmS3AghhBDCp0hyI4QQQgif4vHyC42tYkHmvLw8D0cihBBCiLqq+L1dl8IKzS65yc/PByAuLs7DkQghhBDCWfn5+VgslrO2aXa1pex2O6dOnSIwMBCVSlXv4+Tl5REXF8eJEyekRlUdyP1yjtwv58j9co7cL+fI/XKOu+6Xoijk5+cTExNTpaB2TZpdz41araZFixYuO57ZbJYfdifI/XKO3C/nyP1yjtwv58j9co477te5emwqyIBiIYQQQvgUSW6EEEII4VMkuakng8HA5MmTMRgMng6lSZD75Ry5X86R++UcuV/OkfvlHG+4X81uQLEQQgghfJv03AghhBDCp0hyI4QQQgifIsmNEEIIIXyKJDdCCCGE8CmS3JyRlZXF6NGjMZvNBAUFcdddd1FQUHDWfUpKSnjwwQcJDQ0lICCAG264gbS0tCptHnnkEXr37o3BYKBnz57VjnHs2DFUKlW1r19//dWVl+dynrpfALt27eKiiy7CaDQSFxfHK6+84qrLcht33a/jx48zYsQITCYTERERPPnkk5SXl1e+v3bt2hp/vlJTU91ynfX1zjvvEB8fj9FopF+/fmzZsuWs7b/88ks6duyI0WikW7duLF++vMr7iqLw3HPPER0djZ+fH0OGDOHQoUNV2tTne+ItPHG/4uPjq/0czZgxw+XX5g6uvl9ff/01V1xxBaGhoahUKnbs2FHtGHX59+utPHG/Bg0aVO3na/z48fW/CEUoiqIoV155pdKjRw/l119/VX755Relbdu2yi233HLWfcaPH6/ExcUpiYmJytatW5ULLrhAGTBgQJU2Dz/8sPL2228rt99+u9KjR49qx0hKSlIAZdWqVUpKSkrll9VqdeXluZyn7ldubq4SGRmpjB49WtmzZ4/y+eefK35+fsp///tfV16ey7njfpWXlytdu3ZVhgwZomzfvl1Zvny5EhYWpkyaNKmyzZo1axRAOXDgQJWfL5vN5rZrddbChQsVvV6vzJs3T/njjz+Ue+65RwkKClLS0tJqbL9hwwZFo9Eor7zyirJ3717lmWeeUXQ6nbJ79+7KNjNmzFAsFouyZMkSZefOncrIkSOVhIQEpbi4uLJNfb4n3sBT96tVq1bK1KlTq/wcFRQUuP16G8od92vBggXKlClTlA8++EABlO3bt1c7Tl0+77yRp+7XJZdcotxzzz1Vfr5yc3PrfR2S3CiKsnfvXgVQfvvtt8ptP/zwg6JSqZTk5OQa98nJyVF0Op3y5ZdfVm7bt2+fAiibNm2q1n7y5MlnTW5q+mZ7K0/er3fffVcJDg5WSktLK7c9/fTTSocOHRpwRe7lrvu1fPlyRa1WK6mpqZVt3nvvPcVsNlfen4rkJjs72w1X5hp9+/ZVHnzwwcrXNptNiYmJUaZPn15j+5tvvlkZMWJElW39+vVT7rvvPkVRFMVutytRUVHKq6++Wvl+Tk6OYjAYlM8//1xRlPp9T7yFJ+6XojiSm1mzZrnwShqHq+/X39X2+e3s55038cT9UhRHcvPoo482KPa/k8dSwKZNmwgKCqJPnz6V24YMGYJarWbz5s017rNt2zbKysoYMmRI5baOHTvSsmVLNm3a5HQMI0eOJCIiggsvvJClS5c6fxGNyJP3a9OmTVx88cXo9frKbUOHDuXAgQNkZ2fX42rcz133a9OmTXTr1o3IyMjKNkOHDiUvL48//vijyvF69uxJdHQ0l19+ORs2bHDl5TWI1Wpl27ZtVa5TrVYzZMiQWn8uNm3aVKU9OK67on1SUhKpqalV2lgsFvr161fl3jn7PfEGnrpfFWbMmEFoaCi9evXi1VdfrfII1Bu5437Vhat/PzQWT92vCp9++ilhYWF07dqVSZMmUVRU5PQxKjS7wpk1SU1NJSIioso2rVZLSEhIrWMTUlNT0ev1BAUFVdkeGRnp1HiGgIAAXn/9dQYOHIharWbx4sVce+21LFmyhJEjRzp9LY3Bk/crNTWVhISEaseoeC84OLjOx2os7rpfqampVRKbivcr3gOIjo5mzpw59OnTh9LSUj788EMGDRrE5s2bOe+881xxeQ2SmZmJzWar8Tr2799f4z61Xfff70vFtrO1cfZ74g08db/AMR7uvPPOIyQkhI0bNzJp0iRSUlKYOXNmg6/LXdxxv+rCVZ93jc1T9wvg1ltvpVWrVsTExLBr1y6efvppDhw4wNdff+3cRZzh08nNxIkTefnll8/aZt++fY0UTc3CwsKYMGFC5evzzz+fU6dO8eqrrzZ6ctMU7pc3aQr3q0OHDnTo0KHy9YABAzhy5AizZs3ik08+8WBkoqn5++dU9+7d0ev13HfffUyfPl3KEogGu/feeyv/v1u3bkRHR3PZZZdx5MgR2rRp4/TxfDq5+de//sUdd9xx1jatW7cmKiqK9PT0KtvLy8vJysoiKiqqxv2ioqKwWq3k5ORUyc7T0tJq3aeu+vXrx8qVKxt0jPpoCvcrKiqq2oyDitcNve/O8vT9ioqKqjaLoS73om/fvqxfv/6scTeWsLAwNBpNjd/Ts92bs7Wv+G9aWhrR0dFV2lTMwKvP98QbeOp+1aRfv36Ul5dz7NixKgm0N3HH/aoLd/5+cCdP3a+a9OvXD4DDhw/XK7nx6TE34eHhdOzY8axfer2e/v37k5OTw7Zt2yr3Xb16NXa7vfIG/1Pv3r3R6XQkJiZWbjtw4ADHjx+nf//+DYp7x44dVT5kGktTuF/9+/dn3bp1lJWVVW5buXIlHTp0aPRHUp6+X/3792f37t1VfkmvXLkSs9lM586da43bUz9fNdHr9fTu3bvKddrtdhITE2v9uejfv3+V9uC47or2CQkJREVFVWmTl5fH5s2bq9w7Z78n3sBT96smO3bsQK1WV3u8503ccb/qwp2/H9zJU/erJhXTxev9WeWyoclN3JVXXqn06tVL2bx5s7J+/XqlXbt2VaaFnjx5UunQoYOyefPmym3jx49XWrZsqaxevVrZunWr0r9/f6V///5Vjnvo0CFl+/btyn333ae0b99e2b59u7J9+/bK2SwfffSR8tlnnyn79u1T9u3bp7z00kuKWq1W5s2b1zgXXk+eul85OTlKZGSkcvvttyt79uxRFi5cqJhMpiYxFdzV96tiKvgVV1yh7NixQ/nxxx+V8PDwKlPBZ82apSxZskQ5dOiQsnv3buXRRx9V1Gq1smrVqsa58DpYuHChYjAYlI8++kjZu3evcu+99ypBQUGVs8Buv/12ZeLEiZXtN2zYoGi1WuW1115T9u3bp0yePLnGqc1BQUHKt99+q+zatUu55pprapwKfrbvibfyxP3auHGjMmvWLGXHjh3KkSNHlP/9739KeHi4MmbMmMa9+Hpwx/06ffq0sn37dmXZsmUKoCxcuFDZvn27kpKSUtmmLp933sgT9+vw4cPK1KlTla1btypJSUnKt99+q7Ru3Vq5+OKL630dktyccfr0aeWWW25RAgICFLPZrIwbN07Jz8+vfL9iCtuaNWsqtxUXFysPPPCAEhwcrJhMJuW6666r8sOtKI7pbUC1r6SkJEVRHMlNp06dFJPJpJjNZqVv375Vpg96K0/dL0VRlJ07dyoXXnihYjAYlNjYWGXGjBnuvtwGc9f9OnbsmDJs2DDFz89PCQsLU/71r38pZWVlle+//PLLSps2bRSj0aiEhIQogwYNUlavXu3263XWW2+9pbRs2VLR6/VK3759lV9//bXyvUsuuUQZO3ZslfaLFi1S2rdvr+j1eqVLly7KsmXLqrxvt9uVZ599VomMjFQMBoNy2WWXKQcOHKjS5lzfE2/W2Pdr27ZtSr9+/RSLxaIYjUalU6dOyrRp05SSkhK3XqeruPp+zZ8/v8bPqcmTJ1e2qcu/X2/V2Pfr+PHjysUXX6yEhIQoBoNBadu2rfLkk082aJ0blaIoSv36fIQQQgghvI9Pj7kRQgghRPMjyY0QQgghfIokN0IIIYTwKZLcCCGEEMKnSHIjhBBCCJ8iyY0QQgghfIokN0IIIYTwKZLcCCGEEMKnSHIjhGjyDhw4QFRUFPn5+Q06zgUXXMDixYtdFJUQwlMkuRFCeJzNZmPAgAFcf/31Vbbn5uYSFxfHf/7zn7PuP2nSJB5++GECAwMbFMczzzzDxIkTsdvtDTqOEMKzpPyCEMIrHDx4kJ49e/LBBx8wevRoAMaMGcPOnTv57bff0Ov1Ne53/Phx2rZtS1JSErGxsQ2KwWazERsby9y5cxkxYkSDjiWE8BzpuRFCeIX27dszY8YMHn74YVJSUvj2229ZuHAhCxYsqDWxAVi0aBE9evSokth89NFHBAUF8f3339OhQwdMJhM33ngjRUVFfPzxx8THxxMcHMwjjzyCzWar3E+j0TB8+HAWLlzo1msVQriX1tMBCCFEhYcffphvvvmG22+/nd27d/Pcc8/Ro0ePs+7zyy+/0KdPn2rbi4qKePPNN1m4cCH5+flcf/31XHfddQQFBbF8+XKOHj3KDTfcwMCBAxk1alTlfn379mXGjBkuvzYhROOR5EYI4TVUKhXvvfcenTp1olu3bkycOPGc+/z55581JjdlZWW89957tGnTBoAbb7yRTz75hLS0NAICAujcuTODBw9mzZo1VZKbmJgYTpw4gd1uR62Wzm0hmiL5lyuE8Crz5s3DZDKRlJTEyZMnz9m+uLgYo9FYbbvJZKpMbAAiIyOJj48nICCgyrb09PQq+/n5+WG32yktLW3AVQghPEmSGyGE19i4cSOzZs3i+++/p2/fvtx1112ca85DWFgY2dnZ1bbrdLoqr1UqVY3b/jkzKisrC39/f/z8/Op5FUIIT5PkRgjhFYqKirjjjju4//77GTx4MHPnzmXLli3MmTPnrPv16tWLvXv3uiyOPXv20KtXL5cdTwjR+CS5EUJ4hUmTJqEoSuVg3vj4eF577TWeeuopjh07Vut+Q4cOZdOmTVVmPTXEL7/8whVXXOGSYwkhPEOSGyGEx/3888+88847zJ8/H5PJVLn9vvvuY8CAAWd9PDVs2DC0Wi2rVq1qcBzJycls3LiRcePGNfhYQgjPkUX8hBBN3jvvvMPSpUtZsWJFg47z9NNPk52dzfvvv++iyIQQniBTwYUQTd59991HTk4O+fn5DSrBEBERwYQJE1wYmRDCE6TnRgghhBA+RcbcCCGEEMKnSHIjhBBCCJ8iyY0QQgghfIokN0IIIYTwKZLcCCGEEMKnSHIjhBBCCJ8iyY0QQgghfIokN0IIIYTwKZLcCCGEEMKn/D9YKWm0moCKwQAAAABJRU5ErkJggg==\n"},"metadata":{}}]},{"cell_type":"markdown","source":["## Location of diffraction maxima"],"metadata":{"id":"Ielc9hQcoKID"}},{"cell_type":"markdown","source":["Maxima at $U_M/\\pi \\iff \\tan(U_M)=U_M$"],"metadata":{"id":"qOz6lO4vo7T7"}},{"cell_type":"code","source":["'''\n","Written by Pedro López García <821948@unizar.es>\n","'''\n","import numpy as np\n","\n","#Este bucle es para ir moviéndome por los sucesivos ceros\n","print(\"Número de máximo y coordenada (U/pi):\")\n","print(\"(primer máximo en U=0)\")\n","for n in range(1,20):\n"," x = (np.pi)*(2*n + 1)/2 - 0.001 #Este es el valor inicial del metodo de Newton-Raphson\n"," epsilon = 10e-7 #Pongo una tolerancia arbitraria para no hacer iteraciones innecesarias\n"," for i in range (1,100): #Aquí comienza el bucle de Newton con la funcion f(x) = tan(x) - x\n"," v = (np.tan(x) - x)/((np.tan(x))**2)\n"," if v <= epsilon: break #Como a es la diferencia entre cada iteracion, lo tomo como tolerancia-\n"," x = x - v #Metodo de Newton propiamente dicho\n"," x = x/(np.pi)\n"," print(n+1,x) #Imprime por pantalla numero del cero, valor y numero de iteraciones"],"metadata":{"id":"iMFqhTmkjWCz"},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":["## Plot dynamic figure (analytic)"],"metadata":{"id":"qGrtluxkT2Wf"}},{"cell_type":"code","source":["import matplotlib.pyplot as plt\n","import numpy as np\n","import ipywidgets as widgets\n","from ipywidgets import interactive\n","from ipywidgets import SelectionSlider\n","\n","def plot_function_with_sliders(f, labels, x_min, y_min,ref_x,max_y,value_scale):\n"," # Extract the parameter names from the function signature, excluding 'x'\n"," parameters = list(f.__code__.co_varnames)[1:f.__code__.co_argcount]\n","\n"," # Create sliders for each parameter\n"," # Define the base, min exponent, and max exponent for the slider\n"," sliders = {}\n"," i=0\n"," for param in parameters:\n"," #print(\"parameter=\",param)\n"," #print(\"[initial value, min, max, step]=\",value_scale[i])\n"," sliders[param] = widgets.FloatSlider(value=value_scale[i][0],\n"," min=value_scale[i][1],\n"," max=value_scale[i][2],\n"," step=value_scale[i][3],\n"," description=param,\n"," readout_format='.3f')\n"," i+=1\n","\n"," # Create sliders for x_max and y_max\n"," #print(\"xmax\")\n"," #print(\"[initial value, min, max, step]=\",value_scale[i])\n"," x_max_slider = widgets.FloatSlider(value=value_scale[i][0],\n"," min=value_scale[i][1],\n"," max=value_scale[i][2],\n"," step=value_scale[i][3],\n"," description='x scale',\n"," readout_format='.3f')\n"," #print(\"ymax\")\n"," #print(\"[initial value, min, max, step]=\",value_scale[i+1])\n"," y_max_slider = widgets.FloatSlider(value=value_scale[i+1][0],\n"," min=value_scale[i+1][1],\n"," max=value_scale[i+1][2],\n"," step=value_scale[i+1][3],\n"," description='I scale',\n"," readout_format='.3f')\n","\n"," # Define a function to update the plot\n"," def update_plot(**kwargs):\n"," plt.figure(figsize=(8, 6))\n"," plt.xlabel(labels[0])\n"," plt.ylabel(labels[1])\n","\n"," x = np.linspace(x_min-x_max_slider.value, abs(x_min)+x_max_slider.value, 200)\n","\n"," # Pass slider values as keyword arguments to the input function\n"," params = {param: slider.value for param, slider in sliders.items()}\n"," y = f(x, **params)\n","\n"," plt.plot(x/ref_x, y/max_y)\n"," plt.scatter(x/ref_x, y/max_y,color='red')\n"," plt.title(\"Intensity normalized at $(x_p,y_p)=(0,0)$ (\"+str(max_y)+'$m^2$)')\n"," plt.grid(True)\n"," plt.xlim((x_min-x_max_slider.value)/ref_x, (abs(x_min)+x_max_slider.value)/ref_x)\n"," plt.ylim(y_min, y_max_slider.value)\n"," plt.show()\n","\n"," # Create an interactive plot with the sliders\n"," interactive_plot = interactive(update_plot, **sliders, x_max=x_max_slider, y_max=y_max_slider)\n"," return interactive_plot"],"metadata":{"id":"HXhPvAk_T2cu"},"execution_count":null,"outputs":[]},{"cell_type":"code","source":["# Example of an input function\n","function=diffraction_intensity_rectangle_analytic #diffraction_intensity_rectangle_analytic(xp, yp, P, a,b, k)\n","\n","\n","# Define labels, axis limits, and initial parameter values\n","labels = [\"x/a\", \"Intensity (norm.)\"]\n","m=5\n","x_min = -m*P*(lambda_nm*1e-9)/(2.0*a)\n","y_min = 0.0\n","max_y = (a*b)**2\n","ref_x = a\n","# value_scale (each): [initial value, min,max,step]\n","value_scale=[[1e-9,-1e-2,1e-2,1e-3], # yp\n"," [P,0.1*P,10*P,0.1*P], # P\n"," [a,0.1*a,10*a,0.1*a], # a\n"," [b,0.1*a,10*a,0.1*a], # b\n"," [lambda_nm,0.5*lambda_nm,3.0*lambda_nm,0.1*lambda_nm], # lambda (wavelength) in nm\n"," [-a,0.1*a,10*a,0.05*a], # x scale\n"," [1.0,0.01,50.0,0.05]] # y scale\n","\n","# Create the interactive plot\n","interactive_plot = plot_function_with_sliders(function,\n"," labels,\n"," x_min, y_min,\n"," ref_x,max_y,\n"," value_scale)\n","\n","# Display the interactive plot\n","interactive_plot"],"metadata":{"id":"-yGvE2xSXuHI"},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":["# 2D diffraction pattern (analytic)"],"metadata":{"id":"40xc5XwuN2dy"}},{"cell_type":"code","source":["def diff_pattern_2D():\n"," Xp=200\n"," Yp=200\n"," m=5\n"," xpm = m*P*(lambda_nm*1e-9)/(2.0*a)\n"," ypm = xpm\n","\n"," diff_pattern = []\n"," for i in range(Xp):\n"," xp=xpm * (Xp - 2 * i) / Xp + tolerance\n"," for j in range(Yp):\n"," yp=ypm * (Yp - 2 * j) / Yp + tolerance\n"," I_analytic=diffraction_intensity_rectangle_analytic(xp, yp, P, a,b, lambda_nm)\n"," diff_pattern.append([xp,yp,I_analytic])\n"," return np.array(diff_pattern)"],"metadata":{"id":"qm2CKK5dro-J"},"execution_count":null,"outputs":[]},{"cell_type":"code","source":["diff_pattern_2D=diff_pattern_2D()\n","print(diff_pattern_2D.shape)"],"metadata":{"id":"VRPmse2otTpQ"},"execution_count":null,"outputs":[]},{"cell_type":"code","source":["import numpy as np\n","import matplotlib.pyplot as plt\n","\n","# Generate some sample data (replace this with your numpy array)\n","data =diff_pattern_2D\n","\n","# Extract x, y, and the value from the data\n","x = data[:, 0]\n","y = data[:, 1]\n","value = data[:, 2]/np.max(data[:, 2])\n","\n","# Reshape the value to a 2D grid for contour plotting\n","x_unique = np.unique(x)\n","y_unique = np.unique(y)\n","X, Y = np.meshgrid(x_unique, y_unique)\n","Z = value.reshape(len(y_unique), len(x_unique))\n","\n","# Create a contour plot\n","plt.figure(figsize=(6, 6))\n","max_value=np.max(Z)/100\n","contour = plt.contourf(X, Y, np.rot90(Z), levels=500, cmap='viridis',\n"," vmax=max_value)\n","plt.colorbar(contour) # Use scientific notation for colorbar\n","\n","\n","plt.xlabel('x (m)')\n","plt.ylabel('y (m)')\n","plt.title('Intensity (normalized to unity)')\n","plt.gca().set_aspect('equal') # Set equal aspect ratio\n","plt.show()\n"],"metadata":{"id":"i1N1KpD4NaGo"},"execution_count":null,"outputs":[]}]}