{
"cells": [
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# Egypt serving malware"
]
},
{
"cell_type": "code",
"execution_count": 1,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"import pandas as pd\n",
"import numpy as np\n",
"import functools\n",
"from matplotlib import pylab as plt"
]
},
{
"cell_type": "code",
"execution_count": 2,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"%matplotlib inline"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Data massage"
]
},
{
"cell_type": "code",
"execution_count": 3,
"metadata": {
"collapsed": false
},
"outputs": [],
"source": [
"!tshark -2 -r mads-141.0.174.38.pcap -Tfields \\\n",
" -eframe.time_epoch \\\n",
" -eip.id -e ip.ttl -e ip.dst \\\n",
" -etcp.srcport -etcp.dstport -etcp.len -etcp.stream -etcp.seq -etcp.ack -etcp.flags.str -etcp.window_size \\\n",
" -etcp.options.timestamp.tsval -etcp.options.timestamp.tsecr \\\n",
" -etcp.analysis.initial_rtt -etcp.analysis.ack_rtt \\\n",
" -ehttp.host -ehttp.response.code -ehttp.user_agent -ehttp.location \\\n",
" > mads-141.0.174.38.txt"
]
},
{
"cell_type": "code",
"execution_count": 4,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"data = pd.read_csv('./mads-141.0.174.38.txt', delimiter='\\t',\n",
" names=\n",
" ('time_epoch id ttl dst srcport dstport len stream seq ack flags window_size '\n",
" 'tsval tsecr initial_rtt ack_rtt host code user_agent location').split())"
]
},
{
"cell_type": "code",
"execution_count": 5,
"metadata": {
"collapsed": false
},
"outputs": [],
"source": [
"data['intid'] = data.id.apply(functools.partial(int, base=16))\n",
"data.time_epoch -= data.time_epoch.min()"
]
},
{
"cell_type": "code",
"execution_count": 6,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"text/html": [
"
\n",
"
\n",
" \n",
" \n",
" | \n",
" 2072 | \n",
"
\n",
" \n",
" \n",
" \n",
" time_epoch | \n",
" 2351.17 | \n",
"
\n",
" \n",
" id | \n",
" 0x00006818 | \n",
"
\n",
" \n",
" ttl | \n",
" 64 | \n",
"
\n",
" \n",
" dst | \n",
" 141.0.174.38 | \n",
"
\n",
" \n",
" srcport | \n",
" 37546 | \n",
"
\n",
" \n",
" dstport | \n",
" 80 | \n",
"
\n",
" \n",
" len | \n",
" 0 | \n",
"
\n",
" \n",
" stream | \n",
" 211 | \n",
"
\n",
" \n",
" seq | \n",
" 126 | \n",
"
\n",
" \n",
" ack | \n",
" 414 | \n",
"
\n",
" \n",
" flags | \n",
" *******A**** | \n",
"
\n",
" \n",
" window_size | \n",
" 30336 | \n",
"
\n",
" \n",
" tsval | \n",
" 945408 | \n",
"
\n",
" \n",
" tsecr | \n",
" 3.10169e+09 | \n",
"
\n",
" \n",
" initial_rtt | \n",
" 0.091312 | \n",
"
\n",
" \n",
" ack_rtt | \n",
" 2.5e-05 | \n",
"
\n",
" \n",
" host | \n",
" NaN | \n",
"
\n",
" \n",
" code | \n",
" NaN | \n",
"
\n",
" \n",
" user_agent | \n",
" NaN | \n",
"
\n",
" \n",
" location | \n",
" NaN | \n",
"
\n",
" \n",
" intid | \n",
" 26648 | \n",
"
\n",
" \n",
"
\n",
"
"
],
"text/plain": [
" 2072\n",
"time_epoch 2351.17\n",
"id 0x00006818\n",
"ttl 64\n",
"dst 141.0.174.38\n",
"srcport 37546\n",
"dstport 80\n",
"len 0\n",
"stream 211\n",
"seq 126\n",
"ack 414\n",
"flags *******A****\n",
"window_size 30336\n",
"tsval 945408\n",
"tsecr 3.10169e+09\n",
"initial_rtt 0.091312\n",
"ack_rtt 2.5e-05\n",
"host NaN\n",
"code NaN\n",
"user_agent NaN\n",
"location NaN\n",
"intid 26648"
]
},
"execution_count": 6,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"data.sample(1).T"
]
},
{
"cell_type": "code",
"execution_count": 7,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"text/plain": [
"494"
]
},
"execution_count": 7,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"len(data.stream.unique())"
]
},
{
"cell_type": "code",
"execution_count": 8,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"text/plain": [
"xnxx.com 493\n",
"www.xnxx.com 1\n",
"Name: host, dtype: int64"
]
},
"execution_count": 8,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"data.host.value_counts()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"`www.xnxx.com` stream is not really interesting as it's just a single webpage that occasionally hit the dataset."
]
},
{
"cell_type": "code",
"execution_count": 9,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"text/plain": [
"http://www.xnxx.com/ 477\n",
"http://marketing-sv.com/mads.html 6\n",
"Name: location, dtype: int64"
]
},
"execution_count": 9,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"data.location.value_counts()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"There are three different sorts of streams in the dataset. \n",
"*Good* streams get correct redirect, *bad* streams get injection, *ugly* streams get no redirect at all."
]
},
{
"cell_type": "code",
"execution_count": 10,
"metadata": {
"collapsed": false
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Bad: [117, 268, 274, 278, 287, 294]\n",
"Ugly: [110, 116, 121, 269, 279, 281, 282, 291, 292, 296]\n"
]
}
],
"source": [
"s_good = set(data[data.location == 'http://www.xnxx.com/'].stream)\n",
"s_bad = set(data[data.location == 'http://marketing-sv.com/mads.html'].stream)\n",
"s_ugly = set(data[data.host == 'xnxx.com'].stream) - set(data[~data.location.isnull()].stream)\n",
"print 'Bad:', sorted(s_bad)\n",
"print 'Ugly:', sorted(s_ugly)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## RTT to HTTP response for *good* & *bad* streams"
]
},
{
"cell_type": "code",
"execution_count": 11,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"image/png": "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\nrkJggg==\n",
"text/plain": [
""
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"data[(data.stream.isin(s_good)) & (~data.code.isnull())].ack_rtt.hist(color='green', normed=True)\n",
"data[(data.stream.isin(s_bad)) & (~data.code.isnull())].ack_rtt.hist(color='red', normed=True)\n",
"plt.xlabel('RTT, s'); plt.ylabel('Density');"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"There are not so much streams outside of 250ms range, so let's look at high-res histograms at that range."
]
},
{
"cell_type": "code",
"execution_count": 12,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"image/png": "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\nTh9LOmIAAAAASUVORK5CYII=\n",
"text/plain": [
""
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"data[(data.stream.isin(s_good)) & (~data.code.isnull())].ack_rtt.hist(bins=np.linspace(0, 0.25, 25), color='green')\n",
"plt.xlabel('RTT, s'); plt.ylabel('Count');"
]
},
{
"cell_type": "code",
"execution_count": 13,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"image/png": "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\n",
"text/plain": [
""
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"data[(data.stream.isin(s_bad)) & (~data.code.isnull())].ack_rtt.hist(bins=np.linspace(0, 0.25, 25), color='red')\n",
"plt.xlabel('RTT, s'); plt.ylabel('Count');"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"We have only six samples of injected redirects, but five of these samples have significantly lower RTT than the usual RTT of http response. The ~45ms RTT corresponds well to the latency of last-mile ADSL link that was used during this analysis, so it is close to latency to get a packet from ISP's network."
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Let the good streams roll"
]
},
{
"cell_type": "code",
"execution_count": 14,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"text/plain": [
"(0, 21)"
]
},
"execution_count": 14,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"d_good = data[data.stream.isin(s_good) & (data.srcport == 80)]\n",
"d_good[d_good.tsval.isnull()].shape"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"So, good data from server **always** has TCP timestamp, there are no rows in the slice."
]
},
{
"cell_type": "code",
"execution_count": 15,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"text/plain": [
"54 1447\n",
"Name: ttl, dtype: int64"
]
},
"execution_count": 15,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"d_good.ttl.value_counts()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"So, good data from server **always** has `TTL=54`.\n",
"\n",
"Let's look at [IP fragment ID](https://en.wikipedia.org/wiki/IPv4#Identification) field:"
]
},
{
"cell_type": "code",
"execution_count": 16,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"image/png": "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\n6KGH2HPPPdlqq61YuHAhf/rTn/j0pz/Nzjvv3Cvt/ctf/sI999zDYYcdRmNj47rllf2y7bbb8sIL\nL2y0f8r7rbW1lfnz57PXXnvR0FD75MCf//xnfvKTn3Dbbbex3Xbb8eEPf5gf//jH7LPPPowYMYLF\nixdz4YUXMmLEiHbbevfdd/PCCy+wdu1aFi5cyJw5czjrrLO49tprWbRoEcceeywLFy7krLPO4sAD\nD6zbHiiOzezZs7n++utpamrim9/8JqtXr163zVtvvTULFixgr732Atjoe7J27dp1211rfa36Kunb\n2tpq7rNa+z0iuvQdLR+bSt5tt92WlStXIontttuO5cuX88wzz3Dvvfdy5plnMnTo0HbLXL58Oaee\neiq7774773jHO1i0aBGf/vSn+eUvf8njjz9OQ0MD++67L/fccw9XXHEFW2yxRbvte/rpp7nuuuuI\nCLbaaivGjRvHPvvsw9VXX82qVavYcsstGTZsGBHB8ccfz/7779/usawuf9myZSxdupQHH3yQkSNH\nsnjxYtauXcukSZP42c9+xvjx45kwYQJTpkxhv/3263TZA15E1PwAq4FVNT6rgVX18nXlA3wEuKw0\n/0ng4qo0PwcOKc3fSTGMvG5e4OWqMl6qU38MRq2trXH44cdEU9PIOPzwY6K1tbVXy1+zZk0MH75d\nQEPAsIAtAkYEDA0YEjA8LR8SMDLNj0jTQ0vTw9P8lukzNA499AM9bu+bb74ZjY1jA4ZGY+PYePPN\nNyNi/X5pbBwRY8ZM2Gj/lPfbe95zdIwZMyFgaIwZMyHWrFmzUT1vvPFGQGNAU9oHlf0xPC0blbZv\nVLz44ot121qkG5HyKpXVFEAqqzEtK8obNWp8zfZUjs2wYdumfT9q3b+VbW5oGL5u34wePT4OO2zK\nBvthzZo167a71vpa9VXSjxq1U4wevfE+q7XfDztsShx+ePtll5WPTSVvY+OIGD16/LrvzqhRO6V9\nuH6/r169um6Zy5YtS/tnRPp3y5S/KX1GpGO6vrwVK1bUbd/kyUeVjv+IVN6Q9Bma1g3d4FiOHl3/\nWFaX/573HF0qu1LWyNTGIaX/i10ruy+k384ex4DKp9cK6lbl3QtEd3UjEL1Yp/6YNm3aus+sWbN6\ncmz6zfLly6OpaWTAq9HUNDKWL1/eq+XPnTs3/UhWPk3pP0NlXqXpxjTfkKYpTVfSVQLWq9HQMLzH\n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\n8XckdEaCojwAAAAASUVORK5CYII=\n",
"text/plain": [
""
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"dsa = d_good[d_good.flags == '*******A**S*']\n",
"plt.scatter(dsa.time_epoch, dsa.intid, marker='.')\n",
"plt.xlabel('Time since 1st packet, s'); plt.ylabel('IP ID')\n",
"plt.title('IP ID for SYN-ACK packets from server');"
]
},
{
"cell_type": "code",
"execution_count": 17,
"metadata": {
"collapsed": false
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Min/Max IP ID observed for non-SYN-ACK packets: 79 65340\n"
]
},
{
"data": {
"image/png": "iVBORw0KGgoAAAANSUhEUgAAA44AAADhCAYAAACHveuGAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAIABJREFUeJzsvXt4XFd56P17R4p80cW2LMsiN+dqHNWR7aQJcJI4CrRw\nIMSEJoTQnpIQetoD9AO+9hwIPe1J+rXl1p427Wnh9JSUJhwgpAk0DrhJoLHiJIaQGl9khLAdSMhN\nlm1Fsi625NG83x9rb2lrNDOay56ZPTPv73n2o5k9a+/9rrXX1trvWu9FVBXDMAzDMAzDMAzDSEes\n3AIYhmEYhmEYhmEY0cYUR8MwDMMwDMMwDCMjpjgahmEYhmEYhmEYGTHF0TAMwzAMwzAMw8iIKY6G\nYRiGYRiGYRhGRkxxNAzDMAzDMAzDMDJiiqNRdkSkXUR2iMiIiPx5ueUxio+I3CEiXynDdd8tIr8Q\nkeMisqHU1zcMw8gFGx9rDxsfjShjiqMBgIj8XETe7H2+RUTi3j+PYRH5kYhcm+a4W0TkycD350Vk\nwhvkhkTkKRH5HRGRDJf/bWBQVZep6n8Lt2bFRUSWicjdIvKqV+d+EfmE99sTIvI/ksq/X0QOishi\nEfknEUmIyC8Hfj9fRBJZXLfbO3Zee4nIaSJyp4gcEJFREfmZiHxJRM72ft8uIrclnWtIRG4qpC3y\nIOcksiKyxqt3vv+7/hz4sKq2qOrePM9hGEYNYeNjftj4WBA2PhqRxBRHIx07vX8ey4F/BO4XkWVp\nymrS52tVdRmwBvgs8Eng7gzXWgP05SOkiNTlc1yI/BXQCLzeq/MW4JD3228BHxeRiwBEZBXwF8AH\nVfUkrq2OAX+adM5sBoz3e8e+P8VvDwLvBG4GlgEbgH8H3pJcUETeCnwLuEVV78/iuuVGcO2T6UUr\nE2n7WgT6UlaELecCL62GYczHxsfssPGxtNj4aONj8VFV22wD+DnwZu/zLcCOwG9LgQRwSYrjksvO\nnCew7zJgGuhMcfyXgSlgEjgOvBloAO4CXgZewg0+p3nlrwZeBD4BvArck0amJ3GzZ0PAc8B/DPz+\nOuAh3MByAPitwG93AN8A7vHk6U1V70D5XmBLht//K7AT94/868DfJdX9L4BXgKu8fecD0wvcq6We\nbDcBJ4PyAb8CjAOnZzh+O3AbbvB8DXhbhrJrvHv/n7378TLw+0n3dqd3npeB/wXUB37/JeAxr61f\nBW4PtPO93ud64GvAP3ufBbgd94JxBLgPWO6VfcHrS6NeG7zBa7MeYBgYBL6eoh4N3jHTwBhwMNBf\nPwHsBU7gJtMu8troNe/+Xpd0z/4O2Oad70lgNa6PDuEG3Q0Z2vOvgMPAiHfNzoB8f+HV71XgC8Ci\ndH3eu847Auet8+q+0fv+RuBprw67gauT7v+fAk95feW8cv//sc22KG/Y+Oj/ZuPj3LI2Ptr4WHOb\nrTgaGRGRetw/xVHgYD7nUNVncQPcVSl++wDwVeBz6mZwHwf+ELgc6MLNBl7u7fPpAJYDZ+PMeFJx\nOfATYCVugAzO6H4D+IV3nvcAnxaR7sDv1+H+US8DHsb9I0zHD7zjbxWRC1L8/pe4f/QPAG/C/XML\nMgF82tuy5Qbc/fhn3KBzS+C3twA/VNVXFjjHFuBe4NdU9dEsrtmNG4DeBnzSN9vCDTQfB1px9Xsz\n8GEAEWkCvosbRF4HXAD8W/CkIrIY+BfcoHSTqsaBj3ryXQWcjvvn/gXvkM3e3xavvzwD/AnwqLrZ\n/zNxg/McVHVKVZtx9+JiVb0w8PPNwNtxfSoGbAUeAVZ5snxVRILl3wP8Aa5vTQHfx81Yr8TNZv9V\nqgb0Zq+vBC5QN/t+E+6FAeBzXvt0eX/PAIJmXMl9/mvArwd+/4/AEVXdIyJnAN8G/j9VXYF7OXtQ\nRFYGyv8n3Ix/M24wNgwjR2x8tPHRoxsbH31sfKx2yq252haNjfkzqqdwM0SDuBmza9Ict+CMqrf/\n+8Cn0pzjy7iH2P9+iMAsH/BW4Gfe56txs4inZajLLcCBwPcluFnBdtw/zlPA0sDvnwb+0ft8B/BY\n4LeLgPEM11qEm/17FjcrfIDA7K1XptO7/jtT1Rs3m/YCbtDJZkb1u8D/9D7fjJuhq/O+/x/gawsc\nvx03+/gDvFm7DGX9GdULA/s+B/xDmvIfAx4MyLYrTbk7cLPaPcBfJf3WF+xvuEF1CjdonYMbjGOB\n3+8B/jdwRhb9PEFgBtHrr7cEvl8JvJJ0zNeA/xG4Z38f+O13gR8Hvq8HhtJc+xqgHzcLLEm/jQHn\nBr6/KVOf9/rJcWCx9/3/An/off4ESSsNuIH+NwP3/86F2so222xzGzY+2viYuqyNjzY+1txmK45G\nOr6vqq2q2q6q/0FVtxd4vjNwA202nI6b8fR5wdvnc0RVTy1wjgH/g6qe8D42eecZUtWJpPOfkepY\n3IznYhGJicive870x0XkO965J1X1s6p6GW5G7Z+BfxaR5YHr+z4DKX0HVHUKNyv4J8H9InJl4Hq9\n3r6zcP9gv+YV24ob+P3gDMdwA8lC/BFuIH9IRE5boKziZsR9Zu6HiFwoIg97wQ+GgT8D2rxyZ+HM\noNLxRuBi3EAbZA3wLS8ggW/ecgpn8qIpzvPfcIPmD0WkV0Q+sEB9kgnW7XSc2UuQ5P5xOPD5RIrv\nTaku4j1Df4uboT8sIv9bRJo8356lwK5Anf8V15985vR5VX0O1y7XicgS3Az0V72f1wA3+ecSkdeA\nK3Czsj7JdTQMI3tsfHTY+Gjjo42PNYYpjkbREZHLcP9wnsrykJdxD7fPGpyfg0+qf47Z8grQKiKN\ngX1ne9fMiKp+TVWb1ZmAzIuip6pjuNnZRuDcHOX6Ms7U4tcC53sqcL2Lvd2/iTMneVhEXsUNPIuY\nNcf5HnC5iARfJFIxDrwDZ270wAIO5YIb5HzOZvZ+fBFn8nS+OlOY/86sY/6LuJm/dDwKfAZ4XETa\nA/t/AbzdezFrVdUVqtqoqq+S4t6r6qCq/raqngH8F+ALInJehuvOO0Xg8yvMrStk2T+yupDq36rq\nL+Nm2V+PG9SP4l7AfilQ5+XqzHVSyehzH84c5124Wd2fe/tfxPnHBNuvWVWDofwLeYYMwwgJGx+z\nwsbHWWx8tPGxrJjiaBQNEWkWkXfinN6/oqo/zvLQ+4A/FJE2EWnDzf6FktNIVV/CmRZ9RkQWiUgX\n8MEFzp82qpaI/KGI/LK4EN+LcP4MrwE/zVGuaeBOXIS9TLzfK7cR59+yAbgRuFZEVqjqv+FMdb4l\nIpeISJ03a/c7InJr0jXHcbb/pwNfl8whvP9IRJaIyC8BH8DdI3A+AMdVdUJE1gEfChzzbaBDRD4q\nIg2eHJcnyfAXuNnhfwv4GPw9zi/GD4++SkS2eL8dwZnTzAy4InKj57cAzsQo4W358AwwISKfEJF6\nz7fH78PZkrK/eP3kcs8v6gTOvCahqgr8A3CXN7uKiJzh+Xxk4j6cmdqHmJ1hB2eWc52IvNVbCVgs\nIldn8bJkGEaJsPExJ7lsfLTx0cbHiGCKo+ET5gzLwyIygpsZ+xQuGtZtGconX/tPcc7U+3CRtf4d\nZ+JRCMFrvA834/kKzln7jxYwNcrUNoqbDT2Cm3V7Cy6a10SKcgud9+u4qGAprycib8DN7n3Bm0X0\nt4dxgRne5xW9Eedw/w3cQNELXIqbbZ1zXVUdwf1zvRDnC5GOJ3C+Nd8FPu8NwOAcy39DRI7jBjR/\nwPRnmH8VZyYygPNv6Z7XCKp/igsA8F1xJkx/jfPveMzrRztxwRx8s6o/A572zEwux0Wue8aT4V+A\nj6rq82nqkdy2c7575i7X4Wabj+JMZ35TVQ+mKp/lNXxacAPgEM535CguMAW4F6JDwA88k6bHgLUZ\nL6I6gPONeiPuXvv7X8LNsv4Brl++gLtP/v97m001jNyw8TF7+ZJ/s/HRxsdM1/Cx8bFCEKfMl+ni\nImtxN1RxsxDnMTt79g2cCcbzuGhSI94xn8L9k40DH1PVx7z9lwD/BCwGtqnqx739DbjoWJfiOuJ7\nVTXoH2AYRhpEZA3wM5zjeb6zlIZhRAAReR4X6j4BnFLVy0VkBWnGW8Mw0mPjo1GLlHXFUVUPqOom\nVb0Ep9iN45Kt3g58T1VfDzyOm5VDRDpxIXovwoUH/oLITHLOL+ISx64F1orI27z9H8Q5e1+Iy330\n+dLUzjCqBkuAaxjVQQLo9sZd3ywu5XhrGEZW2Pho1BRRMlX9FeA5VX0Rt4zsmwXcA1zvfd4C3Keq\ncW+p/SDO0bkDaFaXDwncCqN/TPBcD+BMJQzDyB4z3TCM6kCYP+6nG28Nw1gYGx+NmiJKiuN7mXVg\nXa2qh2HGTtmPKHUGc8PkvuztO4O5IYNfYjY88MwxnoP1sIi0FqMChlFtqOoLqlpnZjiGURUozlfq\nWRH5LW9fuvHWMIwM2Pho1CL15RYAQFyenC3MRszK6KBb6OXSyGCzRoZhGDWEqtaamdkVqvqqF53w\nMRH5KVmOtzZGGoZh1A7pxseorDi+Hdilqke974dFZDWAZ4Y66O1/mbk5ZM709qXbP+cYcbl4WlQ1\nZaJdVa3K7Y477ii7DFYvq5vVqzK3aq1bLaIu1xuqegQXYfFy0o+3qY6v+q1a+7vVs7o3q2d1beWu\nZyaioji+j7l5YLYCt3qfb8GFHvb33+zlvDkXuAD4oTrzmhEvB4zgcvkEj/GTv74H5/xvGIZhGDWD\niCwVkSbvcyMuzUAv6cdbwzAMw5hD2U1VRWQpLjDObwd2fw64X0Ruw+VYuQlAVftE5H6gDzgFfFhn\nVeOPMDcdxyPe/ruBr4jIQeAYcHNxa2QYhmEYkWM1LvG54sb+r6rqYyLy76QYb2uV559/vtwilASr\nZ3Vh9awuolzPsiuO6hLBrkraN4RTJlOV/wzwmRT7dwEXp9g/SY0PhN3d3eUWoShUa72geutm9ao8\nqrlutYSq/hzYmGJ/2vG2Ftm4cV4TVSVWz+rC6lldRLmespAta60gImptYRiGURuICFp7wXHyxsZI\nwzCM2iDT+BgVH0fDMAzDMAzDMAwjopjiaBiGYRiGAfT09JRbhJJg9awuwqhnR8c5iEjWW0fHOQVf\nM1fsfpYfUxyNyBGPx9m/fz+JhOXUNYywsefLMAzDSObw4RdwaVyz21x5o9YwH0cP89+IBvF4nLa2\ncxkZGWTZsnaOHv059fVlj+FU0cTjcfr7++ns7CQWs7miKFPse2XP1yzm45gbNkYaRnXjstnl8ozL\ngjn/jMrEfByNiqG/v5+RkUFgiJGRQfr7+8stUskIrgSFtSrkKwoXX3wpra1riMfjBctmhE88HmfP\nnj2h3KtM1PLzZRiGYRhGYZjiaIROIUpGZ2cny5a1A60sW9ZOZ2dn+AJGkKCC19JyBitWnB2KAhGG\nohCW8mmkxm/fTZsuC9yrAbZu3Rq6ol6rz5dhZEuUfYvCxOpZXVg9q4so19MURyNUClUyYrEYR4/+\nnN7eXQwNvVAzppWzCt4g4+PHGRs7RhirQmEoCrZKFS7JEyvB9oVFwHJgKTfc8L7QFfVafb4MwzAM\nwygc83H0MP+NcNi/fz8XX3wp7iW4ld7eXaxfv77cYkWeRCJBa+saRkYGvD2rgSM0Na1kZOSlBV/w\nM/nGFeo3Nyub84szhSN/UvkYxmKxmfZtbm7jy1/+G2688deBQaCNvXt30dXVlff1zL81NebjmBs2\nRhpGdWM+joZPpvHRFEcPGxTDYWpqikWLVgEngcVMTh6hoaGh3GJVBPF4nL6+Pq666h0cP36YxsZW\nhodfXjB4STEDnkxNTbFz507e9KY3cfDgQVNACiTdxEpQwQNYvvwsRkdHgcm87qm/qtndfZ0FwkmD\nKY65YWOkYVQ3pjgaPhYcxygZBw4cACaAJ4EJ77uRjqDZYn19PZ2dnUxPTwMJsn08i2VKOjU1xdKl\nHVxzzdtobHwda9euNaWxQDo7O2lpmW86XF9fz/r164nFYsRiMXbs+A4wST73NLXP5CD79+8vWYAj\nC6ZkVCpR9i0KE6tndWH1rC6iXE97CzRCxfnUdQBXsWxZhwXfyMDJkyfnBcHZs2cP4+PjQD3j4+Ps\n379/wfMUK+DJzp07mZ4eB4aYnh5nx44dpgwUSCKRQDUBJEgkEmnbsqurK+97mspncsmSFq6++rqS\nBDiyYEqGYRiGUZ2U3VRVRJYBXwLW45ZZbgMOAN8A1gDPAzep6ohX/lNemTjwMVV9zNt/CfBPwGJg\nm6p+3NvfANwLXAocBd6rqr9IIYeZ4YTEyZMn2bZtG1u2bElrGlfrvlfxeJzly89gfHwY32xx9+5n\nuOKKX2Vi4vjMvr17n83Kv60Y7Tk9Pc2iRas85XERTU1NjI0dM7PHAsjFBzjfexr0SW1sbEVEGBs7\ngpsnLK7vcTweZ+vWrdxww/uKfq1CMVPV3LAx0vDp6Dgnp+Tvq1evYWDg+eIJZISCmaoaPpH2cRSR\nfwKeUNUvi0g90Aj8AXBMVT8vIp8EVqjq7SLSCXwVuAw4E/gecKGqqog8A/yuqj4rItuAv1bVR0Xk\nQ8DFqvphEXkv8G5VvTmFHDYohkA2/naWhNxXIDYRDILz9NOPsGHDpeQaGKeYTE1NsWPHDt71rt9g\nYmJWyY2qMhB1ShVoyFc6E4kEGzZchpszOwPfZ7IY1519rgeApcDJSAdTMsUxN2yMNHxMwahO7L4a\nPpH1cRSRFuAqVf0ygKrGvZXFdwH3eMXuAa73Pm8B7vPKPQ8cBC4XkQ6gWVWf9crdGzgmeK4HgLcU\nsUo1jzOTGwCeZGRkgP7+/ozpB6opvUMufl2zJr2HaWxczmuv/YL169fP21fuF+6GhgY6OjqYmBgC\nVgGtNDWtNBNkj1x9+ZLTYcTjcXp6ejy/1vDwfSZdn2oH2mhubmbv3meLpsjNPtfDwBh/+ZefnYka\naxiVQpR9i8LE6lldWD2riyjXs9wj+rnAURH5soj8SET+j4gsBVar6mEAVR0A2r3yZwAvBo5/2dt3\nBvBSYP9L3r45x6jqNDAsIq3FqlCtc/bZZwNLgKuAJZx++unz/J1mffKW09i4nHXr1pVX6BDI1a9r\nVoHYzfHjr1JfX59yXxRwAV3SK7S1GgglX18+X6mLx+MzwYcWLVrF1NRU6DIGFdXh4Rfp6uoqmiIX\nfK6hid/7vdtpazvXfBwNwzAMo0oo95tpPXAJ8BFV/XcR+SvgduavlYe5Fp7WNOnOO++c+dzd3U13\nd3eIl60N7r77blw0SJeD7tOf/rS3Avk0IyNX0N/fz/r16xkYOMiqVecxNnaMtrZzK95cde4qautM\nPTPhKxAL7Ss3swFdIBYzs2OffO55kLnBh1rZuXNnaP9zgv6RpepTvpIa9HHMp12KRU9PT6RncY1o\nUCvjvtWzurB6VhdRrmdZfRxFZDXwfVU9z/t+JU5xPB/oVtXDnhnqdlW9SERuB1RVP+eVfwS4A3jB\nL+Ptvxm4WlU/5JdR1WdEpA54VVXbU8hi/hshMDExQWNjO24xe5KlS1cwMXGC5LyOuQQJqQQK8V2L\neqCgTPeq2u5jLhR6z3/84x9z6aXXMD09isgSJiePcdpppxUsVzmU+eQ8lKXw4ywU83HMDRsjDR/z\nhatO7L4aPpH1cfTMUV8UkbXerrcAPwa2Ard6+24BHvI+bwVuFpEGETkXuAD4oWfOOiIil4vr+e9P\nOuYW7/N7gMeLWKWaJh6Pc/rprwfG8XPQTUwcwymNQ8DJmbyOxUohUS6SfddyUSDCSl2QyWS0EHPS\nTPeq2u5jLuR7z/00LBs3Xs6iRQ00NrahOsmqVeeFYta5kA9x2KbFyX04kUjk1S6GEQVqZVXa6lld\nWD2riyjXMwo2ZR8FvioipwE/Az4A1AH3i8htuNXEmwBUtU9E7gf6gFPAhwNToB9hbjqOR7z9dwNf\nEZGDwDFgXkRVIxxmX1iP41xLW2lubicWizEyMlexSCQS9PQ8TCwWm0l8XunkYxJYqLmjz8mTJ2dM\nf5NXmQpdgfIVpFSropl+qwVyvefuXqyZScMyMbEcP01GWGadvjKf/MzNXj/c1chUfbga/JYNwzAM\nw5hL2dNxRAUzwymcWdO9AZYsWc7Ond+lq6uLRCJBf38/a9eu5cCBA6xdu5b29vNr0i8umTDSM6TK\nCWnmpOEThklxchqWpUtXcNppp4Vu1plO1mL0heQ+PDj4XEU832aqmhs2Rho+ZtJYndh9NXwinccx\nKtigGA7pVr6CKx2NjcvTKjm1SKEKSaqckMeOPc+BAwcqyudsIcrpCxrWSt2skvUKS5YsZ3j4VWKx\nWMnqVaw8ksF709fXVxETFaY45oaNkYaPKRjVid1XwyeyPo5G9XHo0CHGxo6R7F8VNGcbHx+iqWkl\ntegXlwrf3DHfF/jknJBHjvyM9vbzq8rnLExf0HwIK/doLBbjpZd+wtKlqzhxYoz29vNLWpd8/TJT\nEfSVDPbhWvZ7NSof37eoo+McRCSrraPjnLLKnA9R9qEKE6tndWH1LD+V9wZpRJapqSkGBwdpaZn/\n0jj3ZbKDY8eer2hFJkok5388dOjQPCWnUOW03ISluOVLWMpQPB5n9epzmZh4DVeXAdraziupQhxG\nX8ikyAeV08HB5+jr66u5HJ9G5XP48Au41ZeFN1fWMAyj+jFTVQ8zwymMqakpli7tYHp6HJEl/Pu/\nP87GjRvnJYqv1SAqpaRY5ojlJAp1Cs/HcQPQiIs8XAdM45t17t79DBs3bgxN5mKRja/krHnvAI2N\nrQwNvUhDQ0NZ5E2FmarmRq2NkbmZ7dWWyZ6ZNFYndl8NHzNVNYpOMJm56gmOHz8+T2kMMwWAkZ4w\nzRGjQhTqFMZKXWdnJ83NHUACSLB48RJgEdAKLCKRSFTEc5LNCqxbJR4AVjM+PszKleeU3MTYmI+I\nxETkRyKy1fu+QkQeE5GfisijIrKs3DIahmEY0aTy3yiNSHDVVVdRV9cItFJX18hVV10181s8Hqe1\ndQ2bNm1mw4bLWLEivUleJSuYYcpe6LmSlZxCzheVexJVc9tc2icWizE09AK7dz/F3r27GB09THNz\nM5CgsbGRN7/5XWXz48yFbBT5zs5OGhtbgSPAEGNjx0puYmyk5GO4lFY+twPfU9XX4/Icf6osUkWE\nKPsWhYnVMzty8XUtp7+r3c/qIsr1jNYbmFGx1NXVMTExwPbtjzI5eYS6urqZ3/r7+xkdHcSZ5g1x\n/HhqH7VyB0AphEJkT1Y8wm6HQmWr1HtSCvJpn/r6ejZu3EhXVxf19fUMDb1Ab+9udu581PPjHGRk\nZIB9+/ZFQmFPx0KKvFOSX7RAWBFCRM4E3gF8KbD7XcA93ud7gOtLLZdhRJVcfF3N39WoBczH0aPW\n/DdKSSKRYPnysxgdHQUm5/mo+b5jiUSCDRsuI+ph/FORb368VGke+vv7Q01nUEjuPssBmZlC2yfo\nNwkEnpMTwFLgZKRzIWZDVH2ba9HHUUT+GfgzYBnw+6q6RUReU9UVgTJDqtqa4tiaGiPNxzE9teQL\nZ3XNeETF1tXITKbxsTLfRIzIkuol0TfP279/P7FYbJ4Jpa84NTe30dLSzvHjlbc64ft8jYzkJvvc\naKGtM22Xz7mCTE1NsXPnTq666qqCzhc8trm5jUQiQSKRiJQCUE4KadtUkwaPP/4Ql112BfA0cBXB\nflGpCru/MmmUFxG5FjisqntEpDtD0bRvgrfeeivnnHMOAMuXL2fjxo10d7tT+aZV1fLd0QN0Bz6T\n9nu55S19+/R4f7P7Xm558/0+S+b6zX4nUvJbfe17Nt/vuusu9uzZM/P/PRO24uhRa7OpxSCfJOnJ\nKza7dz9DfX195FYnsiGflZV00UJzPVewfDwe9yLcjiKyhImJQerr6/Ne9fFNabu7r8vp3tYCftsk\nT4hkQ6q+v3nztSlXHHMJCJSp70R19a8c1NqKo4h8GvhPQBxYAjQD3wJ+GehW1cMi0gFsV9WLUhxf\nE2NkT08P3d3dVb/i6NczHyppZaqQekLl1LXQekJl1DWMelYC5a6nRVU1SkI+ufaSozN2dXVFMgBK\nNuQTvCVdkJFczhX0s1u+/CzuvfdepqdHgdWoTtLauob9+/fnrSzU19dTX19f1jyKUcRv902b3sDm\nzdfm7IuY3PdjsRijo0eBFwHYtWt7zlFkU/lcxuNx9uzZw49+9KOi+KtGJXiSkRlV/QNVPVtVzwNu\nBh5X1d8EHgZu9YrdAjxUJhENwzCMiGMrjh61MptaTPLNtRfVVZCoypXM7MrVIHAWMIFL8RAP7Jss\naKUwCnkUo0YY/p/JPo6FtvHCq5ixguRNJX+uVgZRodZWHIOIyNXM+ji2Avfj/lG8ANykqsMpjqmp\nMbLaVxwLoRJWpsLC6prxiIqtq5GZTONj2RVHEXkeGMElNjulqpeLyArgG8Aa4HncQDbilf8UcBvu\nrfhjqvqYt/8S4J+AxcA2Vf24t78BuBe4FDgKvFdVf5FCjpoaFItFpShbC1FJL8SzSt0ATjEYBDqA\n0whTWaiWexsWxVCmC23jYF9obGzlqaceZdOmy3B94ChwBqkCVOVLJuU56v2llhXHfKi1MdIUx/TU\nkoJhdc14RMXW1chM1E1VEzj/ik2qerm3L2VeKRHpBG4CLgLeDnxBXE8H+CLwQVVdC6wVkbd5+z8I\nDKnqhcBdwOdLUalaJaq59nIlH7PbcuGbu+7du2vG9NE9Vi8CiZl0CMHgNvlQLfc2LLLJZZgrhbZx\nLBZjYOAgTU2rGB8fZvPma2lqasetQLfR3NzM3r3PhiZvsrmtv3JqaVyMSmV+kJDqxOpZXVg9q4so\n1zMKb4DCfDnS5ZXaAtynqnFVfR44CFzuOfQ3q+qzXrl7A8cEz/UA8JbQa2DMo9ITzqd7IY4q9fX1\ndHV1MTBwkKVLV+EUhXZaWk7n2LHn2b37GWKxGBs2XGYv8iESpjIdVr8/dOgQY2PHgCFGR4/y5JPf\nYffuHezd+yzDwy/S1dUVmvKfTnmupIkXwzAMwzCyIwqmqj8DhoFp4O9V9Uvp8kqJyP8Cvq+qX/P2\nfwnYhvOrqcz6AAAgAElEQVTL+IyqvtXbfyXwCc9/oxd4m6q+4v12EHiDqg4lyVFTZjjFJF8zz6hF\n7yyFqV3Y15jr79jG3r276OrqsnyMESdM0+go+KNOTEywatV5TEy8FlmfWDNVzY1aGyPNVDU9tWTS\naHXNeETF1tXITNTzOF6hqq+KyCrgMRH5KfN7bpg9M+2Lwp133jnzubu7uyZC/haDVLkJF1JSZl+c\nfT+98uevK3b+uWL4Uc7mFWxn2bIO1q1bx549ewAKzg1pFI98nplU+BMRg4PPceDAgbL4F548eZLG\nxtfhgjQ18MorP42E0tjT0xNp8x/DMAzDiDyqGpkNuAP4feAnwGpvXwfwE+/z7cAnA+UfAd4QLOPt\nvxn4YrCM97kOGExzbTXCYXp6WpctO1OhQZctO1Onp6cXPKa3t1ehQeG4QnNOx1Yqu3fv9uo8ptCg\nu3fv1t7e3oLrfOrUKe3t7dXJyUltbj59pj2bmk7X3bt353T+yclJ3b59u8bj8YJkKhV+3Sut3+Tz\nzCRz6tSpOec4depUESRdmAcffHBOv37wwQfLIsdCeP/zyz7uVcpWK2Pk9u3bVdX1D9Ast8prG7+e\n+ZBb25S3fQqpp2rl1LXQeqpWRl3DqGclUO56ZhofyzoNLCJLRaTJ+9wIvBXoBbaSOq/UVuBmEWkQ\nkXOBC4AfquoAMCIil3vBct6fdMwt3uf34ILtGEUiHo/T19fH4OBzOQUNmfUpnBvAI5FIlN3fsRjE\n43E2b74W54vYSlNTG93d14USTMRfKT1w4ACjo4PAJDDE2NhR6uvrs179mZqaYunSDq655m0sWrSK\nqampvGUqNn6uwkoMyJLvM5PM/v37I+FXuGXLFlxw61ZgsffdMAzDqC4WISJZbx0d55RbYCMEyurj\n6Cl/38KZotYDX1XVz2bKK+Wl4/ggcIq56TguZW46jo95+xcBXwE2AceAm9UF1kmWRcvZFtVAoaaX\nyf5+lZQSI1eSfREfeOA+brzx1wnTBzGRSLB8+VmMjo4AkzQ3tzM8/GLWSklPTw/XXPO2GZm2b380\nkubbqcycK8WPM6w+Ho/HaW1d4+VrnKSlpZ3XXiu9X6H/DJ999tncfffdfOQjH6GhoaGkMmSL+Tjm\nRq2NkebjmJ5a8oWzumY8Iufyldo2tUak8zhGhVobFItB2AFYqjmgS3K+vaGhF2lvPz/0gCYnT55k\n1arzGBs7lrNiMj09zaJFq5ieHqeurpHJySPU1dUVLFPYzPaT8PMUFpuw+ni6oEilZK4CvxQ4GekJ\nH1Mcc6PWxkhTHNNjylTGI2qqrrXSNrVG1PM4GlVCphQW+aQaqLSUGLmQnG+vvf18BgYOhpoTEOam\nZsjVfLGuro6JiQG2b380o9JY7vQp6cyco640Aqxdu3Ymz2YhfXy2DVxQpFTKZ7Hv02yAnx3AScpt\nMmsY+VArAZRqtZ4dHefkZF5ZKdTq/axWolzP6E0DGxWLn9MtOb1EvuZ46c5XLfT39weUulYOHToU\n+orqbJTV/BSThoaGjOapUTAnrtR+Eo/HaW8/n7GxIzQ2tjI4+Fzesi/UBqW4T52dnTQ3tzE6+hZ8\n392Wluqa8DEMo7I5fPgFcl9VMwzDpzLesIyKIVVC9EKSgYeZYD1KpAqOk0gkZlaD8lkdCh4zNTVF\nT08PqjqToH1w8Dn6+vpCXXGKSqL3Suwns203zPj4MAcOHADyXxnM1AaluE+xWIzHH38INx95Aqhn\n+/aHKuqeGEYU/biLgdWzurB6VhdRrqf5OHrUmv9GKck1IXlykJxqZK5PWitNTatn/BAHBg7S0XFh\nTqtDwRWlpqaVnDhxcsY3cWJigFgsVpQVpygkm69UUrVdIpGo6Pu0b98+Nmy4DN9nc+/eZ0vua5kt\n5uOYG7U2RpqPY3oq2e/P/PjSY21j+JiPo1FWfDO6bPz3fAWo0lIq5Ipv1gdtLFmyYo4f4re//e2c\nV4eCK0pjY4NMT48DQ0xPj7Nz586irTjlcm+NuaRqu2Kl1EgkEvT0PFx0/8/169fT0jLrl7xu3bqq\nTKdjlJ9cfdWyTQUQRd+iYtQ1ivUsBlbP6iJdPYv1/6BU5Cp/XV1j2epqb3lGyclkipdKwSl38JVi\nkEgkEInhHkHBN1mFRVxwwQU5BwUKBhJqamqnrq4RaKWurpGrrrqqqIGGKtFMtJwE+3Ow7ZLNl8Py\nD/QnYzZtegNXXvl29u3bV7RnKRaLcezYrGl0e/v5VT8JZJSHWV+17DZXvjKppboaRj5U+jMyX/7t\nZJI/kZjI+Hsx62qmqh61ZoZTDNKZmAbD9C9ZspzTTlvE8eNH5pji+ceuW7dujqme//JZbbkc56Zh\nWM7SpSuZmDg2k2sxkUjkbK7rt+HatWu9lasRNm/ePBMNtRZMgKNOuiA18XicrVu3csMN78NPqfHM\nM0/z0ksvsWXLloL6/Fyz6LPw05UMDBzk0KFDResPUU+nY6aquRG1MbLY5pJRMlWNmmlo1OTJBTPH\nTE8lt00l90kodtvnXlfL45gFURsUK41MURvdC+QmYDVwmOQk7UFlsbm5jccff4iGhgbWr19PX19f\npF8+8yXZ52xw8DkOHDjA2rVrOXDgQN4v88n3odjKgZEbqZSp2f4/m/+wsbGV8fEJXFqLxZw4cZjF\nixfndc1gztDZZ285TU2r8srvmY7kiYmo+7+a4pgbURsjTXHMeETE5FkMTGZVcvXqNQwMPJ+HVNlR\nycpRsanktonaM5IrlaQ4RmcUNyqaTD50nZ2dNDa2Akdwqx6+WeZi1q5dGzh2kNHRUS677Ao2b76W\nRCJRtbkcg/5tQaWxUNO+ufdhgFWrzjNTwQiRqj/P3rOjwDSQIB4/gZ8LEU6ybdu2rK+RbNrt97W9\ne3fNXLuxsTXv/J7prpnsm2z+r0YlUuu+YsVhknKZ1dn9rC5qpZ7QU24B0mIjeZVTKv/ATApeLBZj\naOhFL9F5Oy5U/5PAxMzqmp/A3Q0wsy+z1fzyWV9fz7p16wLK4lkFB0YJ3oewlQNjPrk+X6n689z+\nfwo4yuTkSYJ+r+94xzuylscpcJtoaXkdU1NTgOtrnZ2dMwFyhodfDnVCJt3Ekfm/GoZhGEb1YKaq\nHlEzwwmDUidn91+iY7FYypfFeDxOX18fmzdfO898LdNv1Uyyr2PQfDDf+qfzF62F9iwlYT5fc/v/\nQOCXp4Er6O3dnZWJ9lyz8CM0Na3ktdd+ATBPVqBgn9dK7mtmqpobURsjzVQ14xGRk6eS2zJKbV9M\nKrltovaM5ErUninzccyCqA2KYVDq4BTZ+tdlCtJSawFciuXr6FNr7VlKivF8+QrklVe+ndHRUfxA\nNtkqYolEgpaW1zE+PjxHLqAosqbyTV63bl0ofbfYmOKYG1EbI01xzHhE5OSp5LaMUtsXk0pum6g9\nI7kStWcq8j6OIhITkR+JyFbv+woReUxEfioij4rIskDZT4nIQRH5iYi8NbD/EhHZJyIHROSuwP4G\nEbnPO+b7InJ2aWtXPkrtH5iNf10w8ue+ffvmpQaoNdO2ZNPFhoYGLrjgAlauPCdv38R06R6McCnG\n81VfX09XVxdDQy+we/eOnPMuzjULn5WrGLKm8k2+8sq3s2qVpeAwKpda8aGyelYXVs9qo6fcAqQl\nKm+THwP6At9vB76nqq8HHgc+BSAincBNwEXA24EviFPTAb4IfFBV1wJrReRt3v4PAkOqeiFwF/D5\nYlcmKpTaP3Ah/7qg/9WiRSvZtGkzGzZcxooVtf2CmZzLr61tTd6+iamClBjFwX++du9+hh07vhPq\nuevr69m4cSNdXV05P7cNDQ289tov5jz3xfhf0NnZ6SmoK/B9k0dHBzl+vDA/XcMwDMMwoknZTVVF\n5Ezgy8CfAb+nqltEpB+4WlUPi0gH0KOq60TkdkBV9XPesf8K3Am8ADyuqp3e/pu94z8kIo8Ad6jq\nMyJSBwyo6qoUckTKDKdSyeTzNJta40ngCpLTclRDmo1CSeWjNjLyUtYv+lHPnVdtFNOPOOpmxlNT\nUyxd2sH09CiwBJikubmNWCxWEb6OZqqaG1EbI81UNeMRkZOnktsySm1fTCq5baL2jORK1J6pvE1V\nRWSliPw/IvJ33va7IrIyp6svzF8B/425LbBaVQ8DqOoALhQnwBnAi4FyL3v7zgBeCux/yds35xhV\nnQaGRaQ15DoYHv7qWX19fYbokVfg8jq5qJHVlGajUFwbdQCvsmRJE8eOPZ/Ti3e1pi+JKpnS0BRC\nsVeOw4i2vHPnTqanx4Fh4AR33/1FhodfnFmFffzxh0oS0dkwDMMwjNKQdmpcRC7CmYk+CuzGqbeX\nAX8gIm9W1YLfkETkWuCwqu4Rke4MRcOcFkg7w3znnXfOfO7u7qa7uzvEy9YevhLp45vL+T6OfX19\naSOw1iqxWIyBgYOsWnUeY2PHaG8/P6dVrGAb5xKUyMgPX1EfGQlXUZ+rkLbS398f2spxWKukV111\nFXV1jUxPt1JX18wtt9xCLBYjkUiwefO1M8F9WlraOXasuBGds6Gnp6eG/GPmIyKLgB1AA27sf0BV\n/1hEVgDfANYAzwM3qepI2QQtMz09PTUx9ls9qwurZ7XRA3SXWYbUZBrJ/wT4mKreH9wpIjfgzEpv\nCOH6VwBbROQdOFunZhH5CjAgIqsDpqqDXvmXgbMCx5/p7Uu3P3jMK56paouqDqUSJqg4GsUhqExu\n3LixzNJEk0OHDgV8HHNXGpIVdih9apZaIZOini/xeJxEIlEUhRTCU0rr6uqYmBhg586dnhJZN3P+\n0dFBfFP048fDVXzzJXky8I//+I/LJ0wZUNVJEblGVSe8sfBpz93jBlxMgc+LyCdxMQVuL6uwhmEY\nRiRJ6+MoIj/1gtPk9FvegohcDfy+5+P4eeCYqn7OG8hWqOrtXnCcrwJvwJmgfhe4UFVVRH4AfBR4\nFvgO8Deq+oiIfBhYr6of9nwfr1fVm1NcP1L+G7VALa+AZap7coqObPzEFmrLMH0fK+W+RVnOdLIl\np7jYseM7eQXIyUQ+/SvX8y9fflZe6URKSS37OIrIUtzq44eAr5AipkCKYyI1RpqPY8YjIidPJbdl\nlNq+mFRy20TtGcmVqD1TmcbHTEsO43n+FgafBe4XkdtwgW9uAlDVPhG5HxeB9RTw4cBI9hHgn3DO\nc9tU9RFv/93AV0TkIHAMmKc0GqUn3QqY73tVzSasC63+5bqKlc1qYlgmlZWychllOePxOCtXnsvx\n4/NlC64Gjo62Ul9fH/ozUIxV0uTzDw29UPXPcSUiIjFgF3A+8Heq+qxv3QMupoCItGc8iWEYhlGz\nZHqTaheR30uxX4B5UUkLRVWfAJ7wPg8Bv5Km3GeAz6TYvwu4OMX+STzF04gOqczl1q1bR2vrmsj5\nRoVNOlPB4CpUKnPTXM8XJCxloZi+d2ESZTn3798fSFnRyv79+2fMtmcV/OU0Nraybt28hZ9QyKV/\nFXKNKK72VhOeItikqsezKa+qCWCTiLQA3xKRX2L+tHXaqelbb72Vc845B4Dly5ezcePGGfNf33+0\nVN8dPcz6AfV4f9N9n+sfle78c6+R/fmLX9/M189Vnrvuuqug+5erPNl/Jy95Frqf8/2bc5Mn+/KL\nmM0StzCx2FISiYmsyq5YsZqhoQF3tZDvZ+nah4LlC97P/P8fnJbTfVqxYjXf/OZ9Wcvb2trBa68d\nzvr8szL68t0FbCS9/Mnlk3+f+z2b/wd79uyZ+f+eiUymqndkOlBVq8pBJGpmONVIUDEC5pnLuXQd\nm6j2NB1BU8Hm5jaeeupfWbduHe3t58+0x8DAQQ4dOpTVi3exTQ/Lda1CiLKc+/btY8OGK3G5D0/j\ngQfu4d3vfveMfCdPnpwJjlSs1dJimvFGebU3SKWaqorI14D/AkzjXDNagL9W1T/P8Tx/BEwAvwV0\nB0xVt6vqRSnKR2qMLJZpmq9cVrupaiFBRqJmVpeJ5HqWwhyzHG0TRtCYSjBVTVfPqMleuDw9ZA6O\nUz5T1bLncYwKURsUqwnf/LS7+7o5L5PAnJfXub5RJ2hsbGV4+OVIvnQWSnKbNDYuZ3x8GKcwL6ep\naVVOikMp/fmi7DsYpBhyhnHO2X4+ADQBJ+fc52Lm4kz3LObzjKVri0rJJVrBiuMeVd0oIr8BXIIL\nZLNLVbsWOK4NOKWqIyKyBBcx/bPA1cBQckyBFMdHaow0H8eMR0ROnkpuy+iUr/y2iZKPY3T+f+Qn\nT+QURxH5m0wnVdWP5iRFxInaoFgtzK4+DOBWEgeBNvbu3UVX1/z3nHg8zp49e7jmmi1FXXGJAnNf\nsGeVxblKZHRfvGuNMFfS4vE4W7du5YYb3kfyfS7Waun8ZzH//pWpLaK82hukghXHH+NsmL4G/K2q\nPiEi+7JQHC8G7sHd/BjwDVX9My+v8f246OMv4NJxDKc4Xi+88JezlnPLlnfwF39RPMMkUxwzHhE5\neSq5LaNTvvLbxhTH8OSJYnCcXTldxTBSEPQ1g9fh3k1ibN58bcoX7/r6ehYvXlxQOopKYH7KhQ4G\nB5/jwIEDrFu3znspDz8Vg5E/YfpN1tfXc/3116cMWBR28Bp/ZTCRSASexTOA/PtXprbwc5Fu27aN\nLVu2RFJprHD+HpdvcS+wQ0TWAAvmXVTVXtwKZfL+tDEFkjl48AtZivhjtm79u6IqjrmTm+9ZZZNb\nXVevXsPAwPPFE6eM1Erev8qoZ+H9sjLqGQY9VFweR1W9p5SCGNWF/7K6bt067+W4jaVLW5iYOM5C\nL97FSqqeSc5Sml0mp1zYvfuZmZQLfnvkqjhUivloJRN2v0xWEBOJBH19fTkHR8pEcl9raWnn+PE2\nz7f2qbwjnmZqi3g8TkfHhZH3caxgHlbVGYsgEfkFcFtpLn1ZaS5TFCbJboa+B/fCVslKZjZ17cF/\nMT18uJLralQO2T6DDuuX0cTeMI3Q8V9WL774UtrazmVg4CC9vbsYGXmVZcvaWWilw3+h7u3dVVQz\nt6Ccra1riMfjRblOMnNTLhxNmXLBVxyyVRqT6+H7siUSiXllU+1f6Py5HlONFKNf+vc5kUjM3MPl\ny89iz549obR3cl974omH6e3dxfDwiwXlh8zUFnNXIwfp7+8vuB7GHB4MfvF8LO4rkyxVSHe5BSgR\n3eUWoCTUxuqU1bP66C63AGkxxdEIneQXx0OHDrF+/Xrq6+vnvWwmEgleffVVBgYG5thg56I4hSVn\nqV5w/dUaaKW5uY1EIlGQkpBcj/3796dUQuLxOCtWnM3FF29k2bIzs1KUZ5XSTbS0vI6pqam85awG\ngopemMr07D0cZHR0lE2b3hDKZEawry1b1k5XV9fMc1XohEB9fT3r1q2jr69vzjmSr2mm1uEgIutE\n5AZgmYj8WmC7FZe/2DAMwzCKiimORuhk++KYSCTo7r6W009fy+mnn0N39ztKuqpVrhdcf7Vm9+5n\nEBE2bLisICUhuR6xWCylEvKjH/2IsbExoI6xsTH27du34LmdQjMArGZ8fJiVK88p2cpsVCnGSvXs\nPWzDmfOEM5mRbmUwjDqkO0ewf+/Y8Z2C5Dfm8HrgncBy4LrAdgnwn8soV5XRU24BSkRPuQUoCfPz\nE1YnVs9qo6fcAqQlL8VRRN4ZtiBG9ZDty+qrr77Kzp1PAAlUj7Fz5w6OHDlSdjlLge/zdfz4EYIr\nhT65rAYl12P9+vW0tMxXQnp7e2e+wyQjIwvG06Czs5PGxlbAyTk2dqzmTQ+LsVLt38O9e3eFPpmR\navW+0Dr4UWEznaO7+7qCJ0WMWVT1IVX9APBOVf1AYPuoqu4st3yGYRhG9ZPvm3Ile8gbJSCbl9XB\nwUE2bPDDu6/gjW+8ivb29rLLWSqcUrgIaAUWFbQaFKxHIpFANQHEA+dvoKuri7q6RqCVurpGNm/e\nvOB5Y7EYQ0Mv0tS0EjM9dBS6Up1uUqC+vp6urq7QJjMyTT4UUge/f95ww3txFpLzz2F+jkXlmIj8\nm4jsBxCRLhH5w3ILVT10l1uAEtFdbgFKQq34xFk9q43ucguQlrzeSlT1jrAFMaqLVC+tyb5911yz\nhR/9aCcuuK/Q2/tjpqenyyVySYnH42zefC2QABI0NTXPRNEs9KW7v7+f0dGjwDPACeC7AFx++ZUs\nWbKY731vG5OTR6irq8vqfLFYzAuhnSjYH7MaKGSlOptJgTAmMxa6TiF1mO2fw8AEDz749XnnMD/H\novIPwKeAUwCqug+4uawSGYZhGDXBgm8LSU74/vYWESnt0pBRMWTj+/TlL/+N9/K5EzhJKiWpmqN5\n7t+/n/HxcZzpaANPPPHwTMAVP4VJvi/dsy/tV+BWhN4OTOGbmq5evTprpRGCiugwo6NHbfWI/JW7\nUq3EZbqO/1z56V9yrcNcpbCD66+/ft45ymkGXgMsVdUfJu0zW+DQ6Cm3ACWip9wClIRa8YmzelYb\nPeUWIC3ZjOYfBL4E/Ia3/QPwSeBpEfnNQi4uIotE5BkR2S0ivSJyh7d/hYg8JiI/FZFHRWRZ4JhP\nichBEfmJiLw1sP8SEdknIgdE5K7A/gYRuc875vsicnYhMhsLs9DLcXf3ddx44004pcZXbuYqSdUe\nzdO9SE/iVm3cO1+qFCb5vHTPvrTvZteuJ3BK4yqglaamlXkpos3NbcBympvbbPWoAEq1EpfuOmEE\nxclWKSynGXiVc1REzsdLiCYiNwKvllckwzAMoyZQ1Ywb8CiwOvB9tbevFdi/0PFZnH+p97cO+AFw\nOfA54BPe/k8Cn/U+dwK7cbaN5wCHAPF+ewa4zPu8DXib9/lDwBe8z+8F7ksjhxrhMD09rcuWnanQ\noMuWnanT09Mzv/X29irUK5yhUK9LlrTp+Pi49vb2ZijXoE1Nr9NTp06VozpFYXp6WltaZtto7969\nCg0KYwoN2tvbG9p1mptPV2hUqNfm5tNzbsdTp07NkbWa7kM5OHXq1Lz+nk+ZfK7jnqvw+1kl4v3P\nL2j8KscGnAd8D5gAXgaeAs4pwXUVNMvth1pX16TumOy21avX5Hz/spen2OWL+/5QirpGR55FNdRv\nitvPVq9ek1NbRquuudU3SrJEr5/lJrsvv2rqsSCbqeCzVPVw4Pugt28Iz8eiEFR1wvu4CKcQKvAu\n4B5v/z3A9d7nLTjFL66qzwMHgctFpANoVtVnvXL3Bo4JnusB4C2FymxkJtOKxNwoncOcOHGcn/3s\nZ/NWJqo9mmcsFuPYsbmRUIuxqheLxbyUCKeAo4yODtLX15fTOfr7+zl+3AKdhEWmlbh4PM6ePXtC\nSfeR6jrme1gVvKyqv4IzI1inqlcCx8ss0zymp8fI5X318OEXyiSpES0msX4TDq5tsm9Lw8iGbBTH\nHhH5tojcIiK3AA95+xpxdnYFISIxEdkNDADf9ZS/1b6yqqoDgO9PeQbwYuDwl719ZwAvBfa/5O2b\nc4yqTgPDItJaqNxGZtIlB882SmctRPNMjoQqEgNiM9/Doqury1NKzwJibN58bU7KiCkbpcE3I920\n6bK8/SAX8gsuZY7FavZRLjPfFJF6VR1X1VFv4vS75RaqeugptwAloqfcApSEWvGJs3pWGz3lFiAt\n9VmU+QhwA84ZDdxq3oPeUuY1hQqgLm/AJhFpAb4lIr/E/KmPMKdCJN0Pd95558zn7u7uGgr7Gz7+\nS/DIyCDLlrVz9OjPZ3IXNjQ08Nprv6C/v5/Ozk4SiQR9fX0zn/39DQ0NHDnyM7Zt28aWLVuq2ldq\n7qpeK/39/TNRVgvFX3XctOkNeZ3fVzb8+1LN96GcBH2D3XxXbop6pmcume7u67Iqly+5yFIqenp6\nquWl41+Af/Z8G88CtgL/tbwiGYZhVDOLvOjyRkr71XJtwB8Bvw/8BM+vEugAfuJ9vh34ZKD8I8Ab\ngmW8/TcDXwyW8T7XAYNprp2zDbAxn1OnTunu3bv1gQce0Gx8qU6dOjXjD9ncfPocX7oTJ07M8ZWs\nZt+6TH6hlXB+o3CC96ixsUMfeOCBnPp8Jv/FoL9jKfwcK8GXkgw+HFHfcBO6DwO9wH8o0TVz8Kn5\nofkQhUgp6hodeSpZ9mj1s2jJXtx7G0XZo1M+t37jt6dqnj6OIvJGEXlWRMZEZEpEpkUkFH8KEWnz\nI6aKyBLgV3FK41bgVq/YLTjzWLz9N3uRUs8FLgB+qM6cdURELhc3JfD+pGNu8T6/B3g8DNmN+cTj\ncVpb17Bp02ZuvPFm0iUHDxJcZRkdHZzjS/ftb3+7apOIJ5vxFTt9gaVHiBapzDiDZqT19fXceOOv\n09Z2btZmxZkiqa5cOeszuXbt2qKbHpt5c/iIyO/5G+6f69nAHuCN3j7DMAzDKCrZvD3+LfA+XCCa\nJcBvAX8X0vVfB2wXkT24qKiPquo2XFTVXxWRn+KC2XwWQFX7gPuBPlzk1A97mjG4Gdi7gQPAQVV9\nxNt/N9AmIgeBj+NWLY0i4PL9DTKbZmJ+cvDkF+bgC2Zzc3vgcxu33fYxXMykVlpaquflM11KhGKl\nLyg0b58RLplSYtTX11NfX5/XhEksFmNg4CAPPvh1jh79+cx93r9//5wJmb6+vqJPIthERVFoDmxN\nwDdxkcX9fRWOMwXLdisePUU8d5ToKbcAIRGVflNeqsQMf0FqpZ5Rfj6zcjpR1UMiUqcuuMyXvWA2\nnyr04qraC1ySYv8Q8CtpjvkM8JkU+3cBF6fYPwncVKisxsK4fH/tjI6Okio5eDq/p6D/nO/jmEgk\n2LDhMlwQ3zaefPI7VfPyOTfPZbj+jMkE27y5uY0dO75DV1dX1bRlJbLQ/fcnU0ZGcvdx7Oi4cN7z\n5e61m4CBRcRisZlJimJSimvUEqr6x+WWobj40TSzpXqVACMXFuo3PUB34Lv1G8MoBJldsEtTQGQH\nTon7Ei7y6avAraq6ofjilQ4R0YXawliY4OrWunXrOHDgwExAlf3793PxxZfign+00tu7K+2LZSKR\noCUvFYEAACAASURBVLV1zcxLcDWtWpSybrNtPoiLozEZmWAltcrU1BQrV57D2Ngxli1rZ3DwuTnP\nCbjnKNdgROmer0QiwfLlZzE6OkhzczvDwy/OCUJVrL6XTx1KiYigqhX3Fiki3wXeo6rD3vcVuDRV\nbyvydTV7xe5ZXErmXBXBSi0vFPP9wa2UFbeuuchfXHmidF+jVj5K96k05bOtbzXUNSr9BjKPj9mM\n5r/plftdYBz39nlDThIYNUN9fT0bN26ks7OT9vbz55jjzTVLbSORSCyYNqDYpm7lSBlQSjM+twrc\nhlttmqQYKR6M7InH47S3n8/Y2BEaG5fzyis/nfecQPp0NplI9is877zz+OY3v0kikWBo6AV6e3fP\nKI1h5IlcqJ7FvkYNs8pXGgFU9TVmU1YZhmEYRtHI+MYqInXAp1X1pKoeV9U/VtXfU9VDJZLPqFDm\nmuM5RSUY/CMWi7Fhw2UZXyqL5fPnU86X22LXzSeYHzKbYEXJREkBqAYFdva5GGZ8fJhHHnkkpT9j\nPu0enJB45ZWf0tj4Om644X2cdtpK4vH4TH9L9WyGhX+P+vr6qjawVQSYFpGz/S8isobcpqqNjPSU\nW4AS0VNuAUpET7kFKAm14vtXK/WMcr/N+Nbq+TSuEZGGEsljVAnpoir65pHZvlQWU1ko5gt0VJjN\nD5k6WFE2x6dro1IqclFSYAsh+bnYsmVLyuck377pT0g88sgjwEmc2epJtm3bllaGsIJOBe/RlVe+\nnZYWi6paJP478JSIfEVE/i+wgxBiDhiGYRjGQmTj43gvcBEurcW4v19V/7K4opUW83EMn1Q+Tn7K\nDhdAZ5KWlnZee+2FlD5XxU4iXs1+lD6F1jHd8aVO8J6Lf2zUSX4uUj0nhd63eDzOaaetxCmPizlx\n4jCHDh3KeM1CSb5HfloR83EMHxFpA97off2Bqh4twTXNxzFDWfNxDEueKN3XqJWP0n0qTXnzcQyj\nfOl9HJ8Dvu2VDYYDN4yMpDLHdCk7jgIvAgmefPI7aX2u3KrLAPAkIyMDoa8IRiFlwNTUFD09PUxO\nTha8ehePx9mzZw/79u2bkx8yVYqGbEnXRoWs1uazUllNeQF9/8V9+/axb9++OWlS/LaJx+P09DzM\n3r3PZt03/WOnpqbo7+9nfPxVHnzw65w4cZiOjgvnPF/FMJVO9mGOxWKRVRqrgGlcxKvjQKeIbC6z\nPEYOdHScYykkDGNBsk+1YmQit5Q1HR3nZD6dqqbcgK94fz+Wrkw1ba4pjGIzPT2ty5adqdCgy5ad\nqdPT09rb26vQoDCm0KC9vb2qqjo5OanQ4v3WopOTk2WWPlwmJye1rm6FQr1C80ybnDp1KudznTp1\nSpubT585T0uLO8+pU6fmtHc+505Fqvvoy9Hb2zvzPZWc+cqz0LkrhYXvVf1Mv8+2jTIdm+75CrtO\nvb29Ojk5qbt37y5Knwsb739+2ceeXDdcLuVe4DVgO3ACeLwE11XQLLcfam7lNULlt+dxfnLue+Wv\n6/Y55aMjf9jn3l7k85eyfPr7tH379oj2s7DLJ9/PSpI9l/Lp6plfv8ldFtT/35+8ZZoKvlRETgdu\nE5EVItIa3DKro4aRmlQrWOlWkw4cOEDQT8t9rx527tzJ9PQ48DT5Rjz1cSu5gzPnOX7cnadYfpyp\n7mM2foiFyFOqgELFZuF79TR+v8+2jTIdOxtZdznNzW2hr9YG73t7+/lA9j7MRl58DLgMeEFVrwE2\n4ZyYDcMwDKOopPVxFJGPAh8CzgNeZm7WVFXV84ovXukwH8fyUgw/r1JQiK/Y9PQ0ixatYnp6FFiC\nn2Mxn3rO5uobnXMeoAw5I9P7IVbCPS02C9+rAWApMEFjYyvDwy8v6D86266vAI04pXQxk5NHiMVi\nrFx5LsePD9DY2MrQ0Is0NIQX7yz5vu/d+yybN18b+XtcqT6OIvKsql4mInuAN6jqpIj8WFV/aYHj\nzgTuBVYDCeAfVPVvvDyQ3wDWAM8DN6nqSIrjFfNxTFs2l/eHKPpjRUf+6LVNdMovxv1vz4WoyF7s\n8lGSJWrl8zk3acfHbILjfFFVP5TDFSsSUxyjycmTLiLkli1bIpewPowAMVNTU+zcuZM3velNHDx4\nsCCfMN/HLegz5+8vRSL2bJXCqCeGLwUL3avzzjuP1asvYGzsWNZ9Kx6Ps3XrVm644b24lccr6O3d\nDcDFF2/C6QtHaGpayWuv/SK05ynVffeDXa1du5a+vr559YwCFaw4fgv4APBx4M04k9XTVPUdCxzX\nAXSo6h4RaQJ2Ae/yznVMVT8vIp8EVqjq7SmON8UxQ9noKF75lY+O/NFrm+iUj5IsUSsfJVmiVr7E\nimOtYIpj6VlIgSh15M5cqYRIn6VW0kwpDId8+1YqJQ6gpeV1jI8P53y+bMk2gvKxY9F5hitVcQwi\nIlcDy4BHVHUqx2P/Bfhbb7taVQ97ymWPqq5LUb5GFMceoDvH80dJ8cq2fA+unq58dOQP+9w9zNaz\nGOcvZflMZXuYW89iy1Ku8j3Mr2e5ZClm+R5S1zOf84erONqbnVEWiu0PVwqiHumzHLkPq8EPsZT5\nKdORb99K5Xsai8UYGnqRpqaVc84XZj3TR1Ce78tp5IeILBaRj4vI34rI74hIvao+oapb81AazwE2\nAj8AVqvqYQBVHQDaw5bdMAzDqA7K+nYnImeKyOMi8mMR6fX8KvGC8TwmIj8VkUdFZFngmE+JyEER\n+YmIvDWw/xIR2SciB0TkrsD+BhG5zzvm+yJydmlracD8l/FslMKoK2ZRSOeRiagr3lGkHMp2Kvy+\ntXv3M+zY8Z2cjk2lxMViMW+VIEEikWBqaqro9XRBedqBRUT1Ga4w7gF+GRdR9e3A/8znJJ6Z6gO4\niOljzJ+KzjA1fStwp7fdhZsV9+lJ+s4Cv0e1fHde5+/p6aGnJ/vvC8tb7O8EvucWrj8a8mf7vTti\n8hTynQy/J5dZqHyu549K+e405ZOPWej8US+/0PG5nn+h73cx+/89MxlNVUXkeuACoFdVH13wbDmS\nq8+FiHQCX8VFlDsT+B5woaqqiDwD/K6qPisi24C/VtVHReRDwMWq+mEReS/wblW9OYUsZqpaJE6e\nPMmqVefN8deKxWLmD1dkZs0WB7IOslLrRMn8OExT7eR6Pfjg17nhhvdR7Hqm8+WMApVmqioivap6\nsfe5Hvihql6S4znqcXmZ/1VV/9rb9xOgO2Cqul1VL0pxbI2YquZTPkqmnpVePkqyRK18lGSJWvko\nyRK18iUyVRWRLwD/L7AS+BMR+aMcrpoVqjqgqnu8z2PAT3AK4btws6t4f6/3Pm8B7lPVuKo+DxwE\nLvcGu2ZVfdYrd2/gmOC5HgDeEnY9jPS4l981jI0dAwYZGRmYCZaRzWpdNZg+piIej7Nnzx727ds3\nswobtolkLBZjYOAgTU2rGB8fpq3t3LKtoFUK5VjlTnffw1wxTq7Xli1baGkpfj3r6+vZuHEjXV1d\nVfcMl4FT/gdVzfdB/kegz1caPbbippoBbgEeyvPcVUJPuQUoET3lFqBE9JRbgBLRU24BSkRPuQUo\nET3lFiAtmaavNwMbVHVaRJYCTwJ/UixBMvlciIjvc3EG8P3AYS97++LAS4H9L3n7/WNe9M41LSLD\nItKqqkNFqooRoL+/n/HxIWAV/i258sq3MzT0woxSWGukChpy+PBBOjouDD0Q0KFDhxgbGwQeZmTk\nOvr7+2uyzbPFn9Ao1Sp3plVFX9kbGSlcuUuuVyKRQDWBb7qaSCRMsYs+G0TkuPdZgCXedwFUVVsy\nHSwiVwC/AfSKyG7cFPQfAJ8D7heR24AXgJuKVQHDMAyjssn0ZjqlqtMAqjohs4btoZPsc+FMYuYQ\npg1p2nrceeedM5+7u7vp7u4O8bK1iXv57WBk5CWgGYgxOjrCAw88wNq1a6t2RTETs0FDYrigIa1s\n27YtsLrUGpqCd8EFF+ByAl4PLPW+G5ko5YTG3FXFufc9bCU2WK++vj5GR48Cw4yOhtffosx8H7PK\nQlXrCjz+aSDdOX6lkHNXF93lFqBEdJdbgBLRXW4BSkR3uQUoEd3lFqBEdJdbgLSk9XEUkQngkP8V\nON/77s9udoUiQA4+FyJyu3ftz3nlHgHuwM2SzvhliMjNuPDiH/LLqOozIlIHvKqq86LGmY9j8YjH\n4zz00EPceOOvA4PMLgbHiGKY/mKTKgH8wMBBlixZDZzET9weRpL2np4errnmbThftuXcffffc+ut\nt9aUoh5lgukzmpvbeOqpf2XdunUcOHCgqCue2ebcrGYqzcex3JiPY+ay5uMYVvkoyRK18lGSJWrl\noyRL1MqXLh3HRcB13vbOwPd3en/DIhefi63AzV6k1HNxgXt+6IUQHxGRy72V0fcnHXOL9/k9wOMh\nym5kQX19Pe9+97s9n6o2XHh+f0sfpj8KaRGKgUuP8AK7d+9g795nGRp6gUOHDgETOIvwCQ4cOFDQ\nNfy2u+KKK6irawSWA0v44Ac/VNZoocbcfh2MnhqL/f/t3Xt4XPV54PHvO1JkY0m+3wIBTCBGOMbY\npkAIYMQdmjSh61y7bSCbbjeXNmm7zxbSbhe6fdqS7LNZ2GST7LZuCskSQuJs4iRcU3RCzD1YtuXI\nxuaWYGJZxrZky8KSpXn3j/Mb62ikGc+M5txm3s/z6PHM0W/OvO/MyL/zm98tw3nnnc+0aQtCX9U1\n6SsCGxMfL+4AIuLFHUBEvLgDiIgXdwAR8eIOICJe3AEUVPBqQVV/VeynGk8emHNxpYh0isgmEbke\nf87FNSLyAv5iNne4mLqB+4Fu4AHg04Fuws8A64CdwC5VfcgdXwfMF5FdwJ8Ct1YjdlOeTCbD/v2v\nsGXL84El+gsv05+UbRHCkr9oSG5IL1zGrFmLpzSfbXBwkNmzT+Xcc89nwYK3c+jQbtat+9/kGuq2\nNUd8xj7Xq5g5860MDw/T2NhIY2OjG7L6BH6v8wH6+3vYsGFDKF+chLFaca1+0WPMiVWynYUxxqRP\nsaGqh5m8b7OkifhpY0NVoxO8wCw0x3Fs+4BeYD5btjzPihVVGR2dWNW4mB8eHmb69Pmo+o3E3FYL\ny5Ytq/uhiUngf65XAYuAfcyYMYcnnniI5cuXu0VyevDnpA66f49WdbEkqO42H2GeM2w2VLU8NlQ1\nLbGkvXySYkla+STFkrTySYolaeUjGqqqqq2qOnOSn9ZaazSacBTqgcj1tq1evbrgMv3+5uHzgVMB\nePe7r2F4eDiKsGMTbERX2nvz5JNPonoEfxeduTQ3zz3eELWhifFbunQp0ATsA3oZHBxk1aqLmD//\nDHp6dtHV1cnQ0D7Wr/8OYz2P1e0hruY2H2Ge0xhjjDHJYlePJhRTHWqayWR4/PGfAG8CizhypI95\n85bU3JDVyUzltbv44ouBZvyGSSN79uyku7u7aO+uiY4/d/UofsM+N9/Xb2y9+OKLLF++nKamJm68\n8cbQ9pMMY6/KpUuX0tIyb8I5h4eH8TyP0dHRKT+HMdHw4g4gIl7cAUTEizuAiHhxBxARL+4AIuLF\nHUBBdgVpQlGNHogVK1bQ3DwXvxF0gIGB/TXdk5HrZezu7q74tdu1axd+Y6QPGObkk8+u2XmiaeQ3\n2k4G9nHSSbPdglETG3Bh9hBX+9wjIyMsXHgmAwP7aG6eTW/vS2QyGYaHh5kxYzFXXHEd06YtqPkR\nA8YYY0ytKzjHsd7YHMfqqtZy/8PDw8ybt4SBgf01PTdvZGSEOXNOY2Cglxkz5tPY+BYOHSr/tRse\nHmbatAX4vVqNwAjBuY61vldfGgTnsmaz2aovUhO1sfnIY5+ztrY27rnnHj7xiU8dP97R8XCi9sa1\nOY7lsTmOaYkl7eWTFEvSyicplqSVT1IsSStf3TmO1nB0rOFYfVNZ7KXWLq5PZNOmTZx/fjt+b+E0\nnnnmp8yYMaPsnMcWX3kCuJgZMxYwOLif1taF9PW9VrOvn4lP/pdEvb0vsXDhmfT378Ff4GeIhoZm\nhob20dAwpT3sq8oajuWxhmNaYkl7+STFkrTySYolaeWTFEvSyke3j6MxU1LOnLrgYjD5c/yAmp+b\n19/fT26+Gwxx5MiRinIObuvR2rrYrWyZIZPJVLxNgm2zYIrJH/q6c+dON9S6Hxhk3bqvJa7RaExh\nXtwBRMSLO4CIeHEHEBEv7gAi4sUdQES8uAMoqHavxE0ilNLoyG8obtu2re5WaFyzZg0NDc3AXBoa\nmlmzZk1F5wlexG/c+CCHDvnzQyt9Hau1n6Y1PqMV9esd/JJo/OI7b+Xmm2+2RqMxxhhTA6zhaEJT\naqMjfyGdTCYT2oqSSdXQ0MDgYA8dHQ9PuXcmdxG/fPnyCa9juQ2KaixyVK3GpylN3K938MuL3t6X\njq/qa0w6tMcdQETa4w4gIu1xBxCR9rgDiEh73AFEpD3uAAqyhqMJTamNjvztAZYvX16Xew42NTVx\n6aWXsn379qpcaOcPIcxms2U3KKqxdYPt8RetQq93lL2QjY2NtLW1sXDhmfaFgTHGGFMj6uOK3EQq\nd4Ha1tZWUqNjsu0B6nHPwbB7iippwFVj64Yw9g00hU32esfRC2lfGJh08uIOICJe3AFExIs7gIh4\ncQcQES/uACLixR1AQfVzVW4iEbxAnT//DHp6dpXU6KjXhmKwB6iaF9ojIyNs3rx5XGNh6dKlsTTg\nptL4rOe5kZXkPjIyQnd3N729L417vcNuxE0Wq31hYIwxxtQW247Dse04qmPz5s2sWnURtndgcbkG\ndm4LgzfeeIVMJlOVvS+PHj3KggVvZ2BgH/53Q+P31ytna5PJ4vRXag1fnM8dt0pyL/aYau2rWvx5\nezjppNls3PgwK1euJJvNsm3bNjKZTCK/FLLtOMpj23GkJZa0l09SLEkrn6RYklY+SbEkrXyNbcch\nIutEZK+IbA0cmyMij4jICyLysIjMCvzu8yKyS0S2i8i1geOrRWSriOwUkTsDx5tE5D73mKdE5LTo\nsqsvIyMjrFnzHmAaMJeZM8vvZaiXHqbJeoCqMSzUv4g/3TUaf07uvZg1ayFLly4t+7WNc7hhPQ91\nrCT3Yo+pxmer+PP2AAt4880hzj//YmbNOpV5885g1aoLeNe7rmLz5s01/zdtjDHG1DxVjfUHuBRY\nCWwNHPsC8Bfu9i3AHe72MqATaASWAC8y1mv6DHCBu/0AcJ27/Sngq+72h4H7CsShZmq6uroUmhT6\nFBp1y5YtZT3+2LFjOmvW2xSadNast+mxY8dCijR+o6Oj43IdHR2tynn99yCjMNO9Fy36/PPP69DQ\nkLa2nqzQrNCoLS0nl/T6hhVnKeJ87rhVkntcr9fo6Kg2Ny90n7smhQGFRvfzVoVWhSadOTNZf9Pu\n//zY68C0/AAKWuLPs1peeU1Q+Y4Kzp+U2Msp3xHy+SstX+1zd4R8/qS8Nvl5Ji32apWfLM+0xF5O\n+UJ5VnL+SmKhYP0Ye4+jqm4EDuYdfj9wt7t9N3Cju/0+/IbfiKq+CuwCLhSRxUCrqj7nyt0TeEzw\nXN8Drqp6EgYIzmlayKxZi8seolpPPUwn6gGqtOd12bJlNDfPB47iD1EdpqmpiZ07d3L4cA/+IIMM\nAwOH2bZtW0lx9vTsYv36bx8fThuVMHvJkq6S3ON6vTKZDL29rwAzyPVwt7QsoLl5LrAPGAIOcOhQ\nbf9NG2OMMbUuqVdiC1V1L4Cq9gAL3fFTgNcC5V53x04BdgeO73bHxj1GVUeBPhGZG17o9avQhWup\njaB6W0yj0IJAU1kBM5PJcODAa7S0zANm09w8m7a2NpYtW8aMGXPJXcTDUMlzHBcvfgdr136U+fPP\niHxLhXpcNCmnktzjer1efvllYBj/v9osTzzxEL29rzB9+hyCw6Vr/W/a1IL2uAOISHvcAUSkPe4A\nItIedwARaY87gIi0xx1AQWlZaUKreK6CiyHcfvvtx2+3t7fT3t5exaetD7kL15xyFvnINTzLWbwl\nCiMjI5HGNL7ndS47duwoq/e2qamJfftedgvk7Gf+/DN4441XOHjwdebNW8LAwNh+mWHHYioT9Wdu\nqnJf+vT3+6MNcns4Hj160C2Y47Fy5cpYc/E8D8/zYnt+Y4wxJvXinjfh5k6czvg5jtuBRe72YmC7\nu30rcEug3EPARcEy7vhHgK8Fy7jbDUBvofkbprqOHTum69ev17F5T03a1dVV1jmGhoa0o6NDR0ZG\nQoqyuCjnXR47dky7uromPGclc9XG5pv6r3tnZ6d2dXXp0NCQdnV1lXzOsXlzjdrcvDBRc9SSIPee\nVXM+YdifuTBizj9v/uev3L/7KFBkDof92BzH8s6flNjLKd8R8vkrLW9zHCsrm59n0mKvVvnJ8kxL\n7OWUL5RnJeevsTmOjjC+J3ADcLO7fRPww8Dxj7iVUs8AzgKeVX84a7+IXCgiAnws7zE3udsfBB4L\nLQsDjN9DcO3aDwPTqWSo2vDwMDNmLOaKK65j2rQFDA8PhxZzIWHOuwwO4a10/8tC52xrazs+7Le5\neS6XXfbbnHvu+SxceCZtbW0lnzM3x7GlZQFHjvTFMlw1qaYypLiYsD9zYcQM44fJ1tuwc2OMMaYu\nJOBbzHuB3+BPvvo18HFgDvBT4AXgEWB2oPzn8VdT3Q5cGzh+PtCFv2DOXYHj04D73fGngSWFvk01\nUzfWW9KowRUW169fP66Ho5SexI6ODg32WnR0dIQSb7Hel7BWqszvVers7NSp9tDkn/PNN9/Uzs5O\nt+Jl5eeuRmy1KKxetTBXR/VjblR4RqEx1PcyrJ7NaqHIN6r2U889jpWUT1IsaS+fpFiSVj5JsSSt\nfJJiSVr56vY45rayqHsiovZaTN22bds499zzgTfw1yUamrDheK4ncXT0CA0NzQwO9tDU1DThXKOj\no0ybtuB4uaGhfTQ0NFQt1lLnX4Yx32zsdToAzOX555/i8svfy8DA/oo3aM8/Z1fX8wCce+4qYBGw\nj5aWefT37y753CMjI8ydezqHDx8Ghpg5cyEHD9bXCqeFZLNZ5s49/fjnp5ormYY1x3F4eJhp0xbg\nr7o7naGhfZP+7dUDEUELbHBci0RkHfBeYK+qrnDH5gDfwZ8u8irwIVXtL/B4peTlBp4DLqT08pCs\nDbPLLZ+kWNJePkmxJK18kmJJWvkkxZK08pWcm4L1o139maoaG6I2n9bWVrZseW7CBfWTTz7J6OgR\n4ACjo0d48sknJz1XQ0MDg4M9dHQ8XPVGI5Q+JDCMlSqXLVvGzJn+UL7W1vlceeX7GRjYR3PzbHp7\nXyr7uUZGRshmsxOGB/rvx2JgL83Nszl48NdlnXvHjh0cPvwGudUyf/7zn1T0OlS6vUiSVWv7i8le\nm7BWR925cydjW7UcdfdNnfgGcF3esVuBn6rq2fjTOD4feVSJ48UdQES8uAOIiBd3ABHx4g4gIl7c\nAUTEizuAgqzhaKoqeDHd1/caK1asIJvNsnnzZrZu3Uo2m+Wyyy6joaEZmEtDQzOXXXbZ8cfnX0Q3\nNTXR3t5e9UYjxLv9RzabRTULZBkdHXYN2D6OHOkr+2I+13N63nkXkM1m6ex85nhDZuz96OTAgdfY\nsWNHWY23qe7NGYwvjHl1USjW6J1qAy+q12ayua8297C+aHl7JhtjjDETWMPRVF3wYjo31HHVqjWc\nd94FzJlzOqo6aU/iZBfRYfZUxbnB/FhPXh+Dg31u38XKLuaDPaeHD79BY2PjuFwaGxuPb49QbgOl\nGq9RmIu9hO1EDbupfj6jeG2qtfCSqUmF9kyuY+1xBxCR9rgDiEh73AFEpD3uACLSHncAEWmPO4CC\n7KrBVFX+hbTfQOolt/H8oUP+xfFkPYn5F9Hbtm0LvTcmrg3Tx/d2Lmbv3hdZv/7bvPHGK2XHUkrP\n6VQaKFN9jdK8wmax160avYVRvDZjOfTS39/Dzp07Y/nMm1Q4wUSYm4Hb3c+djB9O5TFxeFWx39da\nebtv98O+zwl+X8/l8x9j5cu7fydj/7+fQNwrtSXlx38pzFRMtv/c6OiotraerNCqJ1olMn81yS1b\ntmgtr+aZW3VyaGho3F6JQ0NDFZ8r6tVhqxVfUhV73aq1QmnYr83Y32CLQqO2tCzW4eHhUJ4rTSiy\nalyt/lDinskFHlvGqnxpXlW1o4LzJyX2csp3hHz+SsvbPo6Vlc3PM2mxV6v8ZHmmJfZyyhfKs5Lz\n1+Y+jqYGTNY7k8lkOHDgV3R2Pj7pQjlB+cMily9fntqeqlLkevJ27txJf38PsIgjR/qYN29J2b1X\nJ+oVjHNYbinxJVWx123p0qXADOAyYIa7X76wX5tMJoPn/Qi/LpjOwMABLr74qqoP/87t35qby2wS\nqdQ9k40xxpgJbDsOx7bjmLpKtycotvVAWNsSJEk2m2XmzLdy5Egfwa00KlmIppg0vpZJjnmy7U9K\nec/i+Lzv2bOHk08+HXgL0Etj40J2736ZRYsWVeX8R48eZd68JQwODpLbtmX//sm3t0mKOtyO4178\niTPzgL3AbcAPgO8CpwK/wt+Oo6/A4xXbjiMFsaS9fJJiSVr5JMWStPJJiiVp5au7HYc1HB1rOFZH\nuRe+pe6lWOuGh4eZN2/JlPZxLCaNr3PSY67ki5JiOVUr38n+BlWVNWtuYOPGnwPHuPTSK3n88QcR\nmXq7aWRkhNmzT+HIkQP40+bD+/Kjmuqt4ThV1nBMSyxpL5+kWJJWPkmxJK18kmJJWnnbx9EkWLnD\n7vIX7uju7g43wIRqamri4MFfT2koabEVPtO4smnSY65k+G+xz3s18i20YI+I8K//uoHW1jmA0NX1\nS0ZHR8s+f6Gc/EbjAmAatTq03NQLL+4AIuLFHUBEvLgDiIgXdwAR8eIOICJe3AEUZA1HE6tly5bR\n2joff6RUhjVr3pO6ff6qZSpz3U60wmcaVzZNQ8zlvmfjP+/w7ndfw/Dw8PHfTTXfYg3TnTt33IAq\nKQAAFJtJREFUcvjwPqrdEPfjXgzs46STpo3bR9QYY4wxtcNqdhOrTCbD44//hNx2HUnsWUqDE/VW\nxb04TiXSGPOJjH3e3yR/MaSp5jsyMkI2my34RUxYDfGxuDsZGNjLypUra+K9MvWqPe4AItIedwAR\naY87gIi0xx1ARNrjDiAi7XEHUJDV7iZ0J9okfcWKFe6CdhbTp7dw7NgxW5WxTIUaBcHXPo0rm6Yx\n5hNZsWIFzc1zAb/3b2Bg//GGfmNjI21tbXR3d5f1N5DrcT7vvAsYHR1msi9istksnvejE65uXIla\nfJ+MMcYYM17d1PIicr2I7BCRnSJyS9zx1IsTDaEcGRmhu7ub3bu3A80cPXqM1avfxZw5p9XtkNVK\nTNZbVY0N6k31+VvUvEZLyzwma+hX8p4Fe5wHB/smnDt33lWrLuLSS2+o+pYZJ/pyyJj08OIOICJe\n3AFExIs7gIh4cQcQES/uACLixR1AQXXRcBSRDPAV4DrgncBHRaQt3qjqQ7EhlMGL5EWLzgD8pfzh\nAIcO7bMhq2XK7/WxhYeSq9BiSPl/L9u2bSupQTa+x3kx+/e/Ou7cwc/C4cOHWbXqoqp9mWBfUBhj\njDH1oS624xCRdwG3qeoN7v6tgKrqFwJlbDuOEBTbsmD8PnizgGb8JYP9feAOHqyNeW3FhLlPYTab\nZfbsUzl8+DAwlMgtLcx4wb+X1tb5ZDKZkrfnKPZZGjtvD9XcMmNkZIQNGzawdu1Hq3bOqNh2HOWx\n7TjSEkvayycplqSVT1IsSSufpFiSVt6246jEKcBrgfu73TETsmILfozvJXkrb765l0cf/T6bNz9b\nN43GMHtqbOGh9An+vWzc+GBZ23MUm2eYO++WLc9XbYGc3Od37doPA9Orck5jjDHGJJd1PQTcfvvt\nx2+3t7fT3t4eWyy1JHdBmy93MRvsJbn66qtjiDAe44clzmXHjh1V76nJLTzU328X9WmR+3vJZrNV\nfe8aGxtZsWLFhL+5So19fvuA2axf/x1uvPHGxH7h43kenufFHYZJPI8kr2hYPR6WZy3xsDxriUdS\n86ynoaq3q+r17r4NVTWxKzaMt5rCHA5rwpXk9y6qz29YbKhqeepnqKqHf8FW68PkPMYuTJMQT1jn\n9hh/AZ6kXMstX6ysx8SGRpJir1Z5j8kbVGmIvZzyHsUbjvENVa2XhmMD8AJwFbAHeBb4qKpuD5Sx\nhqOJXJIbBsacSJo/v9ZwLE/9NBwrKZ+kWNJePkmxJK18kmJJWvkkxZK08tZwrIiIXA/chT+vc52q\n3pH3e2s4GmNMnbCGY3ms4ZiWWNJePkmxJK18kmJJWvkkxZK08rY4TkVU9SFVPVtV35HfaDTGGGOM\nSfL+adXlxR1ARLy4A4iIF3cAEfHiDiAiXtwBFFQ3DUdjjDHGGGOMMZWpm6GqJ2JDVY0xpn7YUNXy\n2FDVtMSS9vJJiiVp5ZMUS9LKJymWpJW3oarGGGOMMcYYYyJkDUdjjDHGGCDJc4uqy4s7gIh4cQcQ\nES/uACLixR1ARLy4AyjIGo7GGGOMMcYYY4qyOY6OzXE0xpj6YXMcy2NzHNMSS9rLJymWpJVPUixJ\nK5+kWJJW3uY4GmOMMcYYY4yJkDUcjTHGGGOAJM8tqi4v7gAi4sUdQES8uAOIiBd3ABHx4g6gIGs4\nGmOMMcYYY4wpyuY4OjbH0Rhj6ofNcSyPzXFMSyxpL5+kWJJWPkmxJK18kmJJWnmb42iMMcYYY4wx\nJkLWcDTGGGOMAZI8t6i6vLgDiIgXdwAR8eIOICJe3AFExIs7gIJiaziKyAdEZJuIjIrI6rzffV5E\ndonIdhG5NnB8tYhsFZGdInJn4HiTiNznHvOUiJwW+N1NrvwLIvKxaLJLFs/z4g4hFLWaF9RubpZX\n+tRybsYnIteLyA5XV94Sdzzx2hx3ABGxPGuL5VlbkptnnD2OXcDvAj8LHhSRc4APAecANwBfFZHc\nONuvAZ9Q1aXAUhG5zh3/BHBAVd8B3Al80Z1rDvBfgAuAi4DbRGRWqFklUK1e+NVqXlC7uVle6VPL\nuRkQkQzwFeA64J3AR0WkLd6o4tQXdwARsTxri+VZW5KbZ2wNR1V9QVV3kZuFOeb9wH2qOqKqrwK7\ngAtFZDHQqqrPuXL3ADcGHnO3u/094Ep3+zrgEVXtV9U+4BHg+lASMsYYY9LnQmCXqv5KVY8B9+HX\nqcYYY8w4jXEHMIlTgKcC9193x0aA3YHju93x3GNeA1DVURHpF5G5weN55zLGGGPMxHpyN35jcoKZ\nM3+npBOOjvZx5MjUA4vHq3EHEJFX4w4gIq/GHUBEXo07gIi8GncAEXk17gAKCnU7DhF5FFgUPIS/\nJuxfqeqPXJkO4D+q6iZ3/8vAU6p6r7v/T8ADwK+Af1DVa93xS4G/UNX3iUgXcJ2q/sb97kX8iu/j\nwDRV/Xt3/D8Dg6r6pUlitb04jDGmjth2HCAia/Hrzz9y938fuFBVP5tXzupIY4ypE4Xqx1B7HFX1\nmgoe9jpwauD+29yxQseDj/mNiDQAM1X1gIi8DrTnPaajQKx1fwFhjDGm7rwOnBa4H6xbj7M60hhj\nTFK24whWSBuAj7iVUs8AzgKeVdUeoF9ELnSL5XwM+GHgMTe52x8EHnO3HwauEZFZbqGca9wxY4wx\nxsBzwFkicrqINAEfwa9TjTHGmHFim+MoIjcCXwbmAz8Wkc2qeoOqdovI/UA3cAz4tI6Np/0M8C/A\ndOABVX3IHV8HfFNEdgH78Ss+VPWgiPwt8Av8IbJ/4xbJMcYYY+qeWxfgj/EXj8sA61R1e8xhGWOM\nSaBQ5zgaY4wxxhhjjEm/pAxVDZ2IfEBEtonIqIiszvvd50Vkl4hsF5FrA8dXi8hWtynynYHjTSJy\nn3vMUyISnB+SGGnc1FlE1onIXhHZGjg2R0QeEZEXROTh4F6c5b53cRGRt4nIYyLySxHpEpHPuuOp\nzk1EponIMyLS6fK6zR1PdV45IpIRkU0issHdr5W8XhWRLe59e9YdS31ublrCd12cvxSRi2ohrzhZ\nPZLca4Ao6pUk5BpFPZOEPAOxhFbvJCXPsOugBOUZap0US56qWhc/wNnAO/DnP64OHD8H6MQftrsE\neJGxnthngAvc7QfwV54D+BTwVXf7w/j7TsaeY16+GZfL6cBbgM1AW9xxlRD3pcBKYGvg2BfwV9AF\nuAW4w91eVu57F2Nei4GV7nYL8ALQViO5zXD/NgBP469onPq8XBx/BnwL2FArn0UXx8vAnLxjqc8N\nfyrDx93tRmBWLeQV4+tp9UiCrwGIoF5JUK6h1jNJydM9f2j1TlLyJOQ6KEF5/gsh1klx5BnLH0Wc\nP/irqgYbjrcCtwTuPwhchP8fcnfg+EeAr7nbDwEXudsNwL6485okz3cBDxbKM8k/+BcpwQp/B7DI\n3V4M7Kj0vUvKD/AD4Opayg2YgT+f+IJayAt/dclH8VdmzlXgqc/LxfEKMC/vWKpzA2YCL01yPNV5\nxfw5sXpkks8BCb0GIIR6JWm5ElI9k5Q8CbneSVCeodZBSciTCOqkOPKsm6GqReRvfvy6O3YK/kbI\nObvdsXGPUdVRoE9E5oYfalkm29T5lAJlk26hqu4FUH913YXueCXvXexEZAn+t+FP4//nkerc3LCa\nTqAHeFRVn6MG8gL+B/Cf8BfWyqmFvMDP6VEReU5E/tAdS3tuZwBviMg33DCv/yMiM0h/XnGyemRM\noq8BQqxXEpFrBPVMIvIk/HonKXmGXQclIc8o6qTI86yphqOIPOrGAOd+uty/vxP2U4d8fjOenrhI\nMolIC/A94HOqOsDEXFKXm6pmVXUV/jelF4rIO0l5XiLyHmCvqm6m+N93qvIKuERVVwO/DXxGRC4j\n5e8Z/vCe1cD/crkdwf8GN+15mXBU83MQ6zVAxPVKLLnGUM9EnmdM9U5cn92o66A48oyjTgo9z5pq\nOKrqNaq6IvBzrvv3R0Ue9jpwauB+bvPjQsfHPUZEGoCZqnqgaolUR0mbOqfEXhFZBCAii4Fed7yS\n9y42ItKIX7l/U1Vze5DWRG4AqnoI8IDrSX9elwDvE5GXgW8DV4rIN4GelOcFgKrucf/uwx/ediHp\nf892A6+p6i/c/fX4lXba84qT1SMTj497TNzXABHUK4nJFUKtZ5KQZxT1ThLyjKIOSkKeUdRJkedZ\nUw3HMgRb5BuAj7iVic4AzgKedd3H/SJyoYgI8DHgh4HH3ORufxB/wZ2kSfOmzsLE9+hmd/smxr8P\n5b53cfpn/HHqdwWOpTo3EZmfWxFMRE4CrgG2k/K8VPUvVfU0VX07/t/OY6r6B8CPSHFeACIyw/VQ\nICLNwLVAF+l/z/YCr4nIUnfoKuCXpDyvmFk9kvxrgLDrldhzjaieiT3PiOqd2POMqA6KPc+I6qTo\n8wx7EmVSfoAb8ccBvwnsYfyE/8/jr160Hbg2cPx8/A/zLuCuwPFpwP3u+NPAkrjzK5Dz9firrO0C\nbo07nhJjvhf4DTAE/Br4ODAH+KnL5RFgdqXvXYx5XQKM4q9K2Alscu/P3DTnBpzrctkMbAX+yh1P\ndV55OV7O2CIFqc8Lf95F7nPYlfu/oUZyOw+/sbMZ+D7+Cnapzyvm19TqkYReAxBBvZKEXImgnklC\nnnk5h1LvJCFPIqiDkpCniyPUOimOPHPLvBpjjDHGGGOMMZOq16GqxhhjjDHGGGNKZA1HY4wxxhhj\njDFFWcPRGGOMMcYYY0xR1nA0xhhjjDHGGFOUNRyNMcYYY4wxxhRlDUdjjDHGGGOMMUVZw9GYABGZ\nKyKdIrJJRPaIyG53u1NENkYYR6jPJSLrRGSviGwtoezlInJxyPF8Q0T+TRnlbxKRxWHGZIwxJvlE\n5LD793QRGXR19jYR+WqB8p8VkW4R+WbIcd0kIv/T3b4tcD3xgoh8T0TOCfP5jQmDNRyNCVDVA6q6\nSlVXA18DvqSqq92xSyOMI+zn+gZwXYll24F3hxdKRW4GTok7CGOMMbELbkj+oqu/zwPeKSI3TlL+\nU8DVqvoHwYMi0hBijDB2PXE2/qbtj4nIvJCf05iqsoajMYXJuDtj32peLiKeiPxARF4UkX8Qkd8T\nkWdEZIuInOHKzXffKj7jfiY0vkRkmfvdJhHZLCJnTvJcHSLyXRHZHvyGVEQuEJEn3OOeFpFmEcmI\nyBfdOTeLyL+fLDFV3QgcnCSez4rIL91j7xWR04FPAn/qYrwkr/xtInKPiDzpvkX9Q3e8WUR+KiK/\ncK/J+wKP+Zg71ikid08Sw9+KyD+Lb7V7rZ8TkQdFZLGIrAV+C/iWi2lagfcPEfmgiHS55/IKlTPG\nGFM7VHUUeBI4K3hcRL4GvB14UEQ+F6jDNgL3uF7Lx13d9QsReZd7nIjIV11P5cMi8pNyRslMEt/9\nwMPA71WcpDExaIw7AGNSJPit5gqgDegDXgb+UVUvEpHPAn8C/DlwF/43jE+KyKn4lcSyvHN+ErhT\nVb8tIo1A7hvP4HOtdI/rAZ5wDdDngPuAD6rqJhFpAY4CnwD6XCxNrvwjqvqrEnO8BViiqsdEZKaq\nHhKRrwOHVfVLBR5zLnAR0Ap0isiPgX3Ajao64L5RfRrYICLvBP4SuFhVD4rI7MB5RES+CLSo6r9z\nr8eXgfep6n4R+RDwd6r6CRH5Y+DPVbXzBPn8NXCtqu4RkZklvgbGGGPSSQBEZAZwFX4dcJyqfkpE\nrgPaXR10G3AOcImqDovIdPzeyGEROQv4NnABsBY4TVWXicgiYDuwboqxduJfRxiTGtZwNKYyz6lq\nL4CIvAQ84o534Q/tBLgaOEdEcj2XLSIyQ1UHA+d5CvgrEXkb8P9U9cVJnutZVd3jnmszsAQ4BPxG\nVTcBqOqA+/21wLki8kH32JnAO4BSG45bgHtF5AfAD0p8zA9VdRjYLyKPARcCDwB3iMhlQBY4WUQW\nAlcA31XVgy7uvsB5/hp4WlU/6e6fDSwHHnWvYQb4TaD8uB7hAjYCd4vI/cD3S8zHGGNMOp0pIpvw\nv3z9gao+PEkZYXz9scHVYQBNwFdEZCUwil9/AlwCfBdAVfeKSEcVYi2lDjMmUazhaExlhgK3s4H7\nWcb+rgS4SFWPFTqJ62l8Gngv8ICI/JGqekWeazTv/PkE+BNVfbSkLCZ6D7AGeB9+g3Z5CY8J9o6K\nu/9vgXnAKlXNisgrwPQicQM8C5wvInNcw1KAbap6SYHyJw5M9dMicgH+6/u8iKzONVqNMcbUnNwc\nx3IcCdz+M6BHVVeIP+fxzeqFNsEq/NFDxqSGzXE0pnTlfjv4CPC54w8WOW/CCUXOUNVXVPXLwA/x\nh8CW8lwvAItF5Hx3nhZXyT0MfNoN80RE3iEiJxU4x7hvXV2v3mmq+jPgVvzeyhbgsLtdyPtFpMkN\nSb0cvyKcBfS6RuMVwOmu7GPAB0RkrnvOOYHzPATcAfxERJpdjgsCc0waRSQ31PdQMCYR+XsRef+E\nBEXerqrPqeptQC9wapE8jDHGpI8UuF2JWcAed/tjjE0feQJY6+Y6LmJsZFE5gvXtWuAa/KGwxqSG\nNRyNKZ2WefxzwG+5hWC2Af9hkjIfEn/Z8E7gncA9pTyX68X8MP6Qms34jdRpwD8B3cAmEekCvs4k\nIwtE5F78hQOWisivReTj+BXkt0RkC/A8cJeqHgJ+BPyuTLI4jrMV8Nz5/quq9gD/F7jAnev38eeD\noKrdwN8BP3M5//e8vNYD/whswP//6QPAF1yOnUBuW5C7ga+7mKbjz7PsmSS2/yYiW8XfduQJVT3h\n9iPGGGNSRQvcLqV8vq8CN7v6aSljvZHrgd3AL/Hr6eeBfgAR+RsReW8Jz5tbZO4F/EVxrlTV/SU8\nzpjEENVS/saMMWYit7BAsYVzoorjQVW9Ic4YjDHG1C4RaVbVI27EzDP4C+r0xh2XMVGyOY7GmNSz\nRqMxxpiQ/ditBP4W/NE11mg0dcd6HI0xxhhjjDHGFGVzHI0xxhhjjDHGFGUNR2OMMcYYY4wxRVnD\n0RhjjDHGGGNMUdZwNMYYY4wxxhhTlDUcjTHGGGOMMcYU9f8BfqH6fz6r2A4AAAAASUVORK5CYII=\n",
"text/plain": [
""
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"dsa = d_good[d_good.flags != '*******A**S*']\n",
"\n",
"fig = plt.figure(); fig.set_figwidth(15); fig.set_figheight(3)\n",
"\n",
"ax = fig.add_subplot(1, 2, 1)\n",
"ax.scatter(dsa.time_epoch, dsa.intid, marker='.')\n",
"ax.set_xlabel('Time since 1st packet, s'); ax.set_ylabel('IP frag. ID')\n",
"ax.set_title('IP ID for non-SYN-ACK packets from server');\n",
"\n",
"ax = fig.add_subplot(1, 2, 2)\n",
"dsa.intid.hist(bins=32, ax=ax)\n",
"ax.set_xlim(0, 2**16)\n",
"ax.set_xlabel('IP frag. ID'); ax.set_ylabel('Packets')\n",
"ax.set_title('IP ID for non-SYN-ACK packets from server');\n",
"\n",
"print 'Min/Max IP ID observed for non-SYN-ACK packets:', dsa.intid.min(), dsa.intid.max()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Good server replies with `IP-ID=0` in `SYN-ACK` and almost never has `IP-ID=0` in other packets, IP-ID is rather random for other packets."
]
},
{
"cell_type": "code",
"execution_count": 18,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"image/png": "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\nDbS2ttLc3MysWbO44IILet2mCxYs4JxzzmHNmjUMHz6cz372s7zvfe9j2LBhvPjii7zyyis8+OCD\nTJ8+nZ122qnLftLR0dGl3dXsR/llgIr9VqqnFMPEiRN54IEHetxOleRjATZux3HjxvHiiy8ybNgw\nrr76an7xi1+w++678/d///e91rtgwQK+9rWvsW7dOlpbW2lqamLDhg2MHTuWJ554gtWrV9PU1ERD\nQwMtLS2ceuqpfOMb3+ixvuXLl3PuuefS0dEBwIYNGxg/fjwbNmzg7rvvZsOGDbS0tPDyyy8zatQo\nvv71r/drf+/o6OCmm25i1apV3HTTTTz77LM0NDTw/PPP8+qrr/Lqq69SX1/PnnvuybHHHsuJJ57Y\n6747aERErwPQll7vTK9DgXv6Wq5CPROBR4BhwDLgqFR+OvBcGv8R8JHcMj8B3g8cBCzOlR8KXJfG\nVwJ75KatAkZXWH8MRpdffmW0tIyOESMOjJaW0XH55VfWtP79958WUJ8bWsre1wc05KY1l5U15sZL\n80wOaInRo3ferNgOP3xWl/pmzpy1cdrll18ZjY3DA1oDJkVT04iNfZPvs7q6llTHXgEtMXv2nIrr\nGjt2zwrtLu+XLI76+qZe6mjoo5761IetAa8PaOlxm3aNqSVg9y6vdXU759rWHA0NwzfuJ519l7X7\n8MNn9bkfzZ59Wm6Zxor9VurblpbXBbRES8vU1J7K26mS/PZpbBwe9fVDU39k7WpsHJ/bx/qut/K2\na+hhW3TW19TUUrG+rO/K62rsc7+odn/P+rm5h/rK19lZf0/77kBLn539+rzvaagmUfw98K/Aw8Bn\ngFuBOf1aSZZkfgscnd7vTXZ0cgdwFvBk1C7hPNhTwpk7d+7GYcmSJbXdKgNg3bp10dIyOuDugAi4\nO1paRse6detqUv/ChQsD6gIIUNq5P5N29rpU1pSmtwScm6Y1pWnNabwu98fXGSu0xLx58zYptmXL\nllWsb9myZbFu3boYMmRkwKhufdPe3p7rs/aKdbS3t3dZ12WXXZbaWEqg5D5gqFjH6aefXqGOprSc\ncvUpVx8BQ7rF3dAwvNs2zepT6tuWgCUBo3Ov1+TiWldWZ35apGW6tqF8P2pvz/dV5X5btmxZ6ttS\nDHcH9LydKum6T68LGJFiz7evNfVl3/V2brtSgqlLy5b227rcvty9vrPOOqvCflfaD+pTPc0VtuOm\n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\n",
"text/plain": [
""
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"plt.scatter(d_good.time_epoch, d_good.window_size)\n",
"plt.xlabel('Time since 1st packet, s'); plt.ylabel('TCP Window, bytes');\n",
"plt.title('TCP Window announced by server');"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Good server has window size in 25k…31k range (scaling is applied)."
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Bisect bad streams one-by-one"
]
},
{
"cell_type": "code",
"execution_count": 19,
"metadata": {
"collapsed": false
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"[117, 268, 274, 278, 287, 294]\n"
]
}
],
"source": [
"print sorted(s_bad)"
]
},
{
"cell_type": "code",
"execution_count": 20,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"text/html": [
"\n",
"
\n",
" \n",
" \n",
" | \n",
" time_epoch | \n",
" stream | \n",
" id | \n",
" ttl | \n",
" len | \n",
" seq | \n",
" ack | \n",
" flags | \n",
" window_size | \n",
" tsval | \n",
" ack_rtt | \n",
"
\n",
" \n",
" \n",
" \n",
" 1188 | \n",
" 1589.229151 | \n",
" 117 | \n",
" 0x00000000 | \n",
" 54 | \n",
" 0 | \n",
" 0 | \n",
" 1 | \n",
" *******A**S* | \n",
" 28960 | \n",
" 3.100932e+09 | \n",
" 0.103577 | \n",
"
\n",
" \n",
" 1191 | \n",
" 1589.274511 | \n",
" 117 | \n",
" 0x00003412 | \n",
" 59 | \n",
" 99 | \n",
" 1 | \n",
" 213 | \n",
" *******A***F | \n",
" 513920 | \n",
" NaN | \n",
" 0.045109 | \n",
"
\n",
" \n",
" 1193 | \n",
" 1589.374932 | \n",
" 117 | \n",
" 0x00003412 | \n",
" 59 | \n",
" 0 | \n",
" 101 | \n",
" 214 | \n",
" *******A**** | \n",
" 513920 | \n",
" NaN | \n",
" 0.099951 | \n",
"
\n",
" \n",
" 1226 | \n",
" 1709.330761 | \n",
" 117 | \n",
" 0x00003f9c | \n",
" 54 | \n",
" 212 | \n",
" 1 | \n",
" 1 | \n",
" *******A***F | \n",
" 26000 | \n",
" 3.101052e+09 | \n",
" NaN | \n",
"
\n",
" \n",
" 2583 | \n",
" 2705.941551 | \n",
" 268 | \n",
" 0x00000000 | \n",
" 54 | \n",
" 0 | \n",
" 0 | \n",
" 1 | \n",
" *******A**S* | \n",
" 28960 | \n",
" 3.102049e+09 | \n",
" 0.110307 | \n",
"
\n",
" \n",
" 2586 | \n",
" 2705.987294 | \n",
" 268 | \n",
" 0x00003412 | \n",
" 59 | \n",
" 99 | \n",
" 1 | \n",
" 248 | \n",
" *******A***F | \n",
" 513920 | \n",
" NaN | \n",
" 0.045296 | \n",
"
\n",
" \n",
" 2588 | \n",
" 2706.086246 | \n",
" 268 | \n",
" 0x00003412 | \n",
" 59 | \n",
" 0 | \n",
" 101 | \n",
" 249 | \n",
" *******A**** | \n",
" 513920 | \n",
" NaN | \n",
" 0.097518 | \n",
"
\n",
" \n",
" 2655 | \n",
" 2826.044916 | \n",
" 268 | \n",
" 0x0000ee27 | \n",
" 54 | \n",
" 212 | \n",
" 1 | \n",
" 1 | \n",
" *******A***F | \n",
" 26000 | \n",
" 3.102169e+09 | \n",
" NaN | \n",
"
\n",
" \n",
" 2649 | \n",
" 2816.015924 | \n",
" 274 | \n",
" 0x00000000 | \n",
" 54 | \n",
" 0 | \n",
" 0 | \n",
" 1 | \n",
" *******A**S* | \n",
" 28960 | \n",
" 3.102159e+09 | \n",
" 0.103654 | \n",
"
\n",
" \n",
" 2652 | \n",
" 2816.059978 | \n",
" 274 | \n",
" 0x00003412 | \n",
" 59 | \n",
" 99 | \n",
" 1 | \n",
" 135 | \n",
" *******A***F | \n",
" 513920 | \n",
" NaN | \n",
" 0.043669 | \n",
"
\n",
" \n",
" 2654 | \n",
" 2816.158736 | \n",
" 274 | \n",
" 0x00003412 | \n",
" 59 | \n",
" 0 | \n",
" 101 | \n",
" 136 | \n",
" *******A**** | \n",
" 513920 | \n",
" NaN | \n",
" 0.097502 | \n",
"
\n",
" \n",
" 2668 | \n",
" 2936.120685 | \n",
" 274 | \n",
" 0x0000b7b4 | \n",
" 54 | \n",
" 212 | \n",
" 1 | \n",
" 1 | \n",
" *******A***F | \n",
" 26000 | \n",
" 3.102279e+09 | \n",
" NaN | \n",
"
\n",
" \n",
" 2689 | \n",
" 3010.763798 | \n",
" 278 | \n",
" 0x00000000 | \n",
" 54 | \n",
" 0 | \n",
" 0 | \n",
" 1 | \n",
" *******A**S* | \n",
" 28960 | \n",
" 3.102353e+09 | \n",
" 0.105807 | \n",
"
\n",
" \n",
" 2692 | \n",
" 3010.808310 | \n",
" 278 | \n",
" 0x00003412 | \n",
" 59 | \n",
" 99 | \n",
" 1 | \n",
" 204 | \n",
" *******A***F | \n",
" 513920 | \n",
" NaN | \n",
" 0.043931 | \n",
"
\n",
" \n",
" 2695 | \n",
" 3010.907740 | \n",
" 278 | \n",
" 0x00003412 | \n",
" 59 | \n",
" 0 | \n",
" 101 | \n",
" 205 | \n",
" *******A**** | \n",
" 513920 | \n",
" NaN | \n",
" 0.098339 | \n",
"
\n",
" \n",
" 2721 | \n",
" 3130.868194 | \n",
" 278 | \n",
" 0x0000635e | \n",
" 54 | \n",
" 212 | \n",
" 1 | \n",
" 1 | \n",
" *******A***F | \n",
" 28960 | \n",
" 3.102473e+09 | \n",
" NaN | \n",
"
\n",
" \n",
" 2810 | \n",
" 3368.165062 | \n",
" 287 | \n",
" 0x00000000 | \n",
" 54 | \n",
" 0 | \n",
" 0 | \n",
" 1 | \n",
" *******A**S* | \n",
" 28960 | \n",
" 3.102711e+09 | \n",
" 0.267423 | \n",
"
\n",
" \n",
" 2813 | \n",
" 3368.370601 | \n",
" 287 | \n",
" 0x00003412 | \n",
" 59 | \n",
" 99 | \n",
" 1 | \n",
" 199 | \n",
" *******A***F | \n",
" 513920 | \n",
" NaN | \n",
" 0.205282 | \n",
"
\n",
" \n",
" 2815 | \n",
" 3368.389520 | \n",
" 287 | \n",
" 0x00003412 | \n",
" 59 | \n",
" 0 | \n",
" 101 | \n",
" 200 | \n",
" *******A**** | \n",
" 513920 | \n",
" NaN | \n",
" 0.018347 | \n",
"
\n",
" \n",
" 2834 | \n",
" 3488.267293 | \n",
" 287 | \n",
" 0x0000004f | \n",
" 54 | \n",
" 212 | \n",
" 1 | \n",
" 1 | \n",
" *******A***F | \n",
" 26000 | \n",
" 3.102831e+09 | \n",
" NaN | \n",
"
\n",
" \n",
" 2901 | \n",
" 3843.076695 | \n",
" 294 | \n",
" 0x00000000 | \n",
" 54 | \n",
" 0 | \n",
" 0 | \n",
" 1 | \n",
" *******A**S* | \n",
" 28960 | \n",
" 3.103186e+09 | \n",
" 0.101271 | \n",
"
\n",
" \n",
" 2904 | \n",
" 3843.120540 | \n",
" 294 | \n",
" 0x00003412 | \n",
" 59 | \n",
" 99 | \n",
" 1 | \n",
" 216 | \n",
" *******A***F | \n",
" 513920 | \n",
" NaN | \n",
" 0.043557 | \n",
"
\n",
" \n",
" 2907 | \n",
" 3843.220894 | \n",
" 294 | \n",
" 0x00003412 | \n",
" 59 | \n",
" 0 | \n",
" 101 | \n",
" 217 | \n",
" *******A**** | \n",
" 513920 | \n",
" NaN | \n",
" 0.099845 | \n",
"
\n",
" \n",
" 2964 | \n",
" 3963.177494 | \n",
" 294 | \n",
" 0x00009fdf | \n",
" 54 | \n",
" 212 | \n",
" 1 | \n",
" 1 | \n",
" *******A***F | \n",
" 26000 | \n",
" 3.103306e+09 | \n",
" NaN | \n",
"
\n",
" \n",
"
\n",
"
"
],
"text/plain": [
" time_epoch stream id ttl len seq ack flags \\\n",
"1188 1589.229151 117 0x00000000 54 0 0 1 *******A**S* \n",
"1191 1589.274511 117 0x00003412 59 99 1 213 *******A***F \n",
"1193 1589.374932 117 0x00003412 59 0 101 214 *******A**** \n",
"1226 1709.330761 117 0x00003f9c 54 212 1 1 *******A***F \n",
"2583 2705.941551 268 0x00000000 54 0 0 1 *******A**S* \n",
"2586 2705.987294 268 0x00003412 59 99 1 248 *******A***F \n",
"2588 2706.086246 268 0x00003412 59 0 101 249 *******A**** \n",
"2655 2826.044916 268 0x0000ee27 54 212 1 1 *******A***F \n",
"2649 2816.015924 274 0x00000000 54 0 0 1 *******A**S* \n",
"2652 2816.059978 274 0x00003412 59 99 1 135 *******A***F \n",
"2654 2816.158736 274 0x00003412 59 0 101 136 *******A**** \n",
"2668 2936.120685 274 0x0000b7b4 54 212 1 1 *******A***F \n",
"2689 3010.763798 278 0x00000000 54 0 0 1 *******A**S* \n",
"2692 3010.808310 278 0x00003412 59 99 1 204 *******A***F \n",
"2695 3010.907740 278 0x00003412 59 0 101 205 *******A**** \n",
"2721 3130.868194 278 0x0000635e 54 212 1 1 *******A***F \n",
"2810 3368.165062 287 0x00000000 54 0 0 1 *******A**S* \n",
"2813 3368.370601 287 0x00003412 59 99 1 199 *******A***F \n",
"2815 3368.389520 287 0x00003412 59 0 101 200 *******A**** \n",
"2834 3488.267293 287 0x0000004f 54 212 1 1 *******A***F \n",
"2901 3843.076695 294 0x00000000 54 0 0 1 *******A**S* \n",
"2904 3843.120540 294 0x00003412 59 99 1 216 *******A***F \n",
"2907 3843.220894 294 0x00003412 59 0 101 217 *******A**** \n",
"2964 3963.177494 294 0x00009fdf 54 212 1 1 *******A***F \n",
"\n",
" window_size tsval ack_rtt \n",
"1188 28960 3.100932e+09 0.103577 \n",
"1191 513920 NaN 0.045109 \n",
"1193 513920 NaN 0.099951 \n",
"1226 26000 3.101052e+09 NaN \n",
"2583 28960 3.102049e+09 0.110307 \n",
"2586 513920 NaN 0.045296 \n",
"2588 513920 NaN 0.097518 \n",
"2655 26000 3.102169e+09 NaN \n",
"2649 28960 3.102159e+09 0.103654 \n",
"2652 513920 NaN 0.043669 \n",
"2654 513920 NaN 0.097502 \n",
"2668 26000 3.102279e+09 NaN \n",
"2689 28960 3.102353e+09 0.105807 \n",
"2692 513920 NaN 0.043931 \n",
"2695 513920 NaN 0.098339 \n",
"2721 28960 3.102473e+09 NaN \n",
"2810 28960 3.102711e+09 0.267423 \n",
"2813 513920 NaN 0.205282 \n",
"2815 513920 NaN 0.018347 \n",
"2834 26000 3.102831e+09 NaN \n",
"2901 28960 3.103186e+09 0.101271 \n",
"2904 513920 NaN 0.043557 \n",
"2907 513920 NaN 0.099845 \n",
"2964 26000 3.103306e+09 NaN "
]
},
"execution_count": 20,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"d_bad = data[data.stream.isin(s_bad) & (data.srcport == 80)]\n",
"d_bad['time_epoch stream id ttl len seq ack flags window_size tsval ack_rtt'.split()].sort_values(by=['stream', 'time_epoch'])"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"So, all packets that look-like-injected have:\n",
"- IP-ID=0x3412\n",
"- IP TTL=59\n",
"- no TCP options\n",
"\n",
"The server also sends `408 Request timeout` in 120 seconds. It means, that the server has not seen the request at all, so the injector act as an in-band device.\n",
"\n",
"Also ACK that is confirming FIN-ACK is looks like injected according to IP ID and TTL, but it has **weird RTT** (~98ms, but not ~44ms)."
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### Stream 287"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"That's injected stream that has ~200ms latency. On the other hand, *genuine* SYN-ACK from the server also has larger-than-usual RTT, so it's probably just a temporary Bufferbloat lag."
]
},
{
"cell_type": "code",
"execution_count": 21,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"text/html": [
"\n",
"
\n",
" \n",
" \n",
" | \n",
" time_epoch | \n",
" stream | \n",
" id | \n",
" ttl | \n",
" len | \n",
" seq | \n",
" ack | \n",
" flags | \n",
" window_size | \n",
" tsval | \n",
" ack_rtt | \n",
"
\n",
" \n",
" \n",
" \n",
" 2810 | \n",
" 3368.165062 | \n",
" 287 | \n",
" 0x00000000 | \n",
" 54 | \n",
" 0 | \n",
" 0 | \n",
" 1 | \n",
" *******A**S* | \n",
" 28960 | \n",
" 3.102711e+09 | \n",
" 0.267423 | \n",
"
\n",
" \n",
" 2813 | \n",
" 3368.370601 | \n",
" 287 | \n",
" 0x00003412 | \n",
" 59 | \n",
" 99 | \n",
" 1 | \n",
" 199 | \n",
" *******A***F | \n",
" 513920 | \n",
" NaN | \n",
" 0.205282 | \n",
"
\n",
" \n",
" 2815 | \n",
" 3368.389520 | \n",
" 287 | \n",
" 0x00003412 | \n",
" 59 | \n",
" 0 | \n",
" 101 | \n",
" 200 | \n",
" *******A**** | \n",
" 513920 | \n",
" NaN | \n",
" 0.018347 | \n",
"
\n",
" \n",
" 2834 | \n",
" 3488.267293 | \n",
" 287 | \n",
" 0x0000004f | \n",
" 54 | \n",
" 212 | \n",
" 1 | \n",
" 1 | \n",
" *******A***F | \n",
" 26000 | \n",
" 3.102831e+09 | \n",
" NaN | \n",
"
\n",
" \n",
"
\n",
"
"
],
"text/plain": [
" time_epoch stream id ttl len seq ack flags \\\n",
"2810 3368.165062 287 0x00000000 54 0 0 1 *******A**S* \n",
"2813 3368.370601 287 0x00003412 59 99 1 199 *******A***F \n",
"2815 3368.389520 287 0x00003412 59 0 101 200 *******A**** \n",
"2834 3488.267293 287 0x0000004f 54 212 1 1 *******A***F \n",
"\n",
" window_size tsval ack_rtt \n",
"2810 28960 3.102711e+09 0.267423 \n",
"2813 513920 NaN 0.205282 \n",
"2815 513920 NaN 0.018347 \n",
"2834 26000 3.102831e+09 NaN "
]
},
"execution_count": 21,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"d_bad[d_bad.stream == 287]['time_epoch stream id ttl len seq ack flags window_size tsval ack_rtt'.split()]"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"The interesting thing about this stream is that ACK confirming FIN-ACK has 18ms ACK_RTT, so it actually means that the packet was likely sent **BEFORE** seeing the FIN from the client as the last-mile RTT is ~38ms according to `mtr` measurements.\n",
"\n",
"If the statement is actually true, then another question arises: why is ACK-confirming-FIN-ACK usually ~98ms delayed? Is it triggered by some packet from original server? Is it sort of latency camouflage? No further research was done yet to clarify these questions."
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Ugly streams"
]
},
{
"cell_type": "code",
"execution_count": 22,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"text/html": [
"\n",
"
\n",
" \n",
" \n",
" | \n",
" | \n",
" count | \n",
"
\n",
" \n",
" stream | \n",
" tsecr | \n",
" | \n",
"
\n",
" \n",
" \n",
" \n",
" 110 | \n",
" 614915.0 | \n",
" 1 | \n",
"
\n",
" \n",
" 614943.0 | \n",
" 10 | \n",
"
\n",
" \n",
" 116 | \n",
" 747274.0 | \n",
" 1 | \n",
"
\n",
" \n",
" 747297.0 | \n",
" 7 | \n",
"
\n",
" \n",
" 121 | \n",
" 786823.0 | \n",
" 1 | \n",
"
\n",
" \n",
" 786847.0 | \n",
" 10 | \n",
"
\n",
" \n",
" 269 | \n",
" 1034918.0 | \n",
" 1 | \n",
"
\n",
" \n",
" 1034942.0 | \n",
" 10 | \n",
"
\n",
" \n",
" 279 | \n",
" 1110335.0 | \n",
" 1 | \n",
"
\n",
" \n",
" 1110359.0 | \n",
" 3 | \n",
"
\n",
" \n",
" 281 | \n",
" 1143649.0 | \n",
" 1 | \n",
"
\n",
" \n",
" 1143672.0 | \n",
" 10 | \n",
"
\n",
" \n",
" 282 | \n",
" 1151512.0 | \n",
" 1 | \n",
"
\n",
" \n",
" 1151536.0 | \n",
" 10 | \n",
"
\n",
" \n",
" 291 | \n",
" 1239517.0 | \n",
" 1 | \n",
"
\n",
" \n",
" 1239540.0 | \n",
" 9 | \n",
"
\n",
" \n",
" 292 | \n",
" 1279490.0 | \n",
" 1 | \n",
"
\n",
" \n",
" 1279514.0 | \n",
" 9 | \n",
"
\n",
" \n",
" 296 | \n",
" 1318977.0 | \n",
" 1 | \n",
"
\n",
" \n",
" 1319001.0 | \n",
" 9 | \n",
"
\n",
" \n",
"
\n",
"
"
],
"text/plain": [
" count\n",
"stream tsecr \n",
"110 614915.0 1\n",
" 614943.0 10\n",
"116 747274.0 1\n",
" 747297.0 7\n",
"121 786823.0 1\n",
" 786847.0 10\n",
"269 1034918.0 1\n",
" 1034942.0 10\n",
"279 1110335.0 1\n",
" 1110359.0 3\n",
"281 1143649.0 1\n",
" 1143672.0 10\n",
"282 1151512.0 1\n",
" 1151536.0 10\n",
"291 1239517.0 1\n",
" 1239540.0 9\n",
"292 1279490.0 1\n",
" 1279514.0 9\n",
"296 1318977.0 1\n",
" 1319001.0 9"
]
},
"execution_count": 22,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"d_ugly = data[data.stream.isin(s_ugly) & (data.srcport == 80)]\n",
"d_ugly.groupby(by='stream tsecr'.split()).time_epoch.agg(['count'])"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"It means, that the remote server has seen `SYN` packet and the first `ACK` after the `SYN`, but the server has never seen the request itself. It suggests that the *ugly* streams are just a sort of *bad* streams those got no redirection packet for some reason."
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Reunion of the bad and the ugly"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"It's interesting that only mobile User-agents were redirected to the `…/mads.html`. Our test sent ~33% of requests using mobile User-Agent and 67% of requests using desktop User-Agent."
]
},