Skip to content

Instantly share code, notes, and snippets.

@tkf
Last active November 15, 2021 01:29
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save tkf/9f1338506a58be4bf29f708cc162f55e to your computer and use it in GitHub Desktop.
Save tkf/9f1338506a58be4bf29f708cc162f55e to your computer and use it in GitHub Desktop.
Display the source blob
Display the rendered blob
Raw
{
"cells": [
{
"outputs": [
{
"output_type": "execute_result",
"data": {
"text/plain": "--- Manifest.toml\t2021-11-14 18:27:40.042948978 -0500\n+++ environments/target/Manifest.toml\t2021-11-14 18:28:46.550412509 -0500\n@@ -205,9 +205,9 @@\n \n [[Gaius]]\n deps = [\"LinearAlgebra\", \"LoopVectorization\", \"Random\", \"StructArrays\", \"UnsafeArrays\", \"VectorizationBase\"]\n-git-tree-sha1 = \"5d8c867605ca119455772381c1c3823361cb1dbf\"\n-repo-rev = \"master\"\n-repo-url = \"https://github.com/MasonProtter/Gaius.jl.git\"\n+git-tree-sha1 = \"b85c1a72591a775679f7ef5e4b223ee5c56ffb4d\"\n+repo-rev = \"refactor-block_size\"\n+repo-url = \"https://github.com/tkf/Gaius.jl.git\"\n uuid = \"bffe22d1-cb55-4f4e-ac2c-f4dd4bf58912\"\n version = \"0.6.7\"\n \n"
},
"metadata": {},
"execution_count": 1
}
],
"cell_type": "code",
"source": [
"Text(read(joinpath(@__DIR__, \"manifest.patch\"), String))"
],
"metadata": {},
"execution_count": 1
},
{
"outputs": [
{
"output_type": "execute_result",
"data": {
"text/plain": "414c8a2f7438984a32ac902b9dfa2545320781db"
},
"metadata": {},
"execution_count": 2
}
],
"cell_type": "code",
"source": [
"Text(read(joinpath(@__DIR__, \"build/info/git-rev-sha1\"), String))"
],
"metadata": {},
"execution_count": 2
},
{
"outputs": [
{
"output_type": "execute_result",
"data": {
"text/plain": "8516f33df4efdd0fc428ff97adceb4bab3b30e42"
},
"metadata": {},
"execution_count": 3
}
],
"cell_type": "code",
"source": [
"Text(read(joinpath(@__DIR__, \"build/info/git-tree-sha1\"), String))"
],
"metadata": {},
"execution_count": 3
},
{
"outputs": [],
"cell_type": "code",
"source": [
"using BenchmarkConfigSweeps\n",
"using DataFrames\n",
"using DisplayAs\n",
"using VegaLite\n",
"\n",
"resultdir = joinpath(@__DIR__, \"result\")\n",
"mkpath(resultdir)\n",
"\n",
"saveresult(; plots...) = saveresult(:png, :svg; plots...)\n",
"function saveresult(exts::Symbol...; plots...)\n",
" for (k, v) in plots\n",
" for e in exts\n",
" save(joinpath(resultdir, \"mat_mat_mul-$k.$e\"), v)\n",
" end\n",
" end\n",
"end;"
],
"metadata": {},
"execution_count": 4
},
{
"outputs": [
{
"output_type": "execute_result",
"data": {
"text/plain": "\u001b[1m192×4 DataFrame\u001b[0m\n\u001b[1m Row \u001b[0m│\u001b[1m nthreads \u001b[0m\u001b[1m n \u001b[0m\u001b[1m time_ns \u001b[0m\u001b[1m version \u001b[0m\n\u001b[1m \u001b[0m│\u001b[90m Int64 \u001b[0m\u001b[90m Int64 \u001b[0m\u001b[90m Float64 \u001b[0m\u001b[90m Symbol \u001b[0m\n─────┼───────────────────────────────────────────\n 1 │ 1 1200 7.50223e7 target\n 2 │ 1 500 5.3892e6 target\n 3 │ 1 800 2.19662e7 target\n 4 │ 1 1200 7.50951e7 baseline\n 5 │ 1 500 5.39149e6 baseline\n 6 │ 1 800 2.20641e7 baseline\n 7 │ 32 1200 4.04301e6 target\n 8 │ 32 500 500376.0 target\n ⋮ │ ⋮ ⋮ ⋮ ⋮\n 186 │ 30 800 1.35419e6 baseline\n 187 │ 31 1200 4.05181e6 target\n 188 │ 31 500 497386.0 target\n 189 │ 31 800 1.29854e6 target\n 190 │ 31 1200 4.16844e6 baseline\n 191 │ 31 500 506006.0 baseline\n 192 │ 31 800 1.29819e6 baseline\n\u001b[36m 177 rows omitted\u001b[0m",
"text/html": [
"<div class=\"data-frame\"><p>192 rows × 4 columns</p><table class=\"data-frame\"><thead><tr><th></th><th>nthreads</th><th>n</th><th>time_ns</th><th>version</th></tr><tr><th></th><th title=\"Int64\">Int64</th><th title=\"Int64\">Int64</th><th title=\"Float64\">Float64</th><th title=\"Symbol\">Symbol</th></tr></thead><tbody><tr><th>1</th><td>1</td><td>1200</td><td>7.50223e7</td><td>target</td></tr><tr><th>2</th><td>1</td><td>500</td><td>5.3892e6</td><td>target</td></tr><tr><th>3</th><td>1</td><td>800</td><td>2.19662e7</td><td>target</td></tr><tr><th>4</th><td>1</td><td>1200</td><td>7.50951e7</td><td>baseline</td></tr><tr><th>5</th><td>1</td><td>500</td><td>5.39149e6</td><td>baseline</td></tr><tr><th>6</th><td>1</td><td>800</td><td>2.20641e7</td><td>baseline</td></tr><tr><th>7</th><td>32</td><td>1200</td><td>4.04301e6</td><td>target</td></tr><tr><th>8</th><td>32</td><td>500</td><td>500376.0</td><td>target</td></tr><tr><th>9</th><td>32</td><td>800</td><td>1.27026e6</td><td>target</td></tr><tr><th>10</th><td>32</td><td>1200</td><td>4.07463e6</td><td>baseline</td></tr><tr><th>11</th><td>32</td><td>500</td><td>494227.0</td><td>baseline</td></tr><tr><th>12</th><td>32</td><td>800</td><td>1.26507e6</td><td>baseline</td></tr><tr><th>13</th><td>16</td><td>1200</td><td>5.87404e6</td><td>target</td></tr><tr><th>14</th><td>16</td><td>500</td><td>647465.0</td><td>target</td></tr><tr><th>15</th><td>16</td><td>800</td><td>1.83399e6</td><td>target</td></tr><tr><th>16</th><td>16</td><td>1200</td><td>5.7963e6</td><td>baseline</td></tr><tr><th>17</th><td>16</td><td>500</td><td>650745.0</td><td>baseline</td></tr><tr><th>18</th><td>16</td><td>800</td><td>1.829e6</td><td>baseline</td></tr><tr><th>19</th><td>8</td><td>1200</td><td>1.05069e7</td><td>target</td></tr><tr><th>20</th><td>8</td><td>500</td><td>902023.0</td><td>target</td></tr><tr><th>21</th><td>8</td><td>800</td><td>2.94478e6</td><td>target</td></tr><tr><th>22</th><td>8</td><td>1200</td><td>1.02801e7</td><td>baseline</td></tr><tr><th>23</th><td>8</td><td>500</td><td>914533.0</td><td>baseline</td></tr><tr><th>24</th><td>8</td><td>800</td><td>2.92518e6</td><td>baseline</td></tr><tr><th>&vellip;</th><td>&vellip;</td><td>&vellip;</td><td>&vellip;</td><td>&vellip;</td></tr></tbody></table></div>"
]
},
"metadata": {},
"execution_count": 5
}
],
"cell_type": "code",
"source": [
"datadir = joinpath(@__DIR__, \"build/bench_mat_mat_mul\")\n",
"df_raw = DataFrame(BenchmarkConfigSweeps.load(datadir))\n",
"\n",
"begin\n",
" df = select(df_raw, Not(:trial))\n",
" df = select(df, Not(r\"JULIA_.*\"))\n",
" df[!, :time_ns] = map(t -> minimum(t).time, df_raw.trial)\n",
" df[!, :version] = Symbol.(basename.(df_raw.JULIA_PROJECT))\n",
" df\n",
"end"
],
"metadata": {},
"execution_count": 5
},
{
"outputs": [
{
"output_type": "execute_result",
"data": {
"text/plain": "\u001b[1m96×5 DataFrame\u001b[0m\n\u001b[1m Row \u001b[0m│\u001b[1m nthreads \u001b[0m\u001b[1m n \u001b[0m\u001b[1m target \u001b[0m\u001b[1m baseline \u001b[0m\u001b[1m speedup \u001b[0m\n\u001b[1m \u001b[0m│\u001b[90m Int64 \u001b[0m\u001b[90m Int64 \u001b[0m\u001b[90m Float64? \u001b[0m\u001b[90m Float64? \u001b[0m\u001b[90m Float64 \u001b[0m\n─────┼───────────────────────────────────────────────────────────\n 1 │ 1 1200 7.50223e7 7.50951e7 1.00097\n 2 │ 1 500 5.3892e6 5.39149e6 1.00042\n 3 │ 1 800 2.19662e7 2.20641e7 1.00446\n 4 │ 32 1200 4.04301e6 4.07463e6 1.00782\n 5 │ 32 500 500376.0 494227.0 0.987711\n 6 │ 32 800 1.27026e6 1.26507e6 0.995913\n 7 │ 16 1200 5.87404e6 5.7963e6 0.986765\n 8 │ 16 500 647465.0 650745.0 1.00507\n ⋮ │ ⋮ ⋮ ⋮ ⋮ ⋮\n 90 │ 29 800 1.34235e6 1.33428e6 0.993988\n 91 │ 30 1200 4.23311e6 4.17799e6 0.986979\n 92 │ 30 500 488526.0 506606.0 1.03701\n 93 │ 30 800 1.3351e6 1.35419e6 1.0143\n 94 │ 31 1200 4.05181e6 4.16844e6 1.02878\n 95 │ 31 500 497386.0 506006.0 1.01733\n 96 │ 31 800 1.29854e6 1.29819e6 0.99973\n\u001b[36m 81 rows omitted\u001b[0m",
"text/html": [
"<div class=\"data-frame\"><p>96 rows × 5 columns</p><table class=\"data-frame\"><thead><tr><th></th><th>nthreads</th><th>n</th><th>target</th><th>baseline</th><th>speedup</th></tr><tr><th></th><th title=\"Int64\">Int64</th><th title=\"Int64\">Int64</th><th title=\"Union{Missing, Float64}\">Float64?</th><th title=\"Union{Missing, Float64}\">Float64?</th><th title=\"Float64\">Float64</th></tr></thead><tbody><tr><th>1</th><td>1</td><td>1200</td><td>7.50223e7</td><td>7.50951e7</td><td>1.00097</td></tr><tr><th>2</th><td>1</td><td>500</td><td>5.3892e6</td><td>5.39149e6</td><td>1.00042</td></tr><tr><th>3</th><td>1</td><td>800</td><td>2.19662e7</td><td>2.20641e7</td><td>1.00446</td></tr><tr><th>4</th><td>32</td><td>1200</td><td>4.04301e6</td><td>4.07463e6</td><td>1.00782</td></tr><tr><th>5</th><td>32</td><td>500</td><td>500376.0</td><td>494227.0</td><td>0.987711</td></tr><tr><th>6</th><td>32</td><td>800</td><td>1.27026e6</td><td>1.26507e6</td><td>0.995913</td></tr><tr><th>7</th><td>16</td><td>1200</td><td>5.87404e6</td><td>5.7963e6</td><td>0.986765</td></tr><tr><th>8</th><td>16</td><td>500</td><td>647465.0</td><td>650745.0</td><td>1.00507</td></tr><tr><th>9</th><td>16</td><td>800</td><td>1.83399e6</td><td>1.829e6</td><td>0.997279</td></tr><tr><th>10</th><td>8</td><td>1200</td><td>1.05069e7</td><td>1.02801e7</td><td>0.978412</td></tr><tr><th>11</th><td>8</td><td>500</td><td>902023.0</td><td>914533.0</td><td>1.01387</td></tr><tr><th>12</th><td>8</td><td>800</td><td>2.94478e6</td><td>2.92518e6</td><td>0.993344</td></tr><tr><th>13</th><td>24</td><td>1200</td><td>4.57815e6</td><td>4.54447e6</td><td>0.992643</td></tr><tr><th>14</th><td>24</td><td>500</td><td>513696.0</td><td>530676.0</td><td>1.03305</td></tr><tr><th>15</th><td>24</td><td>800</td><td>1.43459e6</td><td>1.44176e6</td><td>1.005</td></tr><tr><th>16</th><td>28</td><td>1200</td><td>4.18618e6</td><td>4.14831e6</td><td>0.990954</td></tr><tr><th>17</th><td>28</td><td>500</td><td>501717.0</td><td>491466.0</td><td>0.979568</td></tr><tr><th>18</th><td>28</td><td>800</td><td>1.33493e6</td><td>1.33776e6</td><td>1.00212</td></tr><tr><th>19</th><td>20</td><td>1200</td><td>5.18036e6</td><td>5.2294e6</td><td>1.00947</td></tr><tr><th>20</th><td>20</td><td>500</td><td>563366.0</td><td>575086.0</td><td>1.0208</td></tr><tr><th>21</th><td>20</td><td>800</td><td>1.59202e6</td><td>1.62132e6</td><td>1.0184</td></tr><tr><th>22</th><td>12</td><td>1200</td><td>7.19e6</td><td>7.20915e6</td><td>1.00266</td></tr><tr><th>23</th><td>12</td><td>500</td><td>759974.0</td><td>762874.0</td><td>1.00382</td></tr><tr><th>24</th><td>12</td><td>800</td><td>2.23596e6</td><td>2.23998e6</td><td>1.0018</td></tr><tr><th>&vellip;</th><td>&vellip;</td><td>&vellip;</td><td>&vellip;</td><td>&vellip;</td><td>&vellip;</td></tr></tbody></table></div>"
]
},
"metadata": {},
"execution_count": 6
}
],
"cell_type": "code",
"source": [
"begin\n",
" df_wrt_baseline = unstack(df, :version, :time_ns)\n",
" df_wrt_baseline[!, :speedup] = df_wrt_baseline.baseline ./ df_wrt_baseline.target\n",
" df_wrt_baseline\n",
"end"
],
"metadata": {},
"execution_count": 6
},
{
"outputs": [
{
"output_type": "execute_result",
"data": {
"text/plain": "DisplayAs.Showable{MIME{Symbol(\"image/png\")}}(VegaLite.VLSpec)",
"image/png": "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"
},
"metadata": {},
"execution_count": 7
}
],
"cell_type": "code",
"source": [
"plt_wrt_baseline = @vlplot(\n",
" layer = [\n",
" {\n",
" mark = {type = :line, point = true},\n",
" encoding = {\n",
" x = {field = :nthreads},\n",
" y = {field = :speedup, title = \"Seedup (target vs baseline)\"},\n",
" color = {field = :n, type = :ordinal, title = \"size(A, 1)\"},\n",
" },\n",
" },\n",
" {mark = {type = :rule}, encoding = {y = {datum = 1}}},\n",
" ],\n",
" data = df_wrt_baseline,\n",
")\n",
"saveresult(; plt_wrt_baseline)\n",
"plt_wrt_baseline\n",
"plt_wrt_baseline |> DisplayAs.PNG"
],
"metadata": {},
"execution_count": 7
},
{
"outputs": [
{
"output_type": "execute_result",
"data": {
"text/plain": "DisplayAs.Showable{MIME{Symbol(\"image/png\")}}(VegaLite.VLSpec)",
"image/png": "iVBORw0KGgoAAAANSUhEUgAAAiMAAAIPCAYAAAChRN78AAAABmJLR0QA/wD/AP+gvaeTAAAgAElEQVR4nOzdeVxVdf7H8de5GyCgAm5syaKCqKmQpoJbuZtrZtlk1tSYlcvklDU1ky1TY2X1q8YsbdL2ySVzV3AZDdfcACFUwBUVQUC2y+Uu5/cH4y0CvC7ARfw8Hw8fD+73fM85nwP3yptzvud7FFVVVYQQQgghnETj7AKEEEIIcWuTMCKEEEIIp5IwIoQQQginkjAihBBCCKeSMCKEEEIIp5IwIkQ9lZOTg6IotG/f/oa3NWDAAHx9fSkrK7O3paamoigKiqJw3333XfM2X3zxRYKDg+3byMnJsS8zm80EBATQr1+/G65dCNHwSRgRop5yc3Pj+eef5/HHH7+h7WzZsoXNmzczefJkDAaDvf2LL74AQKvVsnr1anJzc69puyaTifvvvx8vL69Ky/R6PU888QTbtm1jw4YNN1S/EKLhkzAihBMVFRXxwAMP4O3tjcFgoHXr1rzzzjsAGI1G3nrrLT777DMAFi9ebD8LcflfcHAwUB44evXqhaenJ35+fkydOpXi4mIA/v3vfwNUCDVWq5Wvv/4aNzc3Zs6ciclk4vvvv7+m2t99913mzJmDu7t7lcsfe+wxABYuXHhN2xVC3HokjAjhRMuXL+f777/noYceYs2aNbz00ktVnmkA6NevH0uWLGHJkiXExMQA0LNnT44cOcLw4cOxWq189dVXPPnkk8ybN4/nnnsOKA8qgYGBBAYG2re1efNmzpw5w6hRo5gyZQqKotjPlNQUPz8/goKC2Lp1a41uVwjR8EgYEcKJLo+5WLp0KQsXLuTChQsMHjy4yr5BQUHcd999nD17lvj4eAYPHsyiRYtYt24dpaWl7N27lzFjxvDyyy8DsH79esrKyjh//jy+vr4VtnU5ePTt2xeAjh07smfPHlJTU2v0+Hx9fcnLy6OwsLBGtyuEaFh0zi5AiFtZnz59iI+PZ+PGjSQmJvLKK6+wePFi0tLSquz/+eef88wzz9C7d29++OEHXFxc7MsmTZrEtGnT7K81Gg16vR6dTofJZLK3X7p0iRUrVgDw5JNPVtj+l19+yZtvvlljx2cymVAUBVdX1xrbphCi4ZEzI0I40fbt29m8eTNRUVH84Q9/oGnTpmRnZ1PVI6PWrVvH5MmT8fDwYNKkSaxdu5Z169YxbNgwXF1dWbNmDUlJSZw8eZJvv/2WBQsWoCgKHTt2JC0tDYvFAsDSpUsxGo2MGjXKftnn66+/RqvV8vXXX2Oz2QB46623eOGFFzAajVXWvmHDBhYsWGAfm/Lll1/yzTff2JdbrVaOHTtGeHg4er2+pr91QoiGRBVCOM2OHTvUrl27qp6enqqLi4saERGhLlu2TFVVVc3OzlYBNTw8XFVVVZ09e7YKVPgXFBSkqqqqbt68WY2OjlYbN26senh4qFFRUeoXX3yhqqqqvvrqqyqgbtu2TVVVVY2OjlYBdcOGDRVq6dWrlwqocXFxqqqqalBQkAqoeXl5VdZ+zz33VKonICDAvnzLli0qoL744os1+B0TQjREiqrKU3uFaMiysrJo27YtY8aMuepBqkajER8fH+688042b96MRnPtJ1HvvfdeNm7cyNGjR/Hz87vm9YUQtw65TCNEA9eyZUsWLVpEYGAgZrP5qtbZtm0bOp2ORYsWXVcQsVgshIeHs2jRIgkiQgiH5MyIEEIIIZxKzowIIYQQwqkkjAghhBDCqSSMCCGEEMKpJIwIIYQQwqkkjAghhBDCqSSMCCGEEMKpJIwIIYQQwqkkjAghhBDCqSSMCCGEEMKpJIwIIYQQwqkkjIhKmjdvTmhoKKGhoXTq1Mnevnv3brp27Ur79u158803HbYLIa7dJ598QkREBGFhYYwZM4aCggJAPn+igXPuQ4NFfdSqVatKbVarVQ0JCVETExPVsrIytXv37mp8fHy17UKIa5ebm6s2b95czc3NVVVVVSdOnKi+//778vkTDZ6cGRFX5dChQ3h7e9OpUyf0ej1/+MMfWLFiRbXtQohrp6oqqqpiNBqxWq2UlJTg5+cnnz/R4EkYEZVYrVbatm1Lhw4d+PTTTwE4e/Ys/v7+9j6BgYFkZmZW2y6EuHbe3t7885//pF27drRs2RKLxcJ9990nnz/R4EkYEZXs3buXY8eOsWbNGubOnUt8fLyzSxLillBYWMiiRYtITU3l/PnzGAwG+x8EQjRkEkZEJUFBQQAEBwczatQo9u3bh5+fH2fOnLH3OXXqFP7+/tW2CyGuXXx8PF5eXgQEBKDT6Rg9ejQ7d+6Uz59o8CSMiApyc3O5cOECAFlZWaxfv55OnTrRpUsXcnNzSUxMxGw288033zB69Ohq24UQ1y4wMJADBw6Qk5ODzWZj48aNhIeHy+dPNHg6Zxcg6pfz588zZswYioqKMBgMTJkyhbvvvhuAb775hokTJ2I0Gnn44YeJiYm5YrsQ4tp07NiRGTNm0KNHDwC6du3KtGnT0Gg08vkTDZqiqqrq7CKEEEIIceuSyzRCCCGEcCoJI0IIIYRwKgkjQgghhHAqCSNCCCGEcCoJI0IIIYRwKgkjQgghhHCqWplnJCcnhzVr1nDx4kXuvPPOCve9Hz16lA0bNhAWFsbgwYNrY/dCCCGEuInUypmRGTNmkJiYiIuLC0888QSffPIJAKmpqQwfPhy9Xs+7777Le++9Vxu7F0IIIcRNpFYmPbPZbGg05Tln27ZtvPTSS8THxzN9+nTatm3LtGnTyMnJoXPnzpw6dQqtVlvTJQghhBDiJuHwMk1RURGxsbEcOnSI4uJi/P396dOnD3fccUe161wOIgAnTpywP7gpMTGRCRMmANCsWTPc3d05f/68PNhJCCGEuIVVG0YKCgp44403+OSTTygoKKi0vGvXrrz55psMGTKk2o1nZWXx6quvsmrVKgDy8vLw9PS0L2/cuDEXL16UMCKEEELcwqoNI++99x5vv/02PXr0YNSoUURERODm5sa5c+fYu3cv3333HUOHDqWwsBAPD49K6xcVFTFixAjmzJlDx44dAfDy8qoQbAoKCvDx8QHKH529Y8eOCtsIDAzkwQcfJCMjo0YOVoiGKiQkpNa2LZ8/Ia6sNj9/twy1Gps3b1b37dtX3WK1uLhYXbhwoVpaWlppmclkUgcNGqR++OGHFdqnTZumfvDBB6qqqmp2drbq5+enWiyWavcxZ84cVVVVNT09vdo+taWu9ynH2DD22RCPsSEek7P354x9yjE2nH3WhOzsbBVQw8PDnV2KqqqqWu2ZkbvuuuuKIaZRo0Y8/vjjVS6bPn0658+fx8XFhQULFtC4cWMeeOABpkyZwsiRI9FoNPz4448888wzMnhVCCGEqAUWiwWdrupf825ubjz//PM0b968jquq2nXd2vvNN9+wf//+apd36dKFoUOHkpGRQUZGBqdPnwYgIiKCtWvXYrPZePbZZ3n22Wevr2ohhBCiAZo0aRKKohAbGwvAmTNn0Gq1dO7cGYAtW7bQq1cvPD098fPzY+rUqRQXF5OTk4OiKLRt25YZM2bg4+PDvHnzeOCBB/D29sZgMNC6dWveeecdAIxGI2+99RafffaZfd9xcXH07NkTDw8PAgICeOKJJ8jLywOwbz84OJipU6fi4+NDSEgIW7ZsqZHjvq5Jz1544QUee+wxoqKiqlw+ZcqUatcNCwsjLCzsenYrhBBCNGiPP/44X375JV9//TWDBg3iu+++w2az8ac//YkjR44wfPhwbr/9dr766iuSkpJ4+eWXsdlsvPbaawCkpaVx8uRJXn/9dZKTk/n++++ZNm0a99xzDydOnKhwt+tv/fLLL4wYMQJPT0/ee+89du/ezYIFC8jNzWXp0qX2fidOnMDd3Z2//e1vzJw5k5kzZ3Lo0KEbPu5qw8jq1atZs2ZNlcsuJyUhhBBC1JyYmBjCw8NZsWIFxcXFfP3117i5ufHQQw+xaNEiSktL2bt3L2PGjLGvs379ensYadKkCUuWLMFgMLB9+3bmz5/P0qVLOXfuHJ07d2bSpElV7nf9+vWYTCamT5/O5MmTefTRR/n2229ZvXo1FovF3q9FixbMmTMHRVF47rnnSEtLq5HjrjaM7N+/nwULFtTIToQQQgjhmKIoPP744zz77LO89tprJCYm8vDDD9O0aVN7n0mTJjFt2jT769+e7WjVqhUGgwGAPn36EB8fz8aNG0lMTOSVV15h8eLFNxQgvL29URQFAL1ej9Vqve5t/Va1YaRRo0bo9Xo++ugj+44ve+GFF2pk50IIIYSo6OGHH+bFF19k7ty5APzpT38CYNiwYbz44ousWbOGfv360bhxY3bs2EFJSQmvv/46QIXf19u3b2fbtm1ERUXRqVMnfvrpJ7Kzs1GrmHj98rYXLVpEUFAQe/fuxWQyMW7cuGoHwdakavcQGRmJ2WxmwIABhIaGVlh2+aCFEEIIUbOaN2/OqFGjWLp0KREREfaHzYaFhbF27VpefvllZsyYgc1mIywsjOnTp1e5HZ1Ox4oVK3jnnXcoKysjNDSU1157rdIJBoDw8HBWr17Nyy+/zKxZs2jatCmTJ09mzpw5tXqs9lqrWxAdHU1cXBxeXl6Vlq1bt84+WZkQQgghataSJUuqbL/rrruqnXrj92c8evXqxYEDB6rs26xZs0r9Bw4cyMCBA6+6v9ForLLv9ag2jLi5uTFgwIAql3Xq1KnGChBCCCHEre2qLgTFxsZy9uxZWrVqxfnz53nkkUdquy4hhBBC3CKuatKzn376ieXLl7Nt2zaWL19e2zUJIYQQ4hZyXTOwCiGEEELUFAkjQgghhHAqCSNCCCGEcKran8lECCGEENfs6Olcfko8xZnsAgACmjemT+fbaBvg7eTKap6EESGEEKIeMVtsfPTDz2w9eAKNApdn9zhw9Bw/xh+hf9cgpo3thl5X+eLG+fPnGTp0KAcPHqzxuvLz8+nZsye//PJLha9rwlWFkfvvv5/BgwfTpEkTLl26VCM7FkIIIURlH/2wl60HTwFg+808Y5e/3HrwJKAyc3yPOq/tMg8PDz7//PMa295VjRnp2LEjMTExdOrUyT4trRBCCCFqVuqpi/awUT2VrQdPknrqYpVLLRYLkydPJioqitGjR1NYWAjAoEGDiIqKomPHjixevBiAvLw8BgwYQIcOHejSpQsrVqwAYNmyZXTv3p3IyEgmTpyIyWSqsI+ioiL++Mc/AuVnY8LDw/nzn//MmDFjGD58OKWlpVe1ncschpGysjIyMjIwmUykp6fzxhtvsHXrVkerCSGEEOIaxSeeQlPFs2N+T6MoxCedrnJZcnIyf/zjH9m/fz9t27bl/fffB+C7775j//797N27lw8//JCCggJWrVpF586dSU5O5tChQwwYMIDjx48zb948tm/fzoEDBwgJCWHhwoVXrOf48eP8+c9/ZsWKFYSGhvLjjz9e03YcXqaJi4tj7NixZGdnM2bMGJKSktBqtSQkJNChQwdHqwshhBDiKp29WHTFcyKXqQqczSmscllwcDA9epRfwnnooYd49tlnUVWVefPmsWHDBtzc3MjMzCQ9PZ3IyEheeeUVNBoNY8aMoVevXixfvpyTJ08yYsQIAEpKSujbt+8V62nTpg1BQUFA+UP3Tpw4QWlp6VVvx2EYOXr0KBEREZSWlpKUlMSsWbNYuHAhW7ZskTAihBDippRfVIqrQYeroR7ex6Fw5as0gKLCVZxAKe+rKMTGxrJr1y62bt2Ki4sLQ4YMwWQy0bVrV37++WdWr17Ns88+y+jRo2nWrBmDBw9m/vz5FbaTn59f7T4MBoP9a41Gg8ViwWazVbmdqji8TGMymdDpdCQkJAAwc+ZMwsLC7NeghBBCiJtFXmEpz/1rPRPfWMn4V5bzycqfUa/mVEQd8WvmiXJVBan4+XhWueT48ePs2rULgK+++orevXuTl5dHSEgILi4uZGVlsXPnTgBOnz6Np6cnjz76KH/96185ePAg/fr1Y+XKlWRkZADl40rS09Ov+ViuZTsOI2FwcDAHDhxg0qRJ+Pn50bJlS7KysmjRosU1FyaEEEI40+fLt5CaWf7HtKrC2t0ZRAQ0pk9UmJMrK9e7UyAr44847GdTIaZTYJXLOnTowOeff86UKVMIDg7mq6++QqvV8sUXXzB+/Hg8PDyIiooCYP/+/fz9739HVVVcXV3597//TUhICPPnz2fMmDGYzWb0ej0ffPABPj4+13Qs1W0nNDS0Ul+HYWTkyJEMHz6chIQEXn/9dU6fPo2iKHTr1u2aihJCCCGcLe1EJtC4QtvRhL31JoyE3ebD3ZFBbD5wpTtqFO6ObE3YbZXDQatWrUhKSqpyrfXr11fZPnr06Epto0aNYtSoUZXaL88r0rRpU/vXrVq1qjCvyZQpUxxu5/cchhE3NzdWrVpVoe16TtcIIYQQzpSVV4yX9QJnfhdGfHV5TqqoalPHdkNRFDbtP45GUVD/NzZEUcGmqgyICuLpMXc4t8gaVm0YiY+PZ8eOHdWuGB0dLXOOCCGEqLeOHznM2k07KC2zcZtvE35MtjFQk8EZpQV5ankgidCmcXcP500eVhWdVsOMcd0Z3rMtPyWe4vSFitPBt/H3cnKFNa/aMLJp0yZeffXValecPXu2hBEhhBD10un0X3hu8UFMNC1vuABttWc4iy/vh6whLasEdwO0ixmNod3dzi22Gm38vRpk8KhKtWFkwIABuLm5AbBo0SL8/f3p1asXqampbN++nQEDBtRZkUIIIcS12LZ9ByYq3m1iRcdfZz6FpokfPqiU30Mr6oNqw0hMTAwxMTFs376duXPnkpycjFarBaBnz55ya68QQoh6SzWVwO/CiKJ3QdPE7/KrOq9JVM/hPCP79u3j0qVLbNu2DZvNRmJiIunp6aSkpNRFfUIIIUQFRpMF9QpzcdhO78Erdw86rBXa+7Zxq+3SxHVyeDdNdHQ0VquVu+/+9ZqaRqOR8SJCCCFqh2olafk7bEnJQUHlrg7N6Tj2Oc5eLOGd/+wiLTOPRi56Jg25nWE92mA7tYuy2L/T8mIaxib+ZF4s5YviP9Nam0kTVxUUA73CmjJo7CRnH9k1sZ09iOWXlag5aQAozdqgixiNxreLkyureQ7DyJ133snXX3/NP/7xD44fP05wcDB/+9vfuPPOO+uiPiGEELeYhA1f8vf9QagEA7B5v40XdItYcrwFaVlGAEpMZj5ZtZ8IXxdaLn8UtfRS+SzquRno8KFUNRDcpQ8zxt2Ev6usZZSt/QuWw8tA+c0FjIytWPZ8iq7jOAzD3wWtodKqRqORb7/9lscee6xWS6zp/Ti8TAMwYcIEDh8+TGZmJvHx8QwZMgSj0VgjBQghhBC/FZucj/qbMR02VcPKn89zIquoQj9VhcRvXqKk1MSKsoHMK/0DG8y98Vby6Rag4anRN+fknGVrn8FyeHn5C9VW8R9gObycsrXPVLlucXEx//d//3dN+1NVFZvNdk3rXM9+ruSqwsiMGTPw8PDA29vb/u+tt96qsSKEEELcuo6cvsielEzyCkvJuZjHxcKySn3Mio7mmouV2jNKfXi95Cn+YxrOdnM3FpXey7+ME5n24AD0uqv6FVev2DL3YTn8A1d+Up6K5fAP2DL3VVryxhtvcOLECQYOHMjs2bMBGDRoEFFRUXTs2JHFixcDcP78edq3b8/TTz/NsGHDuHDhAnPnzqV9+/YMGjSIyZMn28PGsmXL6N69O5GRkUycOBGTyVTlfm6Ew8s0W7Zs4cMPP8Td3R0PDw+sVisajQYvr1vj3mchhBC1Q1VV5nz1X3b+cgEAvUZFUW00ovI05/cN6I715/m8f3EkJsovT9ypSyBb60+6ueIzWnZbuzDDzaP2D6AWWH5ZVX5pRnVwpkLRYPllNQb/ijOxvvTSS2zatIm4uDh723fffYePjw8lJSXExMQwduxYANLS0vjxxx8JCwsjJSWFL7/8kv3796MoCj169CAiIoLjx48zb948tm/fjqurK7Nnz2bhwoVV7udGOAwjCQkJtG7dmqeffpqEhAT+9a9/MWTIEO65554aKUAIIcSt6UDKCXsQATDbFDwVE+FuWXSJas2etFwURWFgTGd6dA3D6m/jg+XPctTUEm+lgPCOnUjv+gyJn26psF1VBYv12i471Bdq7vEa7auqKvPmzWPDhg24ubmRmZlJeno6vr6+hISEEBZW/kyenTt3MnToUBo1agRgf57Mtm3bOHnyJCNGjACgpKSEvn37XuthOeQwjJhMJgIDA/H09CQ9PR0PDw88PT1Zv349U6dOrfGChBBC3Bqyjh2q1GZSDfz1ueloXD0Z/rtl2jYD8JsaS6vMAygeLdH4daWNxYpfM0/O5vw691Xn0JY0cXep5epryzXMf6I47hsbG8uuXbvYunUrLi4uDBkyBJPJBGAPHldis9kYPHgw8+fPr9Cek5Nz9XVeBYcX1Fq1asW5c+do27Ytu3fvxtPTk02bNuHicrP+oIUQQjiLWpwDqo3iUjOZxw6iKBXHRrTVn0HjWv0lFsW9Bdp2Q9D4dQXAoNPyj8f6MahbCKGtPBnTO4wX/tCrVo+hNinewTfU18PDg6ysLPvrvLw8QkJCcHFxISsri507d1a5rV69erFu3TpKSkowGo2sXLkSgH79+rFy5UoyMjLs27t8YuK3+7lRDs+M9O3bl9TUVHr06MG9997L6tWr6d+/PxMmTKixIoQQQjRsOak7+WLpetJKm+Gny8NNa+JwaRB/MKxmWdkgSlVXQrSnebJTPtc6O2rzpo2YNrYbGRkZhISE1M4B1BFd+5FY9i5w3FG1oQsfUanZ1dWVUaNG0a5dO0aOHMlrr73GF198wfjx4/Hw8CAqKqrKzUVERDBx4kS6du1KYGAgXbt2pXHjxoSEhDB//nzGjBmD2WxGr9fzwQcfEBoaWmE/c+fOvbHjdtQhODiYN954g9jYWJ544gk+/fRTLl26hIfHzTk4SAghRB1Tbbz57R6OmTsCcKasFT6aPFpo8+nf83ZG5m+hpDCXxqE90Mf83cnFOpfGPwpdp/uwJC2j+jtqFHSdxqHxrzpYLFy4sMLr9evXV9nv4MGDFV5PnTqVWbNmUVpaysCBA5k5cyZQPn7k8hiSK+3nRjgMIzabjeHDh7Nx40bGjRvHY489xtChQzl8+DAdOnSosUKEEEI0DOdzizhw9DyFl/LwC7iNggunOGb2q9Dnos2LZwYF0KJv+c0QMlH7rwzD3gVFiyXxP/8bF3L5TJEKqoru9vsxDH27xvc7Y8YMDh06RGlpKRMnTuT222+v8X1Ux2EYWb9+PXFxcXTpUj797JAhQ/D19WXnzp0SRoQQ4hamGvOwHl6Gai5B22YQmhbtScy4wCuLtmG2lN/N8uOeM7goFhTUChOZATT2b+uMsus/rR7DPe+ju+NRrCkrseUcBUDj0xZth9FoWtVOSKjJMx3XymEYSUlJoXPnzowdO5aEhAQAAgICanwkrRBCiJuHWnyBQ/MfY/2ljhhx4U793xny4JN8u1mxBxGAImMZRUCwJpPjtgB7eyefUoJC2zmh8puHptXttRY86huHYcTHx4czZ85QWFh+29Tu3btJSkriqaeeqnad/Px8tm3bxpEjRxg1apT9PuYDBw5UmCClf//+dO/e/UaPQQghRB1Li/+B1y5OwIIWgEOW9mR+u5LU0h7wv7bLonX7+XOH0+zyj+bYifME+rdiQJ/uKFdxa6q4NTgMI4MHD2b69Om8/fbbaDQali1bhru7O4MHD652ndjYWJYsWcKRI0cqTaqya9cuhg0bBpSP+hVCCHHz2X0KexC57JAplE7aoxyytK/QfndAMa7jv6K/Rkf/3nVZpbhZOJxnxN/fn+XLl9O+fXu0Wi0RERH88MMP+Pr6VrvO+PHjWbZsmX2cyW/dcccdTJ48mcmTJ9fp4BghhBA1R+Ne+ZEgei084/Yl/fR7aISRZpo8HnVdTpc2LUDj8G9fcQtz+O744IMP+Oyzz0hMTESnu/E3U1JSEp999hlRUVF07dr1hrcnhBCijpUVE3xhLVqGYP3N2ZER9wzF/cQ+nkz7jiddv7O3K94jnVGluIk4PDNy2223cerUKVT1Sk8QvDqtW7cmJCSEzMxM7r//fj766KMb3qYQQogaZCnFdj4Jteh8tV2K1/2Vb7K7YkVLUMvG3BUZxEsTYxjYvR36u15G8fz1zLk2uA+62++vi8rFTUxRHaSMw4cPM3LkSDp06MC4cePsc9lHREQ4vLV34sSJjBo1inHjxlValpaWRv/+/Tl9+jQA8fHx7Nixo1K/559/3j4NrRCiarU566R8/m4d+pzDeO14CY0xBxQNxWHjKewy7X9LVZSyIhqd2MCKnSdZa+5LS08dz47rjEFX8e9axWpCfzEF1eCBuWkbrnVG1ZvNzT7ra33g8LrLsmXLOH78OMePH2fNmjX29tmzZ9/QPCN6vR6r1Wp/HRMTQ0xMTIU+b731lv3ruv5h1/W0ws6YxliO8ebf3+V91jb5ud38+7ya/ZVunYzN+L9pG1Qb7qn/weeO+1GNuZRteB61OAcTBtLUJ9EqMGtif9oFele9sbbt6+Ux1sY+xY1zGEaioqKYPHlyle3VyczMZO3atRw7doxNmzZRVFTEI488wt/+9jc8PT1xcXHh888/v+LtwUIIIeqSii3nWKXW0u/up9SqYZO5B+dsLQjVnGaqy5f8HLOs+iAixDVyGEZGjBjBiBGVH8ZzJUajkYyMDPr16wfAiRMnABg7dizbt2/HZrMxb948eveWe7yEEKJ+UDA3bcvys0EkW9vgpRQw1hBLIOd5s+RJjljLnxC7Ceit38dfujRxbrmiQbmq22OOHTtGXFycfeIzgOjo6EqXVS5r06YNc+bMqdQeGRlJZGTkdZYqhBCi1qhWPr/Ymy1l4famRLUDd4e5cyTFVKFrvCWKp/VeuNd1jaLBchhGEhMT6d69O7hVTaYAACAASURBVCZTxTfj7Nmzqw0jQgghbi5luxewu6h1hTajVcea3wURAFVVsKgOb8YU4qo5DCNxcXGYTCb+9Kc/ERoaam+Pjo6u1cKEEELUDTX/FJb4uWj4W6Vl3dv7kXryIgUlv4aSjsHNaeIhM2iLmuMwjERERNCoUSM+/fRTeY6AEEI0NKoN05oZHCltSSluFRa18HLnL/f34FKRie82J5OZU0DbAB8m3C1PbBc1q9owkpycTEpKClA+8dkDDzzAiBEjcHFxAa5unhEhhBDOZ8tKxuV8ImqrpiiNyu+AUQsysaSswnbmZ04dP8Ec45+xqAodg1vg38wD78ZuDO/ZlkYuehq56Jk5/k4nH4VoyKoNI0uXLuXVV1+1v05NTWXJkiX21zc6z4gQQojaplK2ciqW5B/wAkp3eWIY+xmKe3NWfPoG/zVFoqgdiDEY8Vby6dqhG7Mm9ESjkbPgom5VG0aqm1/kt8uFEELUX9bjP2FJ/sH+WjUVUvbD42yz9mRxya9TNhwvDWBU00M8KkFEOEm1YeTy/CLx8fGkpqby+OOP25dt2LCBwMDAOilQCCHE9VHzT5JhDWRF2SDyVQ866o4xmk3sNrau1PeCphVaCSLCSRwOYN20aRPff/99hTAyffp0HnzwQblMI4QQ9Viu3p/XjU9RopYPTD1qDeaENYBztmaV+no0bVnX5Qlhd8Uw8sILLxAfH092djYvvPACACUlJRw/fhxXV7mtSwgh6i1LKQe2rKRE7VWh+aAlHF/vxujyC7DYyucKMWhg+PBBzqhSCMBBGPntg+p++zVAjx49aqciIYQQN0a1UfrjVH7J8ay0yNPdjU+fG05mdiHbEk4C0K9La/yaVe4rRF25Yhj59NNPWb16Nfv27bPfWaPX6+ncubNM6y6EEPVIZtZFPv1uAxm5Ki10+biYb+OwJaxSvxE92wLg39yTBwd0rOsyhajSFcPI5MmTiY6O5vTp0wwZMqSuahJCCHGN/vHJj5wp9QDgkrk57oo7Xi4qD4+4k+z8Ek5kZtEnsi29OsjNB6L+cTiAtUOHDhgMBj7++OOrflCeEEKIupOTfcEeRC4rVhvxzEB/7owqf9puRoYbISESRET9JA/KE0KIm5yHQUGLFSvaCu2tGmurWUOI+uWqHpRns9mYOXMmLVq0sLfLg/KEEKJ++P6/v3CnPpGd5q72th6N0mgdMcaJVQlx9RyGkTZt2hAWFsa7775bF/UIIYRwwGZTOXexCFcXHWu3HWLZ7nM0Udoytela8gwBBDT3oNfIR0FrcHapQlwVh2EkNDSUixcv8tRTTxEdHY3BUP7mlgflCSFE3buQX8yrn/+XU9lFACio6LDxhN8+ej/xCegbOblCIa6dwzCybNkyzp07x/z585k/f769XR6UJ4QQdW/Rip/sQQRARWFI4yRiHvunBBFx03IYRqp7YJ48KE8IIWqZtQxr+hbUshK0wTEo7i04fvIMUHGCMm2ztihuTZ1ToxA1wGEYufzAPCGEEHVHNRVi+nIEtuwjACj6Rly8bQTNLV5kEl6hb6BrYVWbEOKm4TCMCCGEqHvWxP+QnlXMxrIHKMWF7pZEPI8cpL32NrJUH87ZmgPQXZdE/25yd6O4uUkYEUKIeuD4uXwysy8R6u+Dr48Hp46l8HLJDMpUPQC7zF251yWWgsBBvOu2klPH03DTWgnsOQ59+FAnVy/EjZEwIoQQTvbZt2tYmVQMgBYb97VI4Wye1h5ELtun6cG/Hr8fuJ8OllLQ6Mr/CXGTu6p3sdVqJTY2Fp1OR2RkJJcuXSIkJKS2axNCiAbvbOZZexABsKJh+YVwzFSePdXV+7ZfX+hc66I8IeqExlEHm83G8OHDGTZsGAsWLODnn38mNDSU5OTkuqhPCCEatAsnf6nUZkZHtwAtWo1Sob1flPwRKBomh2dG1q9fT1xcHF26dAFgyJAh+Pr6snPnTplnRAghbpCv5QQuGDDx62ypPko+f3/iUY6dK2LNrqMYTRZ6dgigf9cgJ1YqRO1xGEZSUlLo3LkzY8eOJSEhAYCAgABycnJqvTghhGhQVCuWxO+xndxBY7OBsqNuLNpppY/ByD5zJ/LUxvhqLjAjxhVFZ6BdoDczA3s4u2ohap3DMOLj48OZM2coLCy/j3337t0kJSXx1FNP1XpxQgjRkJi3/hPz7nkANAIKVFcOWWajal15/4GWeJqzcA+8G02LCOcWKkQdcxhGBg8ezPTp03n77bfRaDQsW7YMd3d3Bg8eXBf1CSFEg2FJ/I4ESziHrW3xUgq4S7+HrvpfuGvCDPzC/ZxdnhBO4zCM+Pv7s3z5cp555hnS0tIIDw/n/fffx9fXty7qE0KIBkJlVWF3vjYOsbdsMvfi4Ugd3SSIiFvcVd3aO3jwYFJSUmq7FiGEaFAsVhsAOq0G24UU1horzpSaaWuJGtzJGaUJUa9cVRg5duwYcXFx9nEjANHR0cTExNRaYULUZ2VmKwZ95XkglLKiKnqLW43FamPein3899BJAHq28cTr1Hry1Z6V+hpVt7ouT4h6x2EYSUxMpHv37phMpgrts2fPljAiGrQiYxk/p54DoFu4Lx5uBs7nFvHekj2knsrBw83AI0M6M6hbCNYj6ynb8Dwti7MxeofgMuIDNP53OPkIhLOs2nGUTfuP21//dOQS0KtSP1eDjs6hLeuwMiHqJ4dhJC4uDpvNxsyZM2nRooW9PTpaHswkGq7zuUU8+/EmLhWXh/AmHq7MfXIA7y3ZzS8nLwJQWFLGv1bsI7y5hmarngazEQA1NwPTD5Nxm7YfUMBsRLWUorh5AWCzqazccYTdKZm4GfSMjG5HZLtWTjlOUTtSkhIrtbXWX+Dxh8awO/UCCWlZNNLDH0fcQfOmjZxQoRD1i8Mw0qZNG8LCwnj33Xfroh4h6lz62TyWbE0hr7CUzm1acl/f9iz97y/2IAJwqaiUJ+auRVGt/HbiYlVVObXmDZr9L4jY2wvPYf75M9ScY1gOfQOqDc1tPXAZs5Bley/wVWySve+htPO88+QA2gZ41/qxirrhUXIcqDhBWUdvE13aBdClXQAAGRkZhAQ1d0J1QtQ/DsNIaGgoFy9e5KmnniI6OhqDoXyWwIiICJmBVdz0LhYYeWnhVopLzQD8cjKH2L3pFBQZgYpTcSuqlWaaPLJsPhXa07KtRLqABS35tsZ4K5fQKDbMcS8DcNLqTykGgk/tQ7PxBbYfq3hbvNWmsicpXcJIA5F8IpsAYyI+SlMuqk0BaKbJY3RQrpMrE6L+chhGli1bxrlz55g/fz7z58+3t8+ePVvCiLjpHUrLsgeRy3ILS4nUpXLA0r5C+0MuK2muyeVD4yTK/vfRidIdJlv15hPzJHaZ2lOquuKlFPLn8AzaFWzizax7SLKEAdBcyeOp5G+wlXYEKt4ar89JAbrV2nGK2nUmu4D8IhMms5U5X23HT+3K3EZzSLa1RQE6Go7TtMcPzi5TiHrLYRiJiopi8uTJVbYL4Wy27FQsB76AshK0YUPRtiufw0E1FWLL3I8h5xIEB4GiQS04S9mW17GdT0TjHYq+/4sYdJWv17u76vlLq5/4OjOb/5q7A3CXfg9DXPeg9WzO+3lvcMQWgpeST7hbDm+7/oODmVb7+nmqJ/9Mj+LuFv4kWZrZ27NVL74rvYcY/X6+M91jb2+kGOntk1Vb3yJRyz5csoO4g2cA0ClWLKqW1vpMPML70at5GChadB3vRfGWh9wJUR2HYWTEiBGMGDGiLmoR4prYLqZTung4mEsAsCQtwTD8XTS+XTF9dz9qcTbeQOmRRbhO+B7TskexnS8fWGjNzcB2PgFb5AK8lUvkqk3s2x3KOnQXU3jENYVHXH/9a1bfYxr66Gfw3fURLU7Eo3hGoO81g3sLfTj4720Vaists7DhTOXLLtmuIYyIKqDN/o/ZY74dN00pA/S7aNn+41r4DonalnjkpD2IAFhULc00eTzd2wOXge/x+0t9QoiqVRtGkpOTSUlJITw8nNTU1ErLZcyIcDZryo/2IHJZWezfUfSuqCW/Xp+3nd6D8aNIVGPFa/Zq0QXObPqYOe672FjWmzzVk066o/TUHkIT0A21KBs1/wQAGt/O6HpMBb0b+j6z0PeZZd+Or0sxigKq+uu2dVoNXdr6sy81s8I+u4QF4jlwOF14mU5H1oGLJ/oez6EN7lNT3xZRh86kHqjUVmDzxDDgdSdUI8TNq9owsnTpUl599VVeeOEF5syZU2n5lcaM5Ofns23bNo4cOcKoUaMICwuzLzt69CgbNmwgLCxMnm8jboxqRUXhqDWIUtWFMO0JXM0l2MqM7LBG8bP5dtwUI4MN8QSXnKnyj1QTepoohYx3WWdvUwzuuD68ElQV24XymYc1LSJA0VTeANCiqTsPDujIt5uSUVUVg07L1LHd6NflNj5c/jObDxxHVaFNgDePDOkMejcMw+bCsLm18m0RdSfA3QhUnPwuSHcWRVGRsyJCXL1qw8jlsSLdu3e/5jEjsbGxLFmyhCNHjhASEmIPI6mpqYwYMYKZM2fy7rvvkpyczMyZM2vgMMStyKxvyuyS6RyxBgPQVFPAK3de5PDJS3x2tou93w5LFO/eXQa56SxIcCHDdht+miyidQfJajkYpeQnVFOBvb+2/ShAAUVB07LjVdXywF0duCsyiP1Jx+jZNZymHq4AzBjXnT8O64LRZKaFl3vNHbxwOlWF+GMljHXZxaqyu7GoWnw12UzpcBEJIkJcm2rDyG/HiowZM+aaNjp+/HjGjx/PxIkTK7R//PHHTJ8+nSeffJL77ruPzp07M2PGDLTaytNqC/F7qgrFpWV4uBmw5RwjbstPHLH+OhA039aYlw81x2ypOFtwmarn3cPNyC30psBavuyYNYh0NZiFE4bhYmyHecf/oRZdQBvUG330jOuqr0VTd8L8G9uDyGWejQx4NjJc1zZF/fX9inWsP+XJ7brb+MR3IWVad1q0jcTQ5yVnlybETcfhmJHqXM+YkcTERCZMmABAs2bNcHd35/z58/j7+1/TdkTDppoKULNSUDxa2O9A2Jl8ho9/3M+lolJ8vRsxjLVsLKk83XqB0VSpDeDE+UuV2mw2lQt5JbQI7ozLuEU1exCiQSo6k0Rm+i8UFhbx3T43FBTu6eBGywe2Ors0IW5qDseMVOd65hnJy8vD09PT/rpx48ZcvHhRwoiws57cSdkPj6Ea8wHQdfkDpX3f4L3vd2Myl98+ey63hM/pj1rF+lHtfAn2a8qy//5ib9NrNYy/qwPfbkqqMMgUoIm7S20dimhgflrxGR/t1WPEFb3iwp26BEL8vOn5wHPOLk2Im57DMSNXWn6tvLy8KCj49dp8QUEBPj7ls1nGx8ezY8eOatfNyMi45v3dqLrepxwjNFv/HLr/BREAy6Fv2H8pAJO54iRhKtAvvDFGm56f03Kx2VTa+HoytntL3F31uBJC4ok8XPRa+nRowW3NXbnQ2Ze4Q+fs2+ga4o25KIeMopw6Pcab0a3+3lTNJv71c3kQATCrOvaab+eezi3JyDhe7Xo3ss/acKv/HEX9dVVjRqxWK7Gxseh0OiIjI7l06RIhIdc+gc/tt9/Ovn376NWrFzk5ORQXF9OqVfkDwmJiYio9Bfitt96yf309+7sRGRkZdbrPut5fne5TtWJN38qFE8m0ihxhv/SyPeEUm/YfR1FgYFQIMbcHkF9wjiVlQzlsaYePks9owybOHtkP3FNhkwbFzPT7eqJv1BST2UqZ2VphXEZoaAj3/+4Yp4eE0L/bBdIy8who7skdYX4oNTzO0Fk/x9rWYN+bV7m/rDMZlKgVxwJZ0WJTleuus74dY0PYZ0P9/N0KHE56ZrPZGD58OBs3bmTcuHE89thjDB06lMOHD1d7mSYzM5O1a9dy7NgxNm3aRFFREY888ghTpkxh5MiRaDQafvzxR5555hkZvNrQ2SyYvnsA68kdNAGM+97FZeRH7FGjeOc/u+zdDhw9jzH+Z5KMo9hq7mFvT7CGc4c+iRGGLawx90dVFbRYmWRYgU4tn23VRa/FRX9176NOIS3oFNLCcUchfqO5XxCN2E4JbvY2LTYC28lcS0LUBIdhZP369cTFxdGlS/mtkkOGDMHX15edO3dWG0aMRiMZGRn069cPgBMnyieOioiIYO3atWzcuJFnn32WIUOG1NRxiHrKmrEV08nd7DFHkq960lGbRuvYF9mszgQ8KvT98kwYBWrFtmLVDdrew0OXXqBf3l7O2poTpD1Lq9vaoLg3Q4i68EvcFzTRFGOzKZTiikGx8mi0Fz7NWjq7NCEaBIdhJCUlhc6dOzN27FgSEhIACAgIICen+uvsbdq0qXKiNICwsLAKk6CJhs1ccIFXSqZzzNoaAAWVydbvKbRk8fsw4q+5wCVbE34/yrRH5za4BfyHoJ/mcltOGhq/e9D3frauDkHc4vKO7ubtbWZy1eaM7qDjrv59aeHTBHdXvbNLE6LBcBhGfHx8OHPmDIWFhQDs3r2bpKQknnrqqVovTtz8DpzX2YMIgIrCf8qGM9CwiyO2YGxq+aymGsXGhPZGklq05/stv95S3qKpO13btkJx1WMYOa/O6xe3KNWGmn8Km9nI3G+3kasG0cGrhEcefAStRiY0E6KmOQwjgwcPZvr06bz99ttoNBqWLVuGu7u7TOUuqnQhr5jj5/Pxb+aJb1kae/buAyrOB1Kiacy9DzxIl6V/Y7ulG6gq/Qz7iOj1FrcHdSKweWMS0i/g09iN4T3byF+gok7ZCs6y7t9vsjfXBzdMtNFkc0rXilmTx0kQEaKWOAwj/v7+LF++nGeeeYa0tDTCw8N5//338fX1dbSquMVs2JvOp6v2Y7GqKAo0UQrJt1WemCwyzA+P8Bg6TjTQPnEJANrOc9G2jgagb5fW9O3SutJ6QtSFFd8uYvGF3vbXesXCM3cU4d3U8wprCSFuhMMwAuVnR640G6sQFquNhav2YSmflwxVhUuqB146E9HdIkhIzyYnv5jIdn5MGRUJgDaoN9qg3lfYqhB1b/v5JhVem1UdJy5akHeqELXHYRgpKyvjzJkz+Pv7c+bMGf7zn//Qq1cv+vfvXxf1iZtEXn4RZdaKbSoKfx7dgcj/TZDnjDkAhLhWGk3lpzPr3H2cUIkQtw6HYSQuLo6xY8eSnZ3NmDFjSEpKQqvVkpCQcM3TwYuGw1ZWSubRQ7i5e+DhH86qdRvxUgrIUxvb+xgUM8HuJU6sUohrY8o/j81cWqHNVWOlz4ChTqpIiFuDwzBy9OhRIiIiKC0tJSkpiVmzZrFw4UK2bNkiYeQWYLHa2H/0HKYyK7eHtqCphysXTqTyyuebOW0un+fjdt2P/GILZprLcr4sG02OzQtPpZjHPVbStPViJx+BEFdHtZbxzsdfk2EJxFtbQkSQD56e7gzvdwf+LZo43oAQ4ro5DCMmkwmdTmefY2TmzJls377dfquvaLiMJguz5sdyIqv8Z93IoOWVP/bjh/9s4PRvnhWTaGlLd30CbYMD+LhoEfl5eTTx9MBl6D9R3LycVb4QV+Vcdj6ZWXlsWLuGPYWBNNKYeOXxuwgOkkHUQtQVh2EkODiYAwcOMGnSJPz8/GjZsiVZWVm0aCFTajd0sTuT7EEEoKTMyusLVtGIyrfatmzenICH3wTAtawIxeBRqY8Q9YnVpvLGB4v4+YI7AN6KK42VIp4bHSFBRIg65jCMjBw5kuHDh5OQkMDrr7/O6dOnURSFbt261UV9oo6UZuwkbsW3nC2ENs009Bg9meR98UDF0OmmmmiiKSSLilOxB7UOtH8tQUTcDDatW2kPIgC5ahMi3c/QpVtPJ1YlxK3JYRhxc3Nj1apVqKpKfn75o9337duHq6urgzXFzcJmvMSri7dz2Py/mxczodenX2NQLPw+jHRxO86YIX15dXUm583l19G7eedx9/A/1XHVQtyY02fOAd4V2rLN7lV3FkLUqquaZ2TGjBl89tlnlJT8emfE7NmzeeWVV2qtMFFbVKwpq7Ce3IGH2YDa6hnS9/+Xw+bgCr12Wbow1nUz45X1rC7rj1nRE6U9zMQ7m9K023DmR1rJOJpKI48mBAQGOOlYhLh+gV4ucLJiW2t3o3OKEeIW5zCMbNmyhQ8//BB3d3c8PDywWq1oNBq8vGRg4s3IvH0u5vj3gPLH1BlTv+FiaWvgyQr9VBRGTXsLz9MbuG/3fMxlpbiED8HQ/y8A6LRa2rWXu6nEzUol89wFbteaSLSGA3CbLotH7pX5k4RwBodhJCEhgdatW/P000+TkJDAv/71L4YMGcI999xTF/WJGmY5+BWnbb4kW9vgpVziDpLZY+2Mh1JCkdrI3q9dUzNe3t7g/SC6zg8iF+VEQ/LzqgX8eCEIHVZe7V0KiobOfSehbSS38ArhDFd1a29gYCCenp6kp6fj4eGBp6cn69evZ+rUqXVRo7gBqrF8nI/i1hQ1N51tl0KZXzre/rTc9toMfDS5NG/pSxtdCTkFJtr6N+WR0f2cWbYQtcNqJvfIT3y0W4uqKjxwhyeRw0aSkZEhQUQIJ3IYRlq1asW5c+do27Ytu3fvxtPTk9LSUsaPH18X9YnrZSnFtGIKRce2AdCoWWvU/BMsMT1vDyIAv1hDGNg+iv+bMBCNPJFUNFDW9C0cW/0umQU2mijFNFVG4eflwrgx8v+YEPWBwzDSt29fUlNT6dGjB/feey+rV6+mf//+TJgwoS7qE9epeOcnvJ/oxx7LHAB6Gg/RT68hx1Z5rE94uzYSRESDoaoqFwuMeLgZcDXoUI35fPbNCtYYHwZAi5VxLrEMe2KevO+FqCeuatKzOXPKf6EtW7as1gsSNWPlgYvssXS2v95l6YIWCyoV//PVaTV0CGpe1+UJUStOnMvjzcVxnCtQ0WlUJvQN5Q7DUdYYY+x9rGhZYRrI/dZ8QG7lFaI+uKpbe+Pj4/nnP//JiRMnCA4O5q9//SvR0dG1XZu4ShcOrWf1xm3klmrp3FLlzhaFJOa0rNQvS9eaF8b3ZMvBkySmX6Cxm44/3hOJf3NPJ1QtRM376IvVnCtwAcBiU/hqawablTygYuAuQ8cl1eN3U/cJIZzFYRhJTk5m4MCBlJaWP8kyJSWFzZs3s2/fPnlQXj1QePYos5ae5qKtKwDbT8L+zIMcswZV6tuxyx1Ed7qN6E63AZCRkUFISGClfkLcjFQVjhdoK7W7KiZ0qgXLb/67a+Zmw8dLBqwKUV9oHHWIjY3FbDazePFi0tPTWbx4MWazmdjY2LqoTziwb98+Ltoq/qeaZG1HkG8TvD1/vSHXv7kH997dpa7LE6LOKIpKK01upfaHe7fk+Yn98G5UHkb8vV144ZFBKDJcRIh6w+GZkXbt2uHj48OkSZMACAkJYdasWYSGhtZ6ceJ3LCbS//sNaSczCWjpQ0j7TiQnJgJdK3SzKVrmThuBxWrjl5PZAEQENUendZg9hbiJKTzUJosPj3pSrLoBcJfbASJ7/wXFvQU9Iu7FaLLg5nJVV6eFEHWo2k9lcnIyKSkpAHh5eTF58mSio6PZsWMHTZs2lTDiBEsXvM1XZ9qiqu0gDXrtXct+SwSNlFJK1F/PgvQOdUFRQK/TcHto5bEjQjRUR2nLQMMO/HXZhIWG0Prux1Dcf32+kgQRIeqnaj+ZS5cu5dVXX7W/PnLkCAsXLqywXMaM1J2yony+PR1a4W6YneaudPM8Tcxdw9iXcJi8IjNd2vkxZmgfJ1YqhHNYrDbi0qDAejdv36UnuM9YZ5ckhLhK1YaRqKgoJk+eXO2KUVFRtVKQqNqlomIsVB6cN+ruO+l8ZwR39YhwQlVC1B87tm2hwOrKbboLtI+e4uxyhBDXoNowMmLECEaMGFGXtYhqqKrKpvVraaJouKT+ehtuI6WM0A5dr7CmELeODXuOAd4MCTOAVu/scoQQ10AuoNZDqqqybtMOdiUdx02vYCm5xL78ZrhpSvHVXuKcpQmt3ExMGXUHHh4ezi5XCKc7ezKD5EIvXCij/xB5iKcQNxsJI/XQDyvXsHhPCWAAQIsX3ppLPHFXAL3uHobFapM7Y4T4jXUbNqGqTYhpnotHM39nlyOEuEbyG60e2p6YWeG1FS0xvkZ63T0MQIKIEL9hKStl66nyyzJD+t3h5GqEENdDfqvVQ4rFWKnNw83ghEqEqP9+il1Fga0RrQ25hEfKYyqEuBk5DCNlZWVkZGRgMplIT0/njTfeYOvWrXVR2y2jtMxCUakFs8XGB4tW0pzsCstdMdGne0cnVSdE/aUWnmP3wSMADO3s7eRqhBDXy+GYkbi4OMaOHUt2djZjxowhKSkJrVZLQkKCzDNyg1QV5n+zlg3JRahAC902si2eNCKMx5rGkVHWCje9wrDenfDv1NvZ5QpRf5hLWDr/n2zN8kHBg4H6HfS/6+/OrkoIcZ0chpGjR48SERFBaWkpSUlJzJo1i4ULF7JlyxYJI9WwnT2I9dQuFI+W6NqPAG3Vl1i2/7SD9clF9tcXLI0J1pxhai8d7YZ/VlflCnHT2bjsC7489+vZwlM2P8I3LGfQAzK/iBA3I4dhxGQyodPpSEhI+H/27js+qjrf//jrzKQ3SAKhhFASIBB6LwkCGgSJQemwFlxRdLm7eEV/4q5ekXVtXHHv6trb2rAANkCUAArSVFoSEmpCC5BAQkgCpM7M74+s0WwIQ8uclPfz8fDxyPmeOfN9D5jwyTnfAsDs2bNZt24dBQUFNR6uLirZ9gEJS5ews6wDjY0kbgxbSOidH3GioJSPV6dwNLuADq2CuWlwR37esg0IqXR9qdWHjnF/MCe8SB2x9XDpedqKud6ELCJy5ZwWI+3atWPbtm1MmzaNli1b0qxZM7KysggJCXF2aYP03optfFk0peJ408E8/nfnKh5NcHA8p/wuSOrBbJZu3EsPSw7/WYy08DrnyrgimFBu0gAAIABJREFUdZKvrxecrtzm5+tjThgRuWJOi5ExY8YQFxdHYmIiTzzxBEeOHMEwDPr16+eKfLVa8c4v2fVjAgYGnQbEYjXKWHOu8kDTHHsjnli0i+O2VpXa7XYHHpZiOlv3s8vWHoBASx63X6M1EkSciQwsZe2xMkod5T/CPCxl3HjjDSanEpHL5bQY2blzJy+88AJt27ataEtLS6vRUHXBqcSv+cunhzhqLx9YGpp+kH5uyZQ6hlZ5bdFvdtT9hWE4+EP7fQQMvJu9yVvJyc2jT8y1+HYeWePZReqy4hP7WZJqYMPCwObn6BDelqHRfWgWFGB2NBG5TE6n9i5fvpyIiAhGjBjBokWLKCkpcUWuWm/J2lSO2ptVHB+1N+ewPRQMo9LrArwMnhx8gvbWQ5XaB7ttJ2js/+EeOZIuE/5Cq+vuUSEi4ozDznvvfUCmPZgw72Lm/HEak+KHqxARqeOc3hkZOnQo3377LatWrWLVqlU0a9aMadOmMXPmTNq0aeOKjLXS8SLvKm0lnsG88qdxfLf9EElpWQQFeDNhaGea+FzDo8kxfFs0mKP2EDpYD3FdwC4M/6dMSC5Sd+1f8x5fn+qIxXBw363XaTVikXrCaTEyfPhwNm3axP79+/nwww955513mD9/Pt7e3jz++OOuyFjrFOTlk3e2uEp7z66daNLIh4nDOjNxWOffnAmg0YhHuHn1PCgrxvBqhMeN/wDD6rrQInWVw47twDpsWbv4cO1xyhxdGNvVkw7twsxOJiJXyUVtlFdcXMyuXbtIS0vj5MmTzi+oxrZt20hISKg4Hj58OP3797/s93MVm93Bj7uOkptfSPNAb974+FuOloTS2DjDaUf5rrkDwn0ZG3ddte/h1uf3WLuMx5F/BEtgO3DXyH8Rpxw2vnt1Dgsz2nLa0YguVhjqtYPfTXzC7GQichU5LUY++eQTZs6cyalTpzAMgyFDhnD33Xczfvz4S+5s48aNbNq0idGjyzd88/KqOrCztimz2XnktZWkHskDwMCBAz9au53gsTuvw6dZ+UwYfx/ne8cYXgEYXlooTuRiHdq2iheO9KbMUX4XcWtZF3pa0/Dy0IbjIvWJ0+/oXbt24XA4mDFjBn/84x/p1q3bFXXYt29fZsyYcUXv4UpbU9IrChEABwYBxhn+d8Y1+IRFmZhMpP5LPZhTUYj8YldxGA6HA+M/BouLSN3ldPTX9OnTyczM5LXXXrviQgQgOTmZN998k+3bt1/xe7nCqYNJVdqK8cS7VQ8T0og0LIEtqg6Sb+RRqkJEpJ6pthhZtWoVP/74I2FhYXh4VH0EUVZWxrvvvktxcdWBnNVp06YN4eHhHD16lMmTJ/Piiy9eXmoXaut7DjfDVqmti3s6huEwKZFIw5GZsoEA49etJyyGg1tG9jYxkYjUBMPhcJz3X9V58+bx+OOP07dvX8aMGUNUVBQ+Pj5kZmby008/8fnnn5OVlUVBQQF+fn6X3PH+/fsZPnw4R44cAWD9+vVs2LChyuvmzJlDenr6Jb//1VBqs/P+Z6uILvyGz0tjyXU0oqt1D7d2ysMYdL8pmUTOJzw8vMbe26zvv2NJ37HgR2/KsHJtBy8CmzSlQ2gjWgRWnVYvYqaa/P5rKKodM/LAAw9gs9l46aWXeOyxx6qcHzRoEAsXLrysQgTA3d0dm+3XOw4xMTHExMRUes2zzz5b8bWr/7LT09P5ZvNeEk8HYnXrwXOtl+Dh5Ye13RDcBz8Kbld38G16eropn9GVfeoz1lyfNc3Vnyn5xzW8/rODMqzc3MnB9Gk31Wh/+n+zfvRZX7//GoJqixE/Pz/++te/8pe//IU1a9awY8cOzp49S2hoKEOHDqVLl0ufFfLoo4/i7++Pp6cnb7/9NjNnzryi8DVhT1oG+/ensedwJt+lgxfF3NrTIGD8d2ZHE6nXsjOP8q+PvyIt14q3LRcrjekWkMsdt91jdjQRqWFOZ9N4eXkxevToium4V2LcuHGsW7cOu93OSy+9xJAhQ674Pa+mhZ9+zkfbf13uPtSSxeQ2x+kw7m8mphJpGP72+pekFQb/+6gRgUY+9/8+DqtFg1VF6juXTtbv3bs3vXvXzsFnJcXFLNpRxG/H9B61N6PDdaO0UqpIDTuVdew3hUi5XEcAWUfSaNq8pUmpRMRVtLHDv+WdzKDMUfWPIyfriAlpRBoWbx8fDKqOpffx9TUhjYi4moqRf0tLO0iIJadSm69RSERkJ5MSiTQcy778kijr/kpt3X0zadepu0mJRMSVGuyaymdzj7Nr6ya8vb05mnOGlzeVEmnNpZH1DAdsrWhpPcHdQ5rgFxxqdlSReikn8yhePn58/dUXvJfihbulLVOa7+GMtTFBvlbGTp2OYWmwP6JEGpSL+k5fv349Tz/9NAcPHqRdu3b8+c9/Jjo6uqaz1Zj05B957OOd5Nn9gFLaWTJwN5rQtZUPt/1+Ova8DA7lltEuUr+ViVxtOZlHeOK1paQVBWMYDjpaj2G1tGFmX4gdW76MQHp6Om5el7dsgIjUPU6LkZSUFEaMGEFRUREAqamprF69mi1btlzW9N7a4P1lm8mzN684PmBvxc1N93HbvY8CYAmJwnFGc8dFasLbC78kragpAA6HwZ6ycCa3TCd27J9NTiYiZnE6ZmTlypW4u7vz5Zdfsn//ft566y1KSkpYuXKlK/LViKwizyptDp8mJiQRaXjST1ednVbk3tiEJCJSWzgtRtq0aUO3bt0YM2YMERER3HnnnTRp0oSIiAhX5KsREY3LqrR1DG9lQhKRhqelT2mVttCmjUxIIiK1hdNipEOHDhw8eJA5c+bw7rvvMn36dBo3bkxRURGLFi0iJSXFFTmvqrZBVsIsmQBYsRPf7gxDRtxociqRhqFfW28CjfyK4+5+WYyIH2diIhExm9MxI0uWLOHYsWPMnz+/UvvkyZMBmDt3bp0aO1KYn8sXez04bQ/i/mH+xFx7PR7uGrEv4gp2Wxlf7rJR6PDhlrB0+kYPo32PSYBWWRVpyJz+K9ynTx9mzJhxwfN1yZJPP+G0PZAO3jkMv34yhn4GirjMN18sJqMkkJZuuUy4637cPK7uhpMiUjc5LUbi4+OJj493RZYad/rEEb5K9wFg2qjuKkREXKik8Byfbj8L+HHL4CYqRESkgtNiZOvWrWzdurVKe58+fercXZGFn3xBoSOEfoE59Og/2ew4Ig3KkkWfkGPzI8LzJENG1r4du0XEPE6LkaVLlzJv3rwq7XPnzq1Txcjx9F0kHAvGYtiZdvNQs+OINCh5p7L5Ynf5ePk7YjtiWLQThYj8ymkxEhMTw5w5cwBwOBxs3ryZ1NRUYmJiajzc1ZCyOYFl65LJLSgiys1G0+Ag2nSsOwNuReqynOwTrF65iv3pB/EhiE5+ufSM0V1JEanMaTESGxtLbGxsxbHdbqdTp05Y6sBvNuk7f+R/vjpBqePX/WVu9T9pYiKRhuNk5lHu+2cCBTZvIAIDB+PDz5odS0RqIafFSHp6Ounp5UujOxwODh06RGZmJtu2bePaa6+t8YBXYsPmHZQ6Kq/suDkD9HuZSM1bnbCSAptPxbEDgx/SCtGKPiLyn5wWI++9916VMSOGYdC/f/8aC3W1GNaqH89q0RQaEVcoKiwGfCq1nSvV95+IVOW0GOnSpQsTJ06sOG7atClxcXFcc801NRrsaujXK4rP9+6nBI+Ktuu6NTMxkUjD0SsqnM8OnMLxmwXN+rdSMSIiVTktRiZOnFipGKlLVnz3EwEWD1pYcwkMDGRQzwhihl9vdiyRBmHn/iN0tR6nwOGDzeLBwFYOpt4+3exYIlILVVuMrF+/ng0bNlR7YXR0dK2eUZP84/esOdkMN2z89Y7hhIV3MjuSSINx9MBePtvjRanRnr/GNaFndKzzi0Skwaq2GFm1atV51xf5xdy5c2ttMVJWUsTLy3fhcAQxPrJYhYiIi7288FtKCOG6pifoGT3F7DgiUstVW4zExsbi7e0NwDvvvENoaCiDBw9m9+7drFu3rtJ039rmkw/eI6M0iJbup5n4u2lmxxFpUFZ99SlJZ0Lws5zj97dNMDuOiNQB1RYjMTExxMTEsG7dOp577jlSUlKwWq0ADBo0iIKCApeFvBjF587wzZdLOHg8h+OnCnEzfJk5ujMe2v9CxCVSN6/iwIF0vk/NBdpy5wA/GjVpYXYsEakDnA5g3bJlC3l5eaxdu5Zhw4axc+dO0tLSSE1N5YYbbnBFRqfstjL+Z8E77DoXApQvcNbLYx89Bt5ibjCRBuKlf/wf32S2ABphEMBgz2Ri458wO5aI1BFOi5Ho6GhsNhvXXXddRZvFYqlV40XSU7f/uxD51Y7S9pzJO4VfoyCTUok0DBn7d/67ECnnwODnks6UFRfh7uVtYjIRqSucruk+YMAAPvjgA6KiovD29iYqKooPPviAAQMGuCLfRSkuKqrS5nAYlBZXbReRqyv7ZNUtFkodbpzOyTIhjYjURU7vjABMmjSJxo0b4+bmRu/evcnLy6vpXJekfdfeBH++ixxHo4q2SO+TBIa0NDGVSMMQ3qk7XkuXU+TwrGgLccunScu2JqYSkbrE6Z0Ru91OXFwco0eP5vXXX+fnn38mIiKClJQUV+S7KKeyMvAwSuhgPUQb95Nc3yKbR+4dZ3YskYbBVkKYcZwg4zQAbb1yeXhKPwwttioiF8npnZEVK1aQkJBAz549ARg1ahQtWrRg48aNdOnSpcYDXow3P/mW4/ZmDA85yez7/2h2HJEG5Z33P2WfvS3dA3J466GJuFlr/47eIlK7OP2pkZqaSo8ePRg/fnxFW6tWrcjOzq7RYBdrx4bV/HS6GV5GCdOmjDE7jkiDsm/HBlafKF/p+A+TYlWIiMhlcfqTIzg4mIyMjIp1RTZv3kxycjItWpi/foDdVsabK/cAMKFTKcEtWpucSKThcNjtvPLVdhwYjIk4S6uIjmZHEpE6ymkxMnLkSM6dO8f8+fP57LPPGDRoEFarlZEjR7oi3wUtW7yQQyXBNHPLY+zkqWbHEWlQEr78iH2FTWlsPcvkKZPNjiMidZjTMSOhoaEsWbKE+++/n/3799OpUyf+/ve/m3ZnpKy0mGWLP2bHwVyKzp6hiRHMnUPD8PDUegYiNa2suJCliz4g8XABpecKaG4Ec0tMa3z8AsyOJiJ12EVN7Y2NjWXBggW1Ymrvm2+8xfIjwUB5MRRgnKFLz76m5RFpSN58802WZ4QA5cVHgHGGnr31/SciV8ZpMfLL1N5vv/2WCRMmMH36dG644QZ27tzpstk0ERERFzy/8GmXxBCpldLS0mr0/fX9J1K9mv7+ayicjhm50NReERERkSvl9M7IL1N7x40bR2JiIuD6qb1paWmEh4cD8NrLL7PsSHDFucbWM/zz/htpFNzsqvaZnp5e0acruLo/M/rUZ6y5PmvSb7//Xn/lNZYeblxxrrH1LP+cHU+joKZXtc+G8vemz1i3+/ulT7lydW5q7/S7p3NXjxL6NT7BqJbZzL9ryFUvRETk/O68ezp39YF+QTmMCstj/j3Dr3ohIiINj9M7IyNHjmTWrFnMnz8fi8XC4sWL8fX1NW1qr5u7JzdNuY2bTOldpGFzc3PjpgmT9f0nIleV0zsjv0zt7dy5M1arlaioKD777LNaseiZiIiI1H0XNbV35MiRpKamXpUO9+7dyzfffENkZGStWDhNREREzFXtnRG73U5ubi5FRUUAZGRk8Je//IVHHnmEPXv2XFZnu3fvJi4uDnd3dxYsWMDzzz9/ealFRESk3qi2GNm0aRNBQUF8/fXXOBwO4uLiePrpp3nqqacYMGAAOTk5l9zZyy+/zKxZs/jDH/7AwoULWbBgATab7Yo+gIiIiNRt1RYjycnJAFx77bVs376dpKQkunfvzqxZs8jLy2PZsmWX3FlSUhJ9+5av1tikSRN8fX3JzMy8zOgiIiJSH1RbjJw6dQo3Nzf8/f3ZsGEDAH/+8595+umnsVgsHDt27JI7y83Nxd/fv+I4ICDgsu6wiIiISP1R7QDW4OBgysrKWLhwIQsXLsRisTB8+HCKi4ux2+00atTokjsLDAwkPz+/4jg/P5/g4PIFzNavX19R9PwiLCys4mszFpZxdZ/6jPWjz/q4CJL+3upHn/qMUltVW4yMHj0aT09Pbr/9dgBGjBhBs2bNKh7PREVFXXJn3bt3Z8uWLQwePJjs7GzOnj1L8+bNAYiJiSEmJua817l6RT0R+ZW+/0SkplVbjISFhZGQkMDbb7+Nr68vjzzyCACHDh1i8uTJDB48+JI7u/feexkzZgwWi4UvvviC+++/H6vVevnpRUREpM4zHA6Hw5Ud7tmzh2+//ZaOHTsyatQoV3YtIiIitZDLixERERGR33K6HLyIiIhITVIxIiIiIqZSMSIiIiKmUjEiIiIiplIxIiIiIqZSMSIiIiKmUjEiIiIiplIxIiIiIqZSMSIiIiKmUjEiIiIiplIxIiIiIqZSMSIiIiKmUjEiIiIiplIxIiIiIqZSMSIiIiKmUjEiIiIiplIxIiIiIqZSMSIA3HrrrTRt2pRu3bpVtB05coTY2FhatWpFREQE//znPyvObd68mV69etG5c2eeeuopp+0iIiLVUTEiANx11118/fXXVdofe+wxMjIy2LRpE8888wypqanY7XZuueUW3nvvPZKSkvjyyy/ZsGFDte0iIiIX4mZ2AKkdhg0bxv79+yu1hYWFERYWBkBISAidOnXi2LFjFBUVERQUVHEX5ZZbbuHzzz/H29v7vO3R0dGu/TAiIlKn6M6IXJTU1FTS09MZOHAgx44dIzQ0tOJcWFgYR48erbZdRETkQlSMiFO5ublMnTqVl19+GT8/P7PjiIhIPaNiRC6osLCQm2++mfvuu49Ro0YB0LJlSzIyMipec/jwYUJDQ6ttFxERuRAVI1KtsrIypkyZwqhRo7jzzjsr2nv27MmpU6dISkqitLSUDz/8kJtvvrnadhERkQsxHA6Hw+wQYr7JkyezadMmsrKyaNWqFY8++iht2rQhNjaWdu3aVbzu+eef56abbmLTpk3ce++9FBYWcvvtt/Poo48CVNsuIiJSHRUjIiIiYio9phERERFTqRgRERERU6kYEREREVOpGBERERFTqRgRERERU6kYEREREVPVyEZ52dnZLFu2jJycHAYMGEBMTEzFub179/LNN98QGRnJyJEja6J7ERERqUNq5M7IfffdR1JSEp6entxzzz28+uqrAOzevZu4uDjc3d1ZsGABzz//fE10LyIiInVIjSx6ZrfbsVjK65y1a9fyyCOPsH79embNmkWHDh3405/+RHZ2Nj169ODw4cNYrdarHUFERETqCKePac6cOcPKlSvZsWMHZ8+eJTQ0lGuuuYa+fftWe80vhQjAwYMHKzZLS0pKYurUqQA0adIEX19fMjMztZmaiIhIA1ZtMZKfn8+TTz7Jq6++Sn5+fpXzvXr14qmnnqrYyfV8srKymDdvHl999RVQvhW9v79/xfmAgABycnJUjIiIiDRg1RYjzz//PPPnz2fgwIHcdNNNREVF4e3tzfHjx/npp5/46KOPuOGGGygoKMDPz6/K9WfOnCE+Pp5nnnmGrl27AhAYGFipsMnPzyc4OBiA9evXs2HDhkrvERYWxu9+9zvS09OvyocVqa/Cw8PNjiAictmqLUauueYatmzZQp8+faqcu/3225k/fz4LFy7E3d29yvmSkhLGjx/PbbfdxqRJkyrau3fvzpYtWxg8eDDZ2dmcPXuW5s2bAxATE1Np1g3As88+W/G1q3/Ypqenu7RPV/dnRp/6jDXXp4hIXVZtMXLttdde8EIfHx/uuuuu856bNWsWmZmZeHp68vrrrxMQEMCUKVO49957GTNmDBaLhS+++IL7779fg1dFREQauMtaZ+TDDz+kU6dO571rAtCzZ08aN25c8RvbL49ioqKiWL58Od9++y0PPvjgBcebiIiISMNwWcXIww8/zPTp06stRu69995qr42MjCQyMvJyuhUREZF6qNpiZOnSpSxbtuy853Jz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"
},
"metadata": {},
"execution_count": 8
}
],
"cell_type": "code",
"source": [
"df_wrt_nthreads1 = let\n",
" df1 = select(df, [:n, :version, :nthreads, :time_ns])\n",
" df2 = combine(groupby(df1, [:n])) do g\n",
" t1 = only(g[(g.nthreads.==1).&(g.version.==:baseline), :]).time_ns\n",
" (; g.nthreads, g.version, speedup = t1 ./ g.time_ns)\n",
" end\n",
"end\n",
"\n",
"plt_wrt_nthreads1 = @vlplot(\n",
" facet = {field = :n, type = :ordinal, title = \"size(A, 1)\"},\n",
" columns = 2,\n",
" spec = {\n",
" layer = [\n",
" {\n",
" mark = {type = :line, point = true},\n",
" x = :nthreads,\n",
" y = {:speedup, title = \"Seedup (vs baseline nthreads=1)\"},\n",
" color = :version,\n",
" },\n",
" {mark = {type = :rule}, encoding = {y = {datum = 1}}},\n",
" ],\n",
" },\n",
" data = df_wrt_nthreads1,\n",
")\n",
"saveresult(; plt_wrt_nthreads1)\n",
"plt_wrt_nthreads1\n",
"plt_wrt_nthreads1 |> DisplayAs.PNG"
],
"metadata": {},
"execution_count": 8
},
{
"cell_type": "markdown",
"source": [
"---\n",
"\n",
"*This notebook was generated using [Literate.jl](https://github.com/fredrikekre/Literate.jl).*"
],
"metadata": {}
}
],
"nbformat_minor": 3,
"metadata": {
"language_info": {
"file_extension": ".jl",
"mimetype": "application/julia",
"name": "julia",
"version": "1.6.0"
},
"kernelspec": {
"name": "julia-1.6",
"display_name": "Julia 1.6.0",
"language": "julia"
}
},
"nbformat": 4
}
Display the source blob
Display the rendered blob
Raw
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Display the source blob
Display the rendered blob
Raw
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Display the source blob
Display the rendered blob
Raw
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Display the source blob
Display the rendered blob
Raw
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Display the source blob
Display the rendered blob
Raw
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment