{ "metadata": { "name": "", "signature": "sha256:d8c0bbaa9cfeb1615e58cd343de2dd782166ef3151cd969a5baf2fc203af3327" }, "nbformat": 3, "nbformat_minor": 0, "worksheets": [ { "cells": [ { "cell_type": "heading", "level": 1, "metadata": {}, "source": [ "Time optimal control problem" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "In this example we will set-up a simple 4-state system,\n", "and find a time-optimal trajectory that avoids some obstacles in the world." ] }, { "cell_type": "heading", "level": 2, "metadata": {}, "source": [ "Problem setup" ] }, { "cell_type": "code", "collapsed": false, "input": [ "%matplotlib inline" ], "language": "python", "metadata": {}, "outputs": [], "prompt_number": 1 }, { "cell_type": "code", "collapsed": false, "input": [ "from casadi import *\n", "from pylab import *\n", "from optoy import *\n", "\n", "# Time\n", "t = time()\n", "\n", "# An optimization variable for the end time\n", "T = var(lb=0,init=4)\n", "\n", "# States: position and velocity\n", "p = state(2,init=vertcat([3*sin(2*pi/T.init*t),3*cos(2*pi/T.init*t)]))\n", "v = state(2)\n", "\n", "# Control\n", "u = control(2)" ], "language": "python", "metadata": {}, "outputs": [], "prompt_number": 2 }, { "cell_type": "markdown", "metadata": {}, "source": [ "Specify the system dynamics as ODE" ] }, { "cell_type": "code", "collapsed": false, "input": [ "p.dot = v\n", "v.dot = -10*(p-u)-v*sqrt(sum_square(v)+1)" ], "language": "python", "metadata": {}, "outputs": [], "prompt_number": 3 }, { "cell_type": "markdown", "metadata": {}, "source": [ "Set up the path constraints" ] }, { "cell_type": "code", "collapsed": false, "input": [ "# Specify some parameters for circular obstacles\n", "# ( position, radius)\n", "#\n", "circles = [ (vertcat([2,2]), 1),\n", " (vertcat([0.5,-2]), 1.5),\n", " ]\n", "\n", "# List of path constraints\n", "h = []\n", "for center, radius in circles:\n", " h.append(\n", " norm_2(p-center) >= radius # Don't hit the obstacles\n", " )" ], "language": "python", "metadata": {}, "outputs": [], "prompt_number": 4 }, { "cell_type": "heading", "level": 2, "metadata": {}, "source": [ "Solve the OCP problem" ] }, { "cell_type": "code", "collapsed": false, "input": [ "ocp(T,h+[p.start[0]==0],regularize=[0.1*u/sqrt(2)],N=30,T=T,verbose=True,periodic=True,integration_intervals=2)" ], "language": "python", "metadata": {}, "outputs": [ { "output_type": "stream", "stream": "stdout", "text": [ "(1, 1)\n", "\n", "******************************************************************************\n", "This program contains Ipopt, a library for large-scale nonlinear optimization.\n", " Ipopt is released as open source code under the Eclipse Public License (EPL).\n", " For more information visit http://projects.coin-or.org/Ipopt\n", "******************************************************************************\n", "\n" ] }, { "output_type": "stream", "stream": "stdout", "text": [ "This is Ipopt version 3.11.9, running with linear solver mumps.\n", "NOTE: Other linear solvers might be more efficient (see Ipopt documentation).\n", "\n", "Number of nonzeros in equality constraint Jacobian...: 969\n", "Number of nonzeros in inequality constraint Jacobian.: 120\n", "Number of nonzeros in Lagrangian Hessian.............: 811\n", "\n", "Total number of variables............................: 185\n", " variables with only lower bounds: 1\n", " variables with lower and upper bounds: 0\n", " variables with only upper bounds: 0\n", "Total number of equality constraints.................: 125\n", "Total number of inequality constraints...............: 60\n", " inequality constraints with only lower bounds: 0\n", " inequality constraints with lower and upper bounds: 0\n", " inequality constraints with only upper bounds: 60\n", "\n", "iter objective inf_pr inf_du lg(mu) ||d|| lg(rg) alpha_du alpha_pr ls\n", " 0 4.0000000e+00 3.28e+00 6.13e-01 -1.0 0.00e+00 - 0.00e+00 0.00e+00 0\n", " 1 3.9721767e+00 3.22e+00 5.57e+01 -1.0 5.29e+00 0.0 9.30e-01 1.91e-02h 1" ] }, { "output_type": "stream", "stream": "stdout", "text": [ "\n", " 2 4.5743296e+00 1.71e+00 4.11e+01 -1.0 6.38e+00 -0.5 3.17e-01 1.00e+00h 1\n", " 3 4.5160620e+00 4.78e-02 2.89e+01 -1.0 1.29e+00 -0.1 5.57e-01 1.00e+00h 1\n", " 4 4.5387073e+00 1.18e-02 6.84e+00 -1.0 5.09e-01 -0.5 8.05e-01 1.00e+00f 1" ] }, { "output_type": "stream", "stream": "stdout", "text": [ "\n", " 5 4.5008564e+00 2.37e-02 2.60e+00 -1.0 6.10e-01 -1.0 4.87e-01 1.00e+00f 1\n", " 6 4.3904478e+00 4.20e-02 8.12e-01 -1.0 8.20e-01 -1.5 6.32e-01 1.00e+00f 1\n", " 7 3.8063326e+00 7.62e-02 8.91e-02 -1.7 1.02e+00 -2.0 1.00e+00 1.00e+00h 1" ] }, { "output_type": "stream", "stream": "stdout", "text": [ "\n", " 8 3.1482676e+00 1.44e-01 2.28e-02 -2.5 1.53e+00 -2.4 1.00e+00 8.52e-01h 1\n", " 9 2.7625842e+00 2.69e-01 1.38e-02 -2.5 3.64e+00 -2.9 9.47e-01 8.03e-01h 1\n", "iter objective inf_pr inf_du lg(mu) ||d|| lg(rg) alpha_du alpha_pr ls\n" ] }, { "output_type": "stream", "stream": "stdout", "text": [ " 10 2.6035215e+00 4.97e-01 2.95e-02 -2.5 5.41e+00 -3.4 5.34e-01 6.97e-01h 1\n", " 11 2.5788066e+00 5.84e-01 4.58e-02 -2.5 7.11e+01 - 4.13e-02 3.11e-02h 1\n", " 12 2.5527467e+00 2.96e-01 3.33e-02 -2.5 3.74e+00 -3.9 7.11e-01 1.00e+00h 1\n", " 13 2.5597431e+00 9.62e-02 1.67e-02 -2.5 2.31e+00 - 1.00e+00 1.00e+00h 1" ] }, { "output_type": "stream", "stream": "stdout", "text": [ "\n", " 14 2.5598411e+00 1.97e-03 7.88e-04 -2.5 4.93e-01 - 1.00e+00 1.00e+00h 1\n", " 15 2.5334465e+00 4.00e-02 1.75e-02 -3.8 2.38e+00 - 9.22e-01 5.69e-01h 1\n", " 16 2.5176035e+00 3.65e-02 1.16e-02 -3.8 1.31e+00 - 1.00e+00 7.97e-01h 1" ] }, { "output_type": "stream", "stream": "stdout", "text": [ "\n", " 17 2.5117268e+00 9.60e-03 1.70e-03 -3.8 6.50e-01 - 1.00e+00 9.45e-01h 1\n", " 18 2.5107429e+00 3.37e-04 7.40e-05 -3.8 1.79e-01 - 1.00e+00 1.00e+00h 1\n", " 19 2.5090323e+00 6.61e-04 1.69e-03 -5.7 2.13e-01 - 9.95e-01 8.63e-01h 1" ] }, { "output_type": "stream", "stream": "stdout", "text": [ "\n", "iter objective inf_pr inf_du lg(mu) ||d|| lg(rg) alpha_du alpha_pr ls\n", " 20 2.5087117e+00 5.08e-05 1.15e-04 -5.7 5.52e-02 - 1.00e+00 9.83e-01h 1\n", " 21 2.5086992e+00 5.20e-07 5.68e-07 -5.7 1.21e-02 - 1.00e+00 1.00e+00f 1\n", " 22 2.5086749e+00 1.34e-07 3.10e-06 -8.6 4.57e-03 - 1.00e+00 9.94e-01h 1" ] }, { "output_type": "stream", "stream": "stdout", "text": [ "\n", " 23 2.5086747e+00 7.71e-11 6.55e-11 -8.6 1.65e-04 - 1.00e+00 1.00e+00h 1\n", "\n", "Number of Iterations....: 23\n", "\n", " (scaled) (unscaled)\n", "Objective...............: 2.5086746746469544e+00 2.5086746746469544e+00\n", "Dual infeasibility......: 6.5457194679976140e-11 6.5457194679976140e-11\n", "Constraint violation....: 7.7104544971007272e-11 7.7104544971007272e-11\n", "Complementarity.........: 2.5613845271550734e-09 2.5613845271550734e-09\n", "Overall NLP error.......: 2.5613845271550734e-09 2.5613845271550734e-09\n", "\n", "\n", "Number of objective function evaluations = 24\n", "Number of objective gradient evaluations = 24\n", "Number of equality constraint evaluations = 24\n", "Number of inequality constraint evaluations = 24\n", "Number of equality constraint Jacobian evaluations = 24\n", "Number of inequality constraint Jacobian evaluations = 24\n", "Number of Lagrangian Hessian evaluations = 23\n", "Total CPU secs in IPOPT (w/o function evaluations) = 0.064\n", "Total CPU secs in NLP function evaluations = 0.472\n", "\n", "EXIT: Optimal Solution Found.\n", " proc wall num mean mean\n", " time time evals proc time wall time\n", " eval_f 0.013 [s] 0.013 [s] 24 0.53 [ms] 0.53 [ms]\n", " eval_grad_f 0.016 [s] 0.016 [s] 25 0.65 [ms] 0.65 [ms]\n", " eval_g 0.015 [s] 0.015 [s] 24 0.61 [ms] 0.61 [ms]\n", " eval_jac_g 0.133 [s] 0.133 [s] 26 5.10 [ms] 5.10 [ms]\n", " eval_h 0.324 [s] 0.324 [s] 24 13.50 [ms] 13.49 [ms]\n", " main loop 0.545 [s] 0.543 [s]\n" ] }, { "metadata": {}, "output_type": "pyout", "prompt_number": 5, "text": [ "2.5086746746469544" ] } ], "prompt_number": 5 }, { "cell_type": "heading", "level": 2, "metadata": {}, "source": [ "Plotting of results" ] }, { "cell_type": "code", "collapsed": false, "input": [ "# Plot the nominal trajectory\n", "plot(value(p[0]),value(p[1]),'o-')\n", "xlabel('x position')\n", "ylabel('y position')\n", "title('time-optimal trajectory')\n", "axis('equal')\n", "\n", "# Plot the obstacles\n", "theta = linspace(0,2*pi,1000)\n", "for center, radius in circles:\n", " fill(radius*cos(theta) + center[0],radius*sin(theta) + center[1],'r') " ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "display_data", "png": "iVBORw0KGgoAAAANSUhEUgAAAX0AAAEZCAYAAAB7HPUdAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAIABJREFUeJzt3Xd4VNXWwOHfSm8iTVCQJkpRBFSaCDGIECBgb2C/YkMJ\n9isImk/Afq9Srl1QVAQVBSUIiUgICiJIl6YRFFC6QEJISNnfH2eCIU7CJJmZM2W9zzMPM2fOnLNm\ngDV79tl7bTHGoJRSKjiE2B2AUkop79Gkr5RSQUSTvlJKBRFN+kopFUQ06SulVBDRpK+UUkFEk76q\nEhFpLCLZIiJ2x1JZInKjiMzz0LEzROQOTxzbcfzuIrLRU8dXgU+TvnKJiGwVkUtKHhtjfjfGnGR8\nfKKHiDQVkWIROfZv3RjzoTEm0UOnNI6bs1hSROT9ah3cmEXGmFbVOYYjlmIROaO6x1H+R5O+cpUB\n/K5VX4rPxy4O3jxllV4kEubuQJT3aNJXJ+RonTYGvnR06TxStgXt6NYYLSLfOfb5QkTqisiHInJQ\nRH4QkSaljtlKRNJFZJ+IbBSRa08QQ1cRWSYiBxzHurDUcxki8qyILHWca6aI1HI8nen484CIHBKR\nLiJym4gsKvX6YhG5V0R+duzztIg0F5EljvNNE5Fwx741RWS2iOwWkf0i8qWINHThM+wDDAeud3w+\nK0vFPkZEvgMOA2eIyO0ist4RS5aI3FXqOAkisq3U4wYiMsMRz68iMrTUcyEiMkJEfnEca5mInC4i\nJZ/Jakcs1zr2v9PxGewTkVkiclqZz2iIiGwGNovIRBF5qcx7/EJEHjjRZ6FsZozRm95OeAO2AJeU\netwUKAZCHI8zgM1AM6AG8BPwM3AJEAq8B0xy7BsLbANuxWp4tAf2AK3LOXdt4C/gRsf+NwD7gVql\nzr0dOBuIAT4F3nc816R0nI5ttwGLSj0uBj4H4hzHyAe+cbzHkvdyS6lYrgSiHPt/DHxe6lgLgH+V\n8z6eAqaU2ZYBbAVaO95bGNAPaOZ4Ph7ry+A8x+MEYJvjfgjwIzDS8bpmQBbQ2/H8o8Aa4CzH47ZA\n7VLv+YxScVzi+DtoD0QA44GFZT6jeUBNIBLoCOwAxPF8XUecp9j9b1VvFd+0pa/cxQCTjTFbjDGH\ngK+AzcaYb4wxRcAnwHmOffsDW4wx7xljio0xq4DPgPJa+0nAJmP1xRcbY6YBG4HLSp17ijFmvTEm\nFxgFXOfoKnG1C+MFY0yOMWY9sBb4yhiztdR7OQ/AGLPfGPO5MSbPGJMDPANc7OI5nMVjgHeNMRsc\n763QGDPHGLPFcb5MIA3o7uR4HYG6xpgxjtdtAd7G+lIEGAw8YYz52XGsNcaY/eXEdiPwjjFmlTHm\nKNavkgtFpHGpfZ41xhwwxuQbY5YBB4GejuduABYYY/a4+Fkom2jSV+60q9T9PGB3mcdxjvtNgM4i\n8lfJDRgE1BeRRiKS4+h2OOTYvwHwe5lz/ebYXmJbqfu/A+FYrc+qxH7EyeM4ABGJEZE3HBe2DwIL\ngZOr2RdfOnZEpK+IfO/oZvkLq+Vfx8nrmgANynyOw4F6judPx2r5u+I0rM8UAGPMYWAfULrraluZ\n10wBbnLcvwmo1kVq5R16QUa5qrKjdCra/3esroPe5TwfV+bxDuCqMtuaYLXASzQuc78A2IvV3eNO\nDwMtgE7GmN0i0h5YgdWCP9FnVFzO9mOvE5FIYAZWEp1ljCkSkc9x/otlG9YvphblHHcbcCaw/gRx\nAfyB1Z1VEkcs1hfNDmdxOnwArBWRdkArYKYL51E205a+ctUuoPkJ9pFy7peVCrQQkZtEJNxx6ygi\n5Q1FnOPYf6CIhInI9VhJZnapc90kIq1FJAZ4GvjEGGOw+qmLXYjd1fcSh9XyPygitbH66St6bWm7\ngKZOfhWUfhzhuO0FikWkL1Del+MPQLaIPCYi0SISKiJtRKSD4/m3gdEicqZY2jpiLoml9GfyEXC7\niLRzfPE8A3xvjCn7C+sYY8x2YDlWi/9TY0x+efsq36FJX7nqWWCkoxvhIce2si0/U+a+0+eNMdlY\niewGrJbkn47jRzg7saMfuj9WK3sv8AjQv1T/tMHqWnjXcawIINnx2lxgLPCdY7RNZyexOWuhl/de\nXgGiHXEsxvq1UdHnUNonjj/3ichyZ/s7PptkrAvE+4GBwCxnB3NcK+mPdfH1V6wvuDexLj4D/Ndx\nnDSs/ve3sC5AA6QA7zn+Pq8xxszHuhYyA6vV34y/rw1U9J7eA85Fu3b8RsmVd++fWCQKqz80Eus/\n6SxjzHBbglF+TUQWYI3WmWR3LJ4m1gS5t4wxlf3l4hEi0h34wBjT5IQ7K59gW5++MSZPRHoYY3LF\nmuzxrYh0M8Z8a1dMyq/5/OQrN2mD1aq3nWPuwgNYvyCUn7D1Qq7jpzdYLf1QrJ+zSlWFT5eDcAcR\nGYfVnXOrD8TSGlgGrMLq8lJ+wrbuHbBmDGKNfGgOvGaMecy2YJRSKgjYeiHXMRmlPdZ44ngRSbAz\nHqWUCnQ+MU7fGHNQRFKBDljT0gEQkYD/ya6UUp5gjHF6ncu2lr5YxbhqOu5HA72AlWX3q6iGxFNP\nPWV7HQs7b/r+/fP9z569kObNR/D3SFDDSXF3EBXajTMiRtOSdGI5RHtWMIyX+Ywr2EMdetOh1Gue\nOnY/kQ78RiM+YBB38gYt2UAN9nMOX9A8ciQnRcaT2OMqGjV65LhzNm8+gtmzF9r+eQTT37233n9F\n7Gzpn4Y1TjgE68vnfWONFVYqoI0fn0ZW1tjjtmXnvM1JJHNlURQXM45ufEstDhy3TzL5ZHE9WUw/\ntq051zGUjTQmhxuZyo1MBWAX9cgknsz8eOYznrQFUzE8f9zxsrLGMmHCKJKS4j30TpUvsnPI5lrg\nfLvOr5RdDhwocLr9fNbwEhPKfV0SOcAcJtCRjeyhFakMZaNj+/Hqs5tr+ZRr+RSAi+jJYifHzMsL\nrcpbUH7MJ/r0qyohIcHuEGyl7z/B7hAqpaioiJeee4VlPzgvRBnF4RMeI4kcklhOBpDwd320E4rj\noNPtu3ZmUVxcTEiIf03O97e/e3erzvu3dcjmiYiI8eX4lHLVn3/+yTX97mTtmqdoUTyPv1jHr0w7\n9nxzrmMcXzlttbtDKnEMo99xXUNhPEJcSAgdu3zPB59/Sr169So4gvInIoIp50KuJn2lPOz777+n\nf+//42j22zzOBIbzPHOIYwKtyCOWKA6X203jTqllznk723iVaeyS/eTUSmZW2iwuuOACj8agvEOT\nvlI2mTVrFjde+zVhBaP4iFvpy1y7QzpOPhHcynus5nR2Rw/k/U/foF+/fnaHpaqpoqTvXx15SvmR\nD96fzsCr91Kv4F6WcZHPJXyASI4ylUH0ZwlxR9K55aqH+GzGDLvDUh7k1xdylfJVkyfP5e7Bjele\nvJOZdOYkD3fdVEcIhhd5jEZsY0z+fAbfeC3RMTH07dvX7tCUB2j3jlLVlJqayfjxaeTnhxEZWUjL\nli3438RLGGze5DXGEOJHteBmcBWDeZ3iyDt5+vnLmDPn12PvKzm5t47p9xPap6+Uh6SmZjJs2Lwy\nk63+zXUsZzrf2BZXdXxHV3rzGEckFWPePLa9efMnGDcuURO/H9A+faU8xNnsWniegxxyur8/uIjF\nnMfLxyV8KJnBm25TVMpdNOkrVQ35+c4vi+UR6+VI3Ku8i306g9f/adJXqhoiIwudbndldq0viywn\n/qioIi9HotxNk75S1TBoUG9CQ584bltJETR/lsxGmnP9cduaNx/B0KG9bIpIuYteyFWqigoLoUcP\niI39lIXpL9GxOIoYL82u9YaSGbzL6MQh/uTFl5N44IE77A5LuUBH7yjlAf/+N6xeDcWHunHtku+4\n0+6APGQGVzGCIbTsMZYvvvHPEUnBRkfvKOVmX3wBH30Ejz++jvWrV9q/UrkHJZHKHs5jyZJtbNiw\nwe5wVDVp0leqkrZsgcGDYfp0mDrpBe7NzyfC7qA8KIp8ruIz2h29ildfftnucFQ1afeOUpWQnw/d\nusGgQXDPPUdoWKcO644coYHdgXlYBhczhFfYHduNP/bvJyIikL/m/J927yjlJg8/DI0bwwMPwJw5\nczg/LCzgEz5APJlkU4fGnEt6uk7Q8mea9JVy0fTpMHcuTJoEIvDFtGlcmZ1td1heEYJhEFOpefgK\nZk2ffuIXKJ+l3TtKuWDTJqtbJy0NzjsPjDE0rFWLRQcP0tzu4LxkLW3oTSqRdTuydc8uu8NRFaio\ne0dLKytVjpLqmbm5YaxaVcitt/bmvPOsYmNZWVmEFBRwhs0xetO5rKMef/HbobZs376d008/3e6Q\nVBVo0lfKCWfVM+fOfYLUVEhKimf58uV0Cg3FaVMqgN3Ih0w0N7F8+XJN+n5K+/SVcsJZ9czSVSbX\nrV5N2xz/n3VbWafwCdsLfmLYsFkkJo4kNTXT7pBUJdna0heRRsAUoB5ggDeNMePtjEkpqKB6pqPK\n5C9r1jAgyK43pRLHWDpheIHff4fff4esLKvukNbY9x92t/QLgAeNMecAXYD7RKS1zTEpVX71TEeV\nyR2//06wdW6MpxVZHD9yR2vs+x9bk74xZqcxZpXjfg6wAYJi2LPycb16OameWarK5N79+6lrR2A2\nyi9njQCtse9ffOZCrog0Bc4DltobiQp2hYXw/vvxPPQQrFkziry8UKKiihg6tM+xbozDeXmcZHOc\n3qY19gODTyR9EYkDPgWGOVr8x6SkpBy7n5CQQEJCgldjU8Fn/HioVw+efz4eEed91YVFRQRb+zaZ\njWRx/XFdPNavnz42RqUAMjIyyMjIcGlf2ydniUg4MBv4yhjzSpnndHKW8qpt26zJV0uWwFlnlb9f\n4zp1WLR/P028F5pPSCWOEXRhLefSOzGWoUN76UVcH+Szk7NERIB3gPVlE75SdnjgARg6tOKEDxAb\nHR0Ay6RUXhI57OQIwyIHMXduB7vDUVVg9+idi4CbgB4istJx09+KyhapqbBmjbU4yonUrV2bPZ4P\nyScdxBAWplU2/ZWtLX1jzLfY/8WjFLm5cP/98OabEBV14v1Pb9yY7WvXej4wH7QbQ0SkCx+S8kma\ncJUCxoyBLl2gl4vrfp/Zti2bJdiKMFi2h4YSFRtjdxiqinxi9I5Sdlq/Ht56y+racdW57dvzUVwc\nBElp5dJ+iYwkOlqTvr/Slr4KasbAkCHw1FNw2mmuv65Dhw78UFREsI0tM8CGwgJiY+PsDkVVkSZ9\nFZRSUzNJTBxJ69YprFw5ksaNK1c4rFmzZhARwS8eis9X/QTExcbohVw/pt07Kug4K5v80ENPEBrq\neuEwEaF3797M/fhjTjC6M6DMFaHzhV3YHqxDlwKAtvRV0DlR2WRXXT5wIJ/XqOHO0HzeZyedRHyv\nXuicSf+lSV8FnROVTXZVnz59WFVYyHZ3BOUHfgV+Li6mc+dOmvT9mCZ9FXROVDbZVVFRUVx/3XVM\nCg2OKjxvh4Vx4003ER6uvcL+TJO+CjrduvUmLKz8ssmVMeShh3g9IoJ8dwXno3Kxkn7r9t0ZOnQk\nGzem6MpZfsr2gmsV0YJryt2KiuD88yEpKZMVK9JLlU2ueuGwfvHxXPbtt9wTwP9WXxFhevvu7DnU\n7bjrIc2bP8G4cYladM3HVFRwTZO+CiqTJsHkyZCZCe6aUPvDDz9wdY8ebMrNJRCnLGUDLaKjadZ+\nMEuW/HM108TEUcydO9r7galyVZT0tXtHBY3Dh2HUKHjpJfclfIBOnTpxYY8evBgWmH3dz4SHc2nf\nvkRE1Hb6vK6c5V806aug8dJLEB8PnTt74NivvsqEiAg2u//QtvoJeDsigucnTHDbBXBlL036Kij8\n+ae1Itazz3rm+I0bN+apsWO5NTYW56nR/xwFbo2NZexLL9GgQQOSk3vTvLl7LoAr+2ifvgoKgwdD\nnTrw/POeO0dxcTF9unen47JljC0o8NyJvOSRiAg2devGF19/jTj6w1JTM7nxxnSaNQulfv3qXQBX\nnqMXclVQW7PGKpm8aRPUrOnZc+3evZsOZ5/NK/v2cZVnT+VR04Dh9eqxfP166tSpc2y7MVCrFmRl\nWV+iyjfphVwV1B591LqA6+mED1CvXj0+nzePu2NiWOL503nEIiA5NpZZ6enHJXyAXbsgPFwTvj/T\npK8C2ty5sHUr3H239855wQUX8N4nn3BFdDQrvXdat/gBuDo6mqkzZ9K2bdt/PL9xI7Rq5f24lPto\n0lcBp6Rs8sUXp3DNNSO57rpMwsO9G0O/fv147f336RMd7Tct/kVA/+hoJn38MZdeeqnTfTZuhNat\nvRuXcq/AHFisgpazsskfffQEXbq4XjbZXa66+mqiY2K47JpreD03l6u9evbK+QgYFhvL1Jkzy034\nABs2aEvf32lLXwUUd5VNdpe+ffsyb9EiHqxTh+Hh4T43nPMo8HBEBCPq1ePrxYsrTPig3TuBQJO+\nCijuKpvsTueffz4/btjAys6d6RYby0bbIjneOqBrbCybL7qI5evXO+3DL0uTvv/TpK8Ciq/OGj3l\nlFOYs3AhNz/zDN1iYngyLIzDNsWSDQwPD6dHbCx3vfQSX8yf/49ROs7k5MCePdCkiedjVJ5ja9IX\nkUkisktE1toZhwocycm9Oflk35w1GhISwn3JyazatIlfkpJoER3NRBGOeOn8ucA4EVpER7PjsstY\nvXkzd91zz7GJVyeyeTOcdRYEyfIBAcvWyVki0h3IAaYYY8518rxOzlKVsm0bnH12Jh06pGNM9csm\ne9KPP/7I/z36KD98/z13FhRwR2EhTT1wnl+xauG/HRbGRd2789QLL9C+fftKH2fqVJg1C6ZPd3+M\nyr18ekauiDQFvtSkr9xh8GA45RTP1djxhA0bNvDaK68w9cMPaR0aypXZ2fQxhtZAVYqBGqxCaXNF\n+Oykk/i5uJgbb7qJIQ8+SIsWLaoc56hRVis/JaXKh1BeoklfBYVNm6BbN6sbolYtu6OpvKNHj5Ke\nns6sadNInzePnOxsOkVEcO7hw5xVVEQjoC4QhzXWuhDrZ/IeYBvwc1gYa2JiWHb0KCfXqEHvfv24\n7Lrr6NmzJxEREVWOKzU1k/Hj01ixIozTTivk2Wd7++QvJ/W3ipK+z4/TTynVrEhISCAhIcG2WJRv\nGzUKHn7YPxM+QEREBElJSSQlJQGwfft2li9fzrq1a1m0Zg3bt25l37595OTmUlhURFhoKHExMdSt\nU4fTmzXjzLZtuefcc3m7QwcaNmzolpjKznvYuxeGDbOumWji9x0ZGRlkZGS4tK+29FVAWLEC+veH\nX36BmEBcvsomiYkjSUsb42S7rpbly7Tgmgp4I0bAyJGa8N3NF+c9qOqxe8jmR8BioIWIbBOR2+2M\nR/mnhQutfvzBg+2OJPD46rwHVXW2Jn1jzEBjTANjTKQxppExZrKd8Sj/YwwMHw5PPw3VuFapyqGr\nZQUen7+Qq1RFZs+G7GwYONDuSAJTycXa668fRcuWoZxyShFDh/bRi7h+zPYLuRXRC7mqIsXF0L49\njBkDl11mdzSB68ABaNQI9u/H6yWqVdXohVwVUFJSXqVu3euJi7uN9euv58cfX7U7pIC2dClccIEm\n/ECh3TvKr6SkvMrYsWsoLPy7FsAzz9yDyKukpAyxMbLAtWQJdO1qdxTKXbSlr/zKxIkLKSx8/bht\nhYWvM3Fipk0RBb4lS+DCC+2OQrmLJn3lVwoLo8vZHuXlSIJDcbHVvdOli92RKHfRpK/8SliY80LE\nYWF5Xo4kOKxfD/XqWUXsVGDQpK/8yl13XQzcc9y2sLC7uf9+HULoCYsXa9dOoNELucqv1KkzhFat\nXmXPnhsoLIwiLCyP+++P14u4HqIXcQOPjtNXfuPwYWjeHNLSwIXlXJUbtGwJn3yin7e/0XH6KiC8\n+ip0764JyFv27oWdO+Gcc+yORLmTdu8ov5CTAy+9BPPn2x1J8Pj+e+jUSdfEDTTa0ld+YeJE6NED\n2rSxO5Lgof35gUlb+srnHToE//2vVUJZeV7J8ohLl4bRvHkhnTrp8oiBRJO+8nkTJkCvXtC6td2R\nBL6yyyOuWKHLIwYaHb2jfNrBg3DmmfDtt9ZIEuVZujxiYNDRO8pvjRsHfftqwvcWXR4x8Gn3jvJZ\nBw7A+PHWBUXlHbo8YuDTlr7yWS+/DAMGwFln2R1J8NDlEQOftvSVTykZOZKTE8YPPxTy2mu9Ab2A\n6C1JSfFkZcGIEaPo0CGUqChdHjHQaNJXPqPsyBGA5557gtNO05Ej3lRUFM/NN8fz2mt2R6I84YTd\nOyJST0SeEJG3RGSy4zbJG8Gp4DJ+fNpxCR8gK2ssEyak2xRRcFqwABIS7I5CeYorLf1ZQCaQDhQ7\ntuk4SuV2OnLEfkVFsGgRvPWW3ZEoT3El6UcbY/7tiZOLSB/gFSAUeNsY87wnzqP8g44csd/q1XDa\naVC/vt2RKE9xZfTObBFJcveJRSQUmAj0Ac4GBoqIzrkMYsnJvalTR0eO2Em7dgKfKy39B4ARInIU\nKHBsM8aYGtU8dyfgF2PMVgARmQZcDmyo5nGVn+rZM57iYujadRTh4TpyxA4ZGXDLLXZHoTzphEnf\nGBPnoXM3BLaVerwd6Oyhcyk/MHkydO0az+zZmuTtUNKf/847dkeiPMmlIZsicjnWYGkDLDTGfOmG\nc7t0MTglJeXY/YSEBBL0t2dAKiiA55+Hjz6yO5LgtWoVNGxoLYSu/EtGRgYZGRku7XvCgmsi8hzQ\nEfgQEOAGYLkxZnh1ghSRLkCKMaaP4/FwoLj0xVwtuBY8pkyxWvoLFtgdSfB66SXYsgX+9z+7I1HV\nVVHBNVeS/lqgvTGmyPE4FFhljDm3mkGFAZuAnsAfwA/AQGPMhlL7aNIPAsXF1pJ8EybApZfaHU3w\n6t8fbrsNrrnG7khUdVW3yqYBapZ6XBM3jNM3xhQC9wPzgPXA9NIJXwWPzz+Hk06Cnj3tjiR4FRZa\n5avj9XJKwHOlT/9ZYIWIZDgeXww87o6TG2O+Ar5yx7GUfzIGxo6Fp54CcdouUZ6WmprJ6NFpFBSE\ncfPNhSQn60pZgcyV0TsfichCrH59A/zbGLPT45GpoDBvHhw9alXTVN5Xtt5RWhpkZelKWYGs3O6d\nkolSInIBcCrWkModQAMROd874alAN3YsjBgBIVrk2xZa7yj4VNTSfwi4E/gPzvvwe3gkIhU0MjPh\njz/guuvsjiR4ab2j4FNu0jfG3Om428cYk1f6ORGJ8mhUKmCV1MvPzw9j3bpCBg7sTViYdiPYResd\nBR9XflQvdnGbUhUq6T9OSxvDwoUp7Ns3hjlz5pGamml3aEErObk3tWppvaNgUu44fRE5DWiANSlr\nENbELAPUAF43xrTyeHA6Tj+gJCaOJC1tjJPto5g7d7QNESmANm0yiYxM56STSuod9dKLuH6uonH6\nFfXpJwK3YtXI+U+p7dnACPeFp4KF9h/7ntxc2Lo1np0744nzVJUt5VMq6tN/F3hXRK42xszwXkgq\nUGn/se/59lto3x5N+EGk3KQvIjcbY94HmorIQ6Wfwiqt/F+PR6cCSnJyb37++Qm2bPl7iKDVf9zH\nxqiC2/z5OhM62FTUvRPj+PMkjh+yKehyiaoKkpLi+eILmDVrFK1aab18XzB/PvxXm29B5YQF1+yk\nF3IDS3ExtGoFkyZBt27eO29eXh67du1i7969HDp0iLy8PAoLCwkJCSEyMpK4uDhq165N/fr1qVGj\nBhIk9SD274emTWHvXoiIsDsa5U5VvZBb8uIXgDHAEWAu0A540NH1o5TL5s2z+o4vusgzx8/Pz2fF\nihUsX76c1UuWsGHNGrK2beOvw4epFxlJ3bAwaogQjfUPvxjIxxqZsL+oiJ35+YSEhHBGgwa0bNWK\nc7t04fwOHejcuTN16tTxTNA2ysiArl014QcbV0orrzbGtBORK4H+WDN1Fxlj2no8OG3pB5Q+feCG\nG6zyve5gjGHt2rXM/uIL0j/7jGU//USLqCg6Hj1K+7w8WgNnAafh2oQUgL+AX4GNwJqwMJbHxLA8\nL49Gp57Kpf360feKK0hISCAyMtI9b8JG991ntfQffdTuSJS7Vbee/k/GmHNE5B3gU2PMVyVfBJ4I\ntsy5NekHiI0b4eKL4bffIKqa87k3btzI+5MmMW3KFExODv0LCuhz9CjdsS5AuVshsBJICwkhNS6O\nDQUFDOjXj5vuuouePXsSGuqfQ05bt4YPP4TztZJWwKlu0n8OuALIw1rMvCbwpTHG4+vZatIPHPff\nD7VqwegqzsEqKCjgs88+Y+Kzz/LL5s3cWFjIoIICzsMaWeBNfwIfizAlLo69kZHcnZzMXffeS926\ndb0cSdXt2AFt28Lu3eCn31mqAtVK+o4D1AYOGmOKRCQWqGGM+dPNcTo7ryb9AHDwIDRrBmvXWmuw\nVkZeXh5vv/kmL44eTdO8PJJzcrgMCPdIpJW3ApgYHc3nxnDTzTfz2KhRNGrUyO6wTuj992HmTJih\nM3ACUrVWzhKRCOBm4GMRmQH8C9jr3hBVIJs8GRITK5fwCwsLefvNNzmrYUPSRozgk717WZiTw9X4\nTsIHOB+YdOQIG/LyiH73Xdq3bMkD997L3r2+/V9Ex+cHL1e6d97BGuzwHtYv6ZuBQmPMYI8Hpy19\nv1dUBC1aWH3HXbq49prMzEyG3n47NXft4sXDh+nk2RDdahfwdGQkH4eF8eSYMdx7//2EhbmyQJ13\nlFQ5zcgIo2PHQoYP11WyAlFFLX2MMRXegDWubPPEzQpP+bMvvjCmY0djiotPvO9ff/1l7hg0yJwe\nE2M+BlNsrabol7d1YHrExpoLWrUyq1at8vwH7YLZsxea5s1HHBdq8+YjzOzZC+0OTbmZI3c6zauu\njGQrFJEzS32DNMca0KDUCY0fD8nJJ17/dv78+bQ980wiZszgp9xcrsX7F2jd6Rxg/uHDDNm0iUsv\nvJBnR4+mqMjeGkO6SpYC14YvPwp8IyILHWvlfgM84tmwlD9LTc0kMXEkHTumkJk5ktjY8uvlFxUV\nMfKxx7igOWwxAAAYAUlEQVRlwADe3rePV/PzqeHFWD1JgH8Zw4ojR5j33HP06tqVXbt22RaPVjlV\n4NrC6PNFpAXQwrFpkzEm37NhKX9VdqFtgEcffYKIiH8utL1//35uGDCAolWrWHHkCPW9HayXNALm\n5+byfytX0uHss/l0zhw6d/b4iOd/0CqnClwbvRMN3Af8H5ACDNHlElV5XO1CyMrK4sJ27WizfDnz\ncnMDNuGXCAWeLihg4v799O/Rg08+/tjrMSQn96ZhQ10lK9i5MqxgCnAIGI/1i3UQ8D5wbVVPKiLX\nYn2BtAI6GmNWVPVYyre40oWwYsUK+vfsyZOHDnFPcbG3QvMJlwNNjxyh/223sXPHDoY++KDXzp2U\nFE9CAnz77SiaNtUqp8HKlaR/jjHm7FKPvxGR9dU871rgSuCNah5H+ZgTdSF8//33XN6rF6/n5HCl\nNwPzIe2ARUeO0GvkSHKysxn+5JNeO/dvv8Xz+uvx9NElDIKWKxdyV4jIhSUPRKQL8GN1TmqM2WiM\n2VydYyjflJzcmyZNnHchLFu2jMsuvZTJQZzwSzQFFubm8t7zz/PC2LEn2t0tsrNh1SqI14Z9UHOl\npd8B+E5EtmEtntIY2CQia7HGgnq82qbyHyULpcyePYqzzvq7C+GMM06hR5cuvHP4MP3sDtJHNMC6\nwBv/zDOcXKsWdw8Z4tHzZWRAp04QE3PCXVUAcyXpV+mHoIikA6c6eWqEMeZLV4+TkpJy7H5CQgIJ\nCQlVCUd50fr18bz5ZjxJSdbjnTt30qVtW17IzmaAvaH5nIbAvNxc4h95hIaNG9O/f3+PnSstDXr3\n9tjhlY0yMjLIyMhwaV9bV84SkQXAw+VdyNUyDP6npHrjn39ai3Pk5eWR0LEj/TZu5MlCndNXnqVA\n/5gYFixdSps2bTxyjlatYOpULaUcDKpVcM0L/HnipSpjxgwYMODv1ZiS77qL07OyGKUJv0KdgZeP\nHOHKxEQOHjzo9uP//jvs2wft27v90MrP2JL0ReRKxzWCLkCqiHxlRxzK/T75BK67zrr/4QcfsHDG\nDCYfOaLf7C64yRh679vH4EGDcPcv3PR0uPRSCPGFZp6ylStVNpOB940xf3knpOPOrd07fqR0186f\nf/5Gh3POIf3wYbRx6bo8oHNsLA+MG8ftd9zhtuPecIPVn/+vf7ntkMqHVbd7pz6wTEQ+FpE+Iicq\nnaWC1YwZcNllEB5u+Nf11/NIXp4m/EqKAj44fJjHhg1j27ZtbjlmcTF8/TX00om3CheSvjHmCay6\nO5OA24CfReQZR7VNpY75+GO49lp4d9IkDq1bx8M2V5X0V+cCQ/Pzuf/2291yvJUr4ZRTwA8W9FJe\n4FIPnzGmGNiJtUZEEVAL+FREXvRgbMqPbN8OGzbABRf8xfCHHuKNw4ddGg+snPt3YSGbvv+e2bNn\nV/tY6ek6VFP9zZU+/WHALcA+4G3gc2NMgYiEAD8bYzzW4tc+ff8xbpw127Nm9BCOTJ7M63l5dofk\n9+YCyQ0a8NPWrYSHV36RyJJVspYuDeOMMwoZPVpXyQoW1V056/+AJuU8d/aJXl+dG7pylt/o2tWY\nyZN3mtpRUWaXD6xcFSi33rGx5n8TJ1b670NXyQpuVLBylq2Ts05EW/r+Yft2aNcOBlx6M40+m8Zo\nHZPvNsuBK2rV4pc//iAqyvWK5omJI0lLG+Nk+yjmzh3txgiVL6qopa/drqrKSroPsrLCCA/PY8bn\nc/hNE75bdQDaHz3K5Hfe4d777nP5dbpKliqPJn1VJc5WyDqZrSwhlSRybIws8Dx++DC3jx3L3ffe\nS4iLs6t0lSxVHp2fp6rE2QpZB5nGBFrZFFHgugiomZPDV1+5PnE9Obk3jRrpKlnqn7Slr6qk3O4D\nYr0cSeAT4N7sbN74z39IKildegJJSfH07Anz54/ijDN0lSz1N036qkrK7T7gsJcjCQ7XAQ8tXsyu\nXbuoX9+1FYWzsuJ54414+vb1bGzKv2j3jqqS5OTeNG9epvuA6xjKRpsiCmxxwIDQUJcXVN+/35o3\n0aOHZ+NS/keTvqqSpKR4xo1LJCbmEWpyDYl0ZBxf6UVcD7o2N5dPJ092ad+5c62EX4lRnipI6Dh9\nVS0xUdt4Kf9ShqBLHnvaEaB+RARb//yT2rVrV7jvoEFW0r/zTu/EpnyLry+iovzUgQM5HMmvx/Vs\ntTuUoBANdI+M5Ouvv65wv8JCq6XfTxcjVk5o0ldVNnPmCiJlF3U4ancoQePS7Gy+mTOnwn0WL4Zm\nzaBhQy8FpfyKJn1VZenzfuFUk2V3GEGlO/DtggUV7pOaCi6O7FRBSJO+qrKV3++hBZr0vaktsOXP\nP8nOzi53n9mzoX9/78Wk/IsmfVVlW3dEcYEmfa+KAM6Ojmbt2rVOn//1V9i7Fzp08G5cyn9o0ldV\nsmfPHgqLmtBek77XtSksZN26dU6fK+na0QXQVXl0Rq6qks2bNxNOc87UpO91LXNz+Xn9+uO2lVQ8\n/eGHMJo0KSQ1VRdMUc5p0ldVsmXLVo4WX0ZzTfpe1wz4ccOGY4/LVjw9cACGDbNmS2viV2Xpj0BV\nJT//fIAwCqjJQbtDCToNgR3btx977KziaVbWWCZMSPdyZMof2Jb0ReRFEdkgIqtF5DMROdmuWFTl\n/bKxgLrayrdFPWD3vn3HHuuCKaoy7GzppwHnGGPaAZuB4TbGoiohNTWTr+at4ACTSaQDqcTZHVJQ\nqQkcyPm7xpEumKIqw7akb4xJN8YUOx4uBU63KxblupL+478OTiGHV0ljGcPop4nfi2KB3KN/z4JO\nTu5NvXq6YIpyjU8UXBORL4GPjDFTy2zXgms+ptwFt+nIXJbbEFHwKQCiQ0IoLPq7Jd+uXSYi6dSs\nWbJgSi+9iBvEbFsYXUTSgVOdPDXCGPOlY58ngKNlE36JlJSUY/cTEhJISEhwf6DKZbpilu/Ztg22\nb49nx454LaUcpDIyMsjIyHBpX1tb+iJyG3An0NMYk+fkeW3p+xht6dsvF6gTFsaRggIAnnsOtmyB\nN96wNy7lO3yytLKI9AEeBS53lvCVb9IVs+x3GIiJiADAGHj/fbjlFntjUv7DzslZE7BKiaSLCMAS\nY8wQG+NRLijpJx5y77X8vq0VvZjHMDboilledACoGWddOF+xAvLyoGtXe2NS/sPO0TtnGWOaGGPO\nc9w04fuJpKR4htzXgdoM4kXyNeF72W6gXp06AEyZAjffDOL0h7xS/6QzclWVNGzYkLiwn1hNO7tD\nCTo7gAYNG1JQAB99ZCV9pVylSV9VSZMmTTChP7GGtnaHEnS2Ak1btWLePGjRApo3tzsi5U806asq\nadGiBX8VrdCWvg02x8Rw1jnnMGWKXsBVladJX1VJvXr1CAvfwEraoYNqvWtdeDiNG7cjLQ2uvdbu\naJS/0aSvqkREOP/skzlKKDudzr9TnlAIrMvN5eef29GrF9SqZXdEyt9o0ldV1vmSHtRhtfbre9Gr\nxGFCOvHkky+QlTWS1NRMu0NSfkaTvqqybgkJFEZs1H59L0kljtH0Izf/Ww4dSmHlyjEMGzZPE7+q\nFE36qsq6devGnqKV/KhJ3yvG04q9TD9umy6WoipLk76qsho1anD2Gdks1e4drzhSTlE7XSxFVYYm\nfVUtbTrX5zemEk+CLqjiYYc57HS7LpaiKkMXRldVlpqaycLMSOBZFjm2ZXE9MEdLM3hAVNgRpHA4\nhmePbbMWS+ljY1TK3/jEIirl0dLKvk3LLHvPEeDkkM+4/KpIsrOXkJeni6Wo8tm2iIoKbLqgiveM\npTuhYRcyZcqpREf3szsc5ce0T19VWbkLcpfT96yqphjhlZBXuPe+bURH2x2N8nea9FWVOVtQpQkD\ndUEVN3uaGykIKeb558+zOxQVALR7R1VZSV/yhAmj+Ouvoyz7YQeNaEkS02yOLHDkEs0L8iz33LOI\n8PAOdoejAoBeyFVuc/1lg5j35bPM5FYSWGh3OAHhfkbydth57DuQSGysXitRrvHJNXJV4Bn9UgrF\nEf/mbl7lKOF2h+P3/uA03uQBHn5kryZ85Taa9JXbtGjRgkEDozka8jsv86Dd4fi9wYwmOnoqo57S\novnKfbR7R7nVnj17aNnkEsyRBazmfBqzze6Q/NIy2tFV5vH25MXceuuVdoej/ExF3Tua9JXbvTpx\nIs89dIALCs7mc662Oxy/kUoc42lFHrEsozV16ofz+5/jEF31XFWS9ukrr7pnyBAatvqC7ziXOfS1\nOxy/kEocw+hHGsvIJIMjvEZIZBRz5iw68YuVqgRt6SuP2Lx5Mx3aPkbN/P+wiTZEk2d3SD4tkQ6k\nseyf2xNHMXfuaBsiUv7M51r6IjJaRFaLyCoRmS8ijeyIQ3lOixYt+M+4vhwMXc1oHrc7HJ+Xr2WT\nlZfY1b3zgjGmnTGmPTATeMqmOJQHDb7rLi7p9RUvcj7diCeBi7X8cjnCyvklpGWTlbvZkvSNMdml\nHsYBe+2IQ3mWiHDjHddgQr7iOxaykAzSWMYw+mniL+UgNfiF24Chx223yib3siUmFbhs69MXkbHA\nzUAu0MUYc8DJPtqn7+e0/HLF9lGbHsxjS+gy7nlwL2vXHtWyyarabCmtLCLpwKlOnhphjPnSGPME\n8ISIPA68DNzu7DgpKSnH7ickJJCQkOD+YJXHaPnl8u2iHj1IZ1fYfJ58Op9Hh4+yOyTlpzIyMsjI\nyHBpX9tH74hIY2COMaaNk+e0pe/nymvpX0w3MvjOhoh8ww4akMB8ssNmcMcDBxn74gt2h6QCiC+O\n3jmr1MPLgZV2xKE8z1n5ZeEefuRhFpBgT1A220oTLiKT7PAPuW3oPsa88LzdIakgYktLX0Q+BVoC\nRUAWcK8xZreT/bSlHwBSUzOZMCH9WF/1JZc04Nmn5mDy3mIE/+VRXiRY5pz+zJkk8DX54eN5cMRJ\njHjqKZ1xq9xOyzAon7Nu3Tr6XHwT7H+TjmznXW7nZA7ZHZZHrac1F5NGfvgzvPy/87jjzjvtDkkF\nKE36yift3LmTK3sPYOf6OwktSmAmV9GGn+wOy21KaunkE0s+IaxmKOHRqcxMvZEePXrYHZ4KYD7X\np68UwKmnnsrC5d8x4I4fORjxAt1ZwFQG2h2WW5SupbOQDL7nGwpCv+KV//XRhK9spUlf2SoiIoLx\nb7zB2x8PICT2Cu5jNEMYx1HCSSWORDr45Uze8bQii+nHbSssepPp01fbFJFSFl0jV/mEyy+/nPVZ\nXbjr5qG8982tfFk0nlAW8RsfHtsni+uBOSSRY1+gLviVZqymrdPntJaOspu29JXPqF+/PrPSPmba\n57AzJPO4hA+QxXQm0Mqm6CpmgIXE05/PaMMP7NZaOspHadJXPmfAgCQuvOhMp88d8bGZvPlE8B63\n0I4VXMMbZIQt4OprHmHS5Kv+MT9Ba+koX6DdO8onRUcXO92+lAt4mP5cwSy6sphQnO/nabuox+vc\nw/+4h2hZx/6wFK4YEMHIZ8bQsmVLAE455RQmTBhVqpZOH62lo2ynQzaVT0pNzWTYsHlkZY09tq1u\n3fsIL95AXvalRBb0I5+GXM5srmAmvUgnhiPuj6PUsMtIDtOfPJbyIJ9zJTXDP+dI+OvcdXc3hjzw\nAI0bN3b7+ZWqCh2nr/xS2Zm8Q4f2ol+/7ixbtowpb73F9GnfE1HQl/D8vuzhAi5hAVcxk/7M5hT2\n/iNhJ7OxUheBS4ZdHj8K59+Eyj56d9/Pv4YOYsCAAURGRrr/zStVDZr0VUAqKipi8eLFpM6cyVef\nL2TT7204Sa7gUGEP6vIhh1nNQd44tn9jbuJB1tGW2hzkZA5yMoeocez+QU7mL05mNzXYzcn8ynQK\neOUf5+3Z83G+/vo5b75VpSpFk74KCgcOHGDp0qUs+e5Hxo1bw4FD0/6xTyjDqB16NREcIlyyCZFD\nFIcc4iiHOGz+IqdgP3VOKqZpoxr8tqeQXbsn/eMYF1+cQkZGihfekVJVY0s9faW8rWbNmiQmJpKY\nmEhGZgoLF/5zn1bnFDFy5B8UFRUhIkRFnUJcXDNq1arFqaeeymmnnUZYmPXfwioL/c9j6LBL5c80\n6auAFBlZ6HT76afX4oYbbnDpGMnJvcnKeuK4i8nWsMs+bolRKTto0lcByR0Ju2R4pQ67VIFE+/RV\nwHI2+kcTtgoGeiFXKaWCiJZWVkopBWjSV0qpoKJJXymlgogmfaWUCiKa9JVSKoho0ldKqSBia9IX\nkYdFpFhEatsZh1JKBQvbkr6INAJ6Ab9V9RgZGRlui8cf6fvPsDsE2wTzewd9/9V5/3a29P8LPFad\nA+hffIbdIdgqmN9/ML930Pfvd0lfRC4Hthtj1thxfqWUClYeK7gmIunAqU6eegIYDvQuvbun4lBK\nKfU3r9feEZE2wHwg17HpdGAH0MkYs7vMvlp4RymlqsBnC66JyBbgAmPMflsDUUqpIOAL4/S1Na+U\nUl5ie0tfKaWU9/hCS98tgnWil4i8KCIbRGS1iHwmIifbHZOniUgfEdkoIj+LyL/tjsebRKSRiCwQ\nkZ9EZJ2IJNsdkx1EJFREVorIl3bH4m0iUlNEPnX8v18vIl0q8/qASPrumOjlx9KAc4wx7YDNWCOj\nApaIhAITgT7A2cBAEWltb1ReVQA8aIw5B+gC3Bdk77/EMGA9wdk9PA6YY4xpDbQFNlTmxQGR9HHD\nRC9/ZYxJN8YUOx4uxRoNFcg6Ab8YY7YaYwqAacDlNsfkNcaYncaYVY77OVj/4RvYG5V3icjpQD/g\nbYJsuLfjl3x3Y8wkAGNMoTHmYGWO4fdJXyd6HedfwBy7g/CwhsC2Uo+3O7YFHRFpCpyH9WUfTF4G\nHgWKT7RjAGoG7BGRySKyQkTeEpGYyhzAY5Oz3CnYJ3pV8P5HGGO+dOzzBHDUGDPVq8F5XzD+nP8H\nEYkDPgWGOVr8QUFE+gO7jTErRSTB7nhsEAacD9xvjFkmIq8AjwNPVuYAPs8Y08vZdsdEr2bAahEB\nq2vjRxH5x0Qvf1be+y8hIrdh/dzt6ZWA7LUDaFTqcSOs1n7QEJFwYAbwgTFmpt3xeFlX4DIR6QdE\nATVEZIox5hab4/KW7Vg9G8scjz/FSvouC6ghm8E40UtE+gD/AS42xuy1Ox5PE5EwYBPWF9wfwA/A\nQGNMpS5m+SuxWjfvAfuMMQ/aHY+dRORi4BFjzAC7Y/EmEckEBhtjNotIChBtjHF5FJtftPQrIXC+\nwVw3AYgA0h2/dpYYY4bYG5LnGGMKReR+YB4QCrwTLAnf4SLgJmCNiKx0bBtujJlrY0x2Csb/80OB\nD0UkAsgCbq/MiwOqpa+UUqpifj96RymllOs06SulVBDRpK+UUkFEk75SSgURTfpKKRVENOkrpVQQ\n0aSvlBuIyN0icrPj/m0iclqp594K0kqYygfpOH2l3ExEFmDNFP3R7liUKktb+ipgiUhHx+IykSIS\n61h05Owy+zR1LMjygWNBik9EJNrxXE9HJcM1IvKOYwYkIvKcYxGT1SLygmNbimMhn6uBDlgzJleI\nSJSIZIjIBY79BjqOt1ZEnisVR46IjBGRVSKyRETqeetzUsFFk74KWI6iVF8AY4DngfeNMeud7NoC\n+J8x5mzgEDBERKKAycB1xpi2WCVL7nWszHaFMaZk4ZoxJaezTmlmAMuBQcaY840xeSXPiUgD4Dmg\nB9Ae6OgoDQ4Qg1VCoz2QCdzp3k9DKYsmfRXonsYqvd0BeKGcfbYZY5Y47n8AdMP6IthijPnFsf09\nIB44COQ5Wv5XAkfKOWbZEt8CdAQyjDH7jDFFwIeOY4JVFjvVcf9HoKmL70+pStGkrwJdXSAWiAOi\ny9mn9IUtwXkRLwFwJOtOWCVt+wPlFTpzdoyy20qfq6DU9mICrxii8hGa9FWgewMYCUzF6uJxpnGp\nxaUHAYuwyjc3FZHmju03AxkiEgvUNMZ8BTwEtHM8L/zdus8GapQ5h8EqA32xiNRxrPV7A7CwOm9O\nqcrS1oQKWCJyC5BvjJkmIiHAYhFJMMZklNl1E9YC45OAn4DXjDH5InI78Imjhv8PwOtYvxxmOvr8\nBSipaW/4u9X+LvC6iORiLfph7WDMThF5HFjgeO3skpXPOP5XgCE4SwYrL9AhmyqoOdaZ/dIYc67N\noSjlFdq9o5S2qlUQ0Za+UkoFEW3pK6VUENGkr5RSQUSTvlJKBRFN+kopFUQ06SulVBDRpK+UUkHk\n/wFolQFeWUMVnQAAAABJRU5ErkJggg==\n", "text": [ "" ] } ], "prompt_number": 6 }, { "cell_type": "code", "collapsed": false, "input": [], "language": "python", "metadata": {}, "outputs": [] } ], "metadata": {} } ] }