
{
"cell_type": "code",
"execution_count": 23,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"text/plain": [
"Mozilla/5.0 (Linux; U; Android 4.0.3; de-de; Galaxy S II Build/GRJ22) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.30 2\n",
"Mozilla/5.0 (PlayBook; U; RIM Tablet OS 2.1.0; en-US) AppleWebKit/536.2+ (KHTML like Gecko) Version/7.2.1.0 Safari/536.2+ 1\n",
"Mozilla/5.0 (Linux; U; Android 1.5; en-us; SPH-M900 Build/CUPCAKE) AppleWebKit/528.5 (KHTML, like Gecko) Version/3.1.2 Mobile Safari/525.20.1 1\n",
"Mozilla/5.0 (Linux; U; Android 2.2; en-us; Sprint APA9292KT Build/FRF91) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1 1\n",
"Mozilla/5.0 (Linux; U; Android 2.2; en-ca; GT-P1000M Build/FROYO) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1 1\n",
"Mozilla/5.0 (Symbian/3; Series60/5.2 NokiaE6-00/021.002; Profile/MIDP-2.1 Configuration/CLDC-1.1) AppleWebKit/533.4 (KHTML, like Gecko) NokiaBrowser/7.3.1.16 Mobile Safari/533.4 3gpp-gba 1\n",
"MOTORIZR-Z8/46.00.00 Mozilla/4.0 (compatible; MSIE 6.0; Symbian OS; 356) Opera 8.65 [it] UP.Link/6.3.0.0.0 1\n",
"Mozilla/5.0 (Linux; U; Android 1.5; en-gb; T-Mobile_G2_Touch Build/CUPCAKE) AppleWebKit/528.5 (KHTML, like Gecko) Version/3.1.2 Mobile Safari/525.20.1 1\n",
"Mozilla/5.0 (iPod; U; CPU iPhone OS 2_2_1 like Mac OS X; en-us) AppleWebKit/525.18.1 (KHTML, like Gecko) Version/3.1.1 Mobile/5H11a Safari/525.20 1\n",
"BlackBerry8320/4.2.2 Profile/MIDP-2.0 Configuration/CLDC-1.1 VendorID/100 1\n",
"Mozilla/5.0 (SymbianOS/9.1; U; en-us) AppleWebKit/413 (KHTML, like Gecko) Safari/413 es50 1\n",
"BlackBerry8300/4.2.2 Profile/MIDP-2.0 Configuration/CLDC-1.1 VendorID/107 UP.Link/6.2.3.15.0 1\n",
"Mozilla/5.0 (Symbian/3; Series60/5.2 NokiaN8-00/014.002; Profile/MIDP-2.1 Configuration/CLDC-1.1; en-us) AppleWebKit/525 (KHTML, like Gecko) Version/3.0 BrowserNG/7.2.6.4 3gpp-gba 1\n",
"Mozilla/5.0 (Linux; U; Android 2.1; en-us; Nexus One Build/ERD62) AppleWebKit/530.17 (KHTML, like Gecko) Version/4.0 Mobile Safari/530.17 1\n",
"Mozilla/5.0 (Linux; U; Android 4.0.3; en-us; KFTT Build/IML74K) AppleWebKit/535.19 (KHTML, like Gecko) Silk/2.1 Mobile Safari/535.19 Silk-Accelerated=true 1\n",
"Name: user_agent, dtype: int64"
]
},
"execution_count": 23,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"d_goo = data[data.stream.isin(s_bad | s_ugly)]\n",
"d_goo.user_agent.value_counts()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"It explains why OONI dataset sees no redirection. We've seen redirections only for mobile `User-Agent` so probably the DPI targets mobile users."
]
},
{
"cell_type": "code",
"execution_count": 24,
"metadata": {
"collapsed": false
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Redirection happens in 3.2% cases\n",
"Redirection happens in 9.9% of mobile cases\n"
]
}
],
"source": [
"print 'Redirection happens in %.1f%% cases' % (100.*len(s_bad|s_ugly) / len(set(data.stream)))\n",
"\n",
"print 'Redirection happens in %.1f%% of mobile cases' % (100.*len(s_bad|s_ugly) / \n",
" len(set(data[data.user_agent.str.match('.*(?:Android|RIM|Symbian|Series60|iPhone|BlackBerry|MIDP)', as_indexer=True) == True].stream)))"
]
}
],
"metadata": {
"kernelspec": {
"display_name": "Python 2",
"language": "python",
"name": "python2"
},
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 2
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython2",
"version": "2.7.11"
}
},
"nbformat": 4,
"nbformat_minor": 0
}