225 lines
32 KiB
Text
225 lines
32 KiB
Text
{
|
|
"cells": [
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": 121,
|
|
"id": "certified-duplicate",
|
|
"metadata": {},
|
|
"outputs": [],
|
|
"source": [
|
|
"import re\n",
|
|
"import contextlib\n",
|
|
"import itertools\n",
|
|
"import string\n",
|
|
"\n",
|
|
"from PIL import Image\n",
|
|
"import numpy as np\n",
|
|
"from matplotlib import pyplot as plt"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": 94,
|
|
"id": "sound-senator",
|
|
"metadata": {},
|
|
"outputs": [],
|
|
"source": [
|
|
"TC_BODY = '''\n",
|
|
"testcase_id = {tc_id};\n",
|
|
"\n",
|
|
"rst = 1;\n",
|
|
"clk = 0;\n",
|
|
"repeat(2) @(posedge clk);\n",
|
|
"rst = 0;\n",
|
|
"repeat(8) @(posedge clk);\n",
|
|
"\n",
|
|
"@(posedge clk) vsync = 1;\n",
|
|
"for (integer y=0; y<{h}; y=y+1) begin\n",
|
|
" for (integer x=0; x<{w}; x=x+1) begin\n",
|
|
" @(posedge clk) hsync = 1;\n",
|
|
" end\n",
|
|
" repeat(5) @(posedge clk) hsync = 0;\n",
|
|
"end\n",
|
|
"repeat(100) @(posedge clk) vsync = 0;\n",
|
|
"\n",
|
|
"$writememh(\"test_term_fb_dump_{tc_id}.hex\", data_recording, 0, ({w}+5) * {h} + 100);\n",
|
|
"'''\n",
|
|
"\n",
|
|
"TESTCASES = [\n",
|
|
" (32, 32),\n",
|
|
" (100, 20),\n",
|
|
" (92, 97),\n",
|
|
" (400, 400),\n",
|
|
"]\n",
|
|
"\n",
|
|
"def write_testcases():\n",
|
|
" with open('test_data/00TERM_RENDERER_TC_IDX.v', 'w') as f, contextlib.redirect_stdout(f):\n",
|
|
" for tc_id, (w, h) in enumerate(TESTCASES):\n",
|
|
" print(TC_BODY.format(tc_id=tc_id, w=w, h=h))\n",
|
|
" \n",
|
|
"write_testcases()"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": 109,
|
|
"id": "norwegian-career",
|
|
"metadata": {},
|
|
"outputs": [],
|
|
"source": [
|
|
"def read_hexfile(filename):\n",
|
|
" with open(filename) as f:\n",
|
|
" gen = ((int(line, 16) if re.match(r'^[0-9a-f]+$', line) else 0) for line in f if line.strip())\n",
|
|
" return np.array([ ((p>>16)&0xff, (p>>8)&0xff, p&0xff) for p in gen ])[:-1]\n",
|
|
"\n",
|
|
"def display_image(filename, w, h, **kwargs):\n",
|
|
" w_blanked = w+5\n",
|
|
" img = read_hexfile(filename).astype(np.uint8)[8+1:][:h*w_blanked].reshape((h, w_blanked, 3))\n",
|
|
" #fig, ax = plt.subplots(**kwargs)\n",
|
|
" #ax.imshow(img, interpolation='None')\n",
|
|
" return Image.fromarray(img)"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": 111,
|
|
"id": "hidden-playlist",
|
|
"metadata": {},
|
|
"outputs": [],
|
|
"source": [
|
|
"def show_tc(tc_id, **kwargs):\n",
|
|
" w, h = TESTCASES[tc_id]\n",
|
|
" return display_image(f'../Artix-7-HDMI-processing.sim/sim_1/behav/xsim/test_term_fb_dump_{tc_id}.hex', w, h, **kwargs)"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": 173,
|
|
"id": "specific-meeting",
|
|
"metadata": {},
|
|
"outputs": [],
|
|
"source": [
|
|
"with open('test_data/test_glyphmem_data.hex', 'w') as f:\n",
|
|
" for row in range(128):\n",
|
|
" for col, c in enumerate(itertools.islice(itertools.cycle(string.printable), row, row+256)):\n",
|
|
" if col == row+30:\n",
|
|
" c = '\\n'\n",
|
|
" underline = bool(row&1)\n",
|
|
" bold = bool(row&2)\n",
|
|
" bgcolor = max(0, col%24-8) if col//24%2 == 1 else 0\n",
|
|
" fgcolor = 0 if col//24%2 == 1 and col%24 > 8 else (7 if col%24<8 else col%24-8)\n",
|
|
" code = (int(underline)<<19) | (int(bold)<<18) | (bgcolor<<12) | (fgcolor<<8) | ord(c)\n",
|
|
" print(f'{code:05x}', file=f)"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": 172,
|
|
"id": "solved-latitude",
|
|
"metadata": {},
|
|
"outputs": [
|
|
{
|
|
"data": {
|
|
"image/png": "iVBORw0KGgoAAAANSUhEUgAAACUAAAAgCAIAAAAaMSbnAAAA90lEQVR4nO1WwQ3DMAh0Ks+TVwfoKtmiUt6RskVX7SMSohgumLpIrcrLIZgDzgZP8/VWEuWSCVZKqfxj2VdaP+6bMF32VSgte+CnciOxx3KB7bEfVz3bzMKi44lsVDArAhxZbVVHNm0BgQBqTf6snQEwDoP4GwUG5AVvCBgmIn7fY4d24v3Mc3/pV5sH50z1I/ESJLt//vG+G8/sn0JDa+ecs7wp/RNvcM45y9u7/ROI6u28f8bmnBW6wl+XF3XOgTp14DnnHCbFi9dFLRhJLjzr7Hn4Ftjn933sodXfu8dCnWekF28qZ0w/Ov+oElV8f0io2tn1fAJMBbkaUxYHBgAAAABJRU5ErkJggg==\n",
|
|
"text/plain": [
|
|
"<PIL.Image.Image image mode=RGB size=37x32 at 0x7F3932624D90>"
|
|
]
|
|
},
|
|
"execution_count": 172,
|
|
"metadata": {},
|
|
"output_type": "execute_result"
|
|
}
|
|
],
|
|
"source": [
|
|
"show_tc(0)"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": 175,
|
|
"id": "amino-clinic",
|
|
"metadata": {},
|
|
"outputs": [
|
|
{
|
|
"data": {
|
|
"image/png": "iVBORw0KGgoAAAANSUhEUgAAAGkAAAAUCAIAAAABXIRyAAABfUlEQVR4nO2YMQ7CMAxFU9QVBiQkpg6MDEwcgFPAzC2QOiNxC2Z6IEYGJiQkBrgAQyRjnMR13VBAypucYJz0N07iZrP5wiRU9L49gT8mx431rgR7v9kS1/WuJJ0hfz4OiYadmVDQyft76Q+GYD/uN965mEzPpyPvY3lpR6Rxm+SfIX8+jjdarb6MszsxQn8wxHqRZhtEOet9BjXCaHEH/QS5t1eyLkIPxj/wV15DiNG4APt6OYNdTKZg4/ytqoM1lsuV8WpnJ1SbC+5fSI81avPXtNs324D1Go0LaGK9YPurqoOVDKDaKd4kvyuF9kHX043G6y6c6uN+w2cFBq87BfScjSIc49woeCzIWWENvNCMSsc37aIIJ19fjcYSjtIl+rtxrNl3uRgjXlCMMRmuySR7NvzE3FEb3Y2F4+o2OwvkKRGO5KlNYXzIGvaczVI9qybVs3qSdnqSdnqSdnqSdnqC9SzpAfsXvtNFqXNJXaHAU8+6PT/1nU4ybjc8AfzHHaob9pe4AAAAAElFTkSuQmCC\n",
|
|
"text/plain": [
|
|
"<PIL.Image.Image image mode=RGB size=105x20 at 0x7F393260E520>"
|
|
]
|
|
},
|
|
"execution_count": 175,
|
|
"metadata": {},
|
|
"output_type": "execute_result"
|
|
}
|
|
],
|
|
"source": [
|
|
"show_tc(1)"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": 176,
|
|
"id": "answering-outdoors",
|
|
"metadata": {},
|
|
"outputs": [
|
|
{
|
|
"data": {
|
|
"image/png": "iVBORw0KGgoAAAANSUhEUgAAAGEAAABhCAIAAABJZFj0AAAEqElEQVR4nO2dPU5cMRDHTUSRRIECCYlqC0qKVDlArrK3iEQdiVtwq5QpqJCQKOACKbwZZsfzZT/vWxvmV/l5vX7e4c3Y/j/bnHz/8TMFKp+O3YAJOMUX27tbSN//+k2Kbu9uSaZUXq+H1IYLK1VBpl6e5ez8AtKvL8964c31zcPfPzjnzUbEBOUlqUsqr9fD1mbaUSlcNoxwdn6B7UIuPbh8jW1rM87a+t50CadsrufvLP0A/YcdxdwSl1cbSD89PkB6c32TE9npGBvlG5vPcPkVkpMTpt+lZXFtCdgul1cbuBTjETSrtjV61JDiVFmyrE23r7Opry/POGZj8HOkQPu1LgZSCldV3gsSs3MCPzhJtdeejboYyP+8VN3LeZdD0D6G7NXKNR+uho4/pXSC5yKe2AkfKWO5qjGk875twSgD/kUMRPwrux50aul/8D6J+ZpJzNdswkY2YSObsJFN2MhGnK+RHEiPoBN1mceRcbYCM18rc4bSiTz37cuer31wnUjCnq+9A51I0mrb9SOFEXQiom055RFI4ykbqx9perbJIDpRQzyS9CMnXhtNoROxlJp/bQ0uG30QnUjCHkPOqBP1RdSP0sA6UW3MJv6VXY8VjzKkXwv9yCbmayLwNO1i9rzBIiN5nNSLff76jc3/gvJhlBS+ZhO+ZhM2stlbW4M/kHQcZSImrRJQ+n6l/JL2ADkeNbxTw+ziEfxI3A74zWU+rgJPa9kCynelMkvag+lio6W+5uwQPQYalp2vNYtESXaxWg5nR1Y/ksbZ5XtaXs9OjrmC6VakvJJfku3ea/0R2OXs/CLLANlAYJfLq03Wj7KBiH5Ex0f6H7M2LvjL6wXwpf7ugEDiEVwSGwGsjZh1tYPrRMpijQNB+362z/K/tGhj8Ii+69d6tZIEkYPS0bI5Hkmf7o2PCPpYDqPEC8/YTx92KfU0KNkN/VrMaW1ivmYTNrIJG9mEjWzCRja2foQZVidaiDQ1yRj6ES46sk60EN1GXl/7CDqRhKEfZYbSiWp9kH1Jm+RNNIZ+NIVORG6kL0cotRFJP8oJl34E9041cWFNnWiJfgSwNpI0Nu/aGk+xvrAPJmvT7vBr/UInwpDnqHEMOalOlONR7bfe4tEsOlFVPEo1/VrsX2sn5msisf4o1h91JXzNJmxkI46ztyvuO6uar+kTNJOGLf7t59YkobnS8Gcr7POQ8o8LnrgxvuZs5SA/ZgU6nFujsLC2Lr6Z5BEAu38Nj7MzrnNrurT1vn7fmeSDVb4p7Tsqz63Jl9m/sKXE89ikH+Nvqx5o4FKRNwcZ2Yo65JpIUtGhlxpVnxHVXSoaP6I796679q8tboyXMS1ra7VSrK2NwUr5ciBalsdU3Vc6j+3p8UHal02IOa1NzNdswkY2YSObsJFN2MhGXH+UJteJ/MAIQOr+XeeMvmOdyHNS1HrnRMxL3dk+EivrREv0o/I9bbmITTv/aAqdqNZnpbPqs1FKX9POP5pUJ1ohDvTxNSfH0olWOiNKYoqI3m1f9qQ60QrNrj4/Ww9Gzno8S5DMdUxsVSzK/2Bhx0dx/lE1MV8TifVH9vojIHzNJnzN5h+fL/vKYArbwwAAAABJRU5ErkJggg==\n",
|
|
"text/plain": [
|
|
"<PIL.Image.Image image mode=RGB size=97x97 at 0x7F393298BE20>"
|
|
]
|
|
},
|
|
"execution_count": 176,
|
|
"metadata": {},
|
|
"output_type": "execute_result"
|
|
}
|
|
],
|
|
"source": [
|
|
"show_tc(2)"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": 182,
|
|
"id": "tender-alignment",
|
|
"metadata": {},
|
|
"outputs": [
|
|
{
|
|
"data": {
|
|
"image/png": "iVBORw0KGgoAAAANSUhEUgAAAZUAAAGQCAIAAADp9GrfAABHq0lEQVR4nO2dz6tlVbLn12se773+YcITBKEgoR28QYKJg/4DGn0OJLNAEFLIgeBQqEQHlhTWQGpQUpQ1KEnBYUE9SCghQdDEhkKnPWpIEJxIF68dFRQIraOe9SBuRsaNXzvW2mvvvdY58SFJzt533332vSdurFixIr7r767/t/9ekiTReOLKk+r5f/pP/0U9/x+N87/7zXv6/f/zP6rn//Ef/l49/2//63+q5//f3z+ln/8//1c9/7///W/q+df//Sv1/D//yz+o53/yrz9Rz/+PH/9Ov8/D/6qef/feXfX8Iv+h7duSJEkO55Kbf/03v8TXf/jFr9mlr//ml+ykdb1/H3Y3erFzKzzpX69CR9Eff/jev/jqM9e++8s3/jUOXzz49KUbL0eulD+ayit3fnX/rj56l1Ke++nPHn72kfXVD5+99ubXFz/LH1957rX7D9XLvvz4RinlhTceLD3yuEjjTM6Bx/6LWYA8ZN9pXe/fR73boo9zLpYPxnjiypPUZ7HDoxjq7+2FNx6AC0uSuQjNH/v+sQXvNtRf+LA4wVcpBYOvJDlJ9DRhJD6ynIvvdA5xhRZPPX0VX//tr9/h66vPXMPXdC75ySd/wte3br2Kr7948Kl6/6/+/Dm+fv7Fm/jM9AV9/tu/+z399ntvvwUvXrnzKzxJ55LP/fRnxXZhHz57rdguzJlOllJ+/tub7MwH71z8LO/fvkPP08yrmjdwbEn9Enym8Vs5v8/k5FH8lzSgRZzU2OJcshh275zvBfVZTz19FQ+pz8J02Cef/In6LDxkCS/0ZV/9+XP0WfRQnWWXUm7/7vfosMplX0Z9Fk2HPfzsI3BhKm9+/Q24MInvvABwWD//7U32olz2We/fvgOHTt4gmGdQv9c/WezfZ3IOcP/VYAd+lsqyV3mlvJvv+4KP+uMP31ur4DT+qoX6srmIOK9jSU+UBOHrj12cl3Nx1c17wfL38IIGXGWdL7Og88cR+OMrz5VSBndeFtakMjlnLvmvLs4rHmdVvVfwXYaCzh9HADzX+PGXRSQXkZwV7fWrvQxoz6CsY/EEzeXPxWv3H0IgliSz8zj+cuJza4lHXQ+qjfOt6zvOF3DOSJ3X3/76nTVnVNcfb916VV1/fOnGy+r64/Mv3lTXHy3uvf0WW39cBJL3fgmrCrgwjMKg+OvLj2+sKWGN2E+xP99F/DVxereMy86Hv8v+xzFhy5FxaM09fX0UU5f7Zf8jkP2PSZIkndHdfHIIdP7YFnyVy2VfhwdfSbIp6b8GotlnMYZyW8FZ4YCTx2R8cv6YJMmspP9KkmRWzP5HdgZfj6Dz1aWugtXf18LaIR2wisIvofAXHOMqYM6a49T198CYy5TJUSj9j/LMUDpfkfcdB9bFfSxZuZqcGJfmj6nzNSxO8FWWVMCS5FRZ7n88AZ0vSz96jf4Xhdbfo5YOThvhBY3CrLDUqp8A/S/LhS2qgDnLkVJ2FUvwmQQYiueUyxJgWHl4lM7XmvlBMjt19RMj6Hw19BVZ+tGq/hfTv3f0v+CF1P+CQ3BYcv7o6F4x/S88vH/3PSphyHBUwCL19+CwsHmIdhFRn4X6Xyj4BdDD1PlKdqbCfw2i89UwrlpdIBHW7OVxLCM0D/mkJ0pWEvVfU+h8qcj9O7q/haUffRS+cvTg9Orbh/tk1HbahPxX6nz5BDdM2w3wXOPHXxaZt0qCLNevzqjz1RGay58LR//+TIAQLD3gCaPvXzuyzlft9UH9e7p5R0T/C2H6X4uxWK3uVXm0/uiXsKqAC6Nb2JbV+qvv3rurrj+Wg3S+Gn6fycmQ+l8H0xwd0Jr7BgnD7pxkuV/qfwGp/5UkSdIHjLgv4q/ZI3BrSM/xE9h6/Pz2+hX1/CxMFBKeJLX+Bz+vnD8miUmOf0DOH5MkSTqT/itJkll5HKZa69YRDRyst1DnsY5ul3P9mudBIP5v3vMRCikiLUTBEgpWmCKBFm5LCAwbuRd7tuHFpPWri7+lJAEu/Jcs+KLyAPI8vYUvTMguk+U86q3WPM/+gPMapwo/K1eTM2Ht/h3BhYMcUYP4W3jU1q8myWlz4b+aRb5KvwLo7Xycqv/FNt/G+nurYYgV34OWDp02siiMbr4NoJCO1T+A+l+qF0MJHenF/OlkeVR5T4ES/Fr9L1p5D1j6X4UYhtoy4VxPb0gvZjkENR5vO1+SOdH170tAn8v57NfrfGHnWvB6H/RZT1x5EuQowHmhz3rq6aug/8USXujLwHmh/tcnn/wJ5MDAW8n5I9MsZL7Mmv/ee/stKmHIsFTAFp0XAvrR8D/tIkKf9eXHN0D/C5wX6n/9/Lc3Uf+rEJ/1/u07oP/lN5xZFmXJMaVbSYLo+vdWlsrKQ8kr2fXWfaz3tfJc0q91Yc1GHscSd17HcpQzYmZGO7rTS54ASv/24DpfVkC3A5Z+9FHM67x6xdcN/oi+dTqv2eH1E+qCYCTOWvMQsxhTcMO03QDl6BGatxtg49Bu68g0FzbC4nWyhov61V4eZIvJnfNepZPXg/zX+vvsD3guS//+HKhKmdHLnArEZBZ0/S9AzTe15d173afULAIgcv3xb3/9jvksSIGB+JdcggTxLzp/9GOx51+8+dWfP5dLkD6YvPf3smXIKAyLv5olWD9453PI2dMz+Frqf9XmJf2aQXa3hrwnvX6W6D5pIPu390BuoRaHbp7mb6S2A+C5FrttT8ZlZP82kP3bSZIknVlbf59YsMljW/BVHpV9OcWrSXK2pP/aimaHJRnHZwXj/BOYOSZTkPPHJElmJf1XkiSzsqz/RRlW52slrB3SIVhCsbjg6K/QoQqYv+CIZV8z1q+WE1qmTI5iQf+LXpo6X6yL+3Cg8uvop0iSw4jm71Pnqy/+ryhevJok58yC/hcwlM5X7bySlSBa+l8IK74HLR06bWRRGJUAA1QJMDqXpJXl8gEcFbDF+lUpuwr195b+VxESYKClw8S/Cqm/VyXAZtH5Sv2vE8PsHxpW56uq75fp3zv6X/BC6n9dfebad3/5BryVnD8y5S/my6j+11d//hwP/ZHAUgGLF9+DfjT8T1uI0Geh/hc4L6n/BYdS/4vV3zNfljpfyc5c8l9T6HytiQGbN/I4nMM7h4KkzleyJ6H81zg6X6r7644lIX0U8zqv1PlKNkVff0TOU+crsmHanmAL0fguTJI6X8l2NNavTqrzBfmv9ffZH6o/cZ6kzlciebz+OIXOV60O1I8/fM98lqX/BUj9Lz8We+nGy188+FQuQfrQ6XDcL8soDIu/miVYX3jjAeTs6Rl8LfW/3r13F/bsCN5/NJ2v2vsng5P6Xz1Zs5Et3Xnb34V7B9j+QxZBObBhWXR5qf8FpP5XkiRJHzCCvoi/Zo+orSE0x09g6/Hz2+tX1POzkNn9Y6n1P/h55fwxSUxy/ANy/pgkSdKZ9F9JksyKWX+PS/v+ErhsRXauX98vWSprDiTQ/xi5Eqso/BKKLx586iw40rZHCf1ZnD3TZqm/d5i3gpRZy6T1g6eK7r+CGg+qUTpSX8xnoX9Uzx8LtG0f/RQXQOXX0U9xvrD6wXRh46DMH4MeZBBHMzj+Lh75C0ySNfD4q69XWnm3LvPNYsf8cv/tQqaNTEunXFYBK4YEGJ1L+irSfvGkvwW3lF2Vm28DdP9tqgLm638BTAUMylnfv30HqvDxPC4eqWG703sfj8elIS3G7875cpkcReaF639tpPNVDHG7xW9Rn61qvskSXujLnnr6KhW8x0NwWHL++Mknf6LKX9SXUZ9F02HPv3iT7QLJfjqr7MV3XgA4LOwcoi1E1Geh/hcIfuF5ekh9Fup/geAXnqe+DFwYex7rg1C9yYE0JCtU+0lG4NL+HY79qZf5puAntvDQ+TOevaq2jYjzOpYDG4akmdHorMpLxi/O/NewmPqre2JJfVmxXi8sCemjOLztcQ0N8bVznyp/1CBSOE48mKzhsf/qLvU1vn1ENkzbE2zenteF4es9DaDW301hnEmE5frVPYOyNKxi69+fD1WigyyhsWiuaWOnxLJ+tDUvqJ0vONfLIlh5PaXqfa2EBUiA0UP/PrduvcrWHxeB5L1fwqoCLgyjMCj+Wqm/+tr9h+r6Y7m8BEk375C7EDn4NYP001zMe0roxcGpYjyvGjEhfJ3Jr6HI/u1G2HJkHDr+jxAL0A2HHNhy5HS0/aqzfxvI/u0kSZLORPffTsrlmq+24KtoM6lkI7qshyYjk/6rgmafxRjqbykyeSwBLekBGer3nGxBzh+TJJmV9F9JkszKpf4h9rWpdb7iYBWFX0LhLzjGVcCcn2vq+ntghBXVRWrzYmr9BGue7fd0SQWX8l9nqPPFuriPJStXd6DWDln9ID2kI1+6sEMI1d+P4GgGx9/zsbZ+NZmLoUbBs6LP+uPOOl9r9L9wLoADJryg9kf33y5EAsyqn/C3rV1UAXN+BCm7KjffBuj+21QCDLV0aPF9sevvy6MVSShYlVtwl0fb1iJQfHgmOl9Zfz8Upv7EsDpftfG/1P+CQ3BYcuRkyl/UlzH9Lzx86cbLVMKQ4aiARfw+OCxsHqJdRNRnof4XCn4B9FDV/2L199SXqTX3qvhXOQmdr2Q6PP2JKXS+5rXL8f+oDqz52lTn6zx15U6SXetXj9L5Gi3mrxWrGgpLPLqWA3W+tra3ZDfW+q/xg4gitsA6nNGmWrVQn2VNJ7dgBJ2v1F8disfrj5PqfM07flYJyJwkJ6PzlfUTR3Ep/zWFzlft88j6Hf/67/7yDVt/XASS934JqwpbcYPir5X6q29+/Y26/liM/YdeeOMBW3/0URcfkal1vlSs/V8KWbNO53UUqf+1QPNGtrTmvkHCsDts/yGLoBzYsPQNu1L/C0j9ryRJkj5gZH0Rf82eiLGG3Bw/ga3Hz2+vX1HPz8KkCyknQ63/wc8r549JYpLjH5DzxyRJks6k/0qSZFYW+h/Vean6JUsXzM8srKxEj397sIQCKiecBUdo4baEwLCRe7FnG15MmnaBEordylbbUO2wtqmbmYoq/oU89fRV1XJqy3GSOFy/UDad0UNHYwD1A9TzWz1+DDC7carws3J1a3w7rLVPtB9WS2iVfaXD2o0L/zV1R96e+Ft41NavJhMBhazZPzQUFf2PXeZ6yKI+T3B+6kNNjUVhcvDESQEdP+mMAPW/VC+GEjrSi/nTyfKo8p4CJfi1+l+08h6w9L9KKa/dfwiV96wEH/W/2PUfvPM5Lb6ns0gZ7xSt3Xqj84wchs+HkP6XBDvXgtcX4bD8eD4+P/XfFLyVnD8yzULmy9BnXX3mGq2/v3XrVSphyLBUwBadFwL60fA/7SJCn/XKnV+B/hc4L9T/eu6nP0P9r0J81ofPXgP9L3BeWH/PfBl6MTwDzkvq54C3Gif/JUfBYCuleodaIvbTfPMkgq5/L/MC1gDIrpd+jd2hjXlH1LjzOpajeoaYmdGO7qp4X73YMrle+dnMfx1Of/0vS+SrtM4B52Ve5wXK0ap4dBUN/ogOgWucVzk/eztDQvVfmd1vAzyXJR49OB+88zn+K1o6bCOosUX8ThrnObNh/WpHw7LmpOMztQvrAvVEi8ZAL4u4sD2dF82lJoNwMX+szcc71zuiXXGdL+v+/n3igOBcrWwTJu/9vWwZsH8H28IWX7T97T387CPI2dMz+Frqf712/+EfX3lOLkFaqIuP+BokpHEt8t17d2s/F3p9xAfF7WfxVqU+f48rP8x5sSrWVAHbn+zfLkXbQi0O3TzN30htB8BzUc1CFbYcOR27hV3Zvw1k/3aSJElndt1/aChYtN+8fzKUfTnFq0kXuohBJyfG+fqvjhu+j+OzFmeOwIwzx3RYiSTnj0mSzEr6ryRJZuWS/gRjRp2vIIsLjr4QGKqA+QuOWPY1fgm+itUFORS1Ol9VdqtqLj1x5UlL/6sImwFDgmob1v/v9NImQR7Xf9Gzk+p8jQZUfh39FKdMrc5Xm91aVRSy4AucF/Y/fveXbxq2E03inG/+3sff8zFevJokyXYo/mtwna/adXQ5eKoSYHRGQMdPeUNHBWyxftWa11j6X0VIgIGWDhP/KqT+XpUAw4JVuQW33Hz7hTce0Pp7Ootkyjl4OKnO19Yzhoy8tmYh/hpN56s2/mfKX1b/B/QS4aEf81sqYPHie/gBqTYDnEefhfpf4Lyk/hccSv0vVn/PfJksu5fKXwDt2R4h/3WszlfEfiL3ybC9O9x/pc5XG4d3DgU5qvJrap2veP4LoZE7joW+fm/SQHv+60Cdr9G0KOZ1XqAcLcWja0mdL8biRlZJFxT96PGDoNGeEFuIxndhEuqwwJfto8VKc1uR4GgL45zF4BOLDvWrqfNVLutPnCcno/OVTER7/v4Qna/a9QTY7apWcw4TFnTzjkVkFIbFX1T8q4r7d9+DnD09g6+l/tebX38De3YE768uPuJrpiL9wTufM+WvRUbT+WpYjyr2LrYSMBg1+ZVswXnpf63ZyJbuvO3vwr0DbP8hi6Ac2LAcHnal/heQ+l9JkiR9wAj6Iv6aNOuEWEN0jp/A1uPnt9evqOdnITNrx1Lrf/DzOq/5Y5JUkeMfkPPHJEmSzqT/SpJkVpT6VWCx79pipZBO/Nvxqfzrn7jypLPgSNseJbR+wtkzbZb6e4fdylbXUNX/H7m+oXiikEkltRzsJWLNs/QQ7Uftn0X7Oecqwloe+y/mOPDQOn8sgzwGAJVfRz/FiePYYa3dUl8WsSI1CwZbiFqHKjAEWrKFUDmYhlTFuc8f/V08sn/ttLGUeZJZWKVfWDvfjJxfvL/VK+5Ax086HfBVpBclpJ36VSm7KjffBujzUxUwX/8LYCpgUM764bPXoAofz2P9Ktt/m+l/MS2dn//2JlXOwcP3b9+hq0VwKAOZxTjIOV8u0yXQ3jpaz823D+Gx/2JjUeTz7hLPy/PyhvRQ/S4f6rNoOsyP+R0VMN95AeCwsHOIthCpPxcIfuF5ekh9Fup/geAXnqe+DFwYe54/vvKcKp4DDmuc/FdDsqKXzpeFpf9lkWH7biznv5wY+zylviLO61gObBiSHgfFGtWvVt1qUeer9i2C+G5Lqhiy/H3fh0koofljMD7q+2Qb3XMNh7c9rkEVj24AWrhhCsnmkha1IoXFcENb21sbi3tZJdsx9P4do8Vo2Lw9rwvD19Z0cgtq468tYqihFqwpuea4hrr1x45GMM74WYuzBH4moIpOJPhiidHFz31PRzOsU0uChPL3aqVoMC9m2e6iTTesJ9QCkb9fwqoCLgyjMBg/V+qv3nv7LXX9sVxegqSbd8hdiBzUxUcEhKTxdXkk/hW8Of2wqvSj1S+t1/mS91+051qY2UTWH8Fg2PhHzSYDsVqyf5tDa+6r9As3gm445MCWI6djzFAo+7eB7N9OkiTpzND5+0OgZV+HB1+nzdb5geTkSf+lMJTbikweS0BLekDSZyUryfljkiSzkv4rSZJZCel/qYym8+UTVwFz1hynrr8H9ixbbWZTna+G/nDWPwsvHP0cun4t78ZUwFj9Kh4+/+JNqQKQMJb7H49lkMcAsnJ1B3bQ+aqyKNhC1DpUgSHQb/63JAyzBKyKc5k/+ns+ZvPaaTOFzlc6rwZC64+j6XzV1mf729YuqoA5y5HS4OTm2wDdf1v9eWnxfbHr78ujFUkoWJVbcJdH29YiIEeB9ffwAmeRTDkHD1X9L9kzhGfOROerdi/3IOm82mjRnzhW56tB98KP+R0VsEj9PTgs7AKh7SDUZ6H+lzPfUfW/WP099WVqzb0q/lUeOaxx8l8H6nx1yaiWfmF7Oq9mzP5HynnqfI3QPORzYM2XDMQm0vlq+0apYsjy920Pk6zhUvyVOl+Arxw9OJZ4dC3Qvw1TSDaXtDhtnS8/C7GG3LmjmSHq70eL0cBzjR9/WVCfZU0ntyB1vhz8xet0YW3o64+p81Vc/fszAUKwYPCVOl8rWam/dJ7o9asj63w1rIVD5O+XsKqAC6Nb2JbV+qvOz6vqf92/+x5bf/RRFx8RqiINiXyq/LUIKBfCa3ixqHwyoM5X1fsys4msP4LBsPGPmk1wC0i6/lO0Ta2S6fW/modWWnPfIGHYHbb/kEVQDmxYpgiFkNT/AlL/K0mSpA8YQV/EX/NmqQBrSM/xE9h6/Pz2+hX1/CxMFBKeJLX+Bz+v6eePSbIdOf4BOX9MkiTpTPqvJElmZaF+tbacuvnbgyUUK58HS6gXe7bhxaT1q1BCsVvZahtqEYPT1B253roYv2qdtx4SKidwFskOnf3TqOVcfeYa7nwMZ/AQe2bZ+0rxLzjDfmrrl3Y+DFF/v9IrdScrV7eGfeKv/+aXlm4XnI9cz04W26J6WRqW3cj+fywbbDYk6sJYIViCnNf88ccfvt+ify0ZgVmCERaLOYDbSuflcEl/lX6hSp/XOe/fn56UYyy7w6I0sA+bBVD86WTRrA2ssFb/y/mhmP5XKeXe229B5T0rwUf9L3b9w88+osX3dBbJNL/wECrvUf8LD2HnbWwbwkNWc4+H6mfXMF8LMk6oXkvceQGq85pCjnEfLunn4OvmeN7yQdb11ItJjxnxlfF6bksFbNF5IdCCC//TdhC6/zu0gIDzQuP76s+fo/6X+vzgvLD+nvky9GJ4BpyX1M8BbzVO/sv5TB221vmq1f/qFbPXOi+wGWo5SLowwIy/qph3PIw7r2M5qmeINW9D/yOIfwX7HwHVeS3qfFWNT859guctnMh9a9SeRzr2nzkX+S80r01/L2CO44wb8zoviLye++nP8F/bnWHmCNNGNpe0AIe13nmV7e1tNDruXzXOH9Gx7Jq/R3sdxGqtxaMpePjZR/ivaOmwjaCeC7UoHLZYXB5qFKR895dv/JqbdGF96eO/hrWnRaZ2YV2gIdhi8EWdV8SF7VkZM1oVjsUJ7CI6Dhf5L0gHxnW+5PXWeev+vp35z9MX2L+DbWGLL9pKWCHtSpMX/v5D995+6/bvfi+XIC3UxUd8DRLSuBb55tffgOwXKn8tgsqFhSw+OtfH7ac06Xz59tNF56sBNBjcAgYMxt+/VsJkC1OFNc4c/dtrhlYqW76dhHmQ4A/CliOnY5ZQaJHs3wayfztJkqQzQ/QPqfQK/qHs68Al8DNh68lakkjG9V8d/wDG8VnBH2rGmWM6rGR/cv6YJMmspP9KkmRWLuaP0+l8Bd/RX3DEsq/xS/BVrC7IoRhN56shT+fsn8YkwJhmDh5anY9yz1o4A9U2TD8HDtUaEZlwiNfiTM2u+a/RltWxbCfZiNF0vvz7W+AWkLKcwpEAC0Jd2OL+tVK/kDpr9Fn33n4LKgrbHmkiZp0/DtKBlOzPLDpfcf1CcFu5+XYD+v7bZWydr1r9E2SxflVaG1ihpf9VRLU0WKGUDcD6e/XnxYJVuQW33Hz7/t33aP09nUUy5Rw83Ef/S/5c8mQVWw9R292/VnxVdV5SRTphXPJfs+h8tYkfxYvvQT8a/qctRHT/d9D/Aucl9b/gUOp/+T+vLLuXyl8A7dkeIf91Gjpfvah1XmAz1HKQdGE+dfmveadsh3cOBTmq8uvLj2/Q5m3sf4QXZan/EZlF56uX6+yF2vMIY15cP5oazzkkv8pG+fvRchPzOi9Qjpbi0bVg/za8KGQuaUFbuNc4rxLIOezPpkk07OJevwuMKr5qcSY+i7KJ/xphQKNgC9H4LkxCHRb4sn20WNFzYSDmX7+Rzlf3e3Zhcc3xKBd2btStP86r82Wtf58PEHAFgy8adsH/cMYidb4k4Lkm3UJ0FhbWH8fU+aLLBXE7llEYjp9U/KsKSLvS5AVNwUr9r9qfV118xNcPP/uIikc//Owjpvy1yAtvPPjy4xtx/WjUv1e/Or7OV619AmgwuAUMGAzaTLD4i2kWxjfyQF4XyveTxhO9GEv/a5ahdRG2/5DF7D9vlQr+jKT+F5D6X0mSJH3AqPMi/po9CrVCmBw/ga3Hz2+vX1HPz8K8IfBpUOt/8PMaa/6YJEOR4x+Q88ckSZLOpP9KkmRWqutX4yULwe4z/4ZrvorMUn/vsFvZ6hqq+v8j1/uFAlVSYvQku23QntF+wJyY+BIeqjWrt269yqol8AyTAKOHdP0aa3Gc2hG1f4iZjazImZqt9L/WtLN1B8t2ku1w/IJ6PnJ9s86Xf/82oHJQNaSIkBx1YZHNa1nnNj1kfhklDJl4CR6y/rNTcmGjzx8Xy193e5Jkf9qERnYmqIIJgiVFi8WSZpb1v4q9uunH/5ZajvMt6vWWk1pT/CkNTm6+DdD+D2p2vv4XwJRPYDpABYgA/BFY/y3T/2JaOs/99GdUOQcPP3z2Gup/4SF0btOb4xmmPIGHrOcRD2XxfZf61UmlvqokfMGFRVSkkyCP/ZcVb8vz/vXqdzn3Kcb8oiwNvysHZ2zBZS/KZZ+F+l84fgL0kPosVHFibbfUl6lzmdu/+70qngMOa5z8F/VW79++E3Feo+l89YrpeumPo/7X+ludG2b+K6dm23Hg71YGYtACCTEXi8V8pPNa1Pkq6/JQDTpfRfNuB/YPWjPHKhdW+/xMwiTyFrOwKn8/fm5iIlTx6AaghRumkGwuaQEurCw1b1PUyGvMvuLtpL4gZu+1BYyqv6pS+7NA8H5ingtY5b8yRusLW//eTYu1Nv4KThurGGrBmuIvXh/lwmo5VRdmrj+OM34mtaCKTiT4oj4LAzGHLZyXxbBOjdIsvrQR1rA3Tgq1I4/jL2tRzEqTW9dbNKTb4foulTuF7OLXBls5orl8Vf+rducFdfERoYMnWCGIfwVvjrLRJSxhiMr3ErYEuejOInbVV+fLv38V1GysQIxFYUyzsE2C1Vn/UaEBu7X54+lFYYf1bzd7JfqNI4zPwZh/dhXgiIT06TFv/za4sOzfTpJkPs5kL4+t+odUusTzdF5wePB12tD54xkGX8n47Oq/ermbodxWcMFoxslj+qxkcHL+mCTJrKT/SpJkVsz547A6XyOsOW7HnmWrzdD6CVw5mkjnqyp/yupX8VAtW5XiX3hG1t/gIeufhRcs4UDrJ9RfFzMbmr+X/UO08x+Jl+OMw9r812l7k0TC6lfp4Sw6X7AE1GC3ESE56sIim9c6+oWq/pesa8NDVf+LFXzBId0zdEa3hYwyf0ydr3NmCp2voAomCpaoQqyHc0rFq8XR/7LOj6bz5Q+k0uDk5tsAbQGhZodDqNT/xdeqBBgUrMotuIvx+8HBE17gdIC1feChqv8le4bwDFOeiOh/lct0WY6cVOerSsIXXFhERTpZiaf/ZZ0fR+crMgsAh4VdILQdhPos7GLD8ROgh6r+F6u/p75Mrbm3nhkc1jj5L1W80OdUdb566Y9b+oWbIse/Pd99a3at/+rL+Km3A2u+ZCAGLZAQc0kVMAfpvKQEK5A6X4g1c6xyYVX9j8XYv6OctP59yH+NlptYoxx9OL36iiHzClNINpe0wC7uNc6rCAnW4K22ZjudL2fnjgaYkK9DVf9/eRS8n0nnEBDyX6N5CmvqOgu94pRaauOvLXq2J/3UjnJhtUgXdmIBF2OU9ccGpli02hQIwYLBF/VZVE7HYk/BiSmc2kr9pe5Yv7FxUqg7YOp/WeeH0vlqLuRxYCtHi/sP1e684ItY0cETrLBq/ATlQngNLxYlDB3NQrYEuejOZtH5arY3FoUx2cI2FVZn/UclsvBFo7DTzt9vrv91MjpfwZh/OwngfajawuPkGV//C1yY1P8CUv8rSZJxOc8UCv7UF/HX7L8FKzobf/wEZh8/v71+RT0/C4dH92dOrf/Bz+sw/egkGZ8c/4CcPyZJknQm/VeSJLMS7R8KLlEvVsYHW7Ujl/lvNDJT9A+oxROy2t7X/4p08tOvWuf9+7PbLuoF+F+iYM8sOy/Fv+AMVNsw/RzU/6LXQy2OXKr29b/ko/r6X/6Gj1RFBw5x23Y4zw4HpKJ/aJy/t6xc3RpwXljw9fPf3qTlrOiz3r99B/S/pOOQOl/sZLEtyvorte5v4QyEi2PkItSFLe5fC84L6wdv3XqVdkGiz3rpxstQTgjOC/uHnn/xJtUyoeM3/CDY/A/n7739FtR/sT1D2eEJsHf/dup8nS3wlzZCKV8vwIUNtfk2cD4tkJf0c+gXZNDuBOf0W4odnPvzPuerzUNlrf6XlA2w9L9KKbduvQojp5TQLFrz7fMv3rR+n0zzCw9hwMTREg8h8se2ITxkNfd4yNq28VCtvF9fvzqpyFcDqvMaU7nwJLnwX1Z8rmYZ1OvpTZ15RIPO1/rZK93/HVpAwHmh8T319FU6kKLPuvrMNdD/AueFKQzmy9CL4RlwXlI/x/p9HgVTLiwx56Xq3zcwms5XLWAzagi2swuDhiFLP+eEGV3/a5w/dZ+jeoZY8zb0P4L4V7D/EVCdl5RgBWT+q+3hG3S+rBZL+dV9UHseYcyLiN8DVf2PxZjTMPH7NiEdsBwwnvGT9yWoH30U8zovyLaq4tFVQPM2tOCyuaQFurCyznmVy/n72iffiO1EvvrCVHx9qvr/kfF/CTtwqf4LJoz476hnos9Tpv2cYM0I/pV6LbpmqOeKDJ7xaWMcyBt0vGEv9nyw7eaPclxnk8fzYfT61aldWBfoyvdi8EWdV8SFbeG8LGaJpocCxz/Gdr/M2vHvWC7mj7i2jV+IiC616XyVSj0cue7edh8KpF1p8sLffwiqdeI7L6iLj/ia/fb+8ItfQ7YinrBA5cJCFh+d60Gw0NIsZKuQi+5M5u99+1mv81Vrn+z+r5NNZ9hvfvEmhaz/AA0qrCC+xPZ/ca6HnV98/XtcYXv9N7+szd9D2pTtXxX6SQajT//2mtGAfu/hQzR4rsXMBVuOnI5aFfyzZZD+bUxBZP82Y/T1xyRJdkueTke7/6oS+XVoC+mTWtjkMYOv5ARo918dHc04Piu45j3jzDEdVnJ6jL7+mCRJYpH+K0mSWeHzx9T56ojVBTkUavGELLjHWnwmAQYrR7PofPn3kcg9a+EMVNsw/Rw4ZCkIVfyrkPoJ1rwBtfjSZjCFr/6AfvGqVNFBwS84v6j/hdsew3l2eCBK/9A4ziJ1vraG1a9++fENun+a1P8C52X1P56kzhd1YYv710r9QtrILfW/wHlJ/S84lPpfzMXT+i84I4XAGn7kidhq/uh3IA3Sn5RswSwtE3G/Bm5rqM23gd3aoWjB4DjBV2H6OfT1mDpfzsNYyPi/aLIBWH+vSoBhwarcgls2375042VasENnkdb8ZR/9L8b6Fck14jkRthvkaoMy1XlJFelkZx73D5V5dL7gDrKvSALOS+p/waHU/2L198yXybJ7qfwF0J7tEfJf1FXFi+9pFgznkg2MpvNV67zAZqjlIDu7MKrKh2f2ees/vvLca/cfDhV8lXHq70dLvVkcVfkFEjp4iP2P8KIs9T8iqvNSVViLrX9fywnofKmNRDDmxfWj4/2PgNr/yH4zbTli7H9E/TjW/4j6cYMzRP3EvM4L86/4r+3ONO3K5pIW1OzWOK9SygtvPIB/FU+8MZtmSDtm6KqCL5AAqBICKKUwIbkdoPolCI28xqmFHsJ/zZLxVYE1I/hXWrXoGqCeKyIesIXlwfpjxxv2YjGxfZQLq0LmH3Zb+Joi+CqD+K8yuQvrAg3BFoMv6rwiLmzPYXOWaHook8Pxj7FdCtUZ/8B5URdGg6+hQrCF/NfsOl+QdqXJC5qClfpfUK0TV85UFx/xNVORfv7Fm7W/T9SPLjEJQyoeLalt4Zb5+3fv3WUxF12CnF3naz1S+d63pS8efMo8l7Qo1AL76s+f1+bvIW1KbQZrWS2o8aAK/rDU6X+djM4X23/IIigHNixVKviJZGf9L0xBMP0vJPW/GKPMH5MkWbMEdFZg1HkRfw2SBWjGCuUG0c9ETnX8/Pb6FfX8LIyfrTttav0Pfl599KOT5CTJ8Q/I+WOSJEln0n8lSTIry/1Dfu1C/KvOlYcvR64HFsKPfooFaP0EFk84m6ep/Y+LxROIVWDl9/8zO1HraSK6ANZ9amtxmAQYPaTr11iLo+p/AWr/kKr/Bcj+IecHhy348CQe4s7tABxi2xmCZ1jnEBzC/nv0ejwj2zasdrQtGKL/MXW+dgD6b9VDaoKo/8UaHukh1f+iLqyqz9HxUxbYt1/71eb6QQfWuU0P2f6hKGHIxEvwkPos1P+Cgi88j/VfcDjOn0zt5qF9WTt/9M1i6pAqWQTKWY9+igW2cF77s1sLJK1ZxViMDX4yHDsKRX8VCep8tc0KFyee7Myiho+Fqv8FsM41mA5ACbXcgrsIzQCm/8W0dKBsGi/GQzXugP2T6c3xDFOewENUDgDwUBbfd6lfXaOfE2EjF9PFeUkV6UTlhTce7Dl5LNR/yb8rfG3F+W06X/K9rG8vRtqidt5BfRaqOIH4CZ6nvgxcGLsJbAEvb44104Pkv6i3CvZ/UJtbE/8PqPPVxS2i/tf6W8WR499ub41mQ8dCCMHwf/ld+zuvckj+a/x4/sCGIRmIQcIVd17w+x8p0nlZMb+a/2qgQeeraN7tEH0+nyoXFu9/BKz+R5n/irw7A2wGm2dZ/6NM5DuM5rzKzv5r6nVGVTy6AZpmDrpyan/Bd1EjL6nCOgLb6UD4+f5aVP1VlXj/PwDB+zidQ5j2CqoYHuW8ys71X81ykYMA28bg5jG7vS+qCCyKBwBbyAbIHdUGYVHnq6O9bTeFlPmHHWTHqf5qMwc6r3JI/erULqwLEeV+hM4ZIy5sT80TVj8xJqPZmxW5b5dCVcc/nDkyF0ZjrvH1cx7PHxs+Zri+IURngX3zfYKo+l+1Oy+oi48Ijf/BCqsSFrT4MK4fbWUuWMy/aIJq/v6Ddz639u/AmgnmvKqWhpm9xXW+mJ3Q+wRLw2qXsFWc9R8Vuv5jxe90Ilmbv2eZU1rLqkKNZ2UUxhKme4ZjZv92szcJ1tzvRjBtwcxxOtZPBBLJdv3b4MKyfxvI/u0kmYk986cnjFm/2hw3ReL5pAt0CpDBV3KGXPJfvdzNUG4ruOY94+QxfVZy5uT8MUmSWUn/lSTJJuCa9XbNs2b/IyN1vgCrC3IomH4TvHA2T1PrJxaLJxBYPJpC50uebOifhRcs4UDrJ9T+IWY2NH8v+4fU4lWUAGO/T0f/SxYM4hlWfwOHsuAez8jd9qhFnUX/0GiVhCcJqzmkh6r+F2t4pIfotpgWmLXaPYXOl1MIpuLoF6r6X1K8BA9V/S/WOQSHdM/QPTu3HWo3D92H6Pwxdb7OGVbLOibBYkMcREcoTpTs1gVJCwYxFmODX7D/0QJtZjvjCdVPjKbzVVvnoUqAQcGq3IK7iP5bmA7g4AkvcDrA2j7wUNX/cuYvsn56Uf+L/ZhdliO31s8cQeerb1/3GTKofuEUOl+18xFWf099mVpzr4p/lUcOa5z8lype6KPq3zew2D80qc7XIcjxb7e3RrOhYyGEYPi//K5xnFfZNP81vlUdWPMlfzmQcIWYS6qAOUjnZcX8lv59LVX5L2Qona8ullnV/1iM/TuKoX9fC9gMNs+y/se4eEkhLkx+aSjnVTbyX1OvM1ri0bVA5hWmkGwuaUHtL/guauTF8vfBW23NLDpfcar6/8uj4H2cziFMewVVDEdzXmWj+q/Zdb6++8s3+K9Wi24NMITKwdNii57tA7WcfPbU+doOmX/YQXacSvg24zuvE9QvnMWktgNCsGDwReeMERe2p+AEq58Yk9HszYrct0uhquMfzhyZC6MxVxcVwzXf3kxo/jiUzletblTtzgvq4iNC43+wwqqEBX344CzbyVzILUj9W6n5e1Z5qO5fy5wXK2H1xU9m1/ly1n9U6PqPFb/TiWRt/t7ZZ0eFGs/KKIwlTEeYS5r6X4uMpvMVJK5iPibrJwJJnPX6X+DCpP7Xxf1T/6uUkvpfSTIme+ZPzweMOi/ir6ESBw1Y0d92+pkX98/xs5RSyrfXr6jnZ2GW2cOpUut/8PNqnz8mycmT4x+Q88ckSZLOpP9KkqSdF954gGvW9LVPr233eJgabNWOXOZcMDiQc22uvN8HtXhCVtv7+l+s7FAV/0I+eOdzKf5VDP0vWm3PChp8XTD1S9Z9LDu0+uT955HIpWpf/0vajK//5RevUhUdOGQ9DHiIbWdwHg9hqRpLKPBQtj3CmTe1x6BGBWYTqZyAmhusHNxIgmKT/qHRKglPD2z7wENagog+68Nnr0EvGxgc1u/88ZXnaP8juK0vP77BtMCsmlU5eEq/ENf5KpoHWRwjF6nV+XJAn/XjD99DOSE4L+wf+ttfv6NaJuizsIUDm//hPG7hzvYMZYf7U7tzaANoPPBCHRHj8PkjtP5YV/tfTaYGvdjRD7JA3K9hHezmz1TJJ5/8aZ8uSIi8IOyisRgb/2Q4FgeGPflahfos+H/lRFLX/4ro9sovNeh81ep/OderwMgpJTSL1nz7t79+R6t16CySaX7hIQyYOFriIUT+2DaEh9b8hbVt46Faeb++fnVr8cztBrnaoEx1XhOVWx8IBF9t/f9S+V6VwFwZfBUWf7WJrMZNCq6RngjCOnoe78nOW9f7oBeDf+WR84KwH/+VRwE/fBd9fRT3776H//DM4nfBtBEsb80U4Oe/vQn/2Pn3b9+Bf8H7wHRyfRxU67yovam32g0c8PDfbm9NQzA6HGIIpgZfa5xX0ZRXB81/zSKVc1TPEGvehrSOmkv2oVaIWAG/zH+1PXw8/4WoKfleeagG1F8vfgrBm1T1PxZj/w4mft8mpAOWQ9s82U8RFy8phn5hWe28HN6/fefde3fBfjbJf1Uxr/PC/Cv+a7szTbuyuaSFujDnozqv8mjwHGoX200zpB0VxKoe8okrT+K/+Hddfebazs1DkH9g4nE08ooE712clzp/hBcYuXfJf63yX9sp0u0Amzk2u7BaqOeK/OrilhcH1h873rAXi2HRUS6sCll/s9ucMR58qSw6r6Dl7DZ/XFu/OrUL6wINwRaDL+q8Ir+6LZyXBawcHSXkFGcok8Pxj7FdCaEz/oHzYuJf5ZEVdbGl1+4/XLP4g5PHXujrjw27uajlNs0LPTJDYWketd1fXXzE11CzQ6t4IFsRT1igcmEhi4/O9ZC2sAZPuQWp/+5y/1oQz7T278A1b+a82JjpSBj6n5eFtBN2n+CH20XnqwrY+cXXvwchMLAlEPyy9O8lkDZl+1f5j0SNp2r/BAlLmHZMhHXPfy33b0t/f2DC6/AH2IdaFfxkI4L925iCyP5tYLF/+917d6nnag7Kdt1/O0lOkt2Spwlj2X+1hfRJLWzymMFXcsKsr1wFQvHXOD5rnCfpTjqsJKkl9XOSJJmV9F9JkixDKyfiVRRbb7unzx/PROcLuyCPfhAPtXhCdg5hFb4qgaKKfxVDbeKFNx5Y+l/F2DxtIp2v2mIL1rwBK5LSZjCFz2q+oArHL16VKjoo+AXne+l/Fbf4hhpVvAofZUuC+iW0bIKVUDT4k1Xrj6nztTWs5vCVO7+i+6dJ/S/Ws836H1F8jop/FbtmVQ6erOcDekEWF7/H0fmq1SkD5yX1v+BQ6n+B85L6X2zPUHa4P7U7hzbAOodgRESHxeonyuWxKl43qs8fU+frhIlLaB7LCeh87dYCSQsGaSzGxj8ZjsWh9c+LXUTUZ8H/NHgH59WlflWJvwbX+WqTAKP8+MP3tGCHziJZ2wce7qP/xVi/IrmFfialby8IJXW+dmONeCFVvscXcgpJ0xGWw6J1WvFPTYm/Rtb5ktf7MOUv1P+izR9WC9ue3Hv7LfyHZxa/C6aNTEuzAZDNVM1O1f+ySJ0vHPDw325vTUMwOhxiCKYGX2ucVyHZLvnCRwZfNGyKW1E0/3UmjTvNfPHgU9q8jf2P8KIs9T8iaueQFfBb+ve1xPNfiNr8MbvOVy1q/yOdMGL+q/bO2P+I+nGs/7Eq9Yw5077OywG27QD7iezfwZJfJexqQvUT8zovzL826DdRaNqVzSUtqNmtcV6FqLBWPvWGdBcSoEwhkoOs0Y9rQ403aeQVCd67OC91/ggvMHKn+S/AyXzVfl4h/zWUYkktbObY7MJqoZ5rUTygbNOzjSrSo3EaOl+y/ma3OePK38yi8wpaTvP8EVg/CkbrV6d2YV2gIdhi8EWdV8SF7Sk4wfZSG5ahTA7HP8Z2JYTO+CfXW2nw1cWW3vz6mzWLPzh5lMgSCurCaj/uivqvEXS+ajMa6uIjvoaaHVrFw5S/FnnpxstfPPg0rh/tP39tC7ey/+jX37CRk1ohrnkz52XtYisBm6tVPhlH56tWp+yJK08yzyUtCrXAnnr6Kmp+4Vd9W4K0KbUZrGW1oA+/coGVJUw7JsIi+S9aQvHu5cxXvATssf7XjDpfhz/nSmZ//pOHeStMQfyTofOV+l8A6n+xbdNQ/4vRPIvM/sckibJmCSjpCAahF/HXIFmGZqwQJqifieT4CSzqZzK+vX5FPT8LGQIfS63/wc9rWT86Sc6WHP+Arce/nD8mSXJ2pP9KkuQSuGYdL6Hote1ee/2Es2B5AstksBB+9FMsQOsnsHjC2TxN1k8UbfM0QAoGQBWFLDikJdR4ku6fTKN9eujXQ0jVKlYro55nX1283pLT8fUCHFT9L0D2D6nFqygBRvdMw0MowcHzcIhtZwieYZ1DcAj779Hr8Yxs26AW9fCzj+JlE7ALH33hQMsm2Cpkado8TTWMqP797An+8WF79tFDaoLYy8YaHukh1f+iLsyqWVUHTyjhsQ5VwE4sj+B8NVLsU6XzJe9JD63zFtRnof4XFHzheaz/gsO2tsctqN08tBbWOQTDITos6bkK2TxNqoBZWB9Tzh9PGShnPfopFghWKuIgOqYqzm4tkMwRw++EDX4yHKsCbWbReEAtB3wWvAAvhvWr8CIuYVI7vJnxl28ltXpe8ku115fL846qEmr6AqcDUDaNl+EhlFDjeTiE/ZPpbfEMU57AQ1QOAPCwVr8syBYSmpSNhMyrnJEVwY3p0Qbk/t332sQLy6PgnUrgq1NITEc4PquXeGFx9O8XDYJlHxbj89p4Xl5f9XgI1kwPkv+qnbyUsH75Iov9Q8EsbK/N+3r5HX/euhFy/NvtrenfCJ6EEAz/l9+1xnmVUkBzPJ7/Aqz5Y+lkRbr+6uCj2YGPJwMxSLjizgt+/yNF/p6tmF/NfzVQlf9C0P4wBGP5+7aHaaMhuSaJB++A1f8o81+Rd2eAzWDzLOt/lIl8h+2clwVOGMvl/JcDS37FU2Aql/zXCawzrgcyr7gRQ0QOhdpf8F3UPzaWvw/eamsi+nNt9I2b4qtMte8Iwfs4nUN/IJueRH7kLs7Lmj+Cw0LZaKof7We+1juvwvL3f/jFr3OpsQFUEVgUDwC2iHC3UNHswqLOV0d7227olfmHHTTHqf5qM77zipsNeCvcuSO+/4ujpbMeXf/+zF0YquhEgi86Z4y4sD2n56x+YkxmsbftUqjq+IczR+bC6K9rvS2tXPZxMg908TFSfOPgWIiev2eBfZd1a2fRUD3f16xp/I9beMQTFrT4MK4fbWUuakso1fw9qzykhojL3sx5WbvYqrDgP2J/qp3QzzGYvVqv81Vce2uGTiRr8/csc0prWVWo8ayMwljCtGMibDH/hZ4LbYkWPMenkFaq4fj+7aBbHH9VwWf9RCDZn+zfBhb7t9m2adm/nSRJskCFfnRSC50CZPCVnDBV23Z05Hj/FZwVzjh5TJ+VJJuS88ckSWYl/VeSnCm4Zh2voui17V6vzY+z/v4A1HV9Z/M0tX5isXgCgSoKS/+rXE5eUPEvSz8HF7xVKxxf52t9/5BavIoSYFQ5Bw9V/S9ZMIhnWP0NHMqiIjwjd9ujFlVVgo+yJRH9Elo2wVYhS1PzhmMDkkv+a5ZKwqlx/g5V/S/W8EgP0W0xLTCrZlUdPGkJjzxUwc419auD63w516uwziE4pHuG7tm57VC7eWgttHOoPBoO1bYhxFcBU1E/Dseicv54ClSpaB7Faeh87dYFSQsGMRZzaoMbQJtZNB7odqQtRCje+8IbD8B5qS7MQq1ZXRS/lOcX1h/H1Pmqqs9mbR94qOp/yZ4hPCPrpxf1v9iTdFmO7K6fyeglZM5Ina89WaNfCME7lcBXp5CYjnB8liy+785y/cRoOl+zGLEqXuij6t83sNg/FMzC9jK7qXW+5Pi321uj2dCxEMd1KyRZL75alf8CrPlj2dJ5lRHqvxwO9FMyEIOEK8RcUgXMQTovK+a39O9rqcp/IVLFkOXv2x6mjUN0vixU/ftawGaweZb1P8bFS4o2NUFWOi8LnDCWy/kvB5b8qlKRjjO0/1Lp1ZcLmVeYQrK5pAW1v+C7qJGXM3c+kKD+XAOz6HyNBqa9giqGXZyXNX9kyqtUgtXPfG3nvMqk+XvQKdtfrQyGUDl4WmzRs72FimYXTkPnS7KD7DiV8G3Gd15xswFv9eGz1/BF8BshkR+8uBdT+q9eQAgWDL7onDHiwvYUnGD1E2MyWnXO/g+jjn84c2QujMZcXVQM13y7k3mgi4+R4hsHx0Ks+F2pXx1c56tWHKoqYUGLD+HFooShk7mQW5D6t1Lz96zyUN2/ljkvNmb6EoYs+I/YHyx+sxKwWXS+6PURU6/N38v9q/zrqfGsjMJYwrRjImwx/4Wei+4/hPnT+BRSTTU4H9N++l9novO1fiKQ7Ilvb6n/BaD+F9t5CPW/GKn/lSR7MPVgebZgBH0Rfw2VmGjAssIcP4FF/UxG7fj57fUr6vlZSC92LLX+Bz+v4/Wjk2RYcvwDth7/cv6YJMnZkf4rSU6Z+3ffwzVr+tqn17Z7m27+WGasvy+T6JSpxRNOP7yqf8LKDlXxL+ThZx+p1Yaq/hfqBxRSM8EOnf3TqH7Au/fusk8ED61Pylojt+5TjGKLWn0B53oVq3gVJQDgELs4cNt2OI+H2HYG5/EQlqqxhAIPZdujU3xDfygwm0jlBNTcYOVgRIKikCr8QiyK2U8QmDNSQ2r4u57Sf40Ptn3gIS1BpH9j8HcLBof1O7d/93va/whu65U7v2JaYFbNqhw8qdmVyxIoDrSFjX0Jt+1rzlxU6XxJv6bqAuD52uut92V7hrLD/elSMedDO4fKo1pCdFisfqKQtjMU0om8i3Re5dGAV1VBlfPHaUAvdvSDLBAfRbFeevNnGhWIvCDsorEYG/9kOBYHhj35WoX6LJSgKJebH4P92wBsvs1Oqs4LsMJki4v4y4qrO8bn6pfYRGPxVkxdpyz9ncCAiaMlHkLkj21DeMhq7vGQtW3joVp5v75+tbt4JqOXirmkdgqgWursNcz7UPunTpHK96oEJk1HWA4LI6+yTfO/n4tQ9KNlFLc+PlfzGvIRnTP0zuPkv5hyYYk5r166Lov9Q8EsbC+zq/1cHB2r83Fh0LDBEmHlUc8jTUHQ71rjvMrltFcw/wXI4Ismv7bwYuiOimZao+S/jjJW1rwN/Y/QwhbsfwRU52UF/PH8i088/4VQy8MorC3/2gX1Z6cmG6F2POg1fkjAcsB4WC4fiIuXFEO/sKx2Xg4gXkgldHz9CZb8Kr1NaDHQGSL/5cRZ+K/tzjTtyuaSFtTs1jivUgqMn0PtYvva/YfbTR47/l1VuRWqp1T7XfWP1g7kH5h4HI28IsF7l1+yOn+EF0w5h46FTuZro5GPfUbyIxvCf6kwo9wty0s916J4QKmxvDiw/tjxhr14//YdNe2KHOXCGu58yLpBPPhSWXzyoOXInTuq9n/ZdBRkODU0ZWT/1Qsagi0GX9R5RVzYFs7LAlaOtt6/Yz0HegeJFbxv95DO+AfOi4l/lUdW1MWW7r391prFH5w8SmQJBXVhVbJfTuWNnCFiBKPGy435L5mhkNl3en5NRkPen92tYaBG5cJCFh+d6yFtYQ2ecgtS/93l7wfEM639O3DNmzkvNmY6EoZ0/ys84z9kIfWrqOUEZV/+/rWS9VVLvr21Xd9QbYRA2pTtX+V/CzWeqv0TJLL0t/lWjEj+i5ZQ/ORff0IzX/ESMBCPwypC+oNUfRyd+7eDTzDOAmIbtSr4ybE029vZ9m+znYeG7d8eZf0xSbZj3pEy8Un/FYVNHjP4Sk6Y+LYdx9LZfwUHuhnHw3RYSTIap7/+mCTJqZL+K0lOAVo5Ea+i6LXt3iGbP5bB819TLFOqxROycwir8NViAlX8qxhqE/fvvmfpfxVj8zSpn0MPnf3TmAQYq9zBw4l0vqqKOVTZnCeuPImCX3C+l/5XcYtvqFHF69dQtiSoX0LLJlgJBbOfIFB5Qw3J0Z+oZWj/NT6s5vCLB5/S/dOk/pff947ic1T8q9g1q3LwZD0f0Auy2MWNNTtyCHUkwIIMpfPlXz8OtTuHNsA6h2BERIfF6ifK5fpVqQJmIZ1XMYq/2sj543DEJTSPJa5fOKzO124tkLRgkMZibPyT4VgcWv+82EVEfRb8T4N3cF6R/m0ENt9mJ1XnBawUv0QW9L/kl47V+XLmHSp99b8Y61ckt/7j6aViLqm1v9T5amaNeCFVvscXcgpJ0xGWw8LIq1TOH4P4Ol8h/ZzU+bKgripefB/UL19ksX8omIXtZXa1zmscna/aPqSOQM8QS4SVy/pfRQRfa5xXuZz2qtLvlcEXTX5t4cV8nS+LvfNfRzmjJ648SZu3sf8RXpSl/kdEdV5WwG/p39cSz38h1PIwCmvLv3ZhHJ0vNnyu7H9E/TjW/4j6cREwZ9rXeTmAbCHYT0S/kCW/Sm8TcgIdayoG7Oq/nB5a55qNoC3ca5xXuZy/7/iEa6hKXtSCXdzr8xdqUOZc3PYWDd+1BqpfgmDkBVHYopBOF+flzB8x7YW+DF2YYzyRbV8aYK6KiTUUeyp2fP7+KJ0v6rkWxQPKNj3ba6QZN0XddoHScQl8T52v3X7h8eBLZdF5BX8QunMHexHBkdPpjq/zZXG8/zoE6rwiLmxPwQm2l9qwdHRh69lf58sZ/8B5URdG015dbGnlyilOHiWyhEJKsAZxKm+k8fg6X9bPuzB/HE3nq/b+P/7w/RNXnozrR6P+vfrV2hZumb/3f5+45s2cl7WLrQRsTk1+OeDKN27BAGVfGIIFi7/G1/mqvT+kTanNWIo6CDUeVMFvgyVMOybCIvkvWkLxz//yDzTzFS8BA+U4rCIEOo58jfpfZ6LzVaWCnxxOd3s7ef0vtm0a6n8xhtX/OtP5Y3KS7FaPmhwLRtAX8deYWeQ4ltWe/PjJOGr8/Pb6FfX8LKTXO5Za/4OfV2f96CQ5JXL8A3L+mCRJ0pn0X0kyGWovgU+vbfd22/YxyCj6OVO08tL6CSyecDZPU/sfF4snEKiikAWHaIt05Yjun0xrJughLnirVohVFFBCgXumAXiolt1bOl/yS5acTkSfa/31To2YBZTgsENsO0PwDOscgkNZcI9npOAXtajnX7wZL5uAXfjoCwdaNsFWIUtT/4bcOY2VTWzBKP5rfNieffSQmiD2srGGR3pI//boH49Vs6oOnlDCYx2qQM2ONYSC/akqmsyXqVTpfBXXr6nnu1xv/eYPpHbz0FpYCxEMh+iwpOcqZPM0qQJmoW77CGazqQvL+eORVHX/HUXEeRXys4zjGii7PRKtWcVYjA1+kf5HB7SZReOBbkfwWfACvBjteVRdmIVas+rsWRs0nmYuxV9r4vNCQnRV58u5nn7VGiEj47AKU57AQ1QOAPBQFt93qV/dQkKT0kvInFFlf6iTw86P6dEG5KUbLzdLAEDwTiXw1SkkpiMcn1UrXlgLKq9KCdZaU3nsv9bH5/5DWE+m3u1AqLcK9n8E9csXWewfCmZhe5ldr8HT8mubYg2iO4BmQ8dCCMHwf/lda5xXKQU0x+P5L8CaP5Ytt4DEFOr6FqJN8l+DeCIAEq6484Lf/0iRzsuK+dX8VwNV+S9Eqhiy/H3bw7RhffRVLqyLzlcxxt1awGaweZZVhMlEvsN2zssCJ4zlcv7LgSW/4imwIHTxh3oxax7ms1/+vtd4SP8SgkZJ7S/4LmrkJVVYRyCiP9cGJF975S/iyb5a2zgkvnPAtFdQxbCL87Lmj+CwUPaL6kf7ma8tnFe5LN7L9CdK/TCza/6eSn3tmbdGFYFF8QBgpWyAyhYqml2wMq9A3/WjTaW+VA3PTaH6q834zituNuCtcOeO+P4vjpbORnTUv5xy/ZEqoixeTOeMERe2hfOyGCpqsNihiqcKyzFtNyiq4x/OHJkLozHXeltauezjZB7o4mOk+MbBKrsphvFg2CXzX9afg/XJPp4/OvM7S0e8ylx8cSh6NyolFr9/LU7mgsX8iyao5u9Z5SE1RFUnt9i72Kqw4D9if7D4zUrA6OK3b4U4kWRm1zaK1uYT6PXOWhB+aev8PTWelVEYS5h2TIQt5r/Qc6Et0YLn+BQSXNj+9avL/dvBGGGKUMJh/UQg2ZN97O1k+rfZtmlz9W87n/WU88ckmXqwTKpwPuuz7h+iU4AMvpITpmrbjolY9l/BgW7G8TB9VpJMzf8HZeZHSc6iaTwAAAAASUVORK5CYII=\n",
|
|
"text/plain": [
|
|
"<PIL.Image.Image image mode=RGB size=405x400 at 0x7F393260E100>"
|
|
]
|
|
},
|
|
"execution_count": 182,
|
|
"metadata": {},
|
|
"output_type": "execute_result"
|
|
}
|
|
],
|
|
"source": [
|
|
"show_tc(3)"
|
|
]
|
|
}
|
|
],
|
|
"metadata": {
|
|
"kernelspec": {
|
|
"display_name": "Python 3",
|
|
"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
|
|
}
|