{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# Example of using feature importances calculated by ExtraTreesClassifier" ] }, { "cell_type": "code", "execution_count": 1, "metadata": { "collapsed": true }, "outputs": [], "source": [ "require 'matplotlib/iruby'\n", "Matplotlib::IRuby.activate\n", "plt = Matplotlib::Pyplot\n", "nil" ] }, { "cell_type": "code", "execution_count": 2, "metadata": { "collapsed": true, "scrolled": true }, "outputs": [], "source": [ "require 'pycall/import'\n", "include PyCall::Import\n", "pyimport 'numpy', as: 'np'\n", "pyfrom 'sklearn.datasets', import: :fetch_olivetti_faces\n", "pyfrom 'sklearn.datasets', import: :make_classification\n", "pyfrom 'sklearn.ensemble', import: :ExtraTreesClassifier\n", "nil" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## (1) Feature importances with forests of trees\n", "\n", "This section is based on the following content of the reference of scikit-learn:\n", "\n", "- http://scikit-learn.org/stable/auto_examples/ensemble/plot_forest_importances.html" ] }, { "cell_type": "code", "execution_count": 3, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Feature ranking:\n", "1. feature 1 (0.295902)\n", "2. feature 2 (0.208351)\n", "3. feature 0 (0.177632)\n", "4. feature 3 (0.047121)\n", "5. feature 6 (0.046303)\n", "6. feature 8 (0.046013)\n", "7. feature 7 (0.045575)\n", "8. feature 4 (0.044614)\n", "9. feature 9 (0.044577)\n", "10. feature 5 (0.043912)\n" ] }, { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAi8AAAGzCAYAAADnmPfhAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAAPYQAAD2EBqD+naQAAIABJREFUeJzt3Xl8lNW9x/HvZDCL2QhEshlIAkiULZKQvAIIVEZCilauVpZLmxDr8qJIoREV9EJAxCDSXpRVrYJ1A/e2XoqlKcHaRkCWCqgUKMqasCgJGUqimef+YTM6JoFMgExO+Lxfr+dl5sx5zvzOTGS+OfM8z9gsy7IEAABgCD9fFwAAAOANwgsAADAK4QUAABiF8AIAAIxCeAEAAEYhvAAAAKMQXgAAgFEILwAAwCiEFwAAYBTCC4CL7rPPPpPNZtOKFSt8XQqAVoDwAlxgK1askM1mq3ebOnXqRXvc1atXa+bMmRdt/EvdkiVLCF9AC9HG1wUArdXDDz+sxMREj7YePXpctMdbvXq1Fi9e3CIDTKdOnfTvf/9bl112ma9LabIlS5YoMjJS48aN83UpwCWP8AJcJNnZ2UpLS/N1GefN6XQqODj4vMaw2WwKDAy8QBU1r9OnT+vyyy/3dRkAvoOPjQAfevHFF5WamqqgoCC1a9dOo0eP1oEDBzz6/PWvf9Vtt92mjh07KiAgQPHx8frlL3+pf//73+4+48aN0+LFiyXJ42MqSSouLpbNZlNxcbHHuPUdhzJu3DiFhIRo7969+uEPf6jQ0FCNHTvWff+GDRs0bNgwhYeH6/LLL9egQYP0t7/97ZzzPNtj7d+/XzfeeKNCQkIUFxfnnsf27dt1/fXXKzg4WJ06ddLLL7/sMWbtx3Pvvfee7r77brVv315hYWHKycnRl19+WaeGJUuWqHv37goICFBsbKwmTJigkydPevQZPHiwevTooc2bN2vgwIG6/PLL9eCDDyohIUE7d+7U+vXr3c/t4MGDJUlffPGFpkyZop49eyokJERhYWHKzs7WP/7xD4+xa1+HV199VXPmzNGVV16pwMBADRkyRHv27KlT74YNG/TDH/5QERERCg4OVq9evfTEE0949Pn000/14x//WO3atVNgYKDS0tL0+9//3qPPV199pVmzZqlr164KDAxU+/btNWDAAK1du/bsLxrQgrHyAlwk5eXlOn78uEdbZGSk++c5c+Zo+vTpGjlypO644w4dO3ZMCxcu1MCBA7V161a1bdtWkvTaa6/p9OnTGj9+vNq3b6+NGzdq4cKFOnjwoF577TVJ0t13363Dhw9r7dq1euGFF86r7q+//lpZWVkaMGCA5s+f7151+Mtf/qLs7GylpqaqoKBAfn5+Wr58ua6//nr99a9/VXp6utePVVNTo+zsbA0cOFDz5s3TSy+9pHvuuUfBwcF66KGHNHbsWN1yyy1atmyZcnJylJmZWeejuHvuuUdt27bVzJkztWvXLi1dulSff/65OyxI0syZMzVr1iw5HA6NHz/e3W/Tpk3629/+5vFx1okTJ5Sdna3Ro0frJz/5iaKiojR48GBNnDhRISEheuihhyRJUVFRkqR//etfevvtt3XbbbcpMTFRZWVleuqppzRo0CB9/PHHio2N9ah37ty58vPz05QpU1ReXq558+Zp7Nix2rBhg7vP2rVrdeONNyomJkaTJk1SdHS0PvnkE73zzjuaNGmSJGnnzp3q37+/4uLiNHXqVAUHB+vVV1/ViBEj9MYbb+i//uu/3HMvLCzUHXfcofT0dFVUVOjDDz/Uli1bdMMNN3j9mgEtggXgglq+fLklqd6t1meffWbZ7XZrzpw5Hvtu377datOmjUf76dOn6zxGYWGhZbPZrM8//9zdNmHCBKu+/6XXrVtnSbLWrVvn0b5v3z5LkrV8+XJ3W25uriXJmjp1qkdfl8tlde3a1crKyrJcLpdHbYmJidYNN9xw1ufkbI/16KOPutu+/PJLKygoyLLZbNbKlSvd7Z9++qklySooKHC31T7PqampVnV1tbt93rx5liTrd7/7nWVZlnX06FHL39/fGjp0qFVTU+Put2jRIkuS9dxzz7nbBg0aZEmyli1bVmcO3bt3twYNGlSn/cyZMx7j1s43ICDAevjhh91tta/D1VdfbVVVVbnbn3jiCUuStX37dsuyLOvrr7+2EhMTrU6dOllffvmlx7jffe6HDBli9ezZ0zpz5ozH/f369bO6du3qbuvdu7c1fPjwOnUDJuNjI+AiWbx4sdauXeux1XrzzTflcrk0cuRIHT9+3L1FR0era9euWrdunbtvUFCQ+2en06njx4+rX79+sixLW7duvSi1jx8/3uP2tm3btHv3bv33f/+3Tpw44a7X6XRqyJAheu+99+RyuZr0WHfccYf757Zt26pbt24KDg7WyJEj3e3dunVT27Zt9a9//avO/nfddZfHysn48ePVpk0brV69WpL05z//WdXV1Zo8ebL8/L79J+/OO+9UWFiY/u///s9jvICAAOXl5TW6/oCAAPe4NTU1OnHihEJCQtStWzdt2bKlTv+8vDz5+/u7b1933XWS5J7b1q1btW/fPk2ePNm9+lardiXpiy++0F/+8heNHDlSp06dcr8eJ06cUFZWlnbv3q1Dhw5J+uY53blzp3bv3t3oOQEtHR8bARdJenp6gwfs7t69W5ZlqWvXrvXe/9034/3792vGjBn6/e9/X+dYjvLy8gtX8H+0adNGV155ZZ16JSk3N7fB/crLyxUREeHVYwUGBuqKK67waAsPD9eVV17pfqP+bnt9x7J8/zkMCQlRTEyMPvvsM0nS559/LumbAPRd/v7+SkpKct9fKy4uziNcnIvL5dITTzyhJUuWaN++faqpqXHf1759+zr9O3bs6HG79jmrndvevXslnf3MtD179siyLE2fPl3Tp0+vt8/Ro0cVFxenhx9+WDfffLOuuuoq9ejRQ8OGDdNPf/pT9erVq9FzBFoawgvgAy6XSzabTX/84x9lt9vr3B8SEiLpm7/kb7jhBn3xxRd64IEHlJycrODgYB06dEjjxo1r1GrH90NAre++yX7Xd1cSvluvJD3++ONKSUmpd7/amr1R39zP1m5ZlteP4a3vrnQ1xqOPPqrp06fr9ttv1+zZs9WuXTv5+flp8uTJ9b4+F2JuteNOmTJFWVlZ9fbp0qWLJGngwIHau3evfve73+lPf/qTfvOb3+h///d/tWzZMo9VL8AkhBfABzp37izLspSYmKirrrqqwX7bt2/XP//5Tz3//PPKyclxt9d3pkhDIaX2L/vvn1nz/RWHc9UrSWFhYXI4HI3erzns3r1bP/jBD9y3KysrdeTIEf3whz+U9M01ZiRp165dSkpKcverrq7Wvn37Gj2fhp7f119/XT/4wQ/07LPPerSfPHnS4wDtxqp9rnfs2NFgbbXzuOyyyxpVf7t27ZSXl6e8vDxVVlZq4MCBmjlzJuEFxuKYF8AHbrnlFtntds2aNavOX9yWZenEiROSvv0r/bt9LMuqc8qsJPe1WL4fUjp16iS73a733nvPo33JkiWNrjc1NVWdO3fW/PnzVVlZWef+Y8eONXqsC+3pp5/WV1995b69dOlSff3118rOzpYkORwO+fv768knn/R4Hp999lmVl5dr+PDhjXqc4ODgOs+t9M1r9P3X8LXXXnMfc+KtPn36KDExUQsWLKjzeLWP06FDBw0ePFhPPfWUjhw5UmeM774etb9LtUJCQtSlSxdVVVU1qT6gJWDlBfCBzp0765FHHtG0adP02WefacSIEQoNDdW+ffv01ltv6a677tKUKVOUnJyszp07a8qUKTp06JDCwsL0xhtv1HvsR2pqqiTpF7/4hbKysmS32zV69GiFh4frtttu08KFC2Wz2dS5c2e98847Onr0aKPr9fPz029+8xtlZ2ere/fuysvLU1xcnA4dOqR169YpLCxMf/jDHy7Y8+ON6upqDRkyRCNHjtSuXbu0ZMkSDRgwQD/60Y8kSVdccYWmTZumWbNmadiwYfrRj37k7te3b1/95Cc/adTjpKamaunSpXrkkUfUpUsXdejQQddff71uvPFGPfzww8rLy1O/fv20fft2vfTSSx6rPN7w8/PT0qVLddNNNyklJUV5eXmKiYnRp59+qp07d+rdd9+V9M0B4QMGDFDPnj115513KikpSWVlZSopKdHBgwfd15m55pprNHjwYKWmpqpdu3b68MMP9frrr+uee+5pUn1Ai+CTc5yAVqz2FN5Nmzads+8bb7xhDRgwwAoODraCg4Ot5ORka8KECdauXbvcfT7++GPL4XBYISEhVmRkpHXnnXda//jHP+qcevz1119bEydOtK644grLZrN5nDZ97Ngx69Zbb7Uuv/xyKyIiwrr77rutHTt21Hv6cnBwcIP1bt261brlllus9u3bWwEBAVanTp2skSNHWkVFRWedZ0OnStf3WIMGDbK6d+9ep71Tp04ep/zWPs/r16+37rrrLisiIsIKCQmxxo4da504caLO/osWLbKSk5Otyy67zIqKirLGjx9f51Tkhh7bsiyrtLTUGj58uBUaGmpJcp82febMGevee++1YmJirKCgIKt///5WSUmJNWjQII9Tq2tPlX7ttdfO+dxYlmW9//771g033GCFhoZawcHBVq9evayFCxd69Nm7d6+Vk5NjRUdHW5dddpkVFxdn3Xjjjdbrr7/u7vPII49Y6enpVtu2ba2goCArOTnZmjNnjsfp5YBpbJbVDEfAAcAFtmLFCuXl5WnTpk2t4msYADQex7wAAACjEF4AAIBRCC8AAMAoHPMCAACMwsoLAAAwCuEFAAAYpVVcpM7lcunw4cMKDQ1t8BLeAACg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", "text/plain": [ "" ] }, "execution_count": 3, "metadata": {}, "output_type": "execute_result" }, { "data": { "text/plain": [ "(-1, 10)" ] }, "execution_count": 3, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# Build a classification task using 3 informative features\n", "x, y = *make_classification(\n", " n_samples: 1000,\n", " n_features: 10,\n", " n_informative: 3,\n", " n_redundant: 0,\n", " n_repeated: 0,\n", " n_classes: 2,\n", " random_state: 0,\n", " shuffle: false\n", ")\n", "\n", "# Build a forest and compute the feature importances\n", "forest = ExtraTreesClassifier.new(n_estimators: 250, random_state: 0)\n", "\n", "forest.fit(x, y)\n", "importances = forest.feature_importances_\n", "std = np.std(forest.estimators_.map {|tree| tree.feature_importances_ }, axis: 0)\n", "indices = np.argsort(importances)[(-1..0).step(-1)]\n", "\n", "# Print the feature ranking\n", "puts \"Feature ranking:\"\n", "\n", "x.shape[1].times do |f|\n", " puts \"%d. feature %d (%f)\" % [f + 1, indices[f].to_i, importances[indices[f]]]\n", "end\n", "\n", "# Plot the feature importances of the forest\n", "plt.figure()\n", "plt.title(\"Feature importances\")\n", "plt.bar([*0...x.shape[1]], importances[indices],\n", " color: \"r\", yerr: std[indices], align: \"center\")\n", "plt.xticks([*0...x.shape[1]], indices)\n", "plt.xlim([-1, x.shape[1]])" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## (2) Pixel importances with a parallel forest of trees\n", "\n", "This example is based on the following content of the reference of scikit-learn:\n", "\n", "- http://scikit-learn.org/stable/auto_examples/ensemble/plot_forest_importances_faces.html" ] }, { "cell_type": "code", "execution_count": 4, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Fitting ExtraTreesClassifier on faces data with 1 cores...\n", "done in 1.253s\n" ] }, { "data": { "image/png": "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o4/w/vvvo1KlSti+fTu6d++OlJQU3HHHHUhOTsbmzZvNzfvXdO7cGePGjcOnn36Kk046CQCwdOlSREdHY+nSpRg2bFhIA4AzzzzTrGfQoEHYtm0bFixYgBdeeMEsM23aNOzatQuDBg1CVFQUHnnkEfTu3RtfffUVvdPu3bs3kpOTcdNNN2HAgAE499xzkZCQAAD49NNP0blzZyQmJuK2225DpUqV8Mwzz+Css87CkiVL0K5du7C6brjhBqSkpGDUqFHIy8sDcGDNtG/fHlFRURgyZAhSUlLw1ltv4eqrr0Zubi5uvPFGAMCkSZMwbNgwXHTRRRg+fDj27t2L//znP1ixYgUuueQS9O7dG1988QX++c9/Yty4cahZsyYAICUlBZ9++inOO+88nHLKKbj//vsRGxuLjRs34v333y92boADT0imTp2Kiy66CDfffDNWrFiBsWPH4rPPPsPMmTMBHDiHn332WXz44Yf429/+BgA444wzzPruuusu5OTk4JtvvsG4ceMAIDSeRRx8XsTExGDPnj3o0qULvv32WwwaNAgNGjTABx98gJEjR+K7774Le2d1NNdrICjrZ4llTdE7prffftt9//33buvWrW769OmuRo0aLj4+3n3zzTfOOecWLVoU8V6koKDAderUyaWmprodO3a4wYMHu4oVK7qVK1eGyuzatcslJye7P/7xj2HHzcrKcklJSWH64b5jGjhwYNjz66L3CykpKW7nzp0hfeTIkQ6Aa9mypdu/f39IHzBggIuJiQl7T9WwYUMHwL366qshLScnx9WpU8edeuqpIe3GG290ANzSpUvD+tioUSOXnp4eegdXNF6NGzd2e/bsCWt/ce+YDi7rnHODBg1ylStXDmtvly5dHAD3/PPPh7T8/HxXu3Zt16dPn5D297//3QFwjz32WES9hYWFzjnnli5d6gC4F198MezzuXPnhukzZ850AMLm93DYvn27A+AmTJjgnHNu586dLjo62vXt29elpqaGyg0bNsxVr1491K6ieZ08eXKozKHeMdWoUcP9+OOPIX3WrFkOgJs9e3axbWTvqC644AIXExPjvvzyy5C2bds2V7VqVXfmmWeGtKLzqFOnTmHvxJxz7uqrr3Z16tRxO3bsCNP79+/vkpKSQnPeq1cv16JFi2Lbyd4xjRs3zgFw33//fbG/fzAff/yxA+CuueaaMP2WW25xANw777wT0gYOHOiqVKlyWPWyd0zFnRdjxoxxVapUcV988UWYfscdd7gKFSq4LVu2OOeO/noNAnqU918yMjKQkpKC+vXro3///khISMDMmTNRt25d+jvR0dGYMmUKdu/ejR49emDChAkYOXJkmJtpwYIF2LlzJwYMGIAdO3aEfipUqIB27dph0aJFpdaHvn37IikpKfT/or9mL7vsMlSsWDFM37dvH7799tuw309LSwu740lMTMTll1+Ojz76CFlZWQAOuMLatm2LTp06hcolJCTg2muvxebNm7Fu3bqwOgcOHIj4+PjD7sOvy+7atQs7duxA586dsWfPHnz++edhZRMSEnDZZZeF/h8TE4O2bdviq6++CmmvvvoqatasiaFDh0Ycq+gx2IwZM5CUlIRzzjknbI5at26NhISE0BwVvX+ZM2cO9u/ff9h9SklJQbNmzfDuu+8CAN5//31UqFABt956K7Kzs7FhwwYAB+6YOnXqdFhfGWD069cP1apVC/2/c+fOABA2JodLQUEB5s+fjwsuuACNGzcO6XXq1MEll1yC9957L/QIqog//vGPqFChQuj/zjm8+uqrOP/88+GcCxvfzMxM5OTkYM2aNQAOjO8333xzyEePFkVzM2vWrIjHXsXxr3/9C8CBx62/5uabbwaAiEfUpYV1XsyYMQOdO3dGtWrVwsYpIyMDBQUFofVztNdrENDG9F/Gjx+PBQsWYNGiRVi3bh2++uorZGZmHvL3mjRpgtGjR2PlypVo0aIF7rnnnrDPiy46Xbt2RUpKStjP/PnzsX379lLrQ4MGDcL+X7RJ1a9f39QPfh593HHHRVwUTzjhBAAIPcf/+uuv0bRp04hjFz2K+/rrr8P0Ro0a+XQBn376KS688EIkJSUhMTERKSkpoc0nJycnrGy9evUi2lutWrWwfn355Zdo2rRp2MZ8MBs2bEBOTg5q1aoVMUe7d+8OzVGXLl3Qp08f3HfffahZsyZ69eqFyZMnh72LYHTu3Dn0qG7p0qVo06YN2rRpg+rVq2Pp0qXIzc3Fv//979BGUlIOXgNFm9TBc304fP/999izZw+d78LCQmzdujVMP3i+v//+e+zcuRPPPvtsxNheeeWVABAa39tvvx0JCQlo27Ytjj/+eAwePPiwHsUBBzbkjh074pprrkFqair69++Pl19++ZCb1Ndff43o6Ggcd9xxYXrt2rWRnJwcsZ5LC+u82LBhA+bOnRsxThkZGQD+N06/xXota/SO6b+0bdu2xN/bmD9/PgBg27Zt+OGHH1C7du3QZ0UnxgsvvBCmF1HcBdOXX/+leji6+9XL+KOFz93Szp070aVLFyQmJuL+++9HkyZNEBcXhzVr1uD222+PuMiUVr8KCwtRq1YtvPjii+bnKSkpAA7cYb3yyitYvnw5Zs+ejXnz5uGqq67CX/7yFyxfvjziPcKv6dSpEyZNmoSvvvoKS5cuRefOnREVFYVOnTph6dKlSEtLQ2Fh4RFvTGU510DkfBfN2WWXXYaBAweav3PKKacAOLDZrV+/HnPmzMHcuXPx6quvYsKECRg1ahTuu+++Qx733XffxaJFi/Dmm29i7ty5eOmll9C1a1fMnz+fjksRR3KXWhKs86KwsBDnnHMObrvtNvN3iv5I/C3Wa1mjjekIefrpp7FgwQI88MADGDt2LAYNGoRZs2aFPi96uV6rVq3QXz5BZePGjXDOhZ2kX3zxBQCEDBoNGzbE+vXrI3636DFbkburONhFYPHixfjhhx/w2muvhRkAipyRJaFJkyZYsWIF9u/fT1/+N2nSBG+//TY6dux4WBtp+/bt0b59ezzwwAOYNm0aLr30UkyfPh3XXHMN/Z2iDWfBggVYuXIl7rjjDgAHjA4TJ05EWloaqlSpgtatWxd77N/yApqSkoLKlSvT+Y6Ojo64G7fqqFq1KgoKCg5r/VepUgX9+vVDv379sG/fPvTu3RsPPPAARo4cibi4uGL7Hx0djW7duqFbt2547LHH8OCDD+Kuu+7CokWL6LEbNmyIwsJCbNiwIXTXDxwwbOzcufOw1rNFSeapSZMm2L179yHH6bdYr2WNHuUdAZs2bcKtt96KPn364M4778Sf//xnvPHGG3j++edDZTIzM5GYmIgHH3zQfM5b9P2RILBt27aQCwkAcnNz8fzzz6NVq1ahu71zzz0XH374IZYtWxYql5eXh2effRbp6elo3rz5IY9T9N2Wg7+9X/RX7a//ut+3bx8mTJhQ4j716dMHO3bswFNPPRXxWdFxLr74YhQUFGDMmDERZX755ZdQO3/66aeIO4+isDSHejzSqFEj1K1bF+PGjcP+/fvRsWNHAAc2rC+//BKvvPIK2rdvf8g7aDZ2R4MKFSqge/fumDVrVliUjuzsbEybNg2dOnVCYmLiIevo06cPXn31VXzyyScRn/96/f/www9hn8XExKB58+ZwzoXOHdb/g7/+ABze3Jx77rkAEBGl4bHHHgMA9OzZk/5ucVSpUiXi0fOhuPjii7Fs2TLMmzcv4rOdO3fil19+CZU72uu1rNEdUwlxzuGqq65CfHx86HsngwYNwquvvorhw4cjIyMDaWlpSExMxMSJE/H//t//w2mnnYb+/fsjJSUFW7ZswZtvvomOHTuaF82y4IQTTsDVV1+NlStXIjU1FX//+9+RnZ2NyZMnh8rccccd+Oc//4kePXpg2LBhqF69OqZOnYpNmzbh1VdfPawvCbZq1QoVKlTAww8/jJycHMTGxqJr164444wzUK1aNQwcOBDDhg1DVFQUXnjhhSN6DHX55Zfj+eefx4gRI/Dhhx+ic+fOyMvLw9tvv40bbrgBvXr1QpcuXTBo0CCMHTsWH3/8Mbp3745KlSphw4YNmDFjBp544glcdNFFmDp1KiZMmIALL7wQTZo0wa5duzBp0iQkJiaGLnDF0blzZ0yfPh0nn3xy6N3PaaedhipVquCLL77AJZdccsg6iu6ohg0bhszMTFSoUAH9+/cv8fgcij/96U+h7wfdcMMNqFixIp555hnk5+eb3xmzeOihh7Bo0SK0a9cOf/zjH9G8eXP8+OOPWLNmDd5+++3QptK9e3fUrl0bHTt2RGpqKj777DM89dRT6NmzJ6pWrQrgf/2/66670L9/f1SqVAnnn38+7r//frz77rvo2bMnGjZsiO3bt2PChAmoV69emFHnYFq2bImBAwfi2WefDT1K/vDDDzF16lRccMEFOPvss0s0bq1bt8ZLL72EESNG4PTTT0dCQgLOP//8Yn/n1ltvxRtvvIHzzjsPV1xxBVq3bo28vDysXbsWr7zyCjZv3oyaNWv+Zuu1TCkTL2CAKLK5HspSebBd/IknnoiwVzvn3JYtW1xiYqI799xzI34/MzPTJSUlubi4ONekSRN3xRVXuFWrVoXKHKld/GCrb1GbZ8yYccg+N2zY0PXs2dPNmzfPnXLKKS42NtY1a9Ys4nedc+7LL790F110kUtOTnZxcXGubdu2bs6cOYd17CImTZrkGjdu7CpUqBA2ru+//75r3769i4+Pd2lpae62225z8+bNi7CXd+nSxbQWHzw2zh2woN91112uUaNGrlKlSq527druoosuCrNAO+fcs88+61q3bu3i4+Nd1apV3cknn+xuu+02t23bNuecc2vWrHEDBgxwDRo0cLGxsa5WrVruvPPOC5vD4hg/frwD4K6//vowPSMjwwFwCxcuDNMtu/gvv/zihg4d6lJSUlxUVFRovRQXkgiAu/fee4ttW3G/v2bNGpeZmekSEhJc5cqV3dlnn+0++OCDsDKHOo+ys7Pd4MGDXf369UNz0K1bN/fss8+GyjzzzDPuzDPPdDVq1HCxsbGuSZMm7tZbb3U5OTlhdY0ZM8bVrVvXRUdHh6zjCxcudL169XJpaWkuJibGpaWluQEDBkRYry3279/v7rvvvtD6qF+/vhs5cmRE2C8fu/ju3bvdJZdc4pKTkx2A0Jo81Hmxa9cuN3LkSHfccce5mJgYV7NmTXfGGWe4P//5z27fvn1hZY/2ei1Lopz7jd6KikCTnp6Ok046CXPmzCnrpgghjnH0jkkIIUSg0MYkhBAiUGhjEkIIESgCvTGNHz8e6enpiIuLQ7t27fDhhx+WdZOOiHfffRfnn38+0tLSzAyhzjmMGjUKderUQXx8PDIyMkKRI442mzdvLrX3S2PHjsXpp5+OqlWrolatWrjgggsivguzd+9eDB48GDVq1EBCQgL69Onzu0vMOHHiRJxyyilITExEYmIiOnTogLfeeiv0eXnoo8VDDz2EqKioUPBVoHz0tSiD9K9/mjVrFvq8PPSxiG+//RaXXXYZatSogfj4eJx88slYtWpV6POyvBYBAd6YiqyW9957L9asWYOWLVsiMzOzVEP4/Nbk5eWhZcuWodQFB/PII4/gySefxNNPP40VK1agSpUqyMzMxN69e3/jlh4ZS5YsweDBg7F8+XIsWLAA+/fvR/fu3UPRpgHgpptuwuzZszFjxgwsWbIE27ZtQ+/evcuw1f7Uq1cPDz30EFavXo1Vq1aha9eu6NWrVyidSXno48GsXLkSzzzzTChaQxHlpa8tWrTAd999F/p57733Qp+Vlz7+9NNP6NixIypVqoS33noL69atw1/+8pewGItlfi0qW1Mgp23btm7w4MGh/xcUFLi0tDQ3duzYMmxV6QHAzZw5M/T/wsJCV7t27TC77s6dO11sbKz75z//WRZNLDWKomsvWbLEOXegX5UqVQqzzH722WcOgFu2bFlZNbNUqFatmvvb3/5WLvu4a9cud/zxx7sFCxa4Ll26uOHDhzvnys983nvvva5ly5bmZ+Wlj84dyMTbqVMn+nkQrkWBvGPat28fVq9eHRaaIzo6GhkZGWERB8oTmzZtQlZWVlifk5KS0K5du999n4u+AV+9enUAwOrVq7F///6wvjZr1gwNGjT43fa1oKAA06dPR15eHjp06FAu+zh48GD07NkzImROeerrhg0bkJaWhsaNG+PSSy/Fli1bAJSvPr7xxhto06YN+vbti1q1auHUU0/FpEmTQp8H4VoUyI1px44dKCgoQGpqapiempoaSr9Q3ijqV3nrc2FhIW688UZ07NgxlCQvKysLMTExEWm8f499Xbt2LRISEhAbG4vrrrsOM2fORPPmzctVHwFg+vTpWLNmDcaOHRvxWXnpa7t27TBlyhTMnTsXEydOxKZNm9C5c2fs2rWr3PQROJACZeLEiTj++OMxb948XH/99Rg2bBimTp0KIBjXIoUkEkeVwYMH45NPPgl7Vl+eaNq0KT7++GPk5OTglVdewcCBA7FkyZKyblapsnXrVgwfPhwLFixAXFxcWTfnqFGU9Rg4EPG8Xbt2aNiwIV5++WWvKPlBp7CwEG3atMGDDz4IADj11FPxySef4Omnn6YR4H9rAnnHVLNmTVSoUCHC8ZKdnW2mjigPFPWrPPV5yJAhmDNnDhYtWoR69eqF9Nq1a2Pfvn0RgTh/j32NiYnBcccdh9atW2Ps2LFo2bIlnnjiiXLVx9WrV2P79u047bTTULFiRVSsWBFLlizBk08+iYoVKyI1NbXc9PXXJCcn44QTTsDGjRvL1XzWqVMnItjyiSeeGHpsGYRrUSA3ppiYGLRu3RoLFy4MaYWFhVi4cCE6dOhQhi07ejRq1Ai1a9cO63Nubi5WrFjxu+uzcw5DhgzBzJkz8c4770QkRWvdujUqVaoU1tf169djy5Ytv7u+HkxhYSHy8/PLVR+7deuGtWvX4uOPPw79tGnTBpdeemno3+Wlr79m9+7d+PLLL1GnTp1yNZ8dO3aM+PrGF198EUrxEYhr0W9isSgB06dPd7GxsW7KlClu3bp17tprr3XJyckuKyurrJtWYnbt2uU++ugj99FHHzkA7rHHHnMfffSR+/rrr51zzj300EMuOTnZzZo1y/3nP/9xvXr1co0aNXI///xzGbfcj+uvv94lJSW5xYsXu++++y70s2fPnlCZ6667zjVo0MC98847btWqVa5Dhw6uQ4cOZdhqf+644w63ZMkSt2nTJvef//zH3XHHHS4qKsrNnz/fOVc++sj4tSvPufLR15tvvtktXrzYbdq0yb3//vsuIyPD1axZ023fvt05Vz766JxzH374oatYsaJ74IEH3IYNG9yLL77oKleu7P7xj3+EypT1tSiwG5Nzzv31r391DRo0cDExMa5t27Zu+fLlZd2kI6IosvDBPwMHDnTOHbBp3nPPPS41NdXFxsa6bt26ufXr15dto0uA1UccFCX7559/djfccIOrVq2aq1y5srvwwgvdd999V3aNLgFXXXWVa9iwoYuJiXEpKSmuW7duoU3JufLRR8bBG1N56Gu/fv1cnTp1XExMjKtbt67r16+f27hxY+jz8tDHImbPnu1OOumkUBaBX0d5d67sr0WKLi6EECJQBPIdkxBCiGMXbUxCCCEChTYmIYQQgUIbkxBCiEChjUkIIUSg0MYkhBAiUGhjEkIIESgCvTHl5+dj9OjRyM/PL+umHFWOlX4Cx05f1c/yhfr52xLoL9jm5uYiKSkJOTk5SExMLOvmHDWOlX4Cx05f1c/yhfr52xLoOyYhhBDHHkdtYxo/fjzS09MRFxeHdu3a4cMPPzxahxJCCFGOOCqJAl966SWMGDECTz/9NNq1a4fHH38cmZmZWL9+PWrVqlXs7xYWFmLbtm2oWrUqdu3aBeDA7WV5pqh/5b2fwLHTV/WzfKF+lgznHHbt2oW0tDRER3vcBx2NyLBt27Z1gwcPDv2/oKDApaWlubFjxx7yd7du3UqjU+tHP/rRj35+fz9bt2712kNK/Y5p3759WL16NUaOHBnSoqOjkZGRgWXLlkWUz8/PD3OAuP96MZIBRB1Udi85Zqqh7SJl2Z5dSPQ9RLeoRPT9HnUUV8//Ed1KWl6HlF1H9GpEr0B0i35E70b0dKK/SfQmhpZFyo4hOpuLZp7ltxvad6SstT4BIJvo6USva2hsPtkxNxCdvea+1dBYu7cSvTLRuxN9NdFHnhSpTfvELsv681eik2pwlqGxc2UB0X2uIQzfa4gvrE8Wu4kea2iFAH4AULVqVa/2lPrGtGPHDhQUFCA1NfzUSE1Nxeeffx5RfuzYsbjvvvsi9ChEbkwH/78Ia7NhG5DvSzV2TJ+yPnUUV55tWFaf2MT6jGFxuoW1MAGgCtHZUo33qIeV9e0PGy/nUY/v2LLy7I8Ba/5Z3awO3zZa4xtHysZ46mzDYvUnGp1i88/q9j0vrDFn/fGdZx9Ko47i8DnPfdcQAERF+fWgzF15I0eORE5OTuhn61b2d5cQQohjgVK/Y6pZsyYqVKiA7OzwG/7s7GzUrl07onxsbCxiY9nf2kIIIY41Sn1jiomJQevWrbFw4UJccMEFAA447RYuXIgOvg4oAAAgAElEQVQhQ4Ycdj17EXnLGLmtHeAHqx2kbA2POgD+SKTA0NhzYPZogr0zY22PfEN3gByiW7DHauydHMMal4mkLNMziM7aeIehGa8dAPAxZGuIvXth9aQY2jZS1ndtsWcGXxPdgr3XYGuRvWO15i6PlGVjxd4DsjVnjS0A5P07UvsHKWsUPVAH0dm4WPWwx4Tsvd56orNH89Zc+L6/9rluAXy9WNco1hZrDNm6OhRHxS4+YsQIDBw4EG3atEHbtm3x+OOPIy8vD1deeeXROJwQQohyxFHZmPr164fvv/8eo0aNQlZWFlq1aoW5c+dGGCKEEEKIgzkqGxMADBkyxOvRnRBCCAEEwJUnhBBC/BptTEIIIQLFUXuUd6RUQKQrrw0pO8/QmHNks2c7WD0WzPHCdOacqU70nURvbGjMZcZg/Uwm+o+G5ttP9m179sVb6w3l96TsPqKzSAm+WE47nygZxeHjtGJj7vsXJ3OrWWPOXJPMfWetTwCYQ3TmkHve0Fi72Xpmc8QcstY4sv6zc46dQ+x8tupn69nn+gRwRyHrvwXrzzBS710edRehOyYhhBCBQhuTEEKIQKGNSQghRKDQxiSEECJQBNb8kIjIXZO9LLVeALKXfOzFMnuJWhrh5n1DErGQNOxFp/XS1fflb1Ois9AuFr5RxDcT3cdEUFp/WbE5YlgGFRaSiBkUfNviEx6G4fOSG7D7xMLMsDXEDCqsPAvh43Mu+p63bI1a/a9PyrJ1y0wObO6sa5FPGCCA95/NPytvHZfNp2UsYqaNQ6E7JiGEEIFCG5MQQohAoY1JCCFEoNDGJIQQIlBoYxJCCBEoAuvKi0HkrslCm3xlaMwhxVwsPkm7GMx9xepmidJYSCKWENDqEwsbwsLGMCeUD8zx4xs2hjmkrGRmvu5LlsyOtZHNRWlQGiGM2Pr0TSzHzgvLgcbW0Fqis8R/LDyUj0PM1/HI1paPW3EF0dmYs/4zd5sFG5PScA0Dftccdh22Qoz9UrLm6I5JCCFEsNDGJIQQIlBoYxJCCBEotDEJIYQIFNqYhBBCBIrAuvJ+RGSiQOYG8nFOWQnuAP9YVMzF5XPM0ipvtZGNFYO5klhcMKuNPrG/AO5KY27FGobG/rJiY5hOdObWYnHOrDb6OuFY232cVqWVKJC5G624jSwmYm2il1acN5+6fWPFsbVo1cPWClu3Pu47X0rLfcncqta6+JqU7eLRjkOhOyYhhBCBQhuTEEKIQKGNSQghRKDQxiSEECJQaGMSQggRKALryitEpCvPx8XFYsUxnbmvfOJ2sbhlzPHEXDy+GW+tLJFppCxrI6ubtcVyJiWRstkedQDcxWS5+9iaYPpmojOnGeu/NXctSVmWBZi1kR3TilHWjJS1shoD/q40K/4dW7eMDKJbMS4BoB3Rrdh6rD/smCyGJosVaZ1Hd5OyLPP0GqL7ZIJl1yGfWJ4Ad/H9QHTruCz230pD821fEbpjEkIIESi0MQkhhAgU2piEEEIECm1MQgghAoU2JiGEEIEisK68aES68pgzxYqV5+uyKw1Y3DJfJxSDlbfi2TFXEnMfsThnzIHzraFZGWYBoD3RTyX680S3YC6rVKKnE30e0ZmLyVpzzH3ZiehWbDGArxdrXJizi7lPWVzJ5kTPNLR/kLLM2cXcaqyNrC2WG47ND6ujBrFOfkysk5ZDstlEu+xT15ODEti1yHICMgej7zWEOSqZK9Vqo0/Zg6/hh4vumIQQQgQKbUxCCCEChTYmIYQQgUIbkxBCiEAR5ZxzZd2IX5Obm4ukpCTE4/BDElkwIwKDvdCzwv0AQF1DyyVlfV84spA0zNBhGRdY/1ndDFaP9Q45kZRlL7+tECYAcB7Rrba/TMqycEcsaSEzf7DQPhbfEf0Eoj9I9KvIG/1c4+3yO6QO8n4ey4h+EdGXGBr7a/Z0op9EdPZC/2/EubLUiG3FzB9DiX4z0VnYoFaGZoWGAoDhRGfnBTO5WDory85PFgqIlfdJOMgMUdb1yeHAdTEnJweJiWwkItEdkxBCiEChjUkIIUSg0MYkhBAiUGhjEkIIESi0MQkhhAgUgXXlJeDww1lYThMfl0lx5RlWPb7HZDC3HnOUWWFmWHggRhuiW0nLAKC3oTUkZT8hOgvh05XoVngc5vjrRnQGG1s2d5YDjbXFJwkbYIeYAoBrDO0JUvZHojNHGUvmaLlSa5CyrJ+sPHPrsTBT1nixNcfCHbGkjZuJbrWdOQEZbJ2z89yqnyX+zCI6c+WxOxHmeLbaztaWdR0qxIH5lCtPCCHE7xptTEIIIQKFNiYhhBCBQhuTEEKIQOG9Mb377rs4//zzkZaWhqioKLz++uthnzvnMGrUKNSpUwfx8fHIyMjAhg0+gV2EEEIcy3gnCszLy0PLli1x1VVXoXfvSG/WI488gieffBJTp05Fo0aNcM899yAzMxPr1q1DXNzhR2orQKQrj7nemOvFgrWAxaKKIbrlYmFOIBa3jSWzW0V01v8cQ2MxsZj75j2iM/7mUTeLrdWU6P8k+smGttbzmMxR5OuctOL8sf77xu1jc/eUobH+MMcXc2uxtljjyPrD2s1cbG8TnbU9ydDYueLrsmRY8d98ryEsVibTrfp9nYBsLnxdeWx9HW7Zklq+vTemHj16oEePHuZnzjk8/vjjuPvuu9GrVy8AwPPPP4/U1FS8/vrr6N+/fwmbKYQQ4lihVN8xbdq0CVlZWcjI+F9i76SkJLRr1w7LlrG4xkIIIcT/8L5jKo6srANf90pNDX9IlZqaGvrsYPLz85Gfnx/6f24uSx4hhBDiWKDMXXljx45FUlJS6Kd+ffa9dyGEEMcCpbox1a59IN1adnZ4gJPs7OzQZwczcuRI5OTkhH62bmWBXYQQQhwLlOqjvEaNGqF27dpYuHAhWrU6kPsxNzcXK1aswPXXX2/+TmxsLGJjY4/ouMzdUhowt4rlwGG7PMvUyUz0ZxB9M9FZbDEL38y+DMshyBxPzFHEYqsxd6M15qw/LIYYa6NvfEILNv8s8zCDxa2z6mdOTeac20x0Fp+QZRm28HFwFQdzt1lzwRxypRWf8nDbURJ83H1WHDqAx8Rk/WFrkY2XdTvBzi3LwVkIHkOyOLw3pt27d2Pjxo2h/2/atAkff/wxqlevjgYNGuDGG2/En/70Jxx//PEhu3haWhouuOCCEjRPCCHEsYb3xrRq1SqcffbZof+PGDECADBw4EBMmTIFt912G/Ly8nDttddi586d6NSpE+bOnev1HSYhhBDHLoFNexGPw/+Cre9tuw8+t9ssND17NMMeQx3NR3mlhc+jPPY4lD36Yo/yrMcKn5OyjKP5KK+01qfveFmwVBPsMYzPozz7bTF/ZM3w/RK4Vd73y66M8vYoj9Xt+1i5tB7lKe2FEEKI3zXamIQQQgSKUnXllSaVEPkojz0SsRxI7BaX7cSsbvZIwLr1Z4/U2COem4h+F9EnE93KyjmLlC2tv0SsRwWs/yxuHXPlsfGysumyx0Hs0Qx7TMQez/g8niutR3bsMYyPo5I9bmH9YY9Eray5/yBlmROQwR4rsRiKVv/zDQ3gj73ZWmTOUZ/M1mzN+V5zrHXh63j0fZTJsBzPbJ6tMSzpeyLdMQkhhAgU2piEEEIECm1MQgghAoU2JiGEEIFCG5MQQohAEVhX3n5EuvIYlgOvNJwwAHdC7TM05uCxowRyd1MG0ZnTZoJx4FTSUZbx80qiryD6S4bG3GQsliH7Eigr7/MFy5ZEZ07Ab4huzTNgzzXrD6ujOdHXE936Ajf7MrJvnJVMolvn0UBSlkW8HE/0PPILDxOrnTUu7FxhY3sW0Vk91vnCnH3s2nIc0Zlz+ANDYzkXmLORnUPsGsUydVtuVZ/4jIUAfibli0N3TEIIIQKFNiYhhBCBQhuTEEKIQKGNSQghRKAIrPnBB2t39Q0Pw0wOPhGAWagO9oKavXC2Qu8A3ESBLpHSI2/bRdmL2ytY3R74jiELm8MiKfuEnmIJ7pjJhcFeCjNDg8W5RF9DdPYi3kq4xgwxLDkbiwDOIoanGhoL32S9tAeAF4jOQppXecvWRxkaG0Nm2rmM6CzcVy9DO4+UZaaAvhvJB+/Ycu61kRrLZsdCKflGy/cxhbFzwjJcKCSREEKIcoE2JiGEEIFCG5MQQohAoY1JCCFEoNDGJIQQIlBEOedKapw4KuTm5iIpKQk1ELlrVia/YzmzmPuEOecKic7cV3UNrTEpeznRxxH9dKJbDiEAeMLQmFvJN+EYc/f4uNJYeJivic7cfSzMioVPgj+ArwvmKLRCwVhrAgDqEZ3N8z+Jbo0jW+fM2cnGha2LdEPzOScAPp/ElEf7ZCW/ZK40dj77/iVuudLYdagV0U8j+qlEv6BmpHbGDrssm2dfV7IPPskTHYBcADk5OUhMTDzs39MdkxBCiEChjUkIIUSg0MYkhBAiUGhjEkIIESi0MQkhhAgUgXXlJSAyUSBz9xxNmCvNilHG2ufrEGNYieJKUo8Fc7wxt5rlSksnZZ8m+g2ebck2NN814TOfxdVvzSmrm8UnZO6uM4huJYt7ipRlMQSZ44210XK3sRiHbH1uIzpL5sjmwkoU2I6UZQkxmcuSjYvlymPnBKuDuRU3E92a5x6kLAmJSWMi+mL1n93NWDH0CnEgOadceUIIIX7XaGMSQggRKLQxCSGECBTamIQQQgQKbUxCCCECxe8qgy3LbGrF+WLOGeZW8nV3WeXZMWsQnbl47iP6D0R/yNCYy6oh0S0nEAAMIPpZf4jUbnnDLmu5qQDgG6Kzv5YsJ5yvE5KNOYM57ay5ZnWztrDYin8rtkXhsPZZrsmSYI0vywLM4taxtcjKs4y3fQyNZaplbWRz5JOpmo0tq+NborP5txx1LMMuc+SWlhPYco76OHhZzMJDoTsmIYQQgUIbkxBCiEChjUkIIUSg0MYkhBAiUGhjEkIIESgC68qLRmSsPOZ6sSgt9x3buS0HCssweyXR2xuZKgFgJMlWmU7qsdo4npRlmUpfI/pZj5MPjHSij5KiJxKdZbbdSnTLUcXiqpWWW425uKzjMmcjiy3HXJzMUWatXdYfnyyjAI9nZ8W/Y+cQ05n7jp3P3YmeRHQL1n92Ph9PdGstsnljY8iO6RPPjq1nn6zOgL9bz7qOsvXJYuWVBN0xCSGECBTamIQQQgQKbUxCCCEChTYmIYQQgSKw5gcL9nLRorSS9rGXi9aLW3ZMwycAAGh/t60n32jrPi9uHyBlfRMCtidt+YuhWYn8AKAL0YcQfTbRWxnaraQsM0Uw2MtlNqdW/ewlfwbRWTgdFqpmg6GxF9HspbOv+cc651hoMLa2WFt8wgCx+lkdrJ/sPGdhgyxzie8YsmP6mFzY2Ppe5xiWcQEA9hkaa7c1bzI/CCGEKBdoYxJCCBEotDEJIYQIFNqYhBBCBAptTEIIIQKFlytv7NixeO211/D5558jPj4eZ5xxBh5++GE0bdo0VGbv3r24+eabMX36dOTn5yMzMxMTJkxAamqqV8P2IzIkEcNyiTC3jm+iOOZusRJosVA6LAzQY8Tx9qzHMQE7tEk6Kcva2JTozA1kJS5bQ8pOIPrJlxL9E/ILYyKlH4yEhQBwM6mC4eviqm1oLPTQEs+6WWK90gjJ5Yt1bjEHI3NrsfXPwimlE50lyrTwdWWyNlpjXlpj6+Pu83UC+roV2Xj5JBa0yv4mrrwlS5Zg8ODBWL58ORYsWID9+/eje/fuyMv73+X+pptuwuzZszFjxgwsWbIE27ZtQ+/evUvYPCGEEMcaXndMc+fODfv/lClTUKtWLaxevRpnnnkmcnJy8Nxzz2HatGno2rUrAGDy5Mk48cQTsXz5crRv3770Wi6EEKJcckTvmHJycgAA1asf+Mrd6tWrsX//fmRk/O8rhc2aNUODBg2wbNkys478/Hzk5uaG/QghhDh2KfHGVFhYiBtvvBEdO3bESSedBADIyspCTEwMkpOTw8qmpqYiK8t+Aj927FgkJSWFfurXZ8kDhBBCHAuUeGMaPHgwPvnkE0yfPv2IGjBy5Ejk5OSEfrZuZa/nhRBCHAuUKFbekCFDMGfOHLz77ruoV69eSK9duzb27duHnTt3ht01ZWdno3Zty8cExMbGIjY2tiTNCGE553zdd8lEZ84hy8XzHinLHDLzim3RkbHZszxzlDGHmBXPrQYp2/5lj0oAGujvc8OBdwepwjdWmL06+Tj6OMR8kxOymHvnGtpaUpbFlfSNuWbpbK0wWN3svGB/mlpzytanb6JQtl6s5J/MfWrFMiyuboZ1LfJNtsjWHHNOsjsUq34fB58jZQ+F1x2Tcw5DhgzBzJkz8c4776BRo0Zhn7du3RqVKlXCwoULQ9r69euxZcsWdOjQoYRNFEIIcSzhdcc0ePBgTJs2DbNmzULVqlVD742SkpIQHx+PpKQkXH311RgxYgSqV6+OxMREDB06FB06dJAjTwghxGHhtTFNnDgRAHDWWWeF6ZMnT8YVV1wBABg3bhyio6PRp0+fsC/YCiGEEIeD18bk3KGfGMbFxWH8+PEYP358iRslhBDi2EWx8oQQQgSKKHc4t0G/Ibm5uQfeWSEyVp5PrDDf2GcM5taznCnMrZJGdBafi9VzMtEtlxTrP3MxZRKdOaTyDS2JlGXmO6sOAJhKdMuZxLKpMlcWizeYQ3SG1Vd2TDafzK3Fsola0SbZ2vrI85jMxepzvvg6vnzrsda0b6ZeNl7smD5fXvHNyOuTTZtlmGbzw3Q2F6WR8djqvwPwEw4EY0hMTDzsunTHJIQQIlBoYxJCCBEotDEJIYQIFNqYhBBCBAptTEIIIQJFiWLllRU+TjuWZZPBXCw+cc6Ys4fFJ2NuHRa37VuiW24w5ib8huhziM7qsZyAzJX0CtGZW88nQ6hP5tHiyvs4wVj9rG7mvjqe6Cy+vuWcW0/KsrFlbfk30S1KY6wAv/hsgH0uMicoc3yyc47NnQ+s/2y8mBPOKs+uIb74ttFaL6zd1tj+JrHyhBBCiKONNiYhhBCBQhuTEEKIQKGNSQghRKAIrPkhAZG7JntxaRkdWFnfUD0sQZcFC3fDXiwy9hHdJ+QNM22wF8sssRx7QW+NI3tBy47JjBgs/IoFm2dffEKvAPZ4lUaySVY3YI8jW5++Rgwf44LvmPsm7WTryDqPfM0svilJrfFiCTF9Eygyk5PPNYfBzjk2LmyOrDsXVrfvPBeH7piEEEIECm1MQgghAoU2JiGEEIFCG5MQQohAoY1JCCFEoAisK283IhMFMixXHnOIMFcSc/ew0EZW/SyR31dEZzDnjE9SPNZP5uxrTvR5RL/N0MaTssytyJxgzJVo9Z/VwZxNPsnZfGHuO+YytBL/AXwtWknr2PpkY+jrqPMp7zu2LGmfT5JH5mBkY5tNdOaQ+8HQmPuOnbfMxWbVDfjdLbD17+NgLo7SOC9Kgu6YhBBCBAptTEIIIQKFNiYhhBCBQhuTEEKIQKGNSQghRKAIrCvPgrlefJxDrA7mPmHuJovPic5cVhcSfSbRmaPGSpbG3EftPNuymejjDI25j9j8MJ0lIrPGkc0n+4urtFxGPjHkmMuMOQeZ08zqa2nFJ/MZR99EgQx2XrC4lVbcxutJ2U+IvpLobO1ac+STVA/wdwj7rFHfOkrjToSdn1ZbHICfS3AM3TEJIYQIFNqYhBBCBAptTEIIIQKFNiYhhBCBQhuTEEKIQPG7cuX5ZNn0dfD5xMRjsMybLAvsfKIzp01DolttP4OUZU4oFueOjYvVV5/Ms8XBxjHd0L71rNvXxVQa64Idk7nvfOphf1mWhoMVsB1Yvs5G5nhj9TC3olWeuWZZfMoYorPsw9aYszFkc8H67wPLmsvWIRtb5hD1wcd96Up4DN0xCSGECBTamIQQQgQKbUxCCCEChTYmIYQQgUIbkxBCiEDxu3LlMSyXCHOOsCywzAnG3DqW64W55nwz2DK+JvpxhraWlGUuM+aEKo1YbMwJlE501nYr4ydzH/nGc2PlS6P/vi42Hycgc/wx5xhzTrL1b1FaMRFZ232ysrKx7UJ0lpG5KdGtdeHr7CyN+feNw8jmmdXjG+fwcOuQK08IIUS5QBuTEEKIQKGNSQghRKDQxiSEECJQaGMSQggRKMqFK485qix8nTM7Pepm7rvKRM/3bAuLC2a59XxjaDH3oQ85RO9AdOYyZPPp4xxj7kvmSvJ15VnlfZ2ATGfHtOaIzee5RJ9DdJ+2szFsTHR2XrC2M9efNf//JmVZG9OJnkX0WENj88Yyu/o63qz5982a63OuANzFZ82RT7zRQiiDrRBCiHKANiYhhBCBQhuTEEKIQKGNSQghRKDwMj9MnDgREydOxObNmwEALVq0wKhRo9CjRw8AwN69e3HzzTdj+vTpyM/PR2ZmJiZMmIDU1NRSb/iv8XlZWFohbHzqZiYH33A3SUT3SebmG06mPtH/amjnpNllvyAZ8S4mdbMXutZfUeyFM+snC/djveQGgPVE9w0zY8HWHDNuWC+ombFgHdHZGmIvy631z4wyrC3Nic6MRSyBorUWWeJLpqcQna0Lqx62Phm1ic4MF1Zb2B2Er8mhNIxFDOt69puEJKpXrx4eeughrF69GqtWrULXrl3Rq1cvfPrppwCAm266CbNnz8aMGTOwZMkSbNu2Db179y5h04QQQhyLeN0xnX/++WH/f+CBBzBx4kQsX74c9erVw3PPPYdp06aha9euAIDJkyfjxBNPxPLly9G+ffvSa7UQQohyS4nfMRUUFGD69OnIy8tDhw4dsHr1auzfvx8ZGRmhMs2aNUODBg2wbNkyWk9+fj5yc3PDfoQQQhy7eG9Ma9euRUJCAmJjY3Hddddh5syZaN68ObKyshATE4Pk5PAn0KmpqcjKYk9TgbFjxyIpKSn0U78+e6shhBDiWMB7Y2ratCk+/vhjrFixAtdffz0GDhyIdevYq9ZDM3LkSOTk5IR+tm7dWuK6hBBC/P7xDkkUExOD4447kJqudevWWLlyJZ544gn069cP+/btw86dO8PumrKzs1G7NvOlALGxsYiNjfREVQIQdZDm44TyDQPjE9aIlWd1s1BCvgnHWFIwK+RRJin7WlvyAbNOkYMOeTlS+xexUzGXlZX4D+BzYbnBWIJD5spiTkjmyvKBzWcM0dm6YPNsudjYMTcQ3XfNWfiETAL4HDGdOSotffvlpDAh73lbr1LT1vvtiNRYWCc2tj5hzQA/t67vmvN1AlvnRWkkzzwUR/w9psLCQuTn56N169aoVKkSFi5cGPps/fr12LJlCzp0YNHShBBCiHC87phGjhyJHj16oEGDBti1axemTZuGxYsXY968eUhKSsLVV1+NESNGoHr16khMTMTQoUPRoUMHOfKEEEIcNl4b0/bt23H55Zfju+++Q1JSEk455RTMmzcP55xzDgBg3LhxiI6ORp8+fcK+YCuEEEIcLl4b03PPPVfs53FxcRg/fjzGjx9/RI0SQghx7KJYeUIIIQJFuUgUaDlTmMuoNFxJvvgmEGNJuxZ7lGexr4Z/aOvJRH+N1HO3oX1Lyk4muu+4WH9Fsflksf8YrLzPevGNT8jKs3Gx8HWZ+q5zy2nHXGYsDh2Locdgc2G1pRZx2Z1E6niY6Pca7jsA+Nd1kdqQp+2yp5O6hxO9NK5FvrE/mc7uUHzikFr8JrHyhBBCiKONNiYhhBCBQhuTEEKIQKGNSQghRKDQxiSEECJQRDnnSmqcOCrk5uYiKSkJiYiMlefjViotmOvJclr5OsF8s8myeG5WedZuFkOPOa2aEd3K+NqLlO1JdAZzJVr99HWZMSeU71xY0R9Z2XZE9425VhpuPV8nmM86v5bo7xGdxfNjbbHyDrQkZVk/FxGd9ckaR3ZOsFDWPlmwGaXlJvZ15Vkx93xi5TkAPwPIyclBYmLiYf+e7piEEEIECm1MQgghAoU2JiGEEIFCG5MQQohAoY1JCCFEoAhsrLzKiNw1fTJBMvcJc7cwfNwwvllwmaOmumc9VoyyzaQsi6HH4pwtJXpjQ/sjKctg48UyuPq4m3xjhTGYE26roTFnn6/7jmUftfrP5s3XIerjymOZZ1kS5Jmex2RYY86uCZ2J7ptl1irPYkL6uu/YWrTq8Y2J59sW5vj1ueZabtpCHHDl+aI7JiGEEIFCG5MQQohAoY1JCCFEoNDGJIQQIlAE1vyQg8iQRAzrBSV7Kej7UtgHX2MFgxkUGDmGZiVVA/jLTJbM7TSif2xo7AVqOtE3E90nJFENUtY3xFAW0VmfrLn2eVEMAK2Ibo0tYIdBYvPDXpazMEBMt45phQYCuCmC6QwfwxE7V1h4oKZEZ2YBK/wQO2a+Z90+YaNYWV8DCbsTYWvXWv8sJJF1bilRoBBCiHKBNiYhhBCBQhuTEEKIQKGNSQghRKDQxiSEECJQBNaVZ4UkYruoFcKGOYeY+8wXy/XGnC2Wswng/fEN+bKe6BbMxdPJsy2WE9AnqV5x+g9Et8IDMTcdq9vXfcccSD5O0DSiryT66US31tc7pCybZxbCiDkh/2Bo20jZ+UT3DQ/mkyiRudXYPLP1fBLRLbciO899E5my89/qEwtTxeaZuXLZMX8kurX+2Vqx3Ipy5QkhhCgXaGMSQggRKLQxCSGECBTamIQQQgQKbUxCCCECRWBdeXsQGSvPJykWi2eVTnTmNPmc6FYsNuYEYy4eX+fU8US3xoUlG8z0bAuLoXayoT38IilMrFD1byTlCdY8M8cbg80zS07I5tTqEnOIsbh9TGex8qw5YvPM6raS7QFAF6J/YmhrSVl2zvm4uAC+/q0+MScoc/Yxt5pPnEsWn5E5OFn/mbvRiue3sdgWRcLuONiYs/VijYvPmDsoUaAQQohygDYmIYQQgUIbkxBCiEChjUkIIUSg0MYkhBAiUATWlVcBka48n4yPzAnn6xEr7H4AABovSURBVJBjccss59RAUpY5+3xdTDOJfpyhPU7Ksnh7k4nemej9njfES+weFUTZPWLuJp8MvszZ1JXobC4yiM6ykv7L0Jizi8VnY/Ec2xA93dBmkbIs9h+LidiE6PMMjbmyWH/YHDGYc9ByYLLzlvXfN56ltXLZPLO6WRw6dp5/bWjWOQ7wsWUuU3ZMK/YlK8/G3HIH+8YPLEJ3TEIIIQKFNiYhhBCBQhuTEEKIQKGNSQghRKDQxiSEECJQBNaVV4BIVx5z2lguodNI2W+Jzlw5zA1jOYeYs4vFm2Ox/1g8r8uIvtTQ/kHKvkF05taa6lgOSiswnhXlC3iK1MDGJZ3ouYbGHE8ssyub52yiMxejVQ9z0730CPmA2diILfHnayM1X8cnI4noVvw35qZkWWOZE4y52NKJvtnQziBlWby9JURn2YRnGFpfUjad6MxlyJxz1rnIxorNM7u2JHq2xYqhx1ymbJ5Lgu6YhBBCBAptTEIIIQKFNiYhhBCBQhuTEEKIQHFE5oeHHnoII0eOxPDhw/H44weC4Ozduxc333wzpk+fjvz8fGRmZmLChAlITU31qrsyIndNlojLMguwBGonEd0KAwIAMUS3mEj0xkR/qpGtt99k61+ReqwQKR+Rsj8QfQDRMfxgC8p/Mf6keY3EQWIvnFniQ2aKsGAJztjLb7YufEMVtTS0W0hZ+ib6PaIT58pDhsZCJjHYS262di1zCesOC1XDzltmRGHnqKVbiQwBPm//JjpbR1aornNIWWZyYHWztWitf2Y4YXNRmeibPdtiXVuYOcua/988JNHKlSvxzDPP4JRTTgnTb7rpJsyePRszZszAkiVLsG3bNvTu3bukhxFCCHGMUaKNaffu3bj00ksxadIkVKtWLaTn5OTgueeew2OPPYauXbuidevWmDx5Mj744AMsX7681BothBCi/FKijWnw4MHo2bMnMjLCb5hXr16N/fv3h+nNmjVDgwYNsGzZMrOu/Px85Obmhv0IIYQ4dvF+xzR9+nSsWbMGK1dGfiUtKysLMTExSE4OfwqZmpqKrCz763djx47Ffffd59sMIYQQ5RSvO6atW7di+PDhePHFFxEXx17p+TFy5Ejk5OSEfrZuZa8QhRBCHAt43TGtXr0a27dvx2mn/S/gT0FBAd5991089dRTmDdvHvbt24edO3eG3TVlZ2ejdm3bgxMbG4vY2NgIfT8iQxL5uLjY9sYcXyyxHEuKZnkMryFlLyT6bOK+60LKbyb6HENj0W7aEZ2FNvn5SVuPHxOp3U7qYCFMWDiZs4m+yNBYyCB2TBZ6hjknTya65Uxi4at+vtnWO5Ly7PnBfcYBHttol2WJH9mfk8ytZ7mymNOKnZ/MlcfChrG1aIUkY2uFJdVkYaNYyB+r/lWkrJU8tLi6WeJTy/HJDJzM2cjGnLn4mPvYmmvW7n2GxgKaHQqvjalbt25Yu3ZtmHbllVeiWbNmuP3221G/fn1UqlQJCxcuRJ8+fQAA69evx5YtW9ChQ4cSNlEIIcSxhNfGVLVqVZx0Uvi3CapUqYIaNWqE9KuvvhojRoxA9erVkZiYiKFDh6JDhw5o37596bVaCCFEuaXUo4uPGzcO0dHR6NOnT9gXbIUQQojD4Yg3psWLF4f9Py4uDuPHj8f48eOPtGohhBDHIIqVJ4QQIlBEOUczwZUJubm5SEpKQgIiXXlsF7UcJSxWGmMz0dOJbiXFYg6+j/9i658Tt9Z1pJ5I7+IBrK8us6RdzDnFEiiy+GenG1o9UrYZ0V8jeg7RLzI0lpyOxUTbRnQWW4zFBbMchZeTsszFZSV4BLiLyxoXFvuQxVZjbq11RLfW9JWkLHO2sjFksR9nEd1ylDH3pY/LDuDrxTpfmON1DdFZP9natRyS7HrmO//M8cjWheXiZK4861rhAPyMA1GBEhNZmsJIdMckhBAiUGhjEkIIESi0MQkhhAgU2piEEEIECm1MQgghAkWpf8G2tIhGpCuPxXOy4nkxhxyLFcacQz55d1kW1LnEfcfawuK2Maw2WplHAR7Pi7n1mFvLijnInG3M2cecUGwu/mRoLJYdczwxV561hgAeF+4DQ5vn2RbmHGMOLGtNM59TOtFZrEgWc81ai2xtsbiFTRJs/ZHdtn41qceaCxLKkZ5bLIbeeUS3HIjM2deQ6MyVdy7RvzQ0NubMfcfcela8QYCvf8sJya6tlhO4EAdceb7ojkkIIUSg0MYkhBAiUGhjEkIIESi0MQkhhAgU2piEEEIEisC68qwMtj6weE4sVhSLLbfCozxzU5EkoxhC/ixYRKxgrE9WvDCWqZLxNdGZi8dy/SwhZdkYMscbyz5sZd9lLjM2z8w55hOfDrDngsUbZP2sS/TNRLecZmyemUOQZQ1m8d8sV+YQUvZ5ovcg7rvHSfm3iG6tOZY1mGVqZi6+t4lujRdz37EswOza8i+iVzc05khm1wTmbPXJDgzY5wUra9Vd0kCsumMSQggRKLQxCSGECBTamIQQQgQKbUxCCCEChTYmIYQQgSKwrrxqiNw1fbIvsthfDOZuYVjOlGxSlmVqrUTsWpYrBwDmFN+kMFh8Ot9MmMxRZsXL8h1DBnP9WBlCmZuMrRUWK4+58hhWbDHm4GN//flkDWXHZBlcmROMxUpkbVlpaOeTsqd51AHwfrLYglZcOBafktXN9FFEt845Xwcng8V5tPrE3JdpRGfnPzsvWJ+s8dpHylrrsyiDrS+6YxJCCBEotDEJIYQIFNqYhBBCBAptTEIIIQJFYM0Pu3H4iQItuhCdhQFhLxdZAi1LZy//rZf2AE/Ox15cMixDg+/LT1+s/rNEgSxUi68pwIKZGVj/Wd1snlk9lu5bh295y3DCTA4smRszs7CwUdZ5wdY5S/zIyvu+uLfCA7EQU8wUwQwH7OX/ekNrRcpaySMBbjhiJg/LcMDGhBmu2DpnbWFmsc1Et2DruSTojkkIIUSg0MYkhBAiUGhjEkIIESi0MQkhhAgU2piEEEIEisC68iog0pXHnEYWLAwQC2HzFdGZ08RyFLEEd5cRnTkBLyf6fKJboWD+Qcoyt+I7RGdttJxDvo435tbycauxNcHcaswhyGAJ16y2M8cjG0PmkPrR45gM5r7zcTyyY7KwPmwuWP9ZOCXW9omGlknKnkt05j5kWOf0ZlK2NJxtgB2Si9XNklOysF5sjthcWLD5tM5PJQoUQghRLtDGJIQQIlBoYxJCCBEotDEJIYQIFNqYhBBCBIrAuvKaIrJxVtwqAIg1NOa+Yu47BotRxdpiwRxyLM4Xi6HH4n8tMrSGpCxLCMjiljGHmBVbzMfBB/i7uCy3HnPNNSY6i1vI6kknuhXnjLWbOQSZQ44lirRgbio25gwftx6bN9/Yf+yvYqZbDsH3SFkW+4659d4geqqhsXOfOeHSib6Z6NZ6Ye670nIZpxPdOq5vLM+SoDsmIYQQgUIbkxBCiEChjUkIIUSg0MYkhBAiUGhjEkIIESgC68rbgUiXE4sV5hNDzdchxrBcXD6ZRwFgEtF7Ep3FufuLoTFXzniis7htzCFmzYVvNlUG+2upxmG2A+DuO9ZG5uJibjXLUTnPs27m4mPke5Rl7ivWHzYu1ppmY85cphuJztYFq99ai9aaAIANRGdzxM4Xy/XG4taxdm8mOpsjy2nJ6mYZnJnLljkH2XhZY86cutZ6Vqw8IYQQ5QJtTEIIIQKFNiYhhBCBQhuTEEKIQOG1MY0ePRpRUVFhP82aNQt9vnfvXgwePBg1atRAQkIC+vTpg+zs7FJvtBBCiPKLtyuvRYsWePvtt/9XQcX/VXHTTTfhzTffxIwZM5CUlIQhQ4agd+/eeP/9970btgeRuyZzsViOIhYrz9eVx5xGVrbS40hZtjWfSfQ2RLfiswHAA4bGXDy+GUwZ+wyNuRJ9M7WyuHUszp8Fc7wxZxtzK60juuXiYmuL6cytVxrZZ5mbsjLR63rUzTI1/5vo7LxNIrqVkRmwx9w3IzNbQ2yOrDFn1wr2Vz6L28jG0Tp32fpksBiKzMXHYFmZLax2l9SV570xVaxYEbVrRxomc3Jy8Nxzz2HatGno2rUrAGDy5Mk48cQTsXz5crRv376ETRRCCHEs4f2OacOGDUhLS0Pjxo1x6aWXYsuWLQCA1atXY//+/cjIyAiVbdasGRo0aIBly5bR+vLz85Gbmxv2I4QQ4tjFa2Nq164dpkyZgrlz52LixInYtGkTOnfujF27diErKwsxMTFITg5/EJOamoqsLPYQChg7diySkpJCP/Xrs0DuQgghjgW8HuX16NEj9O9TTjkF7dq1Q8OGDfHyyy8jPj6+RA0YOXIkRowYEfp/bm6uNichhDiGOaKQRMnJyTjhhBOwceNGnHPOOdi3bx927twZdteUnZ1tvpMqIjY2FrGxkan+qiPyBbbPizt2K8hexLIX7sxEYL1c9w1JxI7JXtCzl9/WS3TfMEAMy+QA2P1nx2Qv+dlcMLOENRfMQMHmoinR2cti9tLZJyQT09kaPZno1jgycwZ7sX460a2EeIA9vqwsMxYwMweDhTCyEoJmkrKvEZ2tF58xZ/PJrk8+BgLAPi/YdcgnTBvArznsHLXq8bmGFoKvxeI4ou8x7d69G19++SXq1KmD1q1bo1KlSli4cGHo8/Xr12PLli3o0KHDkRxGCCHEMYTXHdMtt9yC888/Hw0bNsS2bdtw7733okKFChgwYACSkpJw9dVXY8SIEahevToSExMxdOhQdOjQQY48IYQQh43XxvTNN99gwIAB+OGHH5CSkoJOnTph+fLlSEk58PBl3LhxiI6ORp8+fZCfn4/MzExMmDDhqDRcCCFE+cRrY5o+fXqxn8fFxWH8+PEYP54lVxBCCCGKR7HyhBBCBIrAJgrMweHvmpZDjLlPWKgi5m5hCcSY68WCeRKZi4m5XloS3XJmMTcZa7dvqCKrHjbmrG6W5I055Fh5C98vHKQTnX0Dz3JmMfcZG5cniD6R6JZbkTm+WBgc5uJja+trQ2Mhttj8MGcnazsLM5RoaH1JWcaVRH+Z6A0NjSXV80m2CHAXq3X+s7LsPGchuZj7jmG1pRUpa4WY2o8ycOUJIYQQpY02JiGEEIFCG5MQQohAoY1JCCFEoNDGJIQQIlAE1pW3H5G7phUrC7BdXD6JvwDuhPNJoMbat96jDoA7BOd51MGcUMwhyNxnbFwsfF1J7K8iNkeWG4o53pgribGG6Kz/lkuKjS1zJc0mOotFt8rQbiNlxxH9PqK/RPR+hvZnUpb1/1uiM+ckixXJkv9ZsHmbSXR2zlnnhe+1hTnnmNPO0ll/2DXH1wnIsGIIsnPlbM+6i0N3TEIIIQKFNiYhhBCBQhuTEEKIQKGNSQghRKDQxiSEECJQRDnnXFk34tfk5uYiKSkJKYjcNVlsLSuGGIu3xmBOG+bWsdxgvsdkbh3m7mEONGtc2F8c7Ji+MbQsmHOIOYSYc46NuYXvGKYT/Q9EZw4ka8yZg5PFRGRrjs2F1VeWNXUZ0d8iej9i73KGRW4FqeNOol9DdDa2zCHKHHUWbGzZmmNuNWst+jhVi8MnmyyLw8jOc59YnsVxmqFVJ2XfNjQH4GcAOTk5SEy0oh3a6I5JCCFEoNDGJIQQIlBoYxJCCBEotDEJIYQIFNqYhBBCBIrAxsqzXCjMDePjKGPx3BjMxWM58CwHC8AdPyybLotz5+McYrCxYv1k7iarjcwJxOaNOY0slyVgO+FYplbmkGRteZLo6UQ/ydDY/DQjOssmO4roMR7HTLTSiQLoR9LDPvWGrVuOQpZh9jKiryU6ywT7CdHTDI2dQ74xMclwmU5ItrZ81z+bO+u88I3Px85n1k/meLbazmIiTjG0PQCuIOWLQ3dMQgghAoU2JiGEEIFCG5MQQohAoY1JCCFEoAis+aEuIl/gsZAvH5fC8dhLVPaCsqmh/UjKssRv7IUmS6zGXq5aBoCvSFkGa0tpGC4YR7MO9jKXmT98Q1JZ9ViJ/ABu5phEdGaKmGNon5OyQ3Ns/UJicmChnSzzw1kkJs1ZzW19+Hu2vpEc0+dFP3v5X4PovqG3rCSPbKxY4kO2FlnoJat+dh76hCkrTidTh0xDs9Yhq7ukoZF0xySEECJQaGMSQggRKLQxCSGECBTamIQQQgQKbUxCCCECRWATBVYDEHXQZyy0h+XiYWFDWEgi5lZhWMYkVgdzplxE9FeI7hNOiZVlieV8sdxAvo4nXyeg1SdWljmn2Byxv9CY68laX8x9x9qYTnTmyuxnaH8jZS03FQDMIzoLYdPD0FqRsmz+3yE6C0nF6rF0Nra+ySmtEFOAHR6JrRUWHutrovtci5g71LefrO3MxWhxOdGtUEU/A7gJShQohBDid442JiGEEIFCG5MQQohAoY1JCCFEoNDGJIQQIlAENlZePCJ3Td/4Tz74ulgst1Y+KcvcRzOJfjzRWWI1K26fb6w85nhkrh/LIeUbb445qhg+88xiqLG2MN1KTgfY64U54dYQ/Wyiv0z0Zw2NjTlbK2yds7mw1vQTpCxrC3OCMuckS5RpJUpk/WEOOasOwI6JBwCVDY2NFTvn2Lgw57AFGyt2frKEgMwXl+FR/yOk7GeGVtJrs+6YhBBCBAptTEIIIQKFNiYhhBCBQhuTEEKIQKGNSQghRKAIbKy8eBx+rDzLmcOcM1Y8J4DH5/JxjrEMlizeGstUyrDcd6weX5cdGxeWZfNowpxWPhlvOxGdubJYPDcftyabZ9ZulvGYxdyzXFztPMoC3CHH+sncjT4wZyNrY0mznv4a1h+WTTqb6NZ5xFx27Jw72nE7fWDnRWeiW45SFuPTco3+AuB9KFaeEEKI3znamIQQQgQKbUxCCCEChTYmIYQQgcJ7Y/r2229x2WWXoUaNGoiPj8fJJ5+MVatWhT53zmHUqFGoU6cO4uPjkZGRgQ0bWIAUIYQQIhyvWHk//fQTOnbsiLPPPhtvvfUWUlJSsGHDBlSrVi1U5pFHHsGTTz6JqVOnolGjRrjnnnuQmZmJdevWIS6O+VkiSUXkrlkasaWYy4w5qhiW64fF27Ky3QJAQ6KzelgsrnSPOphDijmhmHPIiv/HHFzMrcTmyDcTrsUKz/LNic7W3MmGttbzmL5Ya/TfpCyLFcfiMLK2W2uXxYRkY7iZ6KXhvjud6Kw/OURna9TqP3Ow/UD0t4m+h+jWVZJdOdm5wlyJy4jehOiWo5RdW1YaWkkt314b08MPP4z69etj8uTJIa1Ro0b/a4RzePzxx3H33XejV69eAIDnn38eqampeP3119G/f/8SNlMIIcSxgtejvDfeeANt2rRB3759UatWLZx66qmYNGlS6PNNmzYhKysLGRn/i1WblJSEdu3aYdkye6/Oz89Hbm5u2I8QQohjF6+N6auvvsLEiRNx/PHHY968ebj++usxbNgwTJ06FQCQ9f/bu2OXVq8wjuO/6AUnE6GDGgzXDA7eSQUXdXDpFqhdXJwNuOkiZJMgcXXoIM7tUCi4dLCDQ0f9C6rTRcHWLTFYaIekQ9DW2/OzHk3vPTf5fiDLSXxzzvu+8cmb87zP+a3zQ9no6OPb2EZHRx+e+9De3p5yudzDo1Bwt6kCAPpBVGBqtVqam5tTrVbT7OysyuWy1tfXdXBw8OIOVCoVNRqNh8fVlfsFEwDQD6IC0/j4uN69ezzFOT09rcvLS0nS2FinsM3NzeMCHzc3Nw/PfWhoaEjZbPbRAwDQv6KSHxYXF3V+fv6o7eLiQm/fdvLLisWixsbGdHJyopmZGUmd2nenp6fa2NiI6tidXneTlatxF1OHTIpb8TM2++zctE+adpchF8pAil011tVti6mh5/aVy776P2uCxWZ8uewmlzkVqq3nMh7dvnVisk9dNqlrj13ZeDJiG26l3tjPsctAC527oUywp8SuVB06dj+Y17o6fLG1H0PtMXUin+K2871pD9XFc5+V7wJtv0ta+69OBUQFpq2tLS0sLKhWq2l1dVVnZ2c6PDzU4WGnfF8mk9Hm5qZ2d3c1NTX1kC6ez+e1srLygu4BAPpNVGCan5/X0dGRKpWKqtWqisWi9vf3tbb2d0zc3t7W3d2dyuWy6vW6lpaWdHx8HHUPEwCgf0UFJkkqlUoqlUr2+Uwmo2q1qmq1+qqOAQD6E7XyAABJib5i+liG9e+o6ZILQlzpETex7CaLXZmd0CTiF+a1blLYTdC793TJAqHyQG7C1e0XVzbJTXSG9pfrn+tLrNB23GSue09XBsotoBezUKQ7t2L76IS240oP/WLaYxNOQueuO1fcOGO//brthD7/buHHP027+8y5uydDST5usT13DrnxuKSomHOuG4tqPvX60PhduadvA22h/03PwRUTACApBCYAQFIITACApBCYAABJITABAJKSbFber5Iyr/h7l/HiMt66sTidy6bpRiaQJH1t2n8MtMVmX02adpdRGCqP5DLE3kf2xWVfhvajy6Z0xzO2JI/rS2j8LkPKHQt3/N+b9lDmlBvnV6b9J9PusttC31xd9lnMcXuK24+h7XerrJXLqAyd066UmBt/N0oSuUzI2HJXjjtGPwfavjSvXQi0/SHpmxf0hysmAEBSCEwAgKQQmAAASSEwAQCSQmACACQl026325+6E//UaDQ0MjKiq6srVrMFgM/Y7e2tCoWC6vW6crncs/8uuXTxZrOTAFoouGRaAMDnpNlsRgWm5K6YWq2Wrq+vNTw8rGazqUKh0PNXT/ffKnp9nFL/jJVx9hbG+TLtdlvNZlP5fF4DA8+fOUruimlgYEATExOSOosOSlI2m+3pk+Fev4xT6p+xMs7ewjjjxVwp3SP5AQCQFAITACApgzs7OzufuhNPGRwc1PLyst68Se5Xx67ql3FK/TNWxtlbGOfHk1zyAwCgv/FTHgAgKQQmAEBSCEwAgKQQmAAASSEwAQCSQmACACTlLx73lBFkXkkiAAAAAElFTkSuQmCC", "text/plain": [ "" ] }, "execution_count": 4, "metadata": {}, "output_type": "execute_result" }, { "data": { "text/plain": [ "" ] }, "execution_count": 4, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# Number of cores to use to perform parallel fitting of the forest model\n", "n_jobs = 1\n", "\n", "# Load the faces datasets\n", "data = fetch_olivetti_faces()\n", "x = data.images.reshape([PyCall.len(data.images), -1])\n", "y = data.target\n", "\n", "mask = y < 5 # Limit to 5 classes\n", "x = x[mask]\n", "y = y[mask]\n", "\n", "# Build a forest and compute the pixel importances\n", "puts \"Fitting ExtraTreesClassifier on faces data with #{n_jobs} cores...\"\n", "t0 = Time.now\n", "forest = ExtraTreesClassifier.new(\n", " n_estimators: 1_000,\n", " max_features: 128,\n", " n_jobs: n_jobs,\n", " random_state: 0\n", ")\n", "\n", "forest = forest.fit(x, y)\n", "puts \"done in %0.3fs\" % (Time.now - t0)\n", "importances = forest.feature_importances_\n", "importances = importances.reshape(data.images[0].shape)\n", "\n", "# Plot pixel importances\n", "plt.matshow(importances, cmap: plt.cm.__dict__[:hot])\n", "plt.title(\"Pixel importances with forests of trees\")" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": true }, "outputs": [], "source": [] } ], "metadata": { "kernelspec": { "display_name": "Ruby 2.4.1", "language": "ruby", "name": "ruby" }, "language_info": { "file_extension": ".rb", "mimetype": "application/x-ruby", "name": "ruby", "version": "2.4.1" } }, "nbformat": 4, "nbformat_minor": 2 }