Commit ed6e432b authored by Ivan Tyagov's avatar Ivan Tyagov

Multicast keep alive

parent 816b248e
import socket
import struct
import sys
samples_count = int(sys.argv[1])
multicast_group = '224.3.29.71'
server_address = ('', 10000)
# Create the socket
sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
# Bind to the server address
sock.bind(server_address)
# Tell the operating system to add the socket to the multicast group
# on all interfaces.
group = socket.inet_aton(multicast_group)
mreq = struct.pack('4sL', group, socket.INADDR_ANY)
sock.setsockopt(socket.IPPROTO_IP, socket.IP_ADD_MEMBERSHIP, mreq)
last_micro_second = 0
# Receive/respond loop
i = 0
l = []
while i < samples_count:
data, address = sock.recvfrom(1024)
current_micro_second = int(data)
diff = current_micro_second - last_micro_second
#if diff > 200:
# print >>sys.stderr, diff
last_micro_second = current_micro_second
if i > 0:
# omot first cycle as we care for diff between cycles
l.append(str(diff))
i += 1
# save to file
hostname = socket.gethostname()
f = open("report-%s.csv" %hostname, "w")
text = "\n".join(l)
f.write(text)
f.close()
import socket
import struct
import sys, time
multicast_group = ('224.3.29.71', 10000)
# Create the datagram socket
sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
one_microsecond = 1 / 1000000.0
# Set the time-to-live for messages to 1 so they do not go past the
# local network segment.
ttl = struct.pack('b', 1)
sock.setsockopt(socket.IPPROTO_IP, socket.IP_MULTICAST_TTL, ttl)
last_micro_seconds = int(time.time() * 1000000)
# XXX: make CLI arguments
timeout = int(sys.argv[1])
timeout_tolerance = int(sys.argv[2])
warning_limit = timeout + timeout_tolerance
while True:
micro_seconds = int(time.time() * 1000000)
diff = micro_seconds - last_micro_seconds
last_micro_seconds = micro_seconds
message = str(micro_seconds)
if diff / 1000000 > warning_limit:
print >>sys.stderr, '%s' %diff
sent = sock.sendto(message, multicast_group)
time.sleep(timeout * one_microsecond) # wait interval
sock.close()
......@@ -259,7 +259,7 @@
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.10.6"
"version": "3.8.10"
}
},
"nbformat": 4,
......
......@@ -248,7 +248,7 @@
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.10.6"
"version": "3.8.10"
}
},
"nbformat": 4,
......
{
"cells": [
{
"cell_type": "code",
"execution_count": 1,
"id": "67b556cd",
"metadata": {},
"outputs": [],
"source": [
"import matplotlib.pyplot as plt\n",
"import pandas as pd\n",
"import statistics"
]
},
{
"cell_type": "code",
"execution_count": 45,
"id": "a01d193f",
"metadata": {},
"outputs": [],
"source": [
"# round floating numbers\n",
"round_base = 5\n",
"\n",
"# after this we consider an anomaly (in milli seconds)\n",
"treshold = 300 + 200\n",
"\n",
"# maximal records to read from file\n",
"max_sample_records = 150000\n",
"\n",
"# used to show graphically data\n",
"start_index = 0\n",
"stop_index = 1000"
]
},
{
"cell_type": "code",
"execution_count": 46,
"id": "5147313b",
"metadata": {},
"outputs": [],
"source": [
"def convertToSeries(lines):\n",
" d = {}\n",
" i = 0\n",
" for x in lines:\n",
" d[i] = x\n",
" i += 1\n",
" s = pd.Series(d, name='duration')\n",
" return s\n",
"\n",
"def readFile(file_name):\n",
" f=open(file_name, \"r\")\n",
" lines = f.readlines()\n",
" f.close()\n",
" lines = [float(x.replace(\"\\n\", \"\")) for x in lines[:max_sample_records]]\n",
" return lines"
]
},
{
"cell_type": "markdown",
"id": "57888055",
"metadata": {},
"source": [
"##STM32MP1-* (coupler, ARMv7)##"
]
},
{
"cell_type": "code",
"execution_count": 47,
"id": "16494188",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Anomaly records (longer than desired threshold in micro seconds!)= 77\n",
"Anomaly records (in %)= 0.05133\n",
"Anomaly records= [4389.0, 4384.0, 4405.0, 4386.0, 4395.0, 4391.0, 4394.0, 4391.0, 4392.0, 4384.0, 4392.0, 4394.0, 4401.0, 4389.0, 4384.0, 4380.0, 4385.0, 4384.0, 4327.0, 4387.0, 4383.0, 4382.0, 4398.0, 4392.0, 4392.0, 4403.0, 4384.0, 4386.0, 4395.0, 4386.0, 4382.0, 4389.0, 4403.0, 4385.0, 4395.0, 4394.0, 4384.0, 4391.0, 4393.0, 4390.0, 4391.0, 4382.0, 3356.0, 4396.0, 4391.0, 4389.0, 4403.0, 4393.0, 4390.0, 4392.0, 4393.0, 4404.0, 4401.0, 4392.0, 4388.0, 4393.0, 4392.0, 4389.0, 4390.0, 2983.0, 4420.0, 4398.0, 4391.0, 4386.0, 1208.0, 4406.0, 4394.0, 4409.0, 4411.0, 4399.0, 4378.0, 4409.0, 4422.0, 4389.0, 4398.0, 4388.0, 4389.0]\n"
]
}
],
"source": [
"lines = readFile(\"/home/ivan/report-stm32mp1-2.csv\")\n",
"all_record_count = len(lines)\n",
"anomaly_record_list = [x for x in lines if x >= treshold]\n",
"anomaly_record_count = len(anomaly_record_list)\n",
"anomaly_record_percentile = round((anomaly_record_count * 100) / all_record_count, round_base)\n",
"print(\"Anomaly records (longer than desired threshold in micro seconds!)=\", anomaly_record_count)\n",
"print(\"Anomaly records (in %)=\", anomaly_record_percentile)\n",
"print(\"Anomaly records=\", anomaly_record_list)\n",
"# remove anomalies\n",
"lines = [x for x in lines if x < treshold]"
]
},
{
"cell_type": "code",
"execution_count": 48,
"id": "0dbcbd51",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Transimission time (in micro seconds):\n",
"\tMean = 393.41921\n",
"\tMedian = 391.0\n",
"\tMin = 343.0\n",
"\tMax = 469.0\n",
"\tStandart deviation = 8.24558\n",
"\tStandart deviation (%) = 2.10885\n",
"\tMode (most occurencies) = 390.0\n"
]
}
],
"source": [
"mean = statistics.mean(lines)\n",
"median =statistics.median(lines)\n",
"stdev = statistics.stdev(lines)\n",
"stdev_percentile = (stdev * 100) / median\n",
"try:\n",
" mode = statistics.mode(lines)\n",
"except statistics.StatisticsError:\n",
" mode = None\n",
"minimal = min(lines)\n",
"maximal = max(lines)\n",
"print(\"Transimission time (in micro seconds):\")\n",
"print(\"\\tMean = \", round(mean, round_base))\n",
"print(\"\\tMedian = \", round(median, round_base))\n",
"print(\"\\tMin = \", round(minimal, round_base))\n",
"print(\"\\tMax = \", round(maximal, round_base))\n",
"print(\"\\tStandart deviation = \", round(stdev, round_base))\n",
"print(\"\\tStandart deviation (%) = \", round(stdev_percentile, round_base))\n",
"print(\"\\tMode (most occurencies) = \", round(mode, round_base))"
]
},
{
"cell_type": "code",
"execution_count": 34,
"id": "54586ffc",
"metadata": {},
"outputs": [
{
"data": {
"image/png": "iVBORw0KGgoAAAANSUhEUgAAApAAAAGvCAYAAADsceW1AAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjcuMSwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/bCgiHAAAACXBIWXMAAA9hAAAPYQGoP6dpAABX7UlEQVR4nO3deVhU1eMG8HfYhh0EZRNEAxVZXMJEck0QRFJLUnDF3Qw1JZco9yXKyh01S9FMy72Sr+K+ZOKaGqkhkoYboCLgynp/f/TM/TEwIJdlYOD9PM88OueeOffce2fuvJy7jEwQBAFERERERGWkVd0dICIiIiLNwgBJRERERJIwQBIRERGRJAyQRERERCQJAyQRERERScIASURERESSMEASERERkSQMkEREREQkCQMkEREREUlS4wLknDlzIJPJylR3w4YNkMlkuHXrVtV2iqpc48aN8fbbb1fLvIcNG4bGjRtXy7zVrXHjxhg2bFh1d0OymtZvmUyGOXPmVHc3iqnufeLTp09hZWWFzZs3V8v86T9Svkep7srNzYWDgwNWrVpVrtdLCpCKnZNMJsPJkyeLTRcEAQ4ODpDJZJUaBj777DP8/PPPldZeZVq1ahU2bNhQprq3bt2CTCbDV199pXL6V199VWzn37VrV3Gda2lpwdTUFM2bN8eQIUNw8OBBle00btxYfI1MJoOVlRU6deqE3bt3S108jXTq1CnMmTMHGRkZVT6vvXv31sggQbVbTd0nLlu2DCYmJggJCRHL7t+/j48//hhvvfUWTExMIJPJcOzYsRLbOHXqFDp27AhDQ0PY2Nhg4sSJePr0abF62dnZmD59Ouzs7GBgYAAvL68S94llbZPUryr3od9++y26dOkCa2tryOVyNGnSBMOHDy/2B9bt27cxd+5ctGvXDvXq1UP9+vXRtWtXHDp0qEr6VVZnz57FBx98AE9PT+jq6pb7j4Jbt26ha9euxcp1dXURHh6OhQsX4uXLl5LbLdcIpL6+PrZs2VKs/Pjx47hz5w7kcnl5mi1RSTvLIUOG4MWLF3B0dKzU+UkhJUCWl729PTZt2oTvv/8eX375JXr37o1Tp07Bz88PwcHByM3NLfaa1q1bY9OmTdi0aROmTJmCe/fuoW/fvlizZk2V9rUmOHXqFObOnVvmAPntt98iISGhXPPau3cv5s6dW67XUtklJCTg22+/re5u1Bg1cZ+Ym5uLZcuWYdSoUdDW1hbLExIS8MUXX+Du3bvw8PAotY1Lly7Bx8cHz58/x+LFizFq1CisXbsW/fr1K1Z32LBhWLx4MQYNGoRly5ZBW1sbPXv2LDa4IaVNUr+q3IdevHgRTZo0wbRp07B69WoMHjwY+/btwxtvvIF79+6J9X755Rd88cUXcHZ2xoIFCzBz5kw8efIE3bt3R3R0dJX0rSz27t2L7777DjKZDK+99pqk1+bl5eHw4cPFyl++fInjx4+Lz4cPH46HDx+qzHSvJEgQHR0tABD69u0r1K9fX8jNzVWaPnr0aMHT01NwdHQUAgMDpTQtmj17tlC0W0ZGRkJoaGi52qtqbm5uQpcuXcpU9+bNmwIA4csvv1Q5/csvvxQACDdv3hTLunTpIri5uRWrm5eXJ3zwwQcCAGHatGlK01St//v37wtGRkZCs2bNytRXdavIe6YoVeuxqoSFhRV7v1ZUQUGB8Pz580ptU8HR0bFcn6Xc3FwhOzu78jukoQAIs2fPrpS28vPzhRcvXkh6TU3cJ+7atUsAINy4cUOpPCsrS3j06JEgCIKwfft2AYBw9OhRlW0EBAQItra2QmZmplj27bffCgCE/fv3i2Vnzpwpti998eKF4OTkJHh7e5erzdpE1fdoTVUV+9DSnD9/XgAgREZGimV//fWX8ODBA6V6L1++FFxcXAR7e3u19a2olJQU8btA6nq6ffu20KZNG2HgwIHC2bNnhS5dughHjx4VWrRoIUyZMkWp7ttvvy106tRJcv/KNQI5YMAAPHr0SOlwQU5ODnbs2IGBAwcWq3/s2DGVhy0Uh3RLG8GTyWR49uwZNm7cKB6SVZwLVdL5Pvv27UOXLl1gYmICU1NTvPHGG0rp+rfffkO/fv3QqFEjyOVyODg4YPLkyXjx4oVSOykpKRg+fDjs7e0hl8tha2uLPn36iPNr3Lgxrly5guPHj4t9UzVMXBW0tbWxfPlyuLq6YuXKlcjMzCy1vo2NDVq0aIGbN2+WWm/YsGEwNjbGP//8A39/fxgZGcHOzg7z5s2DIAhKdb/66iu8+eabsLS0hIGBATw9PbFjxw6V7f7www9o164dDA0NUa9ePXTu3BkHDhwotS8bN26Ejo4Opk6dKpadOXMGPXr0gJmZGQwNDdGlSxf8/vvv4vQ5c+aI9Zs0aSJul9LOCSt6DmThUw3Wrl0LJycnyOVyvPHGGzh37pzS66KiogBA6ZQBhYKCAixduhRubm7Q19eHtbU1xo4di8ePHyvNX3H+5/79+9G2bVsYGBjgm2++gbu7O956661i/S0oKEDDhg3x3nvviWVStsWrFF7+pUuXist/9epVAMDff/+N9957DxYWFtDX10fbtm3x66+/FmsnIyMDkydPRuPGjSGXy2Fvb4+hQ4fi4cOHYp3s7GzMnj0bzs7O4mdx2rRpyM7OLraOFJ/78+fPQyaTYePGjcXmuX//fshkMsTExIhld+/exYgRI8TDWG5ubli/fn2Z1kV2djYmT56MBg0awMTEBL1798adO3eK1SvpPFpV56LJZDKMHz8emzdvhpubG+RyOWJjYwGUbTuWZ5+4atUqcV52dnYICwsrNkLftWtXuLu74+rVq3jrrbdgaGiIhg0bYtGiRWVaVz///DMaN24MJycnpXITExNYWFi88vVZWVk4ePAgBg8eDFNTU7F86NChMDY2xrZt28SyHTt2QFtbG2PGjBHL9PX1MXLkSMTFxeH27duS2yzJihUr4ObmJu672rZtq/R98u+//+KDDz5A8+bNYWBgAEtLS/Tr16/YNlBsm5MnT2LixIlo0KABzM3NMXbsWOTk5CAjIwNDhw5FvXr1UK9ePUybNk1pn1v4c7lkyRI4OjrCwMAAXbp0wV9//fXK5QD+2w97enrCwMAAFhYWCAkJEdeVQmJiIoKCgmBjYwN9fX3Y29sjJCTkld8xquTm5mLu3Llo2rQp9PX1YWlpiY4dO4rZobR9aOHljYqKwmuvvQZDQ0P4+fnh9u3bEAQB8+fPh729PQwMDNCnTx+kp6e/sk+Kz2nh97+bmxvq16+vVE8ul6Nnz564c+cOnjx5IpYrviOTk5Px9ttvw9jYGA0bNhSXIz4+Ht26dYORkREcHR2Ljewp3gcnTpzA2LFjYWlpCVNTUwwdOrTYd4O1tTUMDAzKsKaLs7e3x/nz5+Hr64uBAwfi7Nmz+Oyzz7Bt2zZ8+eWXSnW7d++OkydPlmn9FaZTno41btwY3t7e+PHHHxEQEADgv9CWmZmJkJAQLF++vDzNqrRp0yaMGjUK7dq1E3cWRXdQhW3YsAEjRoyAm5sbIiIiYG5ujosXLyI2NlYMt9u3b8fz588xbtw4WFpa4uzZs1ixYgXu3LmD7du3i20FBQXhypUrmDBhAho3boy0tDQcPHgQycnJaNy4MZYuXYoJEybA2NgYn376KYD/Nri6aGtrY8CAAZg5cyZOnjyJwMDAEuvm5ubi9u3bsLS0fGW7+fn56NGjB9q3b49FixYhNjYWs2fPRl5eHubNmyfWW7ZsGXr37o1BgwYhJycHP/30E/r164eYmBilvsydOxdz5szBm2++iXnz5kFPTw9nzpzBkSNH4Ofnp7IPa9euxfvvv49PPvkECxYsAAAcOXIEAQEB8PT0xOzZs6GlpYXo6Gh069YNv/32G9q1a4e+ffvi+vXr+PHHH7FkyRJxp9CgQYMyrdPCtmzZgidPnmDs2LGQyWRYtGgR+vbti3/++Qe6uroYO3Ys7t27h4MHD2LTpk3FXj927Fhs2LABw4cPx8SJE3Hz5k2sXLkSFy9exO+//w5dXV2xbkJCAgYMGICxY8di9OjRaN68OYKDgzFnzhykpKTAxsZGrHvy5Encu3dP6Tyzsm4LKaKjo/Hy5UuMGTMGcrkcFhYWuHLlCjp06ICGDRvi448/hpGREbZt24Z33nkHO3fuxLvvvgvgv4spOnXqhGvXrmHEiBF4/fXX8fDhQ/z666+4c+cO6tevj4KCAvTu3RsnT57EmDFj0KJFC8THx2PJkiW4fv16ief4tW3bFq+99hq2bduG0NBQpWlbt25FvXr14O/vDwBITU1F+/btxdDWoEED7Nu3DyNHjkRWVhYmTZpU6joYNWoUfvjhBwwcOBBvvvkmjhw5Uu71WdiRI0ewbds2jB8/HvXr1xe/1MqyHaXuE+fMmYO5c+fC19cX48aNQ0JCAlavXo1z584Vex8+fvwYPXr0QN++fdG/f3/s2LED06dPh4eHh7ivL8mpU6fw+uuvl3udxMfHIy8vD23btlUq19PTQ+vWrXHx4kWx7OLFi2jWrJlSKASAdu3aAfjvsLWDg4OkNlX59ttvMXHiRLz33nv48MMP8fLlS/z55584c+aM+H1y7tw5nDp1CiEhIbC3t8etW7ewevVqdO3aFVevXoWhoaFSmxMmTICNjQ3mzp2L06dPY+3atTA3N8epU6fQqFEjfPbZZ9i7dy++/PJLuLu7Y+jQoUqv//777/HkyROEhYXh5cuXWLZsGbp164b4+PhSv38WLlyImTNnon///hg1ahQePHiAFStWoHPnzrh48SLMzc2Rk5MDf39/ZGdni/28e/cuYmJikJGRATMzs1LXV1Fz5sxBZGSk+H7NysrC+fPn8ccff6B79+6v3IcCwObNm5GTk4MJEyYgPT0dixYtQv/+/dGtWzccO3YM06dPx40bN7BixQpMmTJF5R+Hjx49Qn5+PpKTk8XvMB8fn1f2PyUlBYaGhsW2YX5+PgICAtC5c2csWrQImzdvxvjx42FkZIRPP/0UgwYNEk8ZGzp0KLy9vdGkSROlNsaPHw9zc3PMmTNH/Ez++++/4oBbZVBcO1H4uaq2PT09IQgCTp06Je36FSnDlYpD2OfOnRNWrlwpmJiYiMOr/fr1E9566y1BEIofjjx69KjKwxaKQ7rR0dFimZRD2Ir+KA5VZmRkCCYmJoKXl1exQ0IFBQXi/1UdHoyMjBRkMpnw77//CoIgCI8fPy71cLNCdR3CVti9e7cAQFi2bJlY5ujoKPj5+QkPHjwQHjx4IFy+fFkICQkRAAgTJkwotY+hoaHF6hUUFAiBgYGCnp6e0jB/0fWYk5MjuLu7C926dRPLEhMTBS0tLeHdd98V8vPzleoX3iaF3zPLli0TZDKZMH/+fKW6TZs2Ffz9/YttyyZNmgjdu3cXy6Qewg4NDRUcHR3F54rtZGlpKaSnp4vlv/zyiwBA2LNnj1hW0mGF3377TQAgbN68Wak8Nja2WLmjo6MAQIiNjVWqm5CQIAAQVqxYoVT+wQcfCMbGxkrrvyzbQjGvVx36VCy/qampkJaWpjTNx8dH8PDwEF6+fCmWFRQUCG+++abQtGlTsWzWrFkCAGHXrl3F2ldsv02bNglaWlrCb7/9pjR9zZo1AgDh999/L7HfERERgq6urtL2yc7OFszNzYURI0aIZSNHjhRsbW2Fhw8fKs0jJCREMDMzK/VUgUuXLgkAhA8++ECpfODAgcUOYRd9Dymo2p8BELS0tIQrV64Uq1/W7VjWfWJaWpqgp6cn+Pn5KX3+Vq5cKQAQ1q9fL5Z16dJFACB8//33Yll2drZgY2MjBAUFFZtXYbm5uYJMJhM++uijUuuVdghbMe3EiRPFpvXr10+wsbERn7u5uRVbJ4IgCFeuXBEACGvWrJHcpip9+vQpdf8rCKq/T+Li4oqtS8W2KboP8/b2FmQymfD++++LZXl5eYK9vb3Sd4vic2lgYCDcuXNHLFcczp88ebJYVvR9d+vWLUFbW1tYuHChUj/j4+MFHR0dsfzixYsCAGH79u2lLnNZtWrV6pWnJpW0D1Usb4MGDYSMjAyxPCIiQgAgtGrVSuk0ugEDBgh6enpK+yYFuVwuABD368uXL39l3xMTEwV9fX1hyJAhSuWK78jPPvtMLHv8+LFgYGAgyGQy4aeffhLL//7772L7CsX7wNPTU8jJyRHLFy1aJAAQfvnlF5X9kXoI+86dO0Lbtm2FAQMGKB3CdnFxEaZOnapU9969ewIA4Ysvvihz+4JQzkPYANC/f3+8ePECMTExePLkCWJiYlQevlangwcP4smTJ/j444+hr6+vNK1w6i48JPzs2TM8fPgQb775JgRBEP8iNTAwgJ6eHo4dO1ZsWLkmMTY2BgClIXYAOHDgABo0aIAGDRqgVatW2L59O4YMGYIvvviiTO2OHz9e/L9i9CYnJ0fpqrTC6/Hx48fIzMxEp06d8Mcff4jlP//8MwoKCjBr1iylv4QU7Ra1aNEifPjhh/jiiy8wY8YMsfzSpUtITEzEwIED8ejRIzx8+BAPHz7Es2fP4OPjgxMnTqCgoKBMy1ZWwcHBqFevnvi8U6dOAIB//vnnla/dvn07zMzM0L17d7GvDx8+hKenJ4yNjXH06FGl+k2aNBFHzRSaNWuG1q1bY+vWrWJZfn4+duzYgV69eimt/7JsC6mCgoKURm7T09Nx5MgR9O/fH0+ePBGX6dGjR/D390diYiLu3r0LANi5cydatWoljkgWptju27dvR4sWLeDi4qK0jrp16wYAxdZRYYqLx3bt2iWWHThwABkZGQgODgbw310hdu7ciV69ekEQBKV5+Pv7IzMzs9T1s3fvXgDAxIkTlcpfNWpZFl26dIGrq2ux8srejocOHUJOTg4mTZqk9PkbPXo0TE1N8b///U+pvrGxMQYPHiw+19PTQ7t27V75nk9PT4cgCEqfF6kUpxCpughTX19f6RSjFy9elFivcFtS2lTF3Nwcd+7cUTp1pajC2yw3NxePHj2Cs7MzzM3NVW63kSNHKu37vLy8IAgCRo4cKZZpa2ujbdu2Ktf7O++8g4YNG4rP27VrBy8vL/H9qsquXbtQUFCA/v37K30ObGxs0LRpU/Gzphhh3L9/P54/f15ie2Vlbm6OK1euIDExsdxt9OvXT2nk08vLCwAwePBg6OjoKJXn5OSI+6DC9u3bh7179+Lrr79Go0aN8OzZs1Ln+fz5c/Tr1w8GBgb4/PPPVdYZNWqU+H9zc3M0b94cRkZG6N+/v1jevHlzmJubq9yOY8aMURr9HzduHHR0dErdjlJYW1sjMjISW7ZsEffjXbt2xcWLF4sdRVF8bgufXlQW5TqEDfx3SNDX1xdbtmzB8+fPkZ+fr3ROVnVISkoCALi7u5daLzk5GbNmzcKvv/5aLBwqzvOQy+X44osv8NFHH8Ha2hrt27fH22+/jaFDhyodTqwKUoavFbeiMDExUSr38vLCggULIJPJYGhoiBYtWsDc3LxMbWppaRW74qtZs2YAoHReT0xMDBYsWIBLly4pnbNWuP9JSUnQ0tJS+WVZ1PHjx/G///0P06dPVzrvEYC4Ayp6yLKwzMzMCn2BFdWoUSOl54q2y/IHRWJiIjIzM2FlZaVyelpamtLzooc3FIKDg/HJJ5/g7t27aNiwIY4dO4a0tDQxJCmUZVtIVbRPN27cgCAImDlzJmbOnKnyNWlpaWjYsCGSkpIQFBRUavuJiYm4du1aiacXFF1HhbVq1QouLi7YunWr+MW7detW1K9fXwygDx48QEZGBtauXYu1a9dKnse///4LLS2tYoeHmzdvXupylUVJ27uyt+O///4LoHif9fT08Nprr4nTFezt7YvNq169evjzzz/LND+hyHnSUiiCWNHzX4H/rhwt+gdTSfUKtyWlTVWmT5+OQ4cOoV27dnB2doafnx8GDhyIDh06iHVevHiByMhIREdH4+7du0rrQNV5g0X3K4pw5ODgUKxc1b6madOmxcqaNWtW6vmciYmJEARB5WsBiEGmSZMmCA8Px+LFi7F582Z06tQJvXv3xuDBgyUfvgaAefPmoU+fPmjWrBnc3d3Ro0cPDBkyBC1btixzG1LWF6B6/6w4lzwgIAB9+vSBu7s7jI2NlQZKFPLz8xESEoKrV69i3759sLOzK1ZHX1+/2H7LzMxM5eenrNvR2NgYtra25bqHa0pKSrF5GhgYwNfXV2Xfu3TpolSmeM9K3c+UO0ACwMCBAzF69GikpKQgICCgxIBSUqfy8/MrMvtyyc/PR/fu3ZGeno7p06fDxcUFRkZGuHv3LoYNG6Y0ijVp0iT06tULP//8M/bv34+ZM2ciMjISR44cQZs2bSTPu+hfx0Up/uIrOnpaGsXJ087Ozkrl9evXV/nmqSy//fYbevfujc6dO2PVqlWwtbWFrq4uoqOjy3c7APx3InNGRgY2bdqEsWPHKn3JKrbLl19+idatW6t8vWI0trIUvhVJYWX5kiwoKCj1hspFdz4lfZEFBwcjIiIC27dvx6RJk7Bt2zaYmZmhR48eYp2q2Baq+qTYBlOmTCk2WqpQ9H1YmoKCAnh4eGDx4sUqpxf9gigqODgYCxcuxMOHD2FiYoJff/0VAwYMEEclFP0dPHhwiX94SPkiK43UfZyq7V1V21GK8r7nLSwsIJPJKnS0xtbWFsB/940s6v79+0pf5La2tipHmhSvVdSV0qYqLVq0QEJCAmJiYhAbG4udO3di1apVmDVrlnjrmQkTJiA6OhqTJk2Ct7c3zMzMIJPJEBISovKoSEnrWFV5RQJ5YQUFBZDJZNi3b5/K+RTed3799dcYNmwYfvnlFxw4cAATJ05EZGQkTp8+DXt7e0nz7dy5M5KSksS2vvvuOyxZsgRr1qxRGsErjZT1Bbx6nTk5OaFNmzbieYtFjR49GjExMdi8ebP4x2hV96miFO9zhejoaKUfXmjcuHGp915VfG6LXkj0KhUKkO+++y7Gjh2L06dPKx1mK0oxclP0qr+if/2WpKypWDFS8Ndff5X4RRYfH4/r169j48aNSicnl3QDWicnJ3z00Uf46KOPkJiYiNatW+Prr7/GDz/8IKlvwH+hwdDQsMR7DiYkJMDQ0LDMGzE/Px9btmyBoaEhOnbsWOZ+vEpBQQH++ecfcdQRAK5fvw7g/69g27lzJ/T19bF//36lw0NF75nl5OSEgoICXL16tcTgp1C/fn3s2LEDHTt2hI+PD06ePCnu4BXb1tTU9JXBWJ2/wFDSvJycnHDo0CF06NCh3FfRAf+NCLRr1w5bt27F+PHjsWvXLrzzzjtK67ys26KiFKPSurq6r9wGTk5Or7wy1MnJCZcvX4aPj0+5tllwcDDmzp2LnTt3wtraGllZWUoXFimunM7Pzy/XH1OOjo4oKChAUlKS0gieqs9vvXr1VN53tKz7OEDadizr+lLcDzIhIUHpqEJOTg5u3rxZaX9k6ujowMnJ6ZV3eSiNu7s7dHR0cP78eaXDgDk5Obh06ZJSWevWrXH06FFkZWUpXUhz5swZcbrUNktiZGSE4OBgBAcHIycnB3379sXChQsREREBfX197NixA6Ghofj666/F17x8+bLKfshA1eHg69evl/prWk5OThAEAU2aNFHar5fEw8MDHh4emDFjBk6dOoUOHTpgzZo14gWNUlhYWGD48OEYPnw4nj59is6dO2POnDligKyOX8x58eKFylHpqVOnIjo6GkuXLsWAAQOqtA+JiYlKd9l4+vQp7t+/j549e0puq2h+cXNzk/R6xee2RYsWkl5XoZ8yNDY2xurVqzFnzhz06tWrxHqOjo7Q1tbGiRMnlMrL+vM5RkZGZfow+vn5wcTEBJGRkcXuqq74C0DxF0LhvwgEQcCyZcuU6j9//rxYG05OTjAxMVF645W1b4p5+/n5Yc+ePUhOTlaalpycjD179sDPz6/Ev2IKy8/Px8SJE3Ht2jVMnDix2NWIFbVy5Urx/4IgYOXKldDV1RWvXNPW1oZMJlMaYbl161axK2ffeecdaGlpYd68ecX+Glf1V5m9vT0OHTqEFy9eoHv37nj06BGA/64Sc3JywldffaXyFyQePHgg/t/IyAhA8T9YqkJJ8+rfvz/y8/Mxf/78Yq/Jy8uT1Lfg4GCcPn0a69evx8OHD4sdvi7rtqgoKysrdO3aFd98843KEZ3C2yAoKAiXL19W+etHiu3ev39/3L17V+UNwl+8ePHK85RatGgBDw8PbN26FVu3boWtrS06d+4sTtfW1kZQUBB27typMswW7q8qiquOi95VYunSpcXqOjk5ITMzU+lQ7/379yX9+pOU7VjW/Y6vry/09PSwfPlypc/bunXrkJmZWSlXlCt4e3vj/Pnz5X69mZkZfH198cMPPyid071p0yY8ffpU6cbf7733HvLz85VOTcjOzkZ0dDS8vLzE0Wspbaqi2P8o6OnpwdXVFYIgiD/goK2tXWxftmLFiio7wvbzzz8rjb6ePXsWZ86cKfUq+b59+0JbWxtz584t1ldBEMTlzMrKQl5entJ0Dw8PaGlpqQxcr1J0/RkbG8PZ2bnYdyhQ+fvrvLw8lSPiZ8+eRXx8fLEr87/88kt89dVX+OSTT/Dhhx9Wal9UWbt2rdKPgKxevRp5eXmvvNuBKr6+vkqPoiOSr3LhwgXIZDJ4e3tLel2FRiCB0s9JUzAzM0O/fv2wYsUKyGQyODk5ISYmptTzjwrz9PTEoUOHsHjxYtjZ2aFJkybiibSFmZqaYsmSJRg1ahTeeOMNDBw4EPXq1cPly5fx/PlzbNy4ES4uLnBycsKUKVNw9+5dmJqaYufOncXeaNevX4ePjw/69+8PV1dX6OjoYPfu3UhNTVUa5fD09MTq1auxYMECODs7w8rKqsRhb+C/X5Bo3749Xn/9dYwZMwaNGzfGrVu3sHbtWshkMnz22WfFXpOZmSmOeD5//hw3btzArl27kJSUhJCQEJUhpSL09fURGxuL0NBQeHl5Yd++ffjf//6HTz75RDz0GhgYiMWLF6NHjx4YOHAg0tLSEBUVBWdnZ6UvUWdnZ3z66aeYP38+OnXqhL59+0Iul+PcuXOws7NDZGRksfk7OzvjwIED6Nq1K/z9/XHkyBGYmpriu+++Q0BAANzc3DB8+HA0bNgQd+/exdGjR2Fqaoo9e/YA+G+bAMCnn36KkJAQ6OrqolevXuKOqjIp5jVx4kT4+/tDW1sbISEh6NKlC8aOHYvIyEhcunQJfn5+0NXVRWJiIrZv345ly5aV+Zzh/v37Y8qUKZgyZQosLCyKjRqVdVtUhqioKHTs2BEeHh4YPXo0XnvtNaSmpiIuLg537tzB5cuXAfz3l/yOHTvQr18/jBgxAp6enkhPT8evv/6KNWvWoFWrVhgyZAi2bduG999/H0ePHkWHDh2Qn5+Pv//+G9u2bRPvi1ma4OBgzJo1S7wHYNELtT7//HMcPXoUXl5eGD16NFxdXZGeno4//vgDhw4dKvW+Z61bt8aAAQOwatUqZGZm4s0338Thw4dx48aNYnVDQkIwffp0vPvuu5g4cSKeP3+O1atXo1mzZmW+AEbKdizrPrFBgwaIiIjA3Llz0aNHD/Tu3RsJCQlYtWoV3njjDaULZiqqT58+2LRpE65fv15slEsxcnXlyhUA/wU4xS/GFL5YbuHChXjzzTfRpUsXjBkzBnfu3MHXX38NPz8/pdM2vLy80K9fP0RERCAtLQ3Ozs7YuHEjbt26hXXr1inNu6xtquLn5wcbGxt06NAB1tbWuHbtGlauXInAwEDxvPO3334bmzZtgpmZGVxdXREXF4dDhw6V6ZZp5eHs7IyOHTti3LhxyM7OxtKlS2FpaYlp06aV+BonJycsWLAAERERuHXrFt555x2YmJjg5s2b2L17N8aMGYMpU6bgyJEjGD9+PPr164dmzZohLy8PmzZtEv8YU1DcGuro0aOl3vvY1dUVXbt2haenJywsLHD+/Hns2LFD6dBxSfvQinr69CkcHBwQHBwMNzc3GBkZIT4+HtHR0TAzM1M6j3v37t2YNm0amjZtihYtWojftwrdu3ev9Fv05eTkiBlD8Zns2LEjevfuLdb5999/xdsbKf44U3yWHB0dMWTIkErpy8GDB9GhQwfp71kpl2wXvo1PaVT9qsiDBw+EoKAgwdDQUKhXr54wduxY4a+//irTbXz+/vtvoXPnzoKBgYEAQLx9RdFbVij8+uuvwptvvikYGBgIpqamQrt27YQff/xRnH716lXB19dXMDY2FurXry+MHj1auHz5slJfHj58KISFhQkuLi6CkZGRYGZmJnh5eQnbtm1TmldKSooQGBgomJiYCADKdEufa9euCcHBwYKVlZWgo6MjWFlZCSEhIcK1a9eK1VXcWkPxMDY2Fpo2bSoMHjxYOHDggMr2K/KrLqGhoYKRkZGQlJQk+Pn5CYaGhoK1tbUwe/bsYrfhWbdundC0aVNBLpcLLi4uQnR0dIm/gLB+/XqhTZs2glwuF+rVqyd06dJFOHjwYKl9PnPmjGBiYiJ07txZvFXGxYsXhb59+wqWlpaCXC4XHB0dhf79+wuHDx9Weu38+fOFhg0bClpaWq+8pU9Jt/FRdbslFLklQ15enjBhwgShQYMGgkwmK7bsa9euFTw9PQUDAwPBxMRE8PDwEKZNmybcu3ev1GUvqkOHDgIAYdSoUSqnl3VbSLmNT0m3m0pKShKGDh0q2NjYCLq6ukLDhg2Ft99+W9ixY4dSvUePHgnjx48XGjZsKOjp6Qn29vZCaGio0i11cnJyhC+++EJwc3MT3xuenp7C3LlzlX45pKR+JyYmip+NkydPquxvamqqEBYWJjg4OAi6urqCjY2N4OPjI6xdu7bU9SAI//26ycSJEwVLS0vByMhI6NWrl3D79u1i7wNBEIQDBw4I7u7ugp6entC8eXPhhx9+KPE2PmFhYSrnV9btKHWfuHLlSsHFxUXQ1dUVrK2thXHjxgmPHz9WqlPSLcNKukVRUdnZ2UL9+vWVbr9VeJlLehT122+/CW+++aagr68vNGjQQAgLCxOysrKK1Xvx4oUwZcoUwcbGRpDL5cIbb7xR7FZYUtss6ptvvhE6d+4s7m+cnJyEqVOnKr03Hz9+LAwfPlyoX7++YGxsLPj7+wt///13sfdsSd+fiu1b9JdQFPtihcKfy6+//lpwcHAQ5HK50KlTJ+Hy5csq2yxq586dQseOHQUjIyPByMhIcHFxEcLCwoSEhARBEAThn3/+EUaMGCE4OTkJ+vr6goWFhfDWW28Jhw4dUmrno48+EmQymcrvrMIWLFggtGvXTjA3NxcMDAwEFxcXYeHChUq3rylpH1rSfkhxW8Citxoqun6zs7OFDz/8UGjZsqVgamoq6OrqCo6OjsLIkSOLfT4U66ukR+HbThXdLgolfX6K7t8V/Tx+/LgwZswYoV69eoKxsbEwaNAg8Rebii6rqkdZbx/4KhkZGYKenp7w3XffSX6tTBCq+OxO0ijDhg3Djh07VB4mJiIqzfz58xEdHY3ExMQynYpDZXfr1i00adIEX375JaZMmVKtfWnXrh0cHR2VfniDykbx4xLnzp175REWdVi6dCkWLVqEpKQkyefrV+gcSCIiIoXJkyfj6dOn+Omnn6q7K1RFsrKycPnyZaVfJSPNlJubi8WLF2PGjBnlutizwudAEhERAf9dJFHWc9tJM5mampbrghqqeXR1dYtd0CsFRyCJiIiISBKeA0lEREREknAEkoiIiIgkYYAkIiIiIkl4EU0FFBQU4N69ezAxMamWn2MiIiIi6QRBwJMnT2BnZ1fsBwiobBggK+DevXviT2YRERGRZrl9+zbs7e2ruxsaiQGyAhQ/ZXX79u1K/y1qIiIiqhpZWVlwcHAQv8dJOgbIClActjY1NWWAJCIi0jA8/az8eOCfiIiIiCRhgCQiIiIiSRggiYiIiEgSBkgiIiIikoQBkoiIiIgkYYAkIiIiIkkYIImIiIhIEgZIIiIiIpKEAZKIiIiIJGGAJCIiIiJJGCCJiIiISBIGSCIiIiKShAGSiIiIiCRhgCQiIiIiSRggiYiIiEgSBkgiIiIikoQBkoiIiIgkYYAkIiIiIkkYIImIiIhIEgZIIiIiIpKEAZKIiIiIJGGAJCIiIiJJGCCJiIiISBIGSCIiIiKShAGSiIiIiCRhgCQiIiIiSRggiYiIiEgSBsg6pvHH/6vuLhAREZGGY4CkasMwS0RE5cXvkOrFAElEREREkjBAEhEREZEkDJBEREREJEmtCJCff/45ZDIZJk2aJJa9fPkSYWFhsLS0hLGxMYKCgpCamqr0uuTkZAQGBsLQ0BBWVlaYOnUq8vLy1Nx7IqLaheemEdV+Gh8gz507h2+++QYtW7ZUKp88eTL27NmD7du34/jx47h37x769u0rTs/Pz0dgYCBycnJw6tQpbNy4ERs2bMCsWbPUvQhERFRLMDxTXaHRAfLp06cYNGgQvv32W9SrV08sz8zMxLp167B48WJ069YNnp6eiI6OxqlTp3D69GkAwIEDB3D16lX88MMPaN26NQICAjB//nxERUUhJyenuhaJiKhWaPzx/ximiGoxjQ6QYWFhCAwMhK+vr1L5hQsXkJubq1Tu4uKCRo0aIS4uDgAQFxcHDw8PWFtbi3X8/f2RlZWFK1euqJxfdnY2srKylB5EREREdY3GBsiffvoJf/zxByIjI4tNS0lJgZ6eHszNzZXKra2tkZKSItYpHB4V0xXTVImMjISZmZn4cHBwqIQlISIiotJwNLvm0cgAefv2bXz44YfYvHkz9PX11TbfiIgIZGZmio/bt2+rbd5EdQG/JIiININGBsgLFy4gLS0Nr7/+OnR0dKCjo4Pjx49j+fLl0NHRgbW1NXJycpCRkaH0utTUVNjY2AAAbGxsil2VrXiuqFOUXC6Hqamp0oNICgYkIiKqDTQyQPr4+CA+Ph6XLl0SH23btsWgQYPE/+vq6uLw4cPiaxISEpCcnAxvb28AgLe3N+Lj45GWlibWOXjwIExNTeHq6qr2ZSIiqo3K+keTqnoVeW1NU5uWpbwqso2p5tHIAGliYgJ3d3elh5GRESwtLeHu7g4zMzOMHDkS4eHhOHr0KC5cuIDhw4fD29sb7du3BwD4+fnB1dUVQ4YMweXLl7F//37MmDEDYWFhkMvl1byE/6+0Dxc/eLVHWXestWmb16ZlqQq1ef1UZNlq03qpLctS2/dVpJpGBsiyWLJkCd5++20EBQWhc+fOsLGxwa5du8Tp2traiImJgba2Nry9vTF48GAMHToU8+bNq8Zel01t+rBWJDhp6jLXRdxW6sX1XXMUvp2RlH2bpm3DiixH4Tqattx1mU51d6CyHDt2TOm5vr4+oqKiEBUVVeJrHB0dsXfv3iruWdk1/vh/uPV5YHV3o1aqi+u2Ni1zWZdFU5e5ti9fXVXRP4ZL29418b1Q2nJIqVNSmWKZGTJrhlo7AlmblPbBqg0fJI4ulqy8f9Vryvor65dG0fLS1oGmLHtpattnQtX2UjUypyhTta3LWladqmL+r1pvNWG51akuLWtNxwBZQ5S0Iy08/VVfmCXtpFX9v6YpSyAuvLMsKVS8qu2atA5UbePC/xatV9oXSVnnUZ1K2lZStqWqeqW9vrqXvazv58LPS6tTtN2auMyledU+6lXltS1YS1WXlpVqvlpzCFtTqToMUdYvz1fVUbRbE3c6UkaeytOWlNdXt8oMAaWti5pwuKuqwkJNDhaF+1HWw9RS25X6WiKiiuIIJNUq/AKlmqwy3p98jxNRTcAAWQPwC4GIiIg0CQMkEREREUnCAFmLcWSzbuB2JiIidWOAJCIiqmT8w45qOwZIIiKiGo6BlGoaBsg6qrbvjGr78qlSF5dZU3FbEZGmY4AkIiIiIkkYIImIiIhIEgZIIjXj4UuqTHw/1TzcJhXD9acZGCCJagHucIlqr7r4+a6Ly6xpGCDrIH4wqx+3Qd1VFdue7yciUjcGSKp1+GVKRERUtRggiYiIiEgSBkgiIiIikoQBkoiIiIgkYYAkIiIiIkkYIImIiIhIEgZIIiIiIpKEAZKIiIiIJGGAJCIiIiJJGCCJiIiISBIGSCIiIiKShAGSiIiIiCRhgCQiIiIiSRggiYiIiEgSBkgiIiIikkQjA+Tq1avRsmVLmJqawtTUFN7e3ti3b584vWvXrpDJZEqP999/X6mN5ORkBAYGwtDQEFZWVpg6dSry8vLUvShEREREGkenujtQHvb29vj888/RtGlTCIKAjRs3ok+fPrh48SLc3NwAAKNHj8a8efPE1xgaGor/z8/PR2BgIGxsbHDq1Cncv38fQ4cOha6uLj777DO1Lw8RERGRJtHIANmrVy+l5wsXLsTq1atx+vRpMUAaGhrCxsZG5esPHDiAq1ev4tChQ7C2tkbr1q0xf/58TJ8+HXPmzIGenl6VLwMRERGRptLIQ9iF5efn46effsKzZ8/g7e0tlm/evBn169eHu7s7IiIi8Pz5c3FaXFwcPDw8YG1tLZb5+/sjKysLV65cKXFe2dnZyMrKUnoQERER1TUaOQIJAPHx8fD29sbLly9hbGyM3bt3w9XVFQAwcOBAODo6ws7ODn/++SemT5+OhIQE7Nq1CwCQkpKiFB4BiM9TUlJKnGdkZCTmzp1bRUtEREREpBk0NkA2b94cly5dQmZmJnbs2IHQ0FAcP34crq6uGDNmjFjPw8MDtra28PHxQVJSEpycnMo9z4iICISHh4vPs7Ky4ODgUKHlICIiItI0GnsIW09PD87OzvD09ERkZCRatWqFZcuWqazr5eUFALhx4wYAwMbGBqmpqUp1FM9LOm8SAORyuXjlt+JBREREVNdobIAsqqCgANnZ2SqnXbp0CQBga2sLAPD29kZ8fDzS0tLEOgcPHoSpqal4GJyIiIiIVNPIQ9gREREICAhAo0aN8OTJE2zZsgXHjh3D/v37kZSUhC1btqBnz56wtLTEn3/+icmTJ6Nz585o2bIlAMDPzw+urq4YMmQIFi1ahJSUFMyYMQNhYWGQy+XVvHRERERENZtGBsi0tDQMHToU9+/fh5mZGVq2bIn9+/eje/fuuH37Ng4dOoSlS5fi2bNncHBwQFBQEGbMmCG+XltbGzExMRg3bhy8vb1hZGSE0NBQpftGEhEREZFqGhkg161bV+I0BwcHHD9+/JVtODo6Yu/evZXZLSIiIqI6odacA0lERERE6sEASURERESSMEASERERkSQMkEREREQkCQMkEREREUnCAElEREREkjBAEhEREZEkDJBEREREJAkDJBERERFJwgBJRERERJIwQBIRERGRJAyQRERERCQJAyQRERERScIASURERESSMEASERERkSQMkEREREQkCQMkEREREUnCAElEREREkjBAEhEREZEkDJBEREREJAkDJBERERFJwgBJRERERJIwQBIRERGRJAyQRERERCQJAyQRERERScIASURERESSMEASERERkSQMkEREREQkCQMkEREREUnCAElEREREkjBAEhEREZEkGhkgV69ejZYtW8LU1BSmpqbw9vbGvn37xOkvX75EWFgYLC0tYWxsjKCgIKSmpiq1kZycjMDAQBgaGsLKygpTp05FXl6euheFiIiISONoZIC0t7fH559/jgsXLuD8+fPo1q0b+vTpgytXrgAAJk+ejD179mD79u04fvw47t27h759+4qvz8/PR2BgIHJycnDq1Cls3LgRGzZswKxZs6prkYiIiIg0hk51d6A8evXqpfR84cKFWL16NU6fPg17e3usW7cOW7ZsQbdu3QAA0dHRaNGiBU6fPo327dvjwIEDuHr1Kg4dOgRra2u0bt0a8+fPx/Tp0zFnzhzo6elVx2IRERERaQSNHIEsLD8/Hz/99BOePXsGb29vXLhwAbm5ufD19RXruLi4oFGjRoiLiwMAxMXFwcPDA9bW1mIdf39/ZGVliaOYqmRnZyMrK0vpQURERFTXaGyAjI+P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NmjTpg0AIDw8HG3atMGsWbOgra2NP//8E71790azZs0wcuRIeHp64rfffoNcLhfb2Lx5M1xcXODj44OePXuiY8eOWLt2bXUtEhEREZHG0MgRyK5du0IQhBKn79+//5VtWFhYYMuWLZXZLSIiIqI6QSNHIImIiIio+jBAEhEREZEkDJBEREREJAkDJBERERFJwgBJRERERJIwQBIRERGRJAyQRERERCQJAyQRERERScIASURERESSMEASERERkSQMkEREREQkCQMkEREREUnCAElEREREkjBAEhEREZEkDJBEREREJAkDJBERERFJwgBJRERERJIwQBIRERGRJAyQRERERCQJAyQRERERScIASURERESSMEASERERkSQMkEREREQkCQMkEREREUnCAElEREREkjBAEhEREZEkDJBEREREJAkDJBERERFJwgBJRERERJIwQBIRERGRJAyQRERERCSJRgbIEydOoFevXrCzs4NMJsPPP/+sNF0QBMyaNQu2trYwMDCAr68vEhMTleqkp6dj0KBBMDU1hbm5OUaOHImnT5+qcSmIiIiINJNGBshnz56hVatWiIqKUjl90aJFWL58OdasWYMzZ87AyMgI/v7+ePnypVhn0KBBuHLlCg4ePIiYmBicOHECY8aMUdciEBEREWksneruQHkEBAQgICBA5TRBELB06VLMmDEDffr0AQB8//33sLa2xs8//4yQkBBcu3YNsbGxOHfuHNq2bQsAWLFiBXr27ImvvvoKdnZ2alsWIiIiIk2jkSOQpbl58yZSUlLg6+srlpmZmcHLywtxcXEAgLi4OJibm4vhEQB8fX2hpaWFM2fOlNh2dnY2srKylB5EREREdU2tC5ApKSkAAGtra6Vya2trcVpKSgqsrKyUpuvo6MDCwkKso0pkZCTMzMzEh4ODQyX3noiIiKjmq3UBsipFREQgMzNTfNy+fbu6u0RERESkdrUuQNrY2AAAUlNTlcpTU1PFaTY2NkhLS1OanpeXh/T0dLGOKnK5HKampkoPIiIiorqm1gXIJk2awMbGBocPHxbLsrKycObMGXh7ewMAvL29kZGRgQsXLoh1jhw5goKCAnh5eam9z0RERESaRCOvwn769Clu3LghPr958yYuXboECwsLNGrUCJMmTcKCBQvQtGlTNGnSBDNnzoSdnR3eeecdAECLFi3Qo0cPjB49GmvWrEFubi7Gjx+PkJAQXoFNRERE9AoaGSDPnz+Pt956S3weHh4OAAgNDcWGDRswbdo0PHv2DGPGjEFGRgY6duyI2NhY6Ovri6/ZvHkzxo8fDx8fH2hpaSEoKAjLly9X+7IQERERaRqNDJBdu3aFIAglTpfJZJg3bx7mzZtXYh0LCwts2bKlKrpHREREVKvVunMgiYiIiKhqMUASERERkSQMkEREREQkCQMkEREREUnCAElEREREkjBAEhEREZEkDJBEREREJAkDJBERERFJwgBJRERERJIwQBIRERGRJAyQRERERCQJAyQRERERScIASURERESSMEASERERkSQMkEREREQkCQMkEREREUnCAElEREREkjBAEhEREZEkDJBEREREJAkDJBERERFJwgBJRERERJIwQBIRERGRJAyQRERERCQJAyQRERERScIASURERESSMEASERERkSQMkEREREQkCQMkEREREUnCAElEREREkjBAEhEREZEktTZAzpkzBzKZTOnh4uIiTn/58iXCwsJgaWkJY2NjBAUFITU1tRp7TERERKQZam2ABAA3Nzfcv39ffJw8eVKcNnnyZOzZswfbt2/H8ePHce/ePfTt27cae0tERESkGXSquwNVSUdHBzY2NsXKMzMzsW7dOmzZsgXdunUDAERHR6NFixY4ffo02rdvr+6uEhEREWmMWj0CmZiYCDs7O7z22msYNGgQkpOTAQAXLlxAbm4ufH19xbouLi5o1KgR4uLiSmwvOzsbWVlZSg8iIiKiuqbWBkgvLy9s2LABsbGxWL16NW7evIlOnTrhyZMnSElJgZ6eHszNzZVeY21tjZSUlBLbjIyMhJmZmfhwcHCo4qUgIiIiqnlq7SHsgIAA8f8tW7aEl5cXHB0dsW3bNhgYGJSrzYiICISHh4vPs7KyGCKJiIiozqm1I5BFmZubo1mzZrhx4wZsbGyQk5ODjIwMpTqpqakqz5lUkMvlMDU1VXoQERER1TV1JkA+ffoUSUlJsLW1haenJ3R1dXH48GFxekJCApKTk+Ht7V2NvSQiIiKq+WrtIewpU6agV69ecHR0xL179zB79mxoa2tjwIABMDMzw8iRIxEeHg4LCwuYmppiwoQJ8Pb25hXYRERERK9QawPknTt3MGDAADx69AgNGjRAx44dcfr0aTRo0AAAsGTJEmhpaSEo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",
"text/plain": [
"<Figure size 640x480 with 1 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"# generate plot\n",
"plot_lines = lines[start_index:stop_index]\n",
"s = convertToSeries(plot_lines)\n",
"s.plot.bar()\n",
"plt.title(\"Multicast UDP packet interval receive duration (%d samples, stm32mp1-*)\" %len(plot_lines))\n",
"plt.xlabel('Cycles', fontsize=10)\n",
"plt.ylabel('micro seconds', fontsize=10)\n",
"plt.xticks([])\n",
"plt.show()"
]
},
{
"cell_type": "markdown",
"id": "12f93671",
"metadata": {},
"source": [
"##tsn-shuttle (coupler on x86)##"
]
},
{
"cell_type": "code",
"execution_count": 43,
"id": "adf8c5db",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Anomaly records (longer than desired threshold in micro seconds!)= 7\n",
"Anomaly records (in %)= 0.035\n",
"Anomaly records= [4402.0, 4405.0, 4404.0, 4396.0, 4417.0, 4404.0, 4391.0]\n"
]
}
],
"source": [
"lines = readFile(\"/home/ivan/report-tsn-shuttle.csv\")\n",
"all_record_count = len(lines)\n",
"anomaly_record_list = [x for x in lines if x >= treshold]\n",
"anomaly_record_count = len(anomaly_record_list)\n",
"anomaly_record_percentile = round((anomaly_record_count * 100) / all_record_count, round_base)\n",
"print(\"Anomaly records (longer than desired threshold in micro seconds!)=\", anomaly_record_count)\n",
"print(\"Anomaly records (in %)=\", anomaly_record_percentile)\n",
"print(\"Anomaly records=\", anomaly_record_list)\n",
"# remove anomalies\n",
"lines = [x for x in lines if x < treshold]"
]
},
{
"cell_type": "code",
"execution_count": 44,
"id": "2ba78846",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Transimission time (in micro seconds):\n",
"\tMean = 394.61847\n",
"\tMedian = 393.0\n",
"\tMin = 374.0\n",
"\tMax = 446.0\n",
"\tStandart deviation = 7.76911\n",
"\tStandart deviation (%) = 1.97687\n",
"\tMode (most occurencies) = 391.0\n"
]
}
],
"source": [
"mean = statistics.mean(lines)\n",
"median =statistics.median(lines)\n",
"stdev = statistics.stdev(lines)\n",
"stdev_percentile = (stdev * 100) / median\n",
"try:\n",
" mode = statistics.mode(lines)\n",
"except statistics.StatisticsError:\n",
" mode = None\n",
"minimal = min(lines)\n",
"maximal = max(lines)\n",
"print(\"Transimission time (in micro seconds):\")\n",
"print(\"\\tMean = \", round(mean, round_base))\n",
"print(\"\\tMedian = \", round(median, round_base))\n",
"print(\"\\tMin = \", round(minimal, round_base))\n",
"print(\"\\tMax = \", round(maximal, round_base))\n",
"print(\"\\tStandart deviation = \", round(stdev, round_base))\n",
"print(\"\\tStandart deviation (%) = \", round(stdev_percentile, round_base))\n",
"print(\"\\tMode (most occurencies) = \", round(mode, round_base))"
]
},
{
"cell_type": "code",
"execution_count": 10,
"id": "9c461217",
"metadata": {},
"outputs": [
{
"data": {
"image/png": "iVBORw0KGgoAAAANSUhEUgAAAoAAAAGvCAYAAADL32RdAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjcuMSwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/bCgiHAAAACXBIWXMAAA9hAAAPYQGoP6dpAABU60lEQVR4nO3deVxN+eM/8NctdVtvKeqWEgppwUxGslMKYYyGso+dCR+yTTO2GNMwM/Yw5kMZo7Ezow9FdiPGzmCyDJOtQiprUef3h989X7dNy6Vb5/V8PO6D+z7v+36/zz2dc1/3bFcmCIIAIiIiIpIMnfIeABERERG9XwyARERERBLDAEhEREQkMQyARERERBLDAEhEREQkMQyARERERBLDAEhEREQkMQyARERERBLDAEhEREQkMVoXAGfOnAmZTFasulFRUZDJZLh58+a7HRS9c7Vq1UKXLl3Kpe/PPvsMtWrVKpe+37datWrhs88+K+9hlJi2jVsmk2HmzJnlPYx8ynub+OTJE1hZWWHdunXl0j+9VpLPUamTyWQYPXp0eQ+j1Nu4hw8fwtjYGDt37izxa0sUAFUbF5lMhiNHjuSbLggC7O3tIZPJNPph/s0332D79u0aa0+Tli1bhqioqGLVvXnzJmQyGb7//vsCp3///ff5Nt5t27YV33MdHR0oFArUr18f/fv3x549ewpsp1atWuJrZDIZrKys0KpVK2zbtq2ks1chHT16FDNnzkR6evo772vnzp1aGQSoctPWbeKiRYtgamqKoKAgsezevXv44osv0K5dO5iamkImk+HAgQOFtnH06FG0bNkSRkZGUCqVGDt2LJ48eZKvXlZWFqZMmQJbW1sYGhrC09Oz0G1icdskzbp06RJmzpwpuZ00ha2f7+KzydLSEkOHDsW0adNK/NpS7QE0MDBAdHR0vvKDBw/i9u3bkMvlpWm2UIW9mf3798fz58/h4OCg0f5KoiQBsLTs7Oywdu1a/Pzzz/juu+/QrVs3HD16FL6+vggMDMTLly/zvaZx48ZYu3Yt1q5di4kTJ+Lu3bvo0aMHVqxY8U7Hqg2OHj2KsLCwYq9kP/30ExITE0vV186dOxEWFlaq11LxJSYm4qeffirvYWgNbdwmvnz5EosWLcLQoUOhq6srlicmJmLu3Lm4c+cO3N3di2zj7Nmz8Pb2xrNnzzB//nwMHToUK1euRM+ePfPV/eyzzzB//nz07dsXixYtgq6uLjp37pxv50RJ2iTNunTpEsLCwhgA/7+SfjYV18iRI3H69Gns27evRK+rUprOOnfujE2bNmHx4sWoUuX/moiOjoaHhwcePHhQmmZLTFdXV21DU1mZmZmhX79+amXffvstxo4di2XLlqFWrVqYO3eu2vQaNWqovWbAgAFwcnLCggULMHLkyPcy7opCT0+vvIegRhAEvHjxAoaGhuU9FNGrV6+Qm5sLfX39culf018qtUlubi6ys7NhYGBQ5rbKc5sYExOD+/fvo1evXmrlHh4eePjwISwsLLB58+Yig9eXX36JqlWr4sCBA1AoFABeH9EYNmwYdu/eDV9fXwDAn3/+ifXr1+O7777DxIkTAbzexrm5uWHy5Mk4evRoidskqqgaNGgANzc3REVFoX379sV+Xan2APbu3RsPHz5U292enZ2NzZs3o0+fPvnqHzhwoMDd/qpDokXtQZPJZHj69CnWrFkjHtJUHScv7HyXXbt2oU2bNjA1NYVCocBHH32ktsfy8OHD6NmzJ2rWrAm5XA57e3uMHz8ez58/V2snOTkZgwYNgp2dHeRyOWxsbPDxxx+L/dWqVQsXL17EwYMHxbG1bdv2re+fJujq6mLx4sVwcXHB0qVLkZGRUWR9pVKJBg0a4MaNG0XW++yzz2BiYoJ//vkHfn5+MDY2hq2tLWbNmgVBENTqfv/992jevDksLS1haGgIDw8PbN68ucB2f/nlFzRt2hRGRkaoWrUqWrdujd27dxc5ljVr1qBKlSqYNGmSWHb8+HF07NgRZmZmMDIyQps2bfDHH3+I02fOnCnWr127trhcivoGmvccwDcP1a9cuRKOjo6Qy+X46KOPcOLECbXXRUREAIDaIXeV3NxcLFy4EK6urjAwMIC1tTVGjBiBR48eqfWvOv8xLi4OTZo0gaGhIX788Ue4ubmhXbt2+cabm5uLGjVq4NNPPxXLSrIs3ubN+V+4cKE4/5cuXQIA/P333/j0009hYWEBAwMDNGnSBL///nu+dtLT0zF+/HjUqlULcrkcdnZ2GDBggNoXxKysLMyYMQNOTk7iujh58mRkZWXle49U6/3Jkychk8mwZs2afH3GxcVBJpMhJiZGLLtz5w4GDx4Ma2tryOVyuLq6YvXq1cV6L7KysjB+/HhUr14dpqam6NatG27fvp2vXmHnkRZ0LpbqnKN169bB1dUVcrkcsbGxAIq3HEuzTVy2bJnYl62tLYKDg/PthWjbti3c3Nxw6dIltGvXDkZGRqhRowbmzZtXrPdq+/btqFWrFhwdHdXKTU1NYWFh8dbXZ2ZmYs+ePejXr58Y1IDXwc7ExAQbN24UyzZv3gxdXV0MHz5cLDMwMMCQIUOQkJCAW7dulbjNwixZsgSurq7itqtJkyZqnyf//vsvPv/8c9SvXx+GhoawtLREz5498y0D1bI5cuQIxo4di+rVq8Pc3BwjRoxAdnY20tPTMWDAAFStWhVVq1bF5MmT1ba5b66XCxYsgIODAwwNDdGmTRv89ddfb50P4PV22MPDA4aGhrCwsEBQUJD4XqlcvXoVAQEBUCqVMDAwgJ2dHYKCgt76GZNXVFSUGPbbtWsn/q2qcsDJkyfh5+eHatWqwdDQELVr18bgwYMLnN+itsNFKcm8bN++HW5ubuI2QrVOqhR3HS9s/SzNZ1N6ejrGjRsHe3t7yOVyODk5Ye7cucjNzc1Xt0OHDtixY0e+z+milGoPYK1ateDl5YVff/0VnTp1AvA6dGVkZCAoKAiLFy8uTbMFWrt2LYYOHYqmTZuKK3veDcyboqKiMHjwYLi6uiI0NBTm5uY4c+YMYmNjxXC6adMmPHv2DKNGjYKlpSX+/PNPLFmyBLdv38amTZvEtgICAnDx4kWMGTMGtWrVQmpqKvbs2YOkpCTUqlULCxcuxJgxY2BiYoKvvvoKAGBtba2xeX8bXV1d9O7dG9OmTcORI0fg7+9faN2XL1/i1q1bsLS0fGu7OTk56NixI5o1a4Z58+YhNjYWM2bMwKtXrzBr1iyx3qJFi9CtWzf07dsX2dnZWL9+PXr27ImYmBi1sYSFhWHmzJlo3rw5Zs2aBX19fRw/fhz79u0r9Nv3ypUrMXLkSHz55Zf4+uuvAQD79u1Dp06d4OHhgRkzZkBHRweRkZFo3749Dh8+jKZNm6JHjx64cuUKfv31VyxYsADVqlUDAFSvXr1Y7+mboqOj8fjxY4wYMQIymQzz5s1Djx498M8//0BPTw8jRozA3bt3sWfPHqxduzbf60eMGIGoqCgMGjQIY8eOxY0bN7B06VKcOXMGf/zxh9qex8TERPTu3RsjRozAsGHDUL9+fQQGBmLmzJlITk6GUqkU6x45cgR3795VO8+quMuiJCIjI/HixQsMHz4ccrkcFhYWuHjxIlq0aIEaNWrgiy++gLGxMTZu3Iju3btjy5Yt+OSTTwC8vhigVatWuHz5MgYPHowPP/wQDx48wO+//47bt2+jWrVqyM3NRbdu3XDkyBEMHz4cDRo0wIULF7BgwQJcuXKl0HPcmjRpgjp16mDjxo0YOHCg2rQNGzagatWq8PPzAwCkpKSgWbNmYuiqXr06du3ahSFDhiAzMxPjxo0r8j0YOnQofvnlF/Tp0wfNmzfHvn37Sv1+vmnfvn3YuHEjRo8ejWrVqokfLMVZjiXdJs6cORNhYWHw8fHBqFGjkJiYiOXLl+PEiRP5/g4fPXqEjh07okePHujVqxc2b96MKVOmwN3dXdzWF+bo0aP48MMPS/2eXLhwAa9evUKTJk3UyvX19dG4cWOcOXNGLDtz5gzq1aunFuoAoGnTpgBeH/a1t7cvUZsF+emnnzB27Fh8+umn+M9//oMXL17g/PnzOH78uPh5cuLECRw9ehRBQUGws7PDzZs3sXz5crRt2xaXLl2CkZGRWptjxoyBUqlEWFgYjh07hpUrV8Lc3BxHjx5FzZo18c0332Dnzp347rvv4ObmhgEDBqi9/ueff8bjx48RHByMFy9eYNGiRWjfvj0uXLhQ5OfPnDlzMG3aNPTq1QtDhw7F/fv3sWTJErRu3RpnzpyBubk5srOz4efnh6ysLHGcd+7cQUxMDNLT02FmZlbk+/Wm1q1bY+zYsVi8eDG+/PJLNGjQAMDrvVWpqanw9fVF9erV8cUXX8Dc3Bw3b97E1q1b87Xztu1wYUoyL0eOHMHWrVvx+eefw9TUFIsXL0ZAQACSkpKK9Zn5psLWT2Nj4xJ9Nj179gxt2rTBnTt3MGLECNSsWRNHjx5FaGgo7t27h4ULF6rV9/DwwIIFC3Dx4kW4ubkVb7BCCURGRgoAhBMnTghLly4VTE1NhWfPngmCIAg9e/YU2rVrJwiCIDg4OAj+/v7i6/bv3y8AEPbv36/W3o0bNwQAQmRkpFg2Y8YMIe+wjI2NhYEDBxY6nhs3bgiCIAjp6emCqamp4OnpKTx//lytbm5urvh/1ZjfFB4eLshkMuHff/8VBEEQHj16JAAQvvvuuyLfE1dXV6FNmzZF1lFRzW9hbX733Xdq8yMIgtCmTRvB1dW10Da3bdsmABAWLVokljk4OAi+vr7C/fv3hfv37wvnzp0TgoKCBADCmDFjihzjwIED89XLzc0V/P39BX19feH+/ftied73MTs7W3BzcxPat28vll29elXQ0dERPvnkEyEnJ0et/pvL5M2/mUWLFgkymUyYPXu2Wt26desKfn5++ZZl7dq1hQ4dOohlBb2Pb5tnBwcH8blqOVlaWgppaWli+W+//SYAEHbs2CGWBQcH5/t7FQRBOHz4sABAWLdunVp5bGxsvnIHBwcBgBAbG6tWNzExUQAgLFmyRK38888/F0xMTNTe/+IsC1VfBa1Lb1LNv0KhEFJTU9WmeXt7C+7u7sKLFy/EstzcXKF58+ZC3bp1xbLp06cLAIStW7fma1+1/NauXSvo6OgIhw8fVpu+YsUKAYDwxx9/FDru0NBQQU9PT235ZGVlCebm5sLgwYPFsiFDhgg2NjbCgwcP1PoICgoSzMzMCtwWqJw9e1YAIHz++edq5X369BEACDNmzBDL8v4NqRS0PQMg6OjoCBcvXsxXv7jLsbjbxNTUVEFfX1/w9fVVW/+WLl0qABBWr14tlrVp00YAIPz8889iWVZWlqBUKoWAgIB8fb3p5cuXgkwmEyZMmFBkvU2bNhX4WfDmtEOHDuWb1rNnT0GpVIrPXV1d870ngiAIFy9eFAAIK1asKHGbBfn444+L3P4KQsGfJwkJCfneS9WyybsN8/LyEmQymTBy5Eix7NWrV4KdnZ3aZ4tqvTQ0NBRu374tlh8/flwAIIwfP14sy/t3d/PmTUFXV1eYM2eO2jgvXLggVKlSRSw/c+aMAEDYtGlTkfNcXIUtb9Xn1okTJwp9bUm2wwUp7rwAEPT19YVr166JZefOncu37S3JOl7Y+lnUZ1Pebdzs2bMFY2Nj4cqVK2r1vvjiC0FXV1dISkpSKz969KgAQNiwYUMRc6uu1LeB6dWrF54/f46YmBg8fvwYMTExBR7+fZ/27NmDx48f44svvsh3Ps2bu2jfPLfq6dOnePDgAZo3bw5BEMRvhIaGhtDX18eBAwfyHbLTJiYmJgCAx48fq5Xv3r0b1atXR/Xq1dGoUSNs2rQJ/fv3z3euYGHevCxetfckOzsb8fHxYvmb7+OjR4+QkZGBVq1a4fTp02L59u3bkZubi+nTp0NHR/3PraDbFMybNw//+c9/MHfuXEydOlUsP3v2LK5evYo+ffrg4cOHePDgAR48eICnT5/C29sbhw4dKnC3eFkEBgaiatWq4vNWrVoBAP7555+3vnbTpk0wMzNDhw4dxLE+ePAAHh4eMDExwf79+9Xq165dW9xrpVKvXj00btwYGzZsEMtycnKwefNmdO3aVe39L86yKKmAgAC1b6dpaWnYt28fevXqhcePH4vz9PDhQ/j5+eHq1au4c+cOAGDLli1o1KiRuEfwTarlvmnTJjRo0ADOzs5q75HqHJa879GbVBc/vbnHYPfu3UhPT0dgYCCA1+dSbtmyBV27doUgCGp9+Pn5ISMjo8j3R3VbhbFjx6qVv22vYXG0adMGLi4u+co1vRzj4+ORnZ2NcePGqa1/w4YNg0KhwP/+9z+1+iYmJmrnDuvr66Np06Zv/ZtPS0uDIAhq60tJqU7BKeh8TwMDA7VTdJ4/f15ovTfbKkmbBTE3N8ft27eLPOT45jJ7+fIlHj58CCcnJ5ibmxe43IYMGaK27fP09IQgCBgyZIhYpquriyZNmhT4vnfv3h01atQQnzdt2hSenp5F3gZk69atyM3NRa9evdTWA6VSibp164rrmmqvWFxcHJ49e1Zoe2Vlbm4O4PV5owVdxPim0m6HSzIvPj4+anvRGzZsCIVCUaxt/buyadMmtGrVClWrVlVbZj4+PsjJycGhQ4fU6qveo5Jcg1GqQ8DA692WPj4+iI6OxrNnz5CTk6N2TlJ5uH79OgC8dfdnUlISpk+fjt9//z1fuFOdGyCXyzF37lxMmDAB1tbWaNasGbp06YIBAwaoHY57F0py/ybVrQxMTU3Vyj09PfH1119DJpPByMgIDRo0EFe6t9HR0UGdOnXUyurVqwcAaucrxMTE4Ouvv8bZs2fVztl6c/zXr1+Hjo5OgR92eR08eBD/+9//MGXKFLXz/oDX53IAyHfI700ZGRll+gDKq2bNmmrPVW0X5wvB1atXkZGRASsrqwKnp6amqj2vXbt2gfUCAwPx5Zdf4s6dO6hRowYOHDiA1NRUMeSoFGdZlFTeMV27dg2CIGDatGmF3nIgNTUVNWrUwPXr1xEQEFBk+1evXsXly5cLPQSS9z16U6NGjeDs7IwNGzaIH5wbNmxAtWrVxAB5//59pKenY+XKlVi5cmWJ+/j333+ho6OT7/Bq/fr1i5yv4ihseWt6Of77778A8o9ZX18fderUEaer2NnZ5euratWqOH/+fLH6E0pw/lFeqiCV9/xPAPkuijI0NCy03pttlaTNgkyZMgXx8fFo2rQpnJyc4Ovriz59+qBFixZinefPnyM8PByRkZG4c+eO2ntQ0LlmebcrqqBib2+fr7ygbU3dunXzldWrV6/I8xmvXr0KQRAKfC3wfxfC1a5dGyEhIZg/fz7WrVuHVq1aoVu3bujXr1+JDv++TZs2bRAQEICwsDAsWLAAbdu2Rffu3dGnT598Yf1t2+Hnz5/ne5+VSmWJ5iVvH6p+ynPnz9WrV3H+/Plibx9Vf3cl2VaUOgACQJ8+fTBs2DAkJyejU6dOhQaMwgaUk5NTlu5LJScnBx06dEBaWhqmTJkCZ2dnGBsb486dO/jss8/U9iKNGzcOXbt2xfbt2xEXF4dp06YhPDwc+/btwwcffFDivvN+O81L9S2lJFcDqk7+dXJyUiuvVq0afHx8SjzG4jp8+DC6deuG1q1bY9myZbCxsYGenh4iIyMLvEVQcbi6uiI9PR1r167FiBEj1D4kVcvlu+++Q+PGjQt8vWpvqKYUdjVlcT7kcnNzi7whbt6VurAPosDAQISGhmLTpk0YN24cNm7cCDMzM3Ts2FGs8y6WRUFjUi2DiRMn5ttbqZL377Aoubm5cHd3x/z58wucnvcDMa/AwEDMmTMHDx48gKmpKX7//Xf07t1bvDOBarz9+vUr9ItDw4YNiz3eopR0G1fQ8n5Xy7EkSvs3b2FhAZlMVqYPTBsbGwCv7xuY171792Bra6tWV7W3OW89AGLdkrRZkAYNGiAxMRExMTGIjY3Fli1bsGzZMkyfPl28/dOYMWMQGRmJcePGwcvLC2ZmZpDJZAgKCirwqERh73FB5WUJ1G/Kzc2FTCbDrl27CuznzW3nDz/8gM8++wy//fYbdu/ejbFjxyI8PBzHjh2DnZ2dRsYjk8mwefNmHDt2DDt27EBcXBwGDx6MH374AceOHVMbz9v+Jjds2IBBgwYVOK2481Kcv/v3nWNyc3PRoUMHTJ48ucDpqp0yKqp1T3VuYXGUKQB+8sknGDFiBI4dO6Z2mCovVWLPe9VZ3m+fhSluolV9U//rr78K/SC6cOECrly5gjVr1qidXFvYDUQdHR0xYcIETJgwAVevXkXjxo3xww8/4JdffinR2IDXH/pGRkaF3nMuMTERRkZGxV6AOTk5iI6OhpGREVq2bFnscbxNbm4u/vnnH7U/sCtXrgCAeLL6li1bYGBggLi4OLVvbJGRkWptOTo6Ijc3F5cuXSo0uKlUq1YNmzdvRsuWLeHt7Y0jR46IG2jVslUoFG8Ntu/zDviF9eXo6Ij4+Hi0aNGiTLdzqV27Npo2bYoNGzZg9OjR2Lp1K7p37672nhd3WZSVaq+wnp7eW5eBo6PjW69MdHR0xLlz5+Dt7V2qZRYYGIiwsDBs2bIF1tbWyMzMVLswRnXlbk5OTqm+DDk4OCA3NxfXr19X24NW0PpbtWrVAu/tVdxtHFCy5Vjc90t1P8DExES1vfrZ2dm4ceOGxr4kVqlSBY6Ojm+9y0BR3NzcUKVKFZw8eVLtVjLZ2dk4e/asWlnjxo2xf/9+ZGZmql0Icvz4cXF6SdssjLGxMQIDAxEYGIjs7Gz06NEDc+bMQWhoKAwMDLB582YMHDgQP/zwg/iaFy9evLMb0auOhrzpypUrRf6akaOjIwRBQO3atfMFh4K4u7vD3d0dU6dOxdGjR9GiRQusWLFCvCCvuN72d9qsWTM0a9YMc+bMQXR0NPr27Yv169dj6NChxe7Dz8+v0M9vQHPzUpJ1vLD5Lsl2ztHREU+ePCn2Oqpa91QX2xRHmX4KzsTEBMuXL8fMmTPRtWvXQus5ODhAV1c33zHrZcuWFasfY2PjYq1Mvr6+MDU1RXh4uHgoQEWV5FVJ/81kLwgCFi1apFb/2bNn+dpwdHSEqamp2uGE4o5N1bevry927NiBpKQktWlJSUnYsWMHfH19i3Ufr5ycHIwdOxaXL1/G2LFj810NV1ZLly4V/y8IApYuXQo9PT14e3uL8yKTydS+/dy8eTPflZvdu3eHjo4OZs2ale/bcEHfbu3s7BAfH4/nz5+jQ4cOePjwIYDXVzg5Ojri+++/L/AO/vfv3xf/b2xsDCD/F453obC+evXqhZycHMyePTvfa169elWisQUGBuLYsWNYvXo1Hjx4kO/wb3GXRVlZWVmhbdu2+PHHHwvco/LmMggICMC5c+cK/PUZ1XLv1asX7ty5U+ANnp8/f46nT58WOZ4GDRrA3d0dGzZswIYNG2BjY4PWrVuL03V1dREQEIAtW7YUGEbfHG9BVFe95r2rQd6r74DX24aMjAy1Q6X37t0r0a/vlGQ5Fne74+PjA319fSxevFhtfVu1ahUyMjI0ckWzipeXF06ePFnq15uZmcHHxwe//PKL2jnNa9euxZMnT9TuH/jpp58iJydH7dB+VlYWIiMj4enpKe49LkmbBVFtf1T09fXh4uICQRDEc9d0dXXzbcuWLFnyzvYMbd++XW3v559//onjx48XeZV2jx49oKuri7CwsHxjFQRBnM/MzEy8evVKbbq7uzt0dHQKPIz+NoVtHx89epRvHKrQXtJ+bGxs4OPjo/YAND8vJVnHC1s/S/LZ1KtXLyQkJCAuLi7ftPT09HzzdurUKZiZmcHV1fWtbauUaQ8gUPQ5WSpmZmbo2bMnlixZAplMBkdHR8TExBR5/s2bPDw8EB8fj/nz58PW1ha1a9eGp6dnvnoKhQILFizA0KFD8dFHH6FPnz6oWrUqzp07h2fPnmHNmjVwdnaGo6MjJk6ciDt37kChUGDLli35Dl1cuXIF3t7e6NWrF1xcXFClShVs27YNKSkpansZPDw8sHz5cnz99ddwcnKClZVVkTdi/Oabb9CsWTN8+OGHGD58OGrVqoWbN29i5cqVkMlk+Oabb/K9JiMjQ9zj+OzZM1y7dg1bt27F9evXERQUVGDIKAsDAwPExsZi4MCB8PT0xK5du/C///0PX375pXjo0t/fH/Pnz0fHjh3Rp08fpKamIiIiAk5OTmoriJOTE7766ivMnj0brVq1Qo8ePSCXy3HixAnY2toiPDw8X/9OTk7YvXs32rZtCz8/P+zbtw8KhQL//e9/0alTJ7i6umLQoEGoUaMG7ty5g/3790OhUGDHjh0AXi8TAPjqq68QFBQEPT09dO3aVVz5NEnV19ixY+Hn5wddXV0EBQWhTZs2GDFiBMLDw3H27Fn4+vpCT08PV69exaZNm7Bo0aJinzPbq1cvTJw4ERMnToSFhUW+b4TFXRaaEBERgZYtW8Ld3R3Dhg1DnTp1kJKSgoSEBNy+fRvnzp0DAEyaNEm86e/gwYPh4eGBtLQ0/P7771ixYgUaNWqE/v37Y+PGjRg5ciT279+PFi1aICcnB3///Tc2btwo3hexKIGBgZg+fbp4D7i8Fxp9++232L9/Pzw9PTFs2DC4uLggLS0Np0+fRnx8PNLS0gptu3HjxujduzeWLVuGjIwMNG/eHHv37sW1a9fy1Q0KCsKUKVPwySefYOzYsXj27BmWL1+OevXqFfsCjpIsx+JuE6tXr47Q0FCEhYWhY8eO6NatGxITE7Fs2TJ89NFH+W4wXxYff/wx1q5diytXruTby6Ta23Lx4kUArwOY6hc73rzYa86cOWjevDnatGmD4cOH4/bt2/jhhx/g6+urdtqDp6cnevbsidDQUKSmpsLJyQlr1qzBzZs3sWrVKrW+i9tmQXx9faFUKtGiRQtYW1vj8uXLWLp0Kfz9/cXzrrt06YK1a9fCzMwMLi4uSEhIQHx8fIlvH1JcTk5OaNmyJUaNGoWsrCwsXLgQlpaWhR4qBF6Hl6+//hqhoaG4efMmunfvDlNTU9y4cQPbtm3D8OHDMXHiROzbtw+jR49Gz549Ua9ePbx69Qpr164Vv0ypqG4ttH///iLvfdu4cWPo6upi7ty5yMjIgFwuR/v27REdHY1ly5bhk08+gaOjIx4/foyffvoJCoUCnTt31sj7VNx5Ka6SrOOFrZ8l+WyaNGkSfv/9d3Tp0gWfffYZPDw88PTpU1y4cAGbN2/GzZs31Y4W7tmzB127di3Z0ZRiXy8sqN8Gpih5bwMjCIJw//59ISAgQDAyMhKqVq0qjBgxQvjrr7+KdRuYv//+W2jdurVgaGgoABAvlc57ywOV33//XWjevLlgaGgoKBQKoWnTpsKvv/4qTr906ZLg4+MjmJiYCNWqVROGDRsmXvatGsuDBw+E4OBgwdnZWTA2NhbMzMwET09PYePGjWp9JScnC/7+/oKpqakAoFi3hLl8+bIQGBgoWFlZCVWqVBGsrKyEoKAg4fLly/nqqm7NoHqYmJgIdevWFfr16yfs3r27wPYLev+La+DAgYKxsbFw/fp1wdfXVzAyMhKsra2FGTNm5LuNy6pVq4S6desKcrlccHZ2FiIjIwtcfoIgCKtXrxY++OADQS6XC1WrVhXatGkj7Nmzp8gxHz9+XDA1NRVat24t3mrhzJkzQo8ePQRLS0tBLpcLDg4OQq9evYS9e/eqvXb27NlCjRo1BB0dnbfeEqaw28AUdLse5Ln9x6tXr4QxY8YI1atXF2QyWb55X7lypeDh4SEYGhoKpqamgru7uzB58mTh7t27Rc57Xi1atBAACEOHDi1wenGXRUluA1PY7YquX78uDBgwQFAqlYKenp5Qo0YNoUuXLsLmzZvV6j18+FAYPXq0UKNGDUFfX1+ws7MTBg4cqHZLluzsbGHu3LmCq6ur+Lfh4eEhhIWFCRkZGW8d99WrV8V148iRIwWONyUlRQgODhbs7e0FPT09QalUCt7e3sLKlSuLfB8EQRCeP38ujB07VrC0tBSMjY2Frl27Crdu3cr3dyAIgrB7927Bzc1N0NfXF+rXry/88ssvhd4GJjg4uMD+irscS7pNXLp0qeDs7Czo6ekJ1tbWwqhRo4RHjx6p1SnsllOF3f4ir6ysLKFatWpqt296c54Le+R1+PBhoXnz5oKBgYFQvXp1ITg4WMjMzMxX7/nz58LEiRMFpVIpyOVy4aOPPsp3K6WStpnXjz/+KLRu3Vrc3jg6OgqTJk1S+9t89OiRMGjQIKFatWqCiYmJ4OfnJ/z999/5/mYL+/xULd83b7ElCP+3LVZ5c7384YcfBHt7e0EulwutWrUSzp07V2CbeW3ZskVo2bKlYGxsLBgbGwvOzs5CcHCwkJiYKAiCIPzzzz/C4MGDBUdHR8HAwECwsLAQ2rVrJ8THx6u1M2HCBEEmkxX4mZXXTz/9JNSpU0fQ1dUVbwlz+vRpoXfv3kLNmjUFuVwuWFlZCV26dBFOnjxZ4PzmVdD6l1dx56Ww9bGgbU5x1/HC1k9BKPyzqaD+Hj9+LISGhgpOTk6Cvr6+UK1aNaF58+bC999/L2RnZ4v1Ll++LADIN29vI/v/bwARgNd3O9+8eTN/KJ2ISmz27NmIjIzE1atXJfEzne/TzZs3Ubt2bbWfvysvTZs2hYODg9oPJ1D5GTduHA4dOoRTp06VaA9gmc4BJCIiUhk/fjyePHmC9evXl/dQ6B3JzMzEuXPn1H4VisrPw4cP8d///le87VtJlPkcQCIiIuD1hYHFPbebKiaFQlGqiyjo3bC0tCz1ETvuASQiIiKSGJ4DSERERCQx3ANIREREJDEMgEREREQSw4tAipCbm4u7d+/C1NT0vf68GBEREZWeIAh4/PgxbG1t890gnl5jACzC3bt33/qD9ERERKSdbt26BTs7u/IehlZiACyC6qd+bt26pfHf2iUiIqJ3IzMzE/b29uLnOOXHAFgE1WFfhULBAEhERFTB8PStwvHAOBEREZHEMAASERERSQwDIBEREZHEMAASERERSQwDIBEREZHEMAASERERSQwDIBEREZHEMAASERERSQwDIBEREZHEMAASERERSQwDIBEREZHEMAASERERSQwDIBEREZHEMAASERERSQwDIBEREZHEMAASERERSQwDIBEREZHEMAASERERSQwDIBEREZHEMAASaUCtL/5X3kMgIiIqNgZAIiIiIolhACQiIiKSGAZAIiIiIolhACQiIiKSGAZAIiIiIolhACQiIiKSGAZAIiIiIolhACQiIiKSmAoRAL/99lvIZDKMGzdOLHvx4gWCg4NhaWkJExMTBAQEICUlRe11SUlJ8Pf3h5GREaysrDBp0iS8evXqPY+eiIiISLtofQA8ceIEfvzxRzRs2FCtfPz48dixYwc2bdqEgwcP4u7du+jRo4c4PScnB/7+/sjOzsbRo0exZs0aREVFYfr06e97FohIYirLL8NUlvkgovy0OgA+efIEffv2xU8//YSqVauK5RkZGVi1ahXmz5+P9u3bw8PDA5GRkTh69CiOHTsGANi9ezcuXbqEX375BY0bN0anTp0we/ZsREREIDs7u7xmiYiIiKjcaXUADA4Ohr+/P3x8fNTKT506hZcvX6qVOzs7o2bNmkhISAAAJCQkwN3dHdbW1mIdPz8/ZGZm4uLFiwX2l5WVhczMTLVHSfEbMxEREWk7rQ2A69evx+nTpxEeHp5vWnJyMvT19WFubq5Wbm1tjeTkZLHOm+FPNV01rSDh4eEwMzMTH/b29hqYE6LKiV92iIgqLq0MgLdu3cJ//vMfrFu3DgYGBu+t39DQUGRkZIiPW7duvbe+iYiIiN4XrQyAp06dQmpqKj788ENUqVIFVapUwcGDB7F48WJUqVIF1tbWyM7ORnp6utrrUlJSoFQqAQBKpTLfVcGq56o6ecnlcigUCrUHERERUWWjlQHQ29sbFy5cwNmzZ8VHkyZN0LdvX/H/enp62Lt3r/iaxMREJCUlwcvLCwDg5eWFCxcuIDU1VayzZ88eKBQKuLi4vPd5qswKOhRY1sODFfHwYnHHXBHnrazexd9IZaHt70Nxl52myyqLyjxvVLFpZQA0NTWFm5ub2sPY2BiWlpZwc3ODmZkZhgwZgpCQEOzfvx+nTp3CoEGD4OXlhWbNmgEAfH194eLigv79++PcuXOIi4vD1KlTERwcDLlcXs5z+Bo3DK9V5uBUlnnTpvmt9cX/yryctGl+Sqsk81CW+a0M79WbKsP8FLWOVvT5K+vfdXHem4K2IRX9favotDIAFseCBQvQpUsXBAQEoHXr1lAqldi6das4XVdXFzExMdDV1YWXlxf69euHAQMGYNasWeU46rerKN+Yi7MiFzXGgjYOqn+Laru851tFW8ZRHooz728LgQV9cGrj33lxVIQxllVBy6mw5VWc9beiLuviqKjz9uayK2gZFrauljTgqepVhPeksqtS3gMorgMHDqg9NzAwQEREBCIiIgp9jYODA3bu3PmOR5ZfrS/+h5vf+r/3ft+3kobAvO/J216vjcEP0K6xvG9FfUAUVvdt5RX1A7M0Ksq2oaxfRItTt7A62vD+aMs4ykNxvrgXVa+g966yrs8VXYXdA1hRlOZwGFeWiktT50FVlkNLUve25cflXLGUJRxJaRlLaV4rMpkgCEJ5D0JbZWZmwszMDBkZGYVeEVycP/Q3vw1pcsUoz2+opZkPTb0PFW2+NUUb51s1Jk29LwW1p43z/T5wvt+/9znfef/WtXG+Nb1+F9WHphXn81vquAeQ3ht+KyQiItIODIBEREREEsMASERERCQxDIBEREREEsMA+B7w3Dd1fD8qFy5PIqKKhwGQiIiICsQveJUXA+B7xBWJiIiItAEDIBEREZHEMAASERERSQwDIBGVmqZPa+BpEiQV/Fun8sYASO8VN3pERBUDt9eVGwPge8IViah4uK4QEb17DIBERETlgF92qDwxABIRERFJDAMgERERkcQwABIRERFJDAMgERERkcQwABIRERFJDAMgERERkcQwABIRERFJDAMgERERkcQwABIRERFJDAMgERERkcQwABIRERFJDAMgERERkcQwABIRERFJDAMgERERkcQwABIRERFJDAMgERERkcRobQBcvnw5GjZsCIVCAYVCAS8vL+zatUuc3rZtW8hkMrXHyJEj1dpISkqCv78/jIyMYGVlhUmTJuHVq1fve1aIiIiItEqV8h5AYezs7PDtt9+ibt26EAQBa9aswccff4wzZ87A1dUVADBs2DDMmjVLfI2RkZH4/5ycHPj7+0OpVOLo0aO4d+8eBgwYAD09PXzzzTfvfX6IiIiItIXWBsCuXbuqPZ8zZw6WL1+OY8eOiQHQyMgISqWywNfv3r0bly5dQnx8PKytrdG4cWPMnj0bU6ZMwcyZM6Gvr//O54GIiIhIG2ntIeA35eTkYP369Xj69Cm8vLzE8nXr1qFatWpwc3NDaGgonj17Jk5LSEiAu7s7rK2txTI/Pz9kZmbi4sWLBfaTlZWFzMxMtQcRERFRZaO1ewAB4MKF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J7h+/TpsbGzg4eEBPT097N27V5yemJiIpKQkeHl5leMoiYiIiMpfhT0EPHHiRHTt2hUODg64e/cuZsyYAV1dXfTu3RtmZmYYMmQIQkJCYGFhAYVCgTFjxsDLy4tXABMREZHkVdgAePv2bfTu3RsPHz5E9erV0bJlSxw7dgzVq1cHACxYsAA6OjoICAhAVlYW/Pz8sGzZsnIeNREREVH5q7ABcP369UVONzAwQEREBCIiIt7TiIiIiIgqhkpzDiARERERFQ8DIBEREZHEMAASERERSQwDIBEREZHEMAASERERSQwDIBEREZHEMAASERERSQwDIBEREZHEMAASERERSQwDIBEREZHEMAASERERSQwDIBEREZHEMAASERERSQwDIBEREZHEMAASERERSQwDIBEREZHEMAASERERSQwDIBEREZHEMAASERERSQwDIBEREZHEMAASERERSQwDIBEREZHEMAASERERSQwDIBEREZHEMAASERERSQwDIBEREZHEMAASERERSQwDIBEREZHEMAASERERSQwDIBEREZHESCIARkREoFatWjAwMICnpyf+/PPP8h4SERERUbmp9AFww4YNCAkJwYwZM3D69Gk0atQIfn5+SE1NLe+hEREREZWLSh8A58+fj2HDhmHQoEFwcXHBihUrYGRkhNWrV5f30IiIiIjKRZXyHsC7lJ2djVOnTiE0NFQs09HRgY+PDxISEvLVz8rKQlZWlvg8IyMDAJCZmVloH7lZzzQ44pIpalzvGuf7/eN8v3+c7/eP8/3+Vcb5VrUrCMI7ab8ykAmV+N25e/cuatSogaNHj8LLy0ssnzx5Mg4ePIjjx4+r1Z85cybCwsLe9zCJiIjoHbh16xbs7OzKexhaqVLvASyp0NBQhISEiM9zc3ORlpYGS0tLyGSychwZERERFZcgCHj8+DFsbW3Leyhaq1IHwGrVqkFXVxcpKSlq5SkpKVAqlfnqy+VyyOVytTJzc/N3OUQiIiJ6B8zMzMp7CFqtUl8Eoq+vDw8PD+zdu1csy83Nxd69e9UOCRMRERFJSaXeAwgAISEhGDhwIJo0aYKmTZti4cKFePr0KQYNGlTeQyMiIiIqF5U+AAYGBuL+/fuYPn06kpOT0bhxY8TGxsLa2rq8h0ZERERULir1VcBERCVx8+ZN1K5dG2fOnEHjxo3LezhERO9MpT4HkIgqn+TkZIwZMwZ16tSBXC6Hvb09unbtqnauLxERFa3SHwImosrj5s2baNGiBczNzfHdd9/B3d0dL1++RFxcHIKDg/H333+X9xCJiCoE7gEkogrj888/h0wmw59//omAgADUq1cPrq6uCAkJwbFjxzB48GB06dJF7TUvX76ElZUVVq1aBeD1nQDmzZsHJycnyOVy1KxZE3PmzCm0z7/++gudOnWCiYkJrK2t0b9/fzx48ECcvnnzZri7u8PQ0BCWlpbw8fHB06dP380bQESkIQyARFQhpKWlITY2FsHBwTA2Ns433dzcHEOHDkVsbCzu3bsnlsfExODZs2cIDAwE8PqG799++y2mTZuGS5cuITo6utCLwtLT09G+fXt88MEHOHnyJGJjY5GSkoJevXoBAO7du4fevXtj8ODBuHz5Mg4cOIAePXrw56eISOvxIhAiqhD+/PNPeHp6YuvWrfjkk08Krefq6oqBAwdi8uTJAIBu3brB0tISkZGRePz4MapXr46lS5di6NCh+V6b9yKQr7/+GocPH0ZcXJxY5/bt27C3t0diYiKePHkCDw8P3Lx5Ew4ODpqfaSKid4R7AImoQijud9WhQ4ciMjISwOtf/dm1axcGDx4MALh8+TKysrLg7e1drLbOnTuH/fv3w8TERHw4OzsDAK5fv45GjRrB29sb7u7u6NmzJ3766Sc8evSoFHNHRPR+MQASUYVQt25dyGSyt17oMWDAAPzzzz9ISEjAL7/8gtq1a6NVq1YAAENDwxL1+eTJE3Tt2hVnz55Ve1y9ehWtW7eGrq4u9uzZg127dsHFxQVLlixB/fr1cePGjVLPJxHR+8AASEQVgoWFBfz8/BAREVHgRRbp6ekAAEtLS3Tv3h2RkZGIiopS+9WfunXrwtDQsNi3jPnwww9x8eJF1KpVC05OTmoP1XmIMpkMLVq0QFhYGM6cOQN9fX1s27at7DNMRPQOMQASUYURERGBnJwcNG3aFFu2bMHVq1dx+fJlLF68WO33vYcOHYo1a9bg8uXLGDhwoFhuYGCAKVOmYPLkyfj5559x/fp1HDt2TLxCOK/g4GCkpaWhd+/eOHHiBK5fv464uDgMGjQIOTk5OH78OL755hucPHkSSUlJ2Lp1K+7fv48GDRq88/eCiKgseB9AIqow6tSpg9OnT2POnDmYMGEC7t27h+rVq8PDwwPLly8X6/n4+MDGxgaurq6wtbVVa2PatGmoUqUKpk+fjrt378LGxgYjR44ssD9bW1v88ccfmDJlCnx9fZGVlQUHBwd07NgROjo6UCgUOHToEBYuXIjMzEw4ODjghx9+QKdOnd7p+0BEVFa8CpiIKp0nT56gRo0aiIyMRI8ePcp7OEREWod7AImo0sjNzcWDBw/www8/wNzcHN26dSvvIRERaSUGQCKqNJKSklC7dm3Y2dkhKioKVapwE0dEVBAeAiYiIiKSGF4FTERERCQxDIBEREREEsMASERERCQxDIBEREREEsMASERERCQxDIBEREREEsMASERERCQxDIBEREREEsMASERERCQx/w8JbvkvDtHaKgAAAABJRU5ErkJggg==",
"text/plain": [
"<Figure size 640x480 with 1 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"# generate plot\n",
"plot_lines = lines[start_index:stop_index]\n",
"s = convertToSeries(plot_lines)\n",
"s.plot.bar()\n",
"plt.title(\"Multicast UDP packet interval receive duration (%d samples, tsn-shuttle)\" %len(plot_lines))\n",
"plt.xlabel('Cycles', fontsize=10)\n",
"plt.ylabel('micro seconds', fontsize=10)\n",
"plt.xticks([])\n",
"plt.show()"
]
}
],
"metadata": {
"kernelspec": {
"display_name": "Python 3 (ipykernel)",
"language": "python",
"name": "python3"
},
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 3
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.9.2"
}
},
"nbformat": 4,
"nbformat_minor": 5
}
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment