diff --git a/anaislpb.py b/anaislpb.py index 7c731d5..801db7a 100644 --- a/anaislpb.py +++ b/anaislpb.py @@ -69,10 +69,11 @@ def image_for_mathias(name="1.jpg"): # Show result cv2.imshow("Spotify Code Deskewed", warped) + cv2.waitKey(0) cv2.destroyAllWindows() -l = ["1.jpg", "2.jpg", "3.jpg", "4.jpg"] +l = ["rebirth.jpg"] for name in l: image_for_mathias(name) \ No newline at end of file diff --git a/boonepeter.github.io-code/.gitignore b/boonepeter.github.io-code/.gitignore deleted file mode 100644 index f93211d..0000000 --- a/boonepeter.github.io-code/.gitignore +++ /dev/null @@ -1,2 +0,0 @@ -__pycache__ -.venv \ No newline at end of file diff --git a/boonepeter.github.io-code/README.md b/boonepeter.github.io-code/README.md deleted file mode 100644 index 329bf14..0000000 --- a/boonepeter.github.io-code/README.md +++ /dev/null @@ -1,12 +0,0 @@ -# Code snippets - -This repo contains the code snippets I reference in [my blog](https://boonepeter.github.io/). - -## Index - -Code|Blog Post| ----|---| -[spotify-codes](./spotify-codes)|[How do Spotify Codes Work?](https://boonepeter.github.io/posts/2020-11-10-spotify-codes/)| -[spotify-codes-part-2](./spotify-codes-part-2)|[Spotify Codes Part 2](https://boonepeter.github.io/posts/spotify-codes-part-2/) -[snapcodes](./snapcodes)|No post yet - diff --git a/boonepeter.github.io-code/snapcodes/README.md b/boonepeter.github.io-code/snapcodes/README.md deleted file mode 100644 index 8cdd18c..0000000 --- a/boonepeter.github.io-code/snapcodes/README.md +++ /dev/null @@ -1,37 +0,0 @@ -# Snapcodes - -Using Python 3.10.1 - -```bash -pip3 install -r requirements.txt -``` - -Running this command - -```bash -python3 img_to_points.py snapcode.png -``` - -Gets the points from this image: - -![](./src/snapcode.png) - -Points: - -```python -[1, 2, 3, 4, 6, 9, 14, 18, 20, 21, 22, 23, 27, 28, 29, 30, 32, 38, 39, 41, 43, 44, 45, 49, 53, 58, 59, 62, 64, 65, 66, 67, 70, 71, 73, 76, 77, 83, 87, 90, 93, 94, 96, 99, 100, 101, 103, 104, 105, 106, 107, 108, 109, 110, 112, 113, 115, 118, 119, 120, 130, 131, 134, 140, 141, 144, 145, 146, 150, 153, 155, 157, 159, 161, 163, 169, 170, 171, 172, 173, 174, 175, 178, 182, 183, 184, 185, 188, 190, 192, 193, 196, 197, 202, 204, 206, 207, 209] -``` - -Points are numbered left to right, top to bottom, starting with 0 and ending at 211. - -And this command - -```bash -python3 img_to_svg.py -i snapcode.png -o output.svg -``` - -Outputs an SVG file: - -![](./src/output.svg) - -The svg is useful for checking that the point parsing was correct. diff --git a/boonepeter.github.io-code/snapcodes/requirements.txt b/boonepeter.github.io-code/snapcodes/requirements.txt deleted file mode 100644 index 4aadbc4..0000000 --- a/boonepeter.github.io-code/snapcodes/requirements.txt +++ /dev/null @@ -1,10 +0,0 @@ -imageio==2.13.5 -networkx==2.6.3 -numpy==1.22.1 -packaging==21.3 -Pillow==9.0.0 -pyparsing==3.0.6 -PyWavelets==1.2.0 -scikit-image==0.19.1 -scipy==1.7.3 -tifffile==2021.11.2 diff --git a/boonepeter.github.io-code/snapcodes/src/.gitignore b/boonepeter.github.io-code/snapcodes/src/.gitignore deleted file mode 100644 index b7f5135..0000000 --- a/boonepeter.github.io-code/snapcodes/src/.gitignore +++ /dev/null @@ -1,2 +0,0 @@ -/imgs -.ipynb_checkpoints/ \ No newline at end of file diff --git a/boonepeter.github.io-code/snapcodes/src/exploring/process.ipynb b/boonepeter.github.io-code/snapcodes/src/exploring/process.ipynb deleted file mode 100644 index 46d0a98..0000000 --- a/boonepeter.github.io-code/snapcodes/src/exploring/process.ipynb +++ /dev/null @@ -1,1661 +0,0 @@ -{ - "cells": [ - { - "cell_type": "code", - "execution_count": 1, - "id": "artistic-resolution", - "metadata": {}, - "outputs": [], - "source": [ - "import os\n", - "import matplotlib.pyplot as plt\n", - "from skimage import io, img_as_ubyte\n", - "from skimage.filters import threshold_otsu\n", - "from skimage.color import rgb2gray, rgba2rgb\n", - "from skimage.measure import label, regionprops\n", - "from skimage.transform import resize, rotate" - ] - }, - { - "cell_type": "code", - "execution_count": 2, - "id": "european-citizenship", - "metadata": {}, - "outputs": [ - { - "ename": "FileNotFoundError", - "evalue": "No such file: '/Users/pboonebenchsci.com/repos/boonepeter.github.io-code/snapcodes/src/imgs/mask.jpeg'", - "output_type": "error", - "traceback": [ - "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", - "\u001b[0;31mFileNotFoundError\u001b[0m Traceback (most recent call last)", - "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m\u001b[0m\n\u001b[1;32m 1\u001b[0m \u001b[0mfilepath\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;34m'imgs/mask.jpeg'\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m----> 2\u001b[0;31m \u001b[0mim\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mio\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mimread\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mfilepath\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 3\u001b[0m \u001b[0mmask\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mim\u001b[0m \u001b[0;34m>\u001b[0m \u001b[0mthreshold_otsu\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mim\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 4\u001b[0m \u001b[0mio\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mimshow\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mimg_as_ubyte\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mmask\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", - "\u001b[0;32m/usr/local/lib/python3.9/site-packages/skimage/io/_io.py\u001b[0m in \u001b[0;36mimread\u001b[0;34m(fname, as_gray, plugin, **plugin_args)\u001b[0m\n\u001b[1;32m 46\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 47\u001b[0m \u001b[0;32mwith\u001b[0m \u001b[0mfile_or_url_context\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mfname\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;32mas\u001b[0m \u001b[0mfname\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m---> 48\u001b[0;31m \u001b[0mimg\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mcall_plugin\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m'imread'\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mfname\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mplugin\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mplugin\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m**\u001b[0m\u001b[0mplugin_args\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 49\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 50\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0;32mnot\u001b[0m \u001b[0mhasattr\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mimg\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m'ndim'\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", - "\u001b[0;32m/usr/local/lib/python3.9/site-packages/skimage/io/manage_plugins.py\u001b[0m in \u001b[0;36mcall_plugin\u001b[0;34m(kind, *args, **kwargs)\u001b[0m\n\u001b[1;32m 205\u001b[0m (plugin, kind))\n\u001b[1;32m 206\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 207\u001b[0;31m \u001b[0;32mreturn\u001b[0m \u001b[0mfunc\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m*\u001b[0m\u001b[0margs\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m**\u001b[0m\u001b[0mkwargs\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 208\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 209\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n", - "\u001b[0;32m/usr/local/lib/python3.9/site-packages/skimage/io/_plugins/imageio_plugin.py\u001b[0m in \u001b[0;36mimread\u001b[0;34m(*args, **kwargs)\u001b[0m\n\u001b[1;32m 8\u001b[0m \u001b[0;34m@\u001b[0m\u001b[0mwraps\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mimageio_imread\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 9\u001b[0m \u001b[0;32mdef\u001b[0m \u001b[0mimread\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m*\u001b[0m\u001b[0margs\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m**\u001b[0m\u001b[0mkwargs\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m---> 10\u001b[0;31m \u001b[0;32mreturn\u001b[0m \u001b[0mnp\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0masarray\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mimageio_imread\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m*\u001b[0m\u001b[0margs\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m**\u001b[0m\u001b[0mkwargs\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m", - "\u001b[0;32m/usr/local/lib/python3.9/site-packages/imageio/core/functions.py\u001b[0m in \u001b[0;36mimread\u001b[0;34m(uri, format, **kwargs)\u001b[0m\n\u001b[1;32m 263\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 264\u001b[0m \u001b[0;31m# Get reader and read first\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 265\u001b[0;31m \u001b[0mreader\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mread\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0muri\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mformat\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m\"i\"\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m**\u001b[0m\u001b[0mkwargs\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 266\u001b[0m \u001b[0;32mwith\u001b[0m \u001b[0mreader\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 267\u001b[0m \u001b[0;32mreturn\u001b[0m \u001b[0mreader\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mget_data\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;36m0\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", - "\u001b[0;32m/usr/local/lib/python3.9/site-packages/imageio/core/functions.py\u001b[0m in \u001b[0;36mget_reader\u001b[0;34m(uri, format, mode, **kwargs)\u001b[0m\n\u001b[1;32m 170\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 171\u001b[0m \u001b[0;31m# Create request object\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 172\u001b[0;31m \u001b[0mrequest\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mRequest\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0muri\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m\"r\"\u001b[0m \u001b[0;34m+\u001b[0m \u001b[0mmode\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m**\u001b[0m\u001b[0mkwargs\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 173\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 174\u001b[0m \u001b[0;31m# Get format\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", - "\u001b[0;32m/usr/local/lib/python3.9/site-packages/imageio/core/request.py\u001b[0m in \u001b[0;36m__init__\u001b[0;34m(self, uri, mode, **kwargs)\u001b[0m\n\u001b[1;32m 122\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 123\u001b[0m \u001b[0;31m# Parse what was given\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 124\u001b[0;31m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_parse_uri\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0muri\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 125\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 126\u001b[0m \u001b[0;31m# Set extension\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", - "\u001b[0;32m/usr/local/lib/python3.9/site-packages/imageio/core/request.py\u001b[0m in \u001b[0;36m_parse_uri\u001b[0;34m(self, uri)\u001b[0m\n\u001b[1;32m 258\u001b[0m \u001b[0;31m# Reading: check that the file exists (but is allowed a dir)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 259\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0;32mnot\u001b[0m \u001b[0mos\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mpath\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mexists\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mfn\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 260\u001b[0;31m \u001b[0;32mraise\u001b[0m \u001b[0mFileNotFoundError\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m\"No such file: '%s'\"\u001b[0m \u001b[0;34m%\u001b[0m \u001b[0mfn\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 261\u001b[0m \u001b[0;32melse\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 262\u001b[0m \u001b[0;31m# Writing: check that the directory to write to does exist\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", - "\u001b[0;31mFileNotFoundError\u001b[0m: No such file: '/Users/pboonebenchsci.com/repos/boonepeter.github.io-code/snapcodes/src/imgs/mask.jpeg'" - ] - } - ], - "source": [ - "filepath = 'imgs/mask.jpeg'\n", - "im = io.imread(filepath)\n", - "mask = im > threshold_otsu(im)\n", - "io.imshow(img_as_ubyte(mask))" - ] - }, - { - "cell_type": "code", - "execution_count": 3, - "id": "precise-discussion", - "metadata": {}, - "outputs": [], - "source": [ - "def get_points(filepath):\n", - " im = io.imread(filepath)\n", - " im = rgb2gray(rgba2rgb(im))\n", - " t = threshold_otsu(im)\n", - " return im > t\n", - "\n", - "\n", - " \n", - "def get_points_2(image):\n", - " if image.shape[2] == 4:\n", - " image = rgba2rgb(image)\n", - " im = rgb2gray(image)\n", - " t = threshold_otsu(im)\n", - " return im > t" - ] - }, - { - "cell_type": "code", - "execution_count": 4, - "id": "narrow-sector", - "metadata": {}, - "outputs": [], - "source": [ - "p = get_points(\"imgs/codes/snapcode.png\")" - ] - }, - { - "cell_type": "code", - "execution_count": 5, - "id": "spanish-listening", - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "" - ] - }, - "execution_count": 5, - "metadata": {}, - "output_type": "execute_result" - }, - { - "data": { - "image/png": "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\n", - "text/plain": [ - "
" - ] - }, - "metadata": { - "needs_background": "light" - }, - "output_type": "display_data" - } - ], - "source": [ - "io.imshow(img_as_ubyte(p))" - ] - }, - { - "cell_type": "code", - "execution_count": 6, - "id": "visible-heading", - "metadata": {}, - "outputs": [], - "source": [ - "l = label(p, background=1)" - ] - }, - { - "cell_type": "code", - "execution_count": 7, - "id": "sustained-swift", - "metadata": {}, - "outputs": [ - { - "name": "stderr", - "output_type": "stream", - "text": [ - "/usr/local/lib/python3.9/site-packages/skimage/io/_plugins/matplotlib_plugin.py:150: UserWarning: Low image data range; displaying image with stretched contrast.\n", - " lo, hi, cmap = _get_display_range(image)\n" - ] - }, - { - "data": { - "text/plain": [ - "" - ] - }, - "execution_count": 7, - "metadata": {}, - "output_type": "execute_result" - }, - { - "data": { - "image/png": "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\n", - "text/plain": [ - "
" - ] - }, - "metadata": { - "needs_background": "light" - }, - "output_type": "display_data" - } - ], - "source": [ - "io.imshow(l)" - ] - }, - { - "cell_type": "code", - "execution_count": 8, - "id": "supreme-prefix", - "metadata": {}, - "outputs": [], - "source": [ - "rp = regionprops(l)" - ] - }, - { - "cell_type": "code", - "execution_count": 9, - "id": "compressed-joseph", - "metadata": {}, - "outputs": [], - "source": [ - "def process_and_plot(filepath):\n", - " p = get_points(filepath)\n", - " l = label(p, background=1)\n", - " rp = regionprops(l)\n", - " fig, ax = plt.subplots()\n", - " ax.imshow(l, cmap=plt.cm.gray)\n", - " minx, miny, (maxx, maxy) = 0, 0, l.shape\n", - " max_size = l.shape[0] * l.shape[1] // 500\n", - " for props in rp[:10]:\n", - " y0, x0 = props.centroid\n", - " minr, minc, maxr, maxc = props.bbox\n", - " bx = (minc, maxc, maxc, minc, minc)\n", - " by = (minr, minr, maxr, maxr, minr)\n", - " if props.bbox_area < max_size:\n", - " print(((minr / maxy) + (maxr / maxy)) / 2)\n", - " print(((minc / maxx) + (maxc / maxx)) / 2)\n", - " ax.plot(bx, by, '-b', linewidth=2.5)\n", - " print(minx, miny, maxx, maxy)\n", - " ax.axis()\n", - " plt.show()" - ] - }, - { - "cell_type": "code", - "execution_count": 10, - "id": "opened-blanket", - "metadata": {}, - "outputs": [], - "source": [ - "def get_bb(filepath):\n", - " p = get_points(filepath)\n", - " l = label(p, background=1)\n", - " rp = regionprops(l)\n", - " fig, ax = plt.subplots()\n", - " ax.imshow(l, cmap=plt.cm.gray)\n", - " minx, miny, (maxx, maxy) = 0, 0, l.shape\n", - " max_size = l.shape[0] * l.shape[1] // 500\n", - " bbs = []\n", - " centers = []\n", - " for props in rp:\n", - " y0, x0 = props.centroid\n", - " minr, minc, maxr, maxc = props.bbox\n", - " bx = (minc, maxc, maxc, minc, minc)\n", - " by = (minr, minr, maxr, maxr, minr)\n", - " if props.bbox_area < max_size:\n", - " bbs.append((props.bbox[0] / maxx, props.bbox[1] / maxx, props.bbox[2] / maxx, props.bbox[3] / maxx))\n", - " centers.append(\n", - " (\n", - " (((minr / maxy) + (maxr / maxy)) / 2), \n", - " (((minc / maxx) + (maxc / maxx)) / 2)\n", - " ),\n", - " )\n", - " ax.plot(bx, by, '-b', linewidth=2.5)\n", - " ax.axis()\n", - " plt.show()\n", - " return bbs, centers" - ] - }, - { - "cell_type": "code", - "execution_count": 11, - "id": "spread-capacity", - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "0.0703125\n", - "0.26171875\n", - "0.0703125\n", - "0.3095703125\n", - "0.0703125\n", - "0.404296875\n", - "0.0703125\n", - "0.5478515625\n", - "0.07080078125\n", - "0.166015625\n", - "0.07080078125\n", - "0.2138671875\n", - "0.07080078125\n", - "0.7861328125\n", - "0.1181640625\n", - "0.1181640625\n", - "0.1181640625\n", - "0.2138671875\n", - "0 0 1024 1024\n" - ] - }, - { - "data": { - "image/png": "iVBORw0KGgoAAAANSUhEUgAAAQ8AAAD8CAYAAABpXiE9AAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjMuMywgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/Il7ecAAAACXBIWXMAAAsTAAALEwEAmpwYAABX80lEQVR4nO29eXQb13n3/72DwQ4SIMF9p0iREiVaslZKsmQpsmRbXusmzdLkTdLkKEuT9G3fvK2b9KS/tO6Jk/PWtWO3jh3bee03ie3YsWXFSWVLlqzF2jeSEkmJ+74TBAmS2O/vD2AgDDEDgiCWITWfc+YQGFzeuTNz5zv3Pve5zyWUUsjIyMjMFybZBZCRkVmcyOIhIyMTFbJ4yMjIRIUsHjIyMlEhi4eMjExUyOIhIyMTFQkXD0LIfYSQG4SQFkLI44k+voyMTGwgifTzIIQoANwEsAdAD4ALAD5PKW1IWCFkZGRiQqJbHpsAtFBK2yilTgBvAHgkwWWQkZGJAWyCj5cPoDvoew+AzcEJCCH7Aez3f12foHLJyNzOjFBKM+f7T4kWjzmhlL4I4EUAIITEtU9FCOH9lZGREpxJIQGmhc5o/inR4tELoDDoe4F/X0IhhMiCISN5gl9ulNJEiMi8SLTN4wKA5YSQUkKICsDnABxM1MEZhgHDMLJwyCw6CCGB+isVEtryoJS6CSHfAfABAAWAVyil1+N9XCldcBmZhcLVZ6/Xm9RyJHSodr4s1OYhd09kljox6s5copRumO8/LdlXstw9kbkd4LozyUByoy0LZSGtDSkapWRuL6KtvwzDJLz+LinxiObCy4IhIyWC6+N86zOXNlH1ecmIx3yabrJgyCwGohESLl0ijKlLwuYRqXBQSuH1emXhkFl0cHU3UhJhB1n0LY/5CIc0RCO4DB8L/D4J4F8BnI8w3YU4HHs+eS6GYy8dvF5vxK0QhmHi2gJZ1OIRaX8w+gt4q8IzzMnAvlv5BVf4W2kVipOB4/oES+zB2BlhOcKlezjCPBKR52I4dqwIvt+nAvvmvucxOLL/RRjJi5PzTo0Hi1Y8IlHfWLY2vN7tYX7lV3iPRywtPx0hxwOffcVcA8AEIGVWuhO875TeIZhuPjDMrTwpjU2ekR/7JO+711udsGPHA4/nrjC/xk8MI2mFxNOIuqjFIxyx7qbcerv48HhWQ6zCs+yttG737HQfA9gJQo6DZffw/s/l+hC33spcuhNQqfby0jkcHwC4O4qz8OXJMCeg0dzP+2V6+k9R5jnfY5+ETreP98vU1B9B6Y44Hju+sOwnvO9u9yokSgyDDapixKv1sSjFY67mWuyE4ziAu6FQnILB8CDvl8nJg/B6b1V4heIkPJ7tYNlTSEm59baZmDg4x5tp/hDCtVSknediOHb0fAxgJ1j2E5hMj/J+sVjejfk9D0ckAhIP+8eiG21JbItDPJ/ZxxA/Zuyfing8aMl8eBefcIQnGYb5SOp9rD2ul5R4xG9EhZ+nx+MJOY7XG3rc+QyvRZrOd9zYnqPv2Ml5gn33LLkTvGKJx+NJ2oS1RIvHouq2RNJdiQceTzUmJw8CIEGVfe3sowPw2TgmJt4DpdxDuUakrGvgch3m/W9onj5DptP5gf8zlzY03Xzweu/AzMx/B47tu24LyzPyY1djauqPga6K8LVcPLjdq2CxvAOuboS754nA6/WGfU5i2X1ZVOIRjvgIx6T/r4ln3xBOcyut8GhLaDpxA+Vk0GcTKI0kXSTcOra4gXK+eUZ3bOHbFa9jx4O57ndwmsRCKU3IpNBFIx7h1DR+3ZV/9f8Vs5pPAviXCNJGmi44LYkw3XyYz/nEmmQeOx5I93zmEo9YtT4WTTyPcOKR7KAoMjJSZB7PTFTxPBZFy2MuI+n84XuD+vqqwYbIhbl+38pTyBPVh0qlgkajAQA4HA44HA7BXBmGgU6ng0qlgsPhwMzMjKBYEkKg1Wqh1WrhcrkwPT0Nt9s9j/InBoVCAb1eHzifqampsOej0+ng9XoxNTUleo1UKhUMBgMUCgWmp6cxPT0tWC8UCgVSUlKg1Wpht9sxOTm54GukVCqRmpoKtVqN6elpTExMSOZlFq4FEgvfj0XR8oh9qyOSc/4D5ucdOFeet/JLSUlBSkoKL5yc1WrF1NQU7z+USiUyMjKgVCoD++x2O0ZGRkLO22w2IyXlVhPa6/VieHgYMzMz8ziH+KJWq5Gdnc07n+npaQwODvLOhxCCrKws3jVyu90YGBjA9PQ0L0+9Xo/c3FywrO89SCnF+Pg4hoaGeA+HQqFAfn4+7xo5HA50d3eLitJcaLVaFBcXg2XZQFfAZrOhp6dHMsId4bOzNCOJxdvwo1SeDmw+T8Fx/y/ReweqVKcDGyFWXn4sy/IeCsB3g41GY+AB4DAajbwHDQA0Gg0MBgNvn1ar5T0UXJ7p6emSit+anp4ecj46nQ4mk4m3T6/Xh1wjlmWRmZkZct0yMzN5140QgrS0NOj1el6eGRkZIddIrVYjKysr6vPJysqCSqUKlIlhGBgMBqSlpUWdZyJZ6LMlnZoVBdG2mriJa0rlaaSnP8bbgNqo8uRclFWq0zCbPx3YWJYf31mpVAo+0AzDQK1WB74TQqBSqQSPxXV3OLRarWA6pVIJhUIxr/OIFwzDiJ6PTqfjfddoNILXSKlU8sSHZVneNZudBwchJERMONRqdVQCy7KsYJ4Mw4SIVDKJZ89C8uIRe3tHvDwaI/MwFRsZWohDmdj/SScMQXg8Hg/ve7gyz8+Z7tbncN2IaK5RuPslFZsHEP7cbuuWR7SIeTT6+r7RPWweT2QVyel0hjwsgK9PH9z3ppSG9O85Zu8XMxDa7XbJ9L29Xi8mJ0P9HiilIfttNpvgNZqenobL5Qp85wzDQseabT+yWq2C12hycjIq8fB4PLBarYJCbrFY5p3fYmTRisdC3qjBy/hxG2d9jz5Pr//vrXynp6dDHgKucjmdzkA6p9MJi8USUhEnJiZgs9kCMSK4Cjv7gXE6nRgdHQ0IBaUUMzMzGB0djfp84sH4+DgmJycD7v0ejwdjY2Ow2Wy8dA6HA8PDw3A6nfB6vQExGB4e5qWjlGJwcDAgnpRSuFwuDA4Owm6389JOTExgeHiYd2yLxYKRkZGoz2dwcBAWiyXgku50OjEwMACr1Tr3PyeQeLU+JT/aItYfXVjT8Bh8U9/HccvGEewiboJv1uSuqPIkpHaWK3lofoSQgKHP7XaHvcGcNd/j8Qi+kTkYhgHLsoFmulTvLWf38Xg8YVtGCoUicD4ul0v0fAghUCqVIITA7XaHvUacHYh72GOBSqWCQqGA2+3mtYykhNhz5BfdpevnEXvm6yI+vzyF3cn5+XEPRCRE2vWI5QMRTyI977nEkoNrvUV67Fg/4IvhmseD21Q84uFaHKl7uoyMdFiIs9ht2m2ZP1zT1OFwhD22QqGAWq2O6RtOqVQGPDJjYQAlhASGKB0OR9i3O8uy0Gg0cDqdYd+wnEcoAMzMzEi6y6TRaOBwOCTbYiCEQKPRgGVZQbtZNMzhLCZ3W+KBUqlEfn5+wP3ZbreLGsUyMzORlZUFtVoNt9sNi8WCvr6+qG8+IQQFBQUwm81gWRYulwt9fX0hhsP5oFKpUFRUBJPJBIZhYLfb0dXVhfHx8ZBj5+bmIjc3F0qlEm63G8PDw+ju7g4RT4PBgJKSEqSmpgLwGSc7OjpCDKHJhBCCvLw8FBYWQqVSwe12Y3BwEO3t7ZIaWlWpVFixYkXg/kxPT6O1tVVyxm9gEY+2JIr8/HyYTCawLBt4uxYWFoY4aqWlpSE/Px8ajSZgwOPEJFpycnKQnZ0dMKwqlUoUFRVF7cFICEFRUREyMjICRlidToeysrIQR7O0tDQUFRUFWigqlQr5+fkoLCzkpVMqlaioqAhUdoZhYDKZUF5eLhkHNcDnYVpWVhZwQFOpVCgoKAg5n2RCCEFFRQXMZjMUCkXAuW3lypWiTm7JRBaPMHATrmbDsmzIA5yenh7ysBBConYRZxgGZrM5ZD+XZzSo1eoQV3DAJwCzzycrK0uw3FzF5jAajSEeooCvNWI0GqMqZzzIzs4OOR9CiOD+ZKHT6QTvOTfHSWpI46pJFJZlRd+es/eLpQuXx1yIVerZc2AiJZy7+uz5IWKu5AzD8DwTw52bWB6JJnhYXOi3RATOiYRwZZk9J0gKyOIRBofDIWr0nN2fF+vfz8zMRGXk9Hq9EXuYRsr09HSI8xTgG+oMLj+lFBMTE4J52Gw23vlwTmyzEfMoTQbcTFuhoNVi5U8GDodD8P4ACLFJSQFZPMLg8XjQ19cX8vBbLJaQh2toaCjE1dnhcKC3tzfqkYf+/v4Q8ZqZmcHg4GBU+Xk8HvT29vLOh1KKkZGREJfqvr6+EEG02+3o7u7m7ZuamkJ3d3fIXJKenp4QF/Fk0t/fD5vNxvMunpmZQUdHh2RGhlwuF9ra2kIM7ENDQxgbG0tSqcSRh2ojQKfTwWg0QqFQwGaziQZ8YVkWJpMJOp0u4HIebawIDpVKhYyMDKhUqoDL+UKHaw0GQ8AWY7PZMDY2Jng+SqUSZrMZer0edrsdo6Ojgm9GQgiMRmPAFmOxWATf9MlGqVQiOzsbOp0ODocDAwMDC74/8SAlJQXZ2dlQKBQYHx/H8PDwgut7PIZqoxYPQkghgNcAZMPnh/0ipfQZQkg6gDcBlADoAPAXlFIL8XXmngGwD8A0gK9QSi/PcQxJiIeMzGInHuKxkG6LG8D/opRWAagB8NeEkCoAjwP4iFK6HMBH/u8AcD+A5f5tP4DnF3BsGRmZJBO1eFBK+7mWA6V0EkAjgHwAjwB41Z/sVQCP+j8/AuA16uMsABMhJDfa48vIyPhI1mhRTDxMCSElAO4EcA5ANqW03//TAHzdGsAnLMHWth7/vv6gfSCE7IevZbLo0Ol0KCwsREpKSsC4KOSJyjAM8vPzkZWVFZhWPjAwEBM3ZJmFo1AoUFBQgOzsbHi9XgwNDaGnp2dBXWW1Wo2SkhKkpaXB7Xajp6cHg4ODIXYhQghycnJQWFgIlmUxODiI7u5uQVd6zrM3PT094NWbyFGZBYsHIcQA4PcA/ieldCJYBSmlNHj5hEiglL4I4EV/3tKyuIVBp9Nh7dq1PE/AjIwM1NfX81yLOS/CoqKiwBsjIyMDaWlpuH79uuSMjLcbhBCsWrUK+fn5gX2ZmZkwGAxobGyM6v4olUrceeedPEevzMxMNDY2oqOjg5e2uLgYq1evDvjPZGZmIjs7G+fPn+cZyg0GA7Zs2RJwYjSbzcjPz8eFCxcwNDQ07zJGw4KGagkhSviE4zeU0nf8uwe57oj/L3cmvQCCfYEL/PuWBIWFhSEuxEqlEsXFxbxmpdFoRGFhIW8fN49ESrEvb1dSU1ORmxvam+ZalNGQm5sb4iGqUChQWlrKc/7SaDSorKwMcbzLyMhATk4Ob195eXmI97NKpcLy5csT1o2JWjz8oycvA2iklD4V9NNBAF/2f/4ygPeC9v8P4qMGgDWoe7PoEatYKSkpIRVELACylNy5b1fS0tJE74/QVIVI4CYMzkan0/FeOCqVStArlxAS4rYuNtdFq9UmTDwW0m3ZBuBLAOoJIVf9+34A4EkAvyOEfA1AJ4C/8P/2J/iGaVvgG6r96gKOLTnEPANnxxHlInzNvsGUUkk5Vd2uTE1Nid6faH1CxOqGy+Xi5clFVhMSkNneumKez+EirsWaqMWDUnoKtxZUnc1ugfQUwF9Hezyp09fXF7JAk9frRW9vL8/QZrFYMDY2FvImsVqtkot9eTsyNjaG8fHxkImC3P5o6O/vR3FxccjM5b6+Pt6iXNPT0+jt7UVJSQlPvGZmZjAwMMD7346ODt6Ma8AncJ2dnQkTD9nDNIZkZWWhtLQ0sORjd3d3iOs24LO8V1ZWIj09HYQQDA8Po62tLeo5KzKxRafTBabGA8Do6CiamppEWxCRYDKZsGLFCqSmpsLr9aKnpwctLS0h3sIsy6KyshJ5eXlgWRYWiwU3btwQjMiem5uLyspKGAwGzMzMoLW1FV1dXYLPhqQ8TBPBYhMPwHeTlErlnMF9gVuzTqUa0Soc3OxaLsKaEFxU+vmsSSMVuJgsQOzuD3e9vF7vnFHmuCDRXJR9MbjYJC6Xa87g2GLIkcQkgtfrjbhvvFhEgwtbaDQaYTKZYDQaodfroVaroVQqRae7c9fC7XbDZrNhfHw8sPyC2ILdUmE+QZXnk2ekdSPSEJZer3dBLaKFILc8ZARhGAZ6vR7Z2dnIy8sLrAS/UEs+tyzE+Pg4RkZG0N/fj/Hxcfl+xhm52xKEWGVTKBQwm83QaDSw2WywWCyJMyD5Z5empqbCbrdjbGxMtOui1WqRmZkJSilGR0clY+9QqVTIzs7GsmXLYDKZ4h6Ehlv4qbe3d0Er1icLlmVhNpuh1WoxMTGR8PpmNpthMBhgt9sxNDQk+lzI4hGE0EXSarXYuHEjsrOzQQiBx+NBe3s7amtr4+76rVAosGbNGpSVlYFl2YBb85kzZ0KalTk5OaipqQmM1U9PT+PSpUvo6uqKaxnDoVarUVhYiPLycuj1+qTMl7DZbGhpaVk0IqLVarFt2zbk5OSAYRi4XC60trbi0qVLca9vSqUSmzdvRmlpKViWhcfjQX9/P06dOsUbweGQ2qxaybFq1arAjeRCz5WVlaG0tDTuxy4tLUVFRUWg/88wDHJycnDHHXfw0mm1WtTU1MBgMATCzun1eqxfv14wFmi8USgUKCkpwa5du7BmzZpAuZKBwWDAmjVrsGvXLskFUBZi/fr1yMvLCzyYSqUSlZWVKC8vj/uxueNw9Y2bj7NmzZq4H5tjyYgHF+hldsVnGAZ5eXlxP35BQYHgQ5eXlwe1Wh34npmZKegdqNPpQlyQ443JZMKWLVuwfv36pIpGMISQgIhs27ZNkoF/AV9LTeh+cRHq430t8/LyBI+Rm5ubMNFdMqMt4YYD430jwwWuFZo1KUaijIYMw6C0tBRVVVU8YYsUj8cTWBjc7XaLRlZTq9XQ6/XQ6XTQaDRhAzDPhhCCrKwspKWloampCS0tLZKadRzunidChMXMDYk0QywZ8XC73RgbG0NKSgrv5lFKQ7zzYg2lFP39/YJvotmh7rhQfrO9De12+4JWbI8UtVqN6upqFBYWRvwgezwezMzMYGhoCCMjIxgfH8f09HTE4RA53xe9Xo/09HTk5OQgLS0NKpVqzgdNqVRi9erVSEtLw9WrV5M2LDkbh8OBwcFBlJSU8PZTStHV1RX3h7i3txf5+fkh1294eDhhIrtkxAMArl27Bp1Oh4yMDDAMA6/Xi66uLrS2tsb92K2trTCZTCgqKoJCoQiMoly/fp2Xzmaz4eLFi9i0aVPAScxut+PSpUtxX2GNMyhHuhCV0+lEX18furq6YLFYol4+k/P3cDgcGBsbQ2trKzQaDXJzcwOLWIUTMm7lPIPBgIsXL0oikjilFJcvX4Zer0dGRkbAQN/Z2YmWlpa4H//mzZtIT09HWVkZGIYBpRS9vb24dOlS3I/NsaRGWwDf0FlWVhZSU1NhsVgwMjKSMCVmGAZpaWnIzMzExMQEhoaGRN/OqampyMzMBCEEAwMDcRcOo9GIzZs3i87wDIaLKt7R0RH3yXoKhQLZ2dmoqKiYU0QAn/iePXtWEgIC+OpbdnY2jEYjhoeHMTo6mrDuJ3ftuGBAQtH2OeSh2iBkp6LI0Wq12L59+5zC4fF40NXVhcbGxoT7nSgUCuTk5GDVqlVzllNqArIYkMUjCFk8IkOlUqGmpmbOrsrExATq6uoEQ+MlEpVKhZUrV2LZsmVhWyFWqxUnT56UjA1E6sh+HhHCMExgIefbGYZhsHr16rDCwS3QdPLkSQwMDCQ9DKLT6URdXR0uXrwo6OzEYTQasWHDhqiX3pQ6LMtK/tykXbp5wsUHraiogFarxeTkJOrr69HT05PsoiWF0tJSFBcXi/5OKcWNGzfQ1NS04IWkYgmlFN3d3ZiamsLmzZtFo2ZlZ2ejsrISDQ0NSRe9WKFSqXDHHXegtLQUDMNgZGQEly9fFpySn2yWVLeloqIC27Zt47U4XC4XPvzww7gP10oNk8mE7du3i/pxcMLR0NAg6S5genp6WAHxeDw4e/Ys+vsXf0RLQgi2bduGlStX8oZgLRYL/vjHPy7IDiV3W8LAMAxWrFgRcpGUSiVWrFiRpFIlB4VCgdWrV4d1AGtubpa8cAC+CF7nzp0THfVRKBSorq6OytlNahgMBpSVlYX4bnAuAFJjyYiHSqUKGxT2dqKwsBDZ2dmiv/f19aGxsVHywsExNjaG2trasMPeiZhPEm9UKpWgnYMQIkk3/SUjHk6nU9RX4nYKLKxWq7FixQpRz83x8XFcuXIlaoevZNHX14fm5mZR28ayZcuijm4uFRwOh+B9oZQmxPt4viwZ8fB6vbh69WrIVO6pqSlcu3YtSaVKPELrx3C4XC5cuXIl7CiGlLlx44boQ6RWq7Fs2bIElyi22Gw2XL9+PaRF2NPTg/b29iSVSpwlNdrS3d2No0ePoqqqCgaDAUNDQ2hsbJSkpToesCwbEnk7mI6ODt7qdYsNt9uNa9euYfv27YLN+8LCQty8eXNR+35cuXIFVqsVZWVl0Ol06O/vR21trSTjmywp8QB8zdu+vj4oFApJzcJMBGazWXTxqZmZGdy8eTPBJYo9Y2NjGBgYQEFBQchvWq0WOTk5IUs4Lia8Xi9aWlrQ2toKQoik7VJLptsym9tNOAAgPz9f1Cuzo6Nj0XZXgqGU4ubNm6LG09nLey5WFkPE+SUrHrcbLMsiMzNT8DeXy5XUEIexhpvwKITRaLztRteSxZLrtsSD9PT0QPyLsbExdHd3S65lk5qaKhrGcGRkJO6zdhMJFzNDKHKcSqVCZmYmOjs7k1S6xKFWq1FaWgq9Xg+Hw4H29vaEjizK4jEHxcXF2LlzZ+BtxjWbT5w4ISkBycjIEO2y9Pb2Lhn3bY7h4WE4nU5B57CMjIwlLx56vR579+4NxOwFgOrqanzwwQcYGxtLSBnkbksYuBmpwc1gQgiWL1+OwsLCJJYslNlrq3K43e5FPcIiBhcGUYjU1NQlPymyurqaF3wZ8LWQN27cmDCbz9K+wgvEaDTCaDSG7GcYRtDanywUCoVoDAy73b4kDKWzoZSKvmFTUlKWhLt6OMTsWxkZGQmbjSuLRxjCrf8pJV8ClUolaiTkghQvRcT8dxQKRVKWsUgkYiMxHo8ncYG0E3KURcrExITgdH673Y62trYklEiYcFHJxZr2S4GJiQlBcVcoFIH4sEuV1tbWEJHgfEQSFnYzIUdZpHi9XnzyySfo6OgItEImJydx6tSphBmlIkGr1Yr28ScmJhJcmsThdrtF37KRxGpdzNy8eRMXLlzA9PQ0PB4PHA4Hrl+/jtra2oSVQR5tmQObzYYPP/wQBoMBSqUS09PTkrMhaDQaUSPZUu2yAL4WoMPhEFxPV+pRuBaK1+vFxYsX0djYCK1WC4fDAZvNltBRtQW3PAghCkLIFULI+/7vpYSQc4SQFkLIm4QQlX+/2v+9xf97yUKPnSi8Xi8mJiYwOjoqOeEAxEMOcOutLGXEHhYhQ/dSZGpqCiMjI5icnEz4cHwsui1/A6Ax6PtPAfwHpbQcgAXA1/z7vwbA4t//H/50MnHG6XQmuwhxg1sPRoil4KIudRYkHoSQAgAPAHjJ/50A+BSAt/1JXgXwqP/zI/7v8P++myySO8wwDFJSUpCeni5JQ9xSb6KLQSmV1KjXXKhUKmRlZSElJSVmfigajQbZ2dlJGV1aaK17GsDfA+CmcpoBjFNKuY52D4B8/+d8AN0AQCl1E0Ks/vS8SQqEkP0A9i+wXDHDYDBg+/btKCoqAsMwmJycxJkzZxKyCl2kLHXjYDSoVKrAqoFSoLKyMrDolsfjQUdHB44fPx51XFKGYbB27VqsW7cOer0edrsd169fx9mzZxNm54pa/gghDwIYopTGdH07SumLlNIN0QRkjTUMw2Dbtm1Yvnw51Go1lEol0tPTsXv3bqSnpye7eDJh0Gg0kvEyzczMxK5du5Ceng6WZaFWq1FZWYm777476jIuX74cO3bsgNFoBMuyMBgM2LhxI9auXRvbwodhIVd3G4CHCSEdAN6Ar7vyDAATIYRr0RQA6PV/7gVQCAD+340AJO03nZqaGrKQMXAr1J+MTCRUVFRAo9GE7C8pKYnasLty5coQ3x6GYVBVVRXxAuYLJWrxoJT+I6W0gFJaAuBzAI5SSv8SwDEAn/Yn+zKA9/yfD/q/w//7USrx2VpqtVo0IG2ybB+EEN4mMzfJvl5idYVlWcFh5kgQEwiFQpEw8YiHpe0fALxBCHkCwBUAL/v3vwzg/xFCWgCMwSc4kmZ8fBwTExMhk868Xm9CF5LS6/WBBY2DI4VRSjExMbHoA//GA5ZlUV5eDoPBELhmHo8H4+PjgXggiRrG7uvrQ3V1dUgXZXJyElarNao8x8bGBFvFY2NjCQtuHRPxoJR+DOBj/+c2AJsE0tgBfCYWx0sUDocDJ0+exJ49ewK+FF6vFzdv3kxIqDudToeKigoUFhaKTvSSYkh+KaBWq7F69eqQ/dzSm3a7HT09PWhubo57DIzW1la0traivLw80PqZmZnBiRMnoo5NeunSJRQUFCAjIyMgSlarFWfPnk2Yv8eSWjEuXpjNZixfvhwsy2JgYADt7e1xnz+QlZWFO++8UzQmaSR4PB4cOXJkSc9vqampWdAM56mpKVy+fBmDg4MxLFUoSqUSZWVlyMjIgNvtRktLy4KXU9Dr9VixYgUMBgMcDgeampowPj4umDYeK8bJ4iFBsrKysGnTJkEj23xY6uLBMAzuvvtumM3mBeXjcDhw/vz5uAtIMpGXm7wNUKvVWLt27YKFg0Mqw5XxIFaGa7VajY0bN8r+MvNk6dasGEMISciDWFlZGbNKrFAoZGNqhGg0GlRVVcV9RIZhmIiOkaj6thBuT7/mecAwDJYtW4bq6mpoNBq0t7ejvr4+LkY2tVqN/Px80d8ppbDZbJicnITX64XRaIROpws7NLeUh3PnGn71eDyBSGo2mw0pKSkBpyohcnJykJKSEpcwBnq9HtXV1SgvL8fMzAxqa2vR1tYW0v1mGAYVFRVYvXo19Ho9Wltbcfny5ag9UeOJLB5zsG7dOp4nYEFBAUpLS/Huu+/GfF5FWlqa6BwFl8uF69evo7OzMzAUx7IsdDodMjIyUFRUBJPJdFvNc1Gr1SHdO0oppqamAot/Wa1WuN1uUEpBCIHJZML69ethMplC8mNZFjk5OTEXD51Oh8ceewx5eXkBsSstLcWRI0dw9epVXtqNGzdi586dgfqWl5eH/Px8HDhwQHKrxkm7XZRktFot1q1bF9J8LCgoiIuHaXp6uuibtKWlBS0tLbwxfLfbjYmJCbS1teHEiRP4+OOPcfPmTUxNTYFSGtiWKl6vFx6PB5RSOBwO9PT04Ny5czh69Cjq6uowMjICl8sVuAaUUlgsFly+fFl0/gc3lBtLKioqeMIB+IRqy5YtvJdFamoqampqQurbsmXLUFlZGfNyLZTb5zUVBSaTSXSoNB6VTMzW4fF40N/fH/Z/vV4vxsfHMT4+jqampsA8iqGhoZiXUyrMzMzg/PnzYFkWY2NjETt9jY+Pw2azCbY+9Ho9WJaN6eQyofVlAF+gZpPJFOiSaDQaUUN5fn4+6urqYlamWCCLRxhmZmbgcrkEHbSi9QwMh9jIAfdmjRSn04mBgYFYFUvSRDO86vV6RbucLMvG3FApZh/jon9xuFwuuN1uwXogxZeA3G0Jg9VqRWNjY0jTf3x8HDdu3Ij58cT62gqFQnRdFpn5o1arRVuU09PTMZ/SXl9fHxLzllKKa9eu8XxwrFar4GLk4+PjaG5ujmmZYoHc8ggDpRQff/wxHA4HKioqoFQqMTIyguPHj4t68i0EsSUhCSEoLy/H0NDQko4MlihKSkqg1+sFf5ueno65A6LVasWBAwewc+dOZGVlwel04ubNmzh9+jTvxeT1enH48GFYrVZUV1dDoVBgaGgIJ06ckGQga9nDNEK44DJOpzNux05LS8POnTtFh177+vpw8eJFWUAWQFFREdatWyc6KnX58uW4LavBMAzUajU8Hs+c91CtVoMQErP6JnuYJhGn0wm73R5X0bJarWGXhszLy8OmTZtkx68oYFkWVVVVYYVjZmZmTsP0QvB6vZiZmYlI/B0OR9zr20KRxUNCcDN2w026y8nJ4YVFlJkbk8mErVu3YuXKlWH9YNrb25d8tPlYsuRsHizLIj8/H2lpaRgeHsbAwIDow5ieno7CwkI4HA50d3eLWsV1Oh1KS0uhVqvR29sb1wlUg4ODaG9vR3l5uWgavV6P9evXIy8vDw0NDZLsD0sBlUqFZcuWoaKiYs45MKOjo3GNS0sIQXZ2NvLz8zE5OYmuri7RER+9Xo+SkhKo1Wp0dnaKtkYVCgXy8vKQm5uL0dFRdHV1JSyWB7DExCMlJQUPPPAASktLA2P1V69exeHDh3kWdIZhcNddd6GmpgZarRaUUgwPD+Pdd98NGeLMy8vDI488gpycHBBCMDMzg5MnT+L06dNxaVJSStHQ0ACDwYCcnBzRdAqFIhDPoampKSFhAhYTmZmZWL16dUQzbm02Gy5fvhw3D06GYbB9+3bcfffdgchhAwMDOHDgAHp7e3lpc3Nz8dnPfhZZWVkghGBqagrHjh0LMa6qVCo8/PDDuPPOO6FUKuHxeHDjxg289dZbcY9PEjivhBwlARBCsGPHjkDcDcDXClm/fn1IUNiCggJs374dOp0uMAEpKysLDzzwAC8snEqlwr59+5Cbmxtw8tFqtfjUpz6FZcuWxe1cnE4nLly4EJGvhkajwZo1a7BlyxZ5Vih8cTNWr16Nbdu2RSwcZ8+ejYvfDkdpaSk+9alPQa1Wg2EYMAyDvLw83HfffbxulEqlwqOPPspzKtPr9di7dy+Ki4t5edbU1GDDhg2B+qpQKLBy5Urs2bMnbucxmyUjHmq1WvCBJoRg+fLlvH1CfV9CCHJycnj+FGazGXl5eSF5siwbkmescTgcOHfuHJqbm+dsUXBl37FjB8rLy29bW0hmZiZ27NiBysrKOef4UEoxNDSETz75JC7D7sFUVFQIlqegoIAncOnp6YL1TaVShbinl5WVhdxnQkig1Z0IllS3JdIZpGLppDYN2uVyoa6uDkNDQ6iurp6zZaHRaFBdXY309HRcuXIlof3fZMI9NNXV1REFFOb8LFpaWpK+lm+sZz0nsv5K50lZIA6HQzCuKKU0xDuvoaEhpNJQSjE4OMjzBBwdHcXw8HBInh6PJ2Eef5RS9Pf348SJE2hpaZmzFaJQKFBUVITq6uqElE8KZGdnY82aNXMKB6UUIyMjOHXqFJqamhImHM3NzYLH6u3t5YUiHBsbQ19fX0g6t9sd4tHc1tYmOOmxq6srYbavJSMelFKcPHkSnZ2dAUOm2+1GXV1dyISinp4enDp1Cg6HIzDzdGRkBO+//z5vDN7pdOIPf/gDRkdHAzfK6XTi+PHjcXMkEsNut6O2thZnzpzhlUeM/Pz8mEUjkzpFRUVzLjfgdDpx/fp1nDp1KsRVPN60tbXh2LFjcDgc8Hq98Hq9GBwcxKFDh3ii4nQ6ceDAAQwNDQXur8PhwPHjx9HV1cXL8/z587zWJWcw/fDDD+UAyEB0HqZKpRLFxcUwGo0YHBxEf3+/oBJzdoK8vDzY7XZ0dHSIWqlTUlJQXFwMjUaD3t5eDAwMJHWqu0qlQkVFBZYvXy760LhcLnz44Ye3hd/C1q1bBW0FHCMjI6irq0u4aATD1bf8/Hw4nU60traK1jeDwYCSkhLodDr09vair69PsL5xI265ubmYmJhAc3OzaFdVDoAchJQ97xIBIQSbNm1CYWGh4O9TU1M4cuTIbWH3uOOOO1BRUSH4m9VqXdASB0sF2T1dJgClNGyf3WKx3BbCAfhaFmIvwUjdwWXmz5IUD6VSCa1WO6flmWEYaLXapC0duRA0Go1oQCJKaYjz0VJmdHRU1Ftz9ip7yYQQAq1WK7qAVzAqlQo6nU5So3+zWVJDtQqFAhs3bsS2bdug1+sxODiIY8eOCcZIyM3NxX333YeioiI4HA5cuXIFR48eXTRv63DTyh0Oh+Ao0VLF4XBgYGAApaWlIb+pVCqUl5fj8uXLSSjZLfLy8rBv3z4UFhbC6XSitrYWhw8fDulOaTQa7Nq1C+vXr4darUZ3dzfef/99wVGYZLOkxGPjxo147LHHAmqdmpqK/Px8vPTSSzxrtdFoxFe+8hXem3vv3r3QaDQ4ePCg5ON+pqSkhJ370tPTE/PgzFKnq6tLdNSlsLAw7ByReJOeno6vfvWrvPp2zz33QKFQ4L333gvsI4TggQcewM6dOwP7TCYTcnNz8cwzz8TdmW2+SLdNNE9YlhUMHqvT6bBt2zbevjVr1iAzM5O3j2EYbN68ecGrj8UbhmFQVVUlOgzrcDjQ0tKS4FIlHzGfHMDXjV25cmXCVo+fzZo1a0K6mIQQbNiwAUajMbDPbDZj8+bNIf+fkZGBO+64I+7lnC9LRjzChZZLTU3lefLl5+cLevYplcqI+qPJZNmyZWHXZu3q6hKNSLaUmSucQXZ2dtynFIgx+0XFYTAYeNMh1Gq1qP0t3FB0slgy4mG322GxWAR/Gxsb43VF2tvbBbsmU1NTkp7ebjabsXLlSlGXZrvdHtdp5VJnZGRENJgPIQQrVqwIO1M5XojZK6xWK8/DdHp6WtQvR8h7OtksGfHweDw4evRoyMUfHR3FiRMnePvq6+vR3d0d8v8nT56U7KLQer0eGzduFG0ZUUpx8+bN27LVweH1enHt2rWwkdHFFnyKJ7W1tSEPv8fjwalTp3j3y2Kx4KOPPgppPbW2tqK2tjYRRZ0XS8pJjJsgtW3bNmRkZKCvrw/Hjx8XnNpuNBqxZcsWrFixAg6HA5cvX8aFCxck6Xym0+nmtMcMDAzg7NmzSZ/oJQUqKipQXV0t2kKzWCw4e/ZswuJeAL74tFwoB6vVivPnz6O+vj5EKBiGwaZNm7Bp0yaoVCo0NjbixIkTC36pyR6mQYR7yLnZsZFMEFIoFKCUSlI0gMiEw263SzbCdjLghuzD2YZGR0dx/vz5hAoI4Cub1+udc0SPWxA7VpPcZA/TCKGURnzRPR6PZIUjNTV1TuHweDy4cuWKLBxBeDwe1NbWhr0mZrMZmzZt4o12JAJuecy54JbSlDILEg9CiIkQ8jYhpIkQ0kgI2UIISSeEHCaENPv/pvnTEkLIzwkhLYSQOkLIuticwtIkKytrzmhYHo8HDQ0NknQgSjYzMzO4ePFi2DktZrMZd911F7KzsxNYsqXDgrothJBXAZyklL5ECFEB0AH4AYAxSumThJDHAaRRSv+BELIPwHcB7AOwGcAzlNLQQW1+/vPutpjNZlRXVyMtLQ1DQ0O4evVqwpumC4FlWZSXl6OysjJsfApKKTo7O3H58mXJtpykQG5uLjZu3Bh2CoLb7ca1a9fiGgeWZVmsXr0apaWlmJ6eRn19vaDoE0JQWFiINWvWgGVZtLW1oaGhQdDzmQuEnZ2dDYvFgkuXLomOOErK5kEIMQK4CmAZDcqEEHIDwE5KaT8hJBfAx5TSSkLIC/7Pr89OF+YY8xKPgoIC7N+/HxkZGSCEgFKKjo4OvPDCC3GNURkrTCYTVq9eLbowMgcnHFevXpUNpBEQiYBQSjEwMID6+vqYdwGVSiW+8IUvYPPmzQFHtcnJSfzqV7/C9evXeWlramrw+c9/PjD1wOPx4MyZM/j1r3/Nu9dmsxnf+ta3UFpaGqgrAwMDeOGFF9DZ2RlSBqnZPEoBDAP4FSHkCiHkJUKIHkB2kCAMAODahPkAgsdHe/z7eBBC9hNCLhJCLs6nMIQQ7Nu3D5mZmYGLSQhBSUkJ7r777vmdWYJRqVRYsWIFduzYEYjSLoYsHPOnv78fFy5cCDu7lhCC3Nxc7NixA2VlZTGNA7pmzRrU1NTwPFxTUlLw6U9/GlqtNrDPYDDg4Ycf5s1ZUigUqKmpwYoVK3h57t27F8uWLePVlZycHDz88MMJm0y3kKOwANYBeJ5SeieAKQCPByfwt0jm1bShlL5IKd0wXyXU6XQoKSkJ2c8JSKxjRcYClmVRVFSEHTt2YPXq1XPO7vV4PGhtbZWFIwo4AZkrrodGo8HatWuxfft2ZGdnx+RBXL58uWA+GRkZPO9Tk8kkuKA5y7JYtWpV4DsXWEiIvLy8hM0SX4i89gDooZSe839/Gz7xGCSE5AZ1W4b8v/cCCI5cU+DfFxNcLpeoc5DUrNYMw6CgoADLly+HyWSKSNhcLheuX7+O1tZWyU/ckyr9/f04efIkNm3aFDaYNCEEZrMZW7duxfDwMJqbmzE8PBy1bUmsXnq9Xl5rKNwQ7vT0dOBzuNFEp9Mp/RimlNIBAN2EEC4m/G4ADQAOAviyf9+XAXDTBg8C+B/+UZcaANZw9o75wk1znn2D3W43zp07J5kHjlv6cP369UhLS4tIOCYnJ3Hu3Dm0tLRI5jwWK+Pj4zh16hR6enrmvJYKhQI5OTnYunUrtm7dGrVnam1traCAXL9+nTeZb3h4WDB8hNVqDfEwFXIIpJTi7NmzCQsrsdDRlrUAXgKgAtAG4KvwCdLvABQB6ATwF5TSMeJ7Sp4DcB+AaQBfpZSGtWvM12CqVCrx6KOPoqamBiqVChMTEzh27BiOHTsmidZHSUkJqqurI5585/F40NfXh7q6utsiFmkiUSgUKC0tRVVVVcTNfIfDgevXr887+DUXMvKBBx5ARkYGXC4Xmpqa8Lvf/S4kTIDZbMbnPvc5VFVVQaFQYGxsDL/5zW9CDKsKhQL33Xcf9u7dC71ej5mZGZw9exZvvfWWoG1HUqMtiSCaoVqGYZCWloaMjAz09/dLxnmqsLAQGzZsiHha+NTUFBoaGtDd3S0PxcaRtLQ0VFdX8wzt4fB4PLh06VJINPNI0Ol0KCgowMTEBEZGRkTtVlyLR6PRYGBgQNTVgBACk8mE7OxsjI6OYnR0NOxzIYYsHhKGiw4lFvkrGLfbjY6ODty4cUNubSQIhUKBwsJCrFixAgaDYc70U1NTOHHixKLyH4qHeCypSGJSpaCgYE7h8Hg8GBwcxM2bN3nTtGXij8fjQUdHBwYGBlBSUoKysjLeEOps9Ho9iouL0dDQkMBSSg9ZPBKAWKBi4JZz0o0bNyJazEkmftjtdjQ1NaGnpwfl5eUoLi4W9fLNzc1FU1PTomoBxxpZPBJAOIejGzduoKGh4bauhFLDZrPh6tWrGBgYQE1NjeD902q1YFn2tl7WYUnOql1M2Gw2WTgkyuTkpKhRk1um9HZGbnkkgGAHn9msXLkSbrcbfX19sohIiNTUVNx5552igabDCcvtgiweCaC3txfFxcWCQ4FceMFYeDLKLBy9Xo/S0lKUlpaG9ccRWz/2dkIWjwQwNDSEkZER0Sja3Lh+ZmYmxsfH0dXVhcHBQUxNTd32FTQRKBQKmEwmFBcXIy8vT7S1wcHdo9sd2c8jQZhMJmzZsiUiXw/AN5fFYrFgaGgIg4ODcjM5hhBCoNPpAg5WGRkZ0Ov1ETnw2e12nD59GmNjYwkoaeyQncSCWGziAfjWi9mwYUPYID9CeDweTE1Noa+vD21tbWFtKDLiKBQK5ObmoqSkBOnp6VAqlfOabe1wOHD16tWQyPuLAVk8gliM4gH4pmHfeeedUcfOtNvtqK2tXZQVOJloNBps2LBhzkBLYlitVly+fDlpS1YuFFk8glis4gH4VgarrKxESUlJVLEX7HY7PvroI9l9fR6sW7cOy5Ytm/f/OZ1OtLa2oqWlZc5YIFJGdk9fJDAME1bcHA4H6urq0N7ejrKyMuTn54d1h56NWq2G2WxGT09PLIq75GFZNqyXrxB2ux09PT1obW2NaM2Uue55POFCbiYaWTxiSHZ2Nu69917k5ubCarXi2LFjuHHjhmj6yclJXL16FTdu3EBubi6Ki4thNBrnDIHHzaaUxSMy1Gr1nCMogG9SotVqRVdXF/r6+uZs2RFCUFlZiV27dsFkMqG/vx+HDh0SXGQsHuTl5WHPnj3IysrC+Pg4jh49mtDlRuVuS4zIycnB97//fd5wrM1mwwsvvIC6urqI8mAYBgaDAbm5ucjLy4PJZBIdARgYGMAnn3wiD+VGQH5+PmpqagRtHR6PB8PDw+jv78fIyAgmJycjrlt33HEHvvOd7/BajUNDQ/jpT3+KoaGhMP+5cAoKCvC///f/5tW3yclJ/PznPw+J/QFILwCyTBD33HNPiB8HF9A20mC6Xq8XExMTuHHjBo4fP44rV66IBjFKT09HZmZmwoLdLlY0Go1oDFsuNsfp06fR2toKq9UasXCwLIuHH344pLuZlZWF3bt3x6Ts4bj//vtD6ltKSgoefvjhiGPGLBS52xIDGIZBcXGx4G+5ubkwGAwYHx+fV55erxddXV0oKioS7K+rVCps3boVVqsVFouFF+bObrcHmtwzMzNwuVxwOBySa61FCyEESqUSLMtCr9eDYRgoFApeXFKFQgGj0Yi0tDRRe9Lw8DC6u7ujar3p9Xrk5eUJ/lZeXh5XGwgXY1WIrKwsqFSqhBjTZfGIAZRSUXGwWq2iAXDnwuv1orOzUzTKFcuyMJvNghWJeyC45TRnZmYwMTGB0dFRjIyMwGazLRqnM86pi4sQZzQaYTAYwLIsr1U3nyFYbgmLaLt9drsdVqsVKSkpIb8NDQ3FVagppaJ1ymazJSyGqSweMYBSig8++ACrV6+GTqcL7He5XDh8+HDU4gH45sWUl5cLhuQPB/cgcQ+XSqWC0WhEYWEh3G43pqen0dPTg56eHkxOTkrSdqJWq5Gbm4uCgoKonLrCMTo6iv7+6ONvOxwOfPTRR/jiF7/I6yZMTU3h2LFjsShiWI4ePYo77riDZwh2u904evRowl4KssE0RhBCcOedd2Lfvn1IS0vD9PQ0Dh8+jFOnTi24rOnp6bjrrrvish6Hy+VCT08PmpubJRPvValUYtmyZVi2bBl0Ol3M19yx2+04derUvLuSs2FZFrt27cKuXbug1WoxNDSEgwcPoqGhIe5izAVVfvDBB5Gamgq73Y4jR47g6NGjgnYy2UksCKmJBwfXlJ69JsdCycvLw5o1ayKeGzNfpOAMxTAMcnNzUVVVhdTU1Lgs1GWz2XD58uWYjoaoVCowDAO3253wrqBSqYRCoZizvsniEYRUxSOe6PV6rFq1Crm5ufOeHxMpExMTaGxsRG9vb0KvsdFoxMqVK5GbmxuX0QKHw4Hu7m40NzcvqsDFsUIWjyBuR/EAfM1Vg8GArKwsmM1m6PX6QNwJtVrNqyQMw0T19uaCMTc1NcFiscS1Ca5Wq1FWVoaysrKI17MJJriJPnu1NJvNhpmZmcDsZJvNFpMyL0Zk8QjidhWP2QQLhFqtDry1OZHhDKUmkwmpqalQqVQRC4rb7UZ/fz+am5tjLiJqtRrFxcVYtmxZRMsdALdGGcbHx2GxWDAxMQGHwxEwSDscDp54LGShr8zMTCxfvhwsy+LatWuiU/A1Gg3KysqQm5uLtrY2dHZ2JmyBMaVSibKyMpSWlqK3txfNzc2iQ7SyeAQhi8f8IIRArVYjIyMDJSUlyMzMjLh74Ha7MTAwgL6+PgwNDUU9esSyLIxGY2AEJVLRcLlc6O3tRXd3NywWS9yDDm/duhVf+tKXAusIj46O4rXXXsO5c+d46bKysvCd73wHFRUVUCgUcDqdOHPmDF566aUFjbBFgkajwde+9jXs2LEjYGO7evUqnn32WUHDtyweQcjiET0MwyAjIwMrVqyIeKU04Nabn/MVmZycxNTUlODiyoQQaDQaKJVKGI1GZGRkID09PeKgO8At1/Hr169jfHw8IcPJmZmZ+Jd/+ZeQofHR0VH86Ec/CkzJJ4TgG9/4Rog3qdfrxS9+8Yu4D9c+8MAD+OpXv8oTBUop3n//ffzqV78KSS/PqpWJCV6vF0NDQxgdHUV+fj5Wrlwp6Ow0G0IItFotCgoKUFBQAEopvF4v7HZ7yIPNtXQIIVEZQG02GxoaGtDT05PQF8Xq1asFfWrMZjOWL18eEI+UlBSsX78+JB3DMKipqcHHH38cN7Hj3AJmCwK3/7e//W1CRsxk8biN8Xg86OrqwvDwMCoqKlBcXDwvXxJOGGI5fOxwONDZ2YmbN2/GvekvRDh7xey3vJiosSwb92nyYq1FQkhchriFkGdVyWBmZga1tbU4efIkuru7k+K27na70d3djRMnTqCuri4pwgEAzc3NgvE7hoeHeeEVbDYbrl27FpLO6/XiwoULcXdPb2xsDBEnSikaGhoS5qcji4dMAIvFgvPnz+PEiRMJExGn0xkQjfPnz8Nqtcb9mOHo7+/Hyy+/zCvH8PAwfvnLX/JCEFJK8Zvf/AZ1dXUBoXA6nTh8+DCOHj0a93IeOnQIp06dCsxj8Xg8qKurw9tvv52wqQaywVRGEEIIUlJSUFRUFJgZHCvnLY/HA5vNhv7+fnR2dsJms0lubk1OTg7KyspAKQ2sIyyERqNBVVUVdDodRkZG0NzcnLChWpZlUV5eHggGFK6rJ4+2BCGLR+Lg1jXJzc2FyWSC0WgMuEXP1b+mlMLj8cDlcsFqtWJkZATDw8MYHx9P2EMmI4+2yCQJj8eD0dFRjI6OBmJpaDQaaLVapKSkBGbucn+57o7T6cTU1BRmZmbgcDjgdDol18KQiZ4FtTwIIX8L4OsAKIB6AF8FkAvgDQBmAJcAfIlS6iSEqAG8BmA9gFEAn6WUdsyRf1QtD7VaDa1Wi6mpqbCxDRiGQUpKSqAZLVW4BzWRsRpkIkelUkGn02FycjJmrSmumzifsIjhkFTLgxCSD+B7AKoopTOEkN8B+ByAfQD+g1L6BiHkFwC+BuB5/18LpbScEPI5AD8F8Nlojy8Ey7LYuXMnHnjgAZjNZvT39+N3v/sdLl26FJK2vLwcn/nMZ7By5Uo4nU588skneOONNyS1nAHDMNi7dy8eeughpKeno7u7G2+++SYuX74sv8ElAMuy2LNnD/bt24fMzEy0tbXh97///YLuj1arxRe/+EVs374darUa169fx2uvvYaOjo7YFj4GRN3y8IvHWQBrAEwAOADgWQC/AZBDKXUTQrYA+P8opfcSQj7wfz5DCGEBDADIpGEKMN+Wx969e7F//35edKnJyUn827/9G5qamgL7MjMz8ZOf/ATZ2dm8/A4dOoQXXnhBMvaUXbt24Xvf+x7P92JychJPPPGE4DChTGJ58MEH8Y1vfIM3w9lms+FHP/oRGhoa5p0fwzD49re/jYceeohnS+rp6cHf//3fY2RkJOqySioAMqW0F8D/AdAFoB+AFb5uyjillBvj6wGQ7/+cD6Db/79uf/qQ+HmEkP2EkIuEkIvzKY9SqcS9994bEmw4JSUFDz74IG/fXXfdFRIXlGEY3HXXXcjIyJjPYeOGSqXCo48+GuK0lZKSgn379iWpVDIcOp0OjzzySEhoBIPBgEceeSQqR62cnBzs3r075H8LCgpw1113Lai88SBq8SCEpAF4BEApgDwAegD3LbRAlNIXKaUb5quEXIxLIVJSUng3pKioSPDmcgZAKcAtwyBEenp6wiJkywijVqtFlwydz3yhYDQajaiHb1FR0bzzizcLcRK7B0A7pXSYUuoC8A6AbQBM/m4JABQA6PV/7gVQCAD+343wGU5jAuc3IERfXx+vD3rt2jXBronNZku6kxKH2+0W9S3o7e2VhzmTzNTUlOjiTm1tbVF1fScmJgS9WznPUamxEPHoAlBDCNERn8zuBtAA4BiAT/vTfBnAe/7PB/3f4f/9aDh7x3zxeDw4ePBgiMFzYGAAf/jDH3j7zp07x7OBAL5p32+//faC+pWxxO1245133gmJejU8PIx33303SaWS4XA6nXjzzTdD7k9fXx8OHjwYVZ4jIyN4++23Qzx7GxsbQ8IBSIGFDtX+GL4REzeAK/AN2+bDN1Sb7t/3RUqpgxCiAfD/ANwJYAzA5yilbXPkPy+DKSEEq1atwr59+wKjEwcOHEBvb29I2oyMDDz44INYsWIFbDYbPv74Y5w+fVoyxlLg1nKGf/Znfwaz2Yz29nYcPHgQ3d3dyS6aDHz3Z82aNYEFmNra2nDw4EF0dXVFnSfLsti6dSt2796NlJQU1NfX48CBA7BYLAsqq+xhGkS4h5ybWUgpnXPIjGGYiNIlE+58pCRsMreIx/2JdZ6S8vOQMvMRg8XwQEpd3G534nF/FsM9l2fVysjIRMWSa3lkZGTgnnvuQXZ2Nm7cuIFTp04tyPWcEILly5dj+/btMBgMqK2txdmzZxcUb4JhGNxxxx3YsmULWJbFmTNnwi5qHQlqtRo1NTXYsGEDxsbGcPz4cbS1hTUpLRlKSkqwa9cumEwmnD9/HufPnxd0409JScHu3btRWVmJrq4uHD16FIODgyHpFAoF1q9fj23btsHr9eLUqVO4cuWKYCu1sLAQ99xzD3JyctDU1IRjx44JLial0Wiwfft2bNiwAZOTkzh06BBaW1sFWxeVlZW45557YDKZ8Mknn+DMmTOCMTpSU1Oxe/duVFdXo7W1FR9++CGGh4cjvGoLZ0nZPFasWIEf/vCHyM3NDdg8Ll68iJ/85CdRD8Hefffd+P73vw+DwQBCCDweDw4fPoynn346KgEhhODP//zP8Y1vfCOw1IDD4cBvf/tbvPrqq1F1o1QqFX7wgx9g165dASe5sbEx/PSnP8WpU6fmnd9i4p577sHf/d3fBXx83G43PvzwQ/zsZz/jPXDZ2dl48sknsXLlyoCdq62tDY8//jg6OzsD6RiGwde+9jV85Stf4d2f5557Dm+88QbvYV+1ahWefPJJFBQUAPB1NS5fvozHH3+cN2qn0Wjwgx/8AA899FDA9mCxWPDjH/84JNbp3XffjSeeeAImk4l3Pv/8z//Mq285OTl46qmnsGbNmsD5tLa24vvf/z4vaFHweYmRcA9TqcEwDP7yL/8SeXl5AQcdQgg2bNiARx99NKo8U1NT8Y1vfIPnZKZQKLBnzx5s2bIlqjyLi4vxV3/1V7w1StRqNT7zmc9E7Qi0fft2nnAAPkeyv/7rv5aM01s8MJlM+OY3v8lzDmRZFnv37sXmzZt5aR977DFUVVUFHiJCCMrKyvCtb32L53BXVFSEL3zhCyH3Z//+/bz7w7Isvvvd7waEg8tz/fr1+Oxn+VO2tm/fzhMOAEhLS8O3v/1t3trGJpMJ3//+9wPCwR3n3nvvDalvn//857F27dqQ8/mbv/mbhDkQLhnxSE1NRWVlZch+bvg2Go+/vLw8ZGZmhuxXKBRYu3ZtNMVEWVmZoOeoXq/HypUro8pz5cqVIW75gG9pgPkukL2YMJvNgtMJWJZFWVkZ7/uGDRsE68CKFSt4QrFhwwZBwU1JSeHVL6PRiIqKCsFyrVu3jvcAb9iwQfDNX1paipKSksD37Oxs5Ofnh6RTKBQ8MSSEoKqqKuR8CCEoLCwUrAvxYMmIh9PpxPT0tOBv0cZ0tNvtgnYISmnUdhSHwyHYz6WURr3QtNjyiR6PZ0l7os7MzIiGSgy2eXi9XtFuq8vl4t2P8fFxwa6j1+vl1S+XyyXabZ2amuLlKeQ1CvjqQvC9c7vdovdr9qJTYsdOZMyUJSMe09PTguHuubiS0VzQ3t5eXLhwIeR/bTYbTp48GVU56+vr0d7eLnis69evR5Xn6dOnQ4TH6/XizJkzoi7US4Hh4WHBcAsWiwVnz54NfPd6vfjv//7vECMqN5M62Cv54sWLgk5eHR0dvJnMk5OTOH78uGB9e++993gCdOzYMcEXw9mzZ9HT0xP43tXVxSt38PkEx0WllOLw4cMhi1+53W7B/fFiyYgHALz11lv4/e9/D6vVCo/Hg7GxMbz00ktRGw1dLheee+45nDp1Cna7PbD84lNPPSVolIoEq9WKJ554Ak1NTXA6nXA4HLh27Rp+9rOfCVrpI+HmzZv42c9+ho6ODrhcLszMzODkyZN4+umnl3TLw+Vy4amnnsKJEycCrZDOzk48+eSTaGlp4aU9duwYXnnlFQwODsLtdmNiYgJvvvkmfvOb3/DSjY+P44knnkBdXR1cLhecTicaGxvxox/9iHd/KKX4r//6L7z11luw2WzweDwYGRnBz3/+c3z88ce8PBsaGvDEE08E5iTZbDYcOXIE//7v/867Py6XC//6r/+KkydPBupbW1sbfvKTn4Scz5/+9Cc8++yzGBoagtvthsViwa9//Wu8+uqrsbm4EbCkRlv8/4OsrCxkZGRgYGAAY2NjC27GKZVKFBUVQa1Wo7e3NyaT57RaLYqKiuDxeNDd3R2TcPkGgwFFRUWYnp5Gb2/vbRN1TKlUIj8/H3q9Hl1dXaLdBMBnSM7Ly4PFYkF/f79oPeLWoPV4POjs7BQNEqVQKFBQUACTyYSBgQEMDQ2J1jeTyYSioiJYrVb09PSICrtKpUJRURE0Gg06OjpEu8iEEGRkZCA/Px/Dw8Nhz0d2Tw9iMXiGyshIBXmoVkZGJqYspPGw5DxM4wHLssjPz4darUZfX59kgyVzK9A7nU50dXWJjkRwzXyNRoP+/n7RbhghJDAcOjMzg+7ubtEWn06nQ1FREdxuN3p6ehK64ptKpUJhYWHg/kRrOwqG61YSQsJ2W+ZDWloa8vLyAtdSrFupVCpRWloKpVKJnp4eycSYCYGbgCPFDQBlGEZwI4RQ+KK2x3XLysqizz77LL106RKtq6ujf/rTn+iuXbsScuxIN0IIvf/+++mHH35Ir1+/Tmtra+mzzz5Li4qKQtLm5+fTV155hdbX19Ompib6wQcf0N27d4ekY1mW7t+/n549e5Y2NzfTuro6+k//9E9Uo9GEpK2qqqLvvfcebWlpoTdv3qQHDhygq1atSsi5l5SU0P/7f/8vbW5upu3t7fTkyZP0oYceWlD9WLt2LT106BBtb2+nnZ2d9MCBA7SiomJB5dyzZw89c+YM7e3tpW1tbfS1116jOTk5Ieny8vLoK6+8Qru7u2lfXx89f/48feSRRxZ0Pv7uv+DmT3Mxqucz2QIRrXgEnXjcNqVSSZ9//nl648YN3nb27FlaVVWVkIcjkq2qqopevnyZtrS08Lbnn3+eKpXKQDqWZenzzz9P29raeNv58+dpeXk5L88///M/p83NzbSzszOwtbW10b/927/lpTObzfTIkSO0u7ubtx09epRmZGTE9bxVKhV9/fXXaV9fH2+rr6+P+v5kZmbS48eP04GBAd52+PBhajQao8pz9erVtKmpiQ4PD/O2l156iapUKl59e+WVV+jo6CgdGxsLbM3NzbSysjLq6xTBMxSVeMg2jzAUFxejpqYmZH9aWhr27t2bhBIJc/fddyM1NTVkf01NDXJycgLfS0pKBAPpcoGROBQKhWDwZYVCgYceegh6vT6wb9OmTVi+fHlInuXl5YLXLpYUFBRgw4ZQO5/ZbMY999wTVZ6bN28W9BytqqrCunXrosrz05/+NMzmkFjf+NSnPsVzby8tLcWePXtCPEfT09Nx330LDg8ccyQvHuEMOtG4nM8HtVot6uorJbfv4LkQwbAsy4vubTAYRAPsajSawGdCiGjwZYPBwMvTZDIJWvIJITyRiQfckpdCRDu/Qyx4MbfkZjRotVrB/Wq1mif6KpVKsL4RQpCXlxfVscM9IwsdaZW8eCSTjo4OwcV2PB4PLly4kPgCidDY2CjoM9DX18cLotze3s7zaOTweDy4fPly4Lvb7caJEycEK1d9fT3PYFxXVydoQB4fH4/7Nerv7xf0BnW5XFF76545c0bwfGw2W9RBiM+fPy9oaG5ra0Nra2vg+8DAgGAQb5fLFbWjYzxfsJIXj2S2PKampvCLX/yCZ+12u904dOgQjhw5Etdjz4dDhw7h9ddf5wmIxWLBk08+ySu71WrFU089xYuH6Xa78e6774a427/++uuor68PVHpKKTo7O/Hv//7vvFGcxsZGvPDCC7zRFYfDgVdeeSXuq5xNTEzgiSee4Amkx+PBb3/72xAvz0i5efMmXn31VZ6L98zMDJ577jk0NzdHleehQ4fw3nvv8a7byMgI/u3f/o3n0DYyMoIf//jHvHvmcrnwzjvv4PDhw1EdOxwLbXlI3knM/1dUKIKMq/EqAyoqKrBv3z5kZGTg448/DrgPSwm1Wo29e/firrvuQn9/P44ePYq6urqQdIQQrFy5Eg899BCMRiMOHz6M06dPC3q4pqen495778WmTZvQ0NCA999/X/DNyM1a3bdvHwgh+OMf/4iLFy+KDhXHmrVr12LPnj0wm804c+YMPvjggwXdH6VSiS1btmDfvn1wuVz4wx/+gEuXLi3I1V+r1WLnzp3Yu3cvRkZG8Pvf/z4kgj/guz8bN27E3r17kZ2djSNHjkR9PvN4bpamhyn3eQ4PuYSUR0ZmMTGPZ+b29TCNd/dFRmaxkYhnYtGIx1y2j3hfrPkcIxHlSSSxPp94XJ/53p9kHTsRzFWeWLXUF417OqU07AXhYpbGGoVCgfvuuw9f+MIXoNFocOHCBfzyl78UXAqypKQE3/72t1FRUYGxsTG8+OKLgvEZFgvl5eX47ne/i9LSUgwNDeEXv/gFLl26FPV1ZhgGO3bswFe+8hWYzWZ0dHTgueeeizq8AeAb3nzsscfwZ3/2Z9DpdLhw4QJefvllwYW+Vq9eje9973soLCzE0NAQfvnLXy54oa+tW7fiO9/5DsxmM27evImnn36aN4KSDBImZMn2Ip3Lw3T2Fs5bLtYu64QQun//fjowMEDHx8fp+Pg4tVgs9J133qEmk4mXtqysjF65coVOTk4Gts7OTnrvvffG1csyXtuKFStobW0tnZqaCmzd3d2CruyRbg8++CAdGRmhdrs9sNXX19OysrKo78/jjz9Op6amqNPpDGwnT56kZrM55HxaW1upx+MJbGNjY/T++++P+nzuv/9+OjIyQoOpr68P8dZN5Bbu+Qjjlb003dOFKkyiBCQ7O5s2NjYGhCNYQL70pS/xyvT000/zhIPbjh49KjgfRMobIYT+53/+J084uO1Pf/oTz+U90k2tVtMjR47whIPbnn766ajKmZubS7u6unjC4XQ6qcPhoF//+td5aZ955hmecHDbsWPHoj6f06dPUyGeeeaZpN23KJ+N28M9nc7RZI5l/7OwsFAwADIXJZuDYRjR4MVlZWVReyYmC5ZlRQM8V1ZWRhWRXafTYdmyZYK/rV+/nue1Gilms1nw2hJCkJ2dHfjOrWkjBBd0Z76kpaVFHAA5EURS7+d6dubLohMPIHECMjAwIDodOnixaa/XKxortK+vL2xkKynidrtDwt5xWCyWqKKeORwOQTsR4HPMisYnxGq1iga9Do4Z6nQ6eWuzBDM8PBxVzM+JiQlBb13Adz6JdB9IhnAAi1g8EiEgfX19IQv9AD7hePPNN3nl+eUvfxkS5NblcuHFF18UjW4uVSileOGFF0LOx+12R30+09PT+PWvfx0Sw2JoaAgvv/xyVJW7t7cXr7/+esiDeuPGDbz77ruB79z5zBYvp9OJV199NSoxnJ6exssvvxwiepOTk3jllVfi6rgYTKTCEZfyJNuuMV+bR/A2l3EoFjaQ1NRU+sMf/pBeunSJ3rhxg7711lt08+bNgv3NBx98kH7wwQe0ubmZnj59mn7961+narU6Kf3fhW4Mw9D777+fHj16lLa0tNAzZ87Qb37zm7wp5PPdVCoV/eY3v0nPnTtH29vb6fHjxxccG8VgMNAf/vCHtK6ujra3t9M33niDrl69WjDt/fffT8+cOUO7u7vp+fPn6de//vWo7B3cptFo6De/+U1aV1dHh4eH6cmTJ+l9992XkHARXJ2L5BmIIK+obB6LxsNUjHBedMEsRH25WaZarRZjY2Nhm9hKpRJpaWmwWq0xCWqcbJRKJUwmE2w2W0yiaQG+GbypqakYHx+P2TIBer0eWq0WFoslrBu5SqUK3J9YTTHQ6XRIS0uLugs0X+bTqo6w+7S03dPDkQgBkZGRAnEQDuB2dk+P9CIRQsAwjKS8AWVkImG+dTcRBttF42E6F16vN+IWCKfeXCtEbo3ISJFojf6JGumZ82kjhLxCCBkihFwL2pdOCDlMCGn2/03z7yeEkJ8TQloIIXWEkHVB//Nlf/pmQsiX43EyXq93XkLA3RyGYeQWiYwkCK6T862PlNLEDhFHMOS5A4ANwGuU0tX+fT8DMEYpfZIQ8jiANErpPxBC9gH4LoB9ADYDeIZSupkQkg7gIoAN8Fl3LwFYTym1zHHsqJoEUpuoJCMTbxZoz4uPzYNSegLA2KzdjwDgFsV8FcCjQftf83vpngVgIoTkArgXwGFK6ZhfMA4DiFtEV06B5e6IzFInmXU9WptHNqWUCyk1AIDzBc4H0B2Urse/T2x/CISQ/QD2R1kuHgEf/AhtITIyi4lkB8FasMGUUkqj7V6I5PcigBeB6Lsts/F6vXJXRmbJIBWXg2hfyYP+7gj8f4f8+3sBFAalK/DvE9ufMLjmndydkVmMSLH+RiseBwFwIyZfBvBe0P7/4R91qQFg9XdvPgCwlxCS5h+Z2evflxSC+4lSuREyMrPh6qeUBCOYObsthJDXAewEkEEI6QHwzwCeBPA7QsjXAHQC+At/8j/BN9LSAmAawFcBgFI6Rgj5VwDcQh7/QimdbYRNOEJ+HlzXRu7iyCSSxehzJHX39EkA0ceoSywZAEaSXYgIWCzlBBZPWRdLOQHhshZTSkMD18yB1D1Mb0Qz/pwMCCEXF0NZF0s5gcVT1sVSTiC2ZZXHMGVkZKJCFg8ZGZmokLp4vJjsAsyDxVLWxVJOYPGUdbGUE4hhWSVtMJWRkZEuUm95yMjISBRZPGRkZKJCsuJBCLmPEHLDHxvk8SSXpZAQcowQ0kAIuU4I+Rv//nnHNUlQeRWEkCuEkPf930sJIef85XmTEKLy71f7v7f4fy9JcDlNhJC3CSFNhJBGQsgWCV/Tv/Xf+2uEkNcJIRopXFeSzHg7yY6QLhI1XQGgFcAyACoAtQCqklieXADr/J9TANwEUAXgZwAe9+9/HMBP/Z/3AfhvAARADYBzCS7v3wH4LYD3/d9/B+Bz/s+/APAt/+dvA/iF//PnALyZ4HK+CuDr/s8qACYpXlP4ZoC3A9AGXc+vSOG6AtgBYB2Aa0H75nUNAaQDaPP/TfN/Tpvz2ImsLPO4IFsAfBD0/R8B/GOyyxVUnvcA7IHP+zXXvy8XPqc2AHgBwOeD0gfSJaBsBQA+AvApAO/7K8oIAHb2tYVvftEW/2fWn44kqJxG/wNJZu2X4jXlQkqk+6/T+/DFqJHEdQVQMks85nUNAXwewAtB+3npxDapdlsijv+RaPxN0DsBnMP845okgqcB/D0ALtiDGcA4pZRbLyK4LIFy+n+3+tMnglIAwwB+5e9ivUQI0UOC15RS2gvg/wDoAtAP33W6BGleVyCO8XaCkap4SBJCiAHA7wH8T0opbzk16pPspI57E0IeBDBEKb2UzHJECAtfc/t5SumdAKbga2IHkMI1BQC/zeAR+AQvD4AecYyEF0vieQ2lKh5Jj/8xG0KIEj7h+A2l9B3/7vnGNYk32wA8TAjpAPAGfF2XZ+ALB8nNYwouS6Cc/t+NAIQXlI09PQB6KKXn/N/fhk9MpHZNAeAeAO2U0mFKqQvAO/BdayleVyBB8XakKh4XACz3W7NV8BmdDiarMMQ3P/9lAI2U0qeCfppvXJO4Qin9R0ppAaW0BL5rdpRS+pcAjgH4tEg5ufJ/2p8+IW96SukAgG5CSKV/124ADZDYNfXTBaCGEKLz1wWurJK7rgLHj1+8nUQYnKI0Au2Db1SjFcAPk1yWu+Br+tUBuOrf9sHXj/0IQDOAIwDS/ekJgP/0l70ewIYklHknbo22LANwHr44K28BUPv3a/zfW/y/L0twGdfCF1W/DsAB+Cz9krymAH4MoAnANQD/D4BaCtcVwOvw2WFc8LXmvhbNNQTwV/7ytgD4aiTHlt3TZWRkokKq3RYZGRmJI4uHjIxMVMjiISMjExWyeMjIyESFLB4yMjJRIYuHjIxMVMjiISMjExX/P3yQX1eEDPh5AAAAAElFTkSuQmCC\n", - "text/plain": [ - "
" - ] - }, - "metadata": { - "needs_background": "light" - }, - "output_type": "display_data" - } - ], - "source": [ - "process_and_plot(\"imgs/codes/snapcode.png\")" - ] - }, - { - "cell_type": "code", - "execution_count": 12, - "id": "separate-addition", - "metadata": {}, - "outputs": [ - { - "ename": "FileNotFoundError", - "evalue": "No such file: '/Users/pboonebenchsci.com/repos/boonepeter.github.io-code/snapcodes/src/imgs/all_dots.png'", - "output_type": "error", - "traceback": [ - "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", - "\u001b[0;31mFileNotFoundError\u001b[0m Traceback (most recent call last)", - "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m\u001b[0m\n\u001b[0;32m----> 1\u001b[0;31m \u001b[0mprocess_and_plot\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m\"imgs/all_dots.png\"\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m", - "\u001b[0;32m\u001b[0m in \u001b[0;36mprocess_and_plot\u001b[0;34m(filepath)\u001b[0m\n\u001b[1;32m 1\u001b[0m \u001b[0;32mdef\u001b[0m \u001b[0mprocess_and_plot\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mfilepath\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m----> 2\u001b[0;31m \u001b[0mp\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mget_points\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mfilepath\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 3\u001b[0m \u001b[0ml\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mlabel\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mp\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mbackground\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;36m1\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 4\u001b[0m \u001b[0mrp\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mregionprops\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0ml\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 5\u001b[0m \u001b[0mfig\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0max\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mplt\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0msubplots\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", - "\u001b[0;32m\u001b[0m in \u001b[0;36mget_points\u001b[0;34m(filepath)\u001b[0m\n\u001b[1;32m 1\u001b[0m \u001b[0;32mdef\u001b[0m \u001b[0mget_points\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mfilepath\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m----> 2\u001b[0;31m \u001b[0mim\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mio\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mimread\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mfilepath\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 3\u001b[0m \u001b[0mim\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mrgb2gray\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mrgba2rgb\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mim\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 4\u001b[0m \u001b[0mt\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mthreshold_otsu\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mim\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 5\u001b[0m \u001b[0;32mreturn\u001b[0m \u001b[0mim\u001b[0m \u001b[0;34m>\u001b[0m \u001b[0mt\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", - "\u001b[0;32m/usr/local/lib/python3.9/site-packages/skimage/io/_io.py\u001b[0m in \u001b[0;36mimread\u001b[0;34m(fname, as_gray, plugin, **plugin_args)\u001b[0m\n\u001b[1;32m 46\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 47\u001b[0m \u001b[0;32mwith\u001b[0m \u001b[0mfile_or_url_context\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mfname\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;32mas\u001b[0m \u001b[0mfname\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m---> 48\u001b[0;31m \u001b[0mimg\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mcall_plugin\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m'imread'\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mfname\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mplugin\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mplugin\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m**\u001b[0m\u001b[0mplugin_args\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 49\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 50\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0;32mnot\u001b[0m \u001b[0mhasattr\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mimg\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m'ndim'\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", - "\u001b[0;32m/usr/local/lib/python3.9/site-packages/skimage/io/manage_plugins.py\u001b[0m in \u001b[0;36mcall_plugin\u001b[0;34m(kind, *args, **kwargs)\u001b[0m\n\u001b[1;32m 205\u001b[0m (plugin, kind))\n\u001b[1;32m 206\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 207\u001b[0;31m \u001b[0;32mreturn\u001b[0m \u001b[0mfunc\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m*\u001b[0m\u001b[0margs\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m**\u001b[0m\u001b[0mkwargs\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 208\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 209\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n", - "\u001b[0;32m/usr/local/lib/python3.9/site-packages/skimage/io/_plugins/imageio_plugin.py\u001b[0m in \u001b[0;36mimread\u001b[0;34m(*args, **kwargs)\u001b[0m\n\u001b[1;32m 8\u001b[0m \u001b[0;34m@\u001b[0m\u001b[0mwraps\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mimageio_imread\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 9\u001b[0m \u001b[0;32mdef\u001b[0m \u001b[0mimread\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m*\u001b[0m\u001b[0margs\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m**\u001b[0m\u001b[0mkwargs\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m---> 10\u001b[0;31m \u001b[0;32mreturn\u001b[0m \u001b[0mnp\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0masarray\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mimageio_imread\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m*\u001b[0m\u001b[0margs\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m**\u001b[0m\u001b[0mkwargs\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m", - "\u001b[0;32m/usr/local/lib/python3.9/site-packages/imageio/core/functions.py\u001b[0m in \u001b[0;36mimread\u001b[0;34m(uri, format, **kwargs)\u001b[0m\n\u001b[1;32m 263\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 264\u001b[0m \u001b[0;31m# Get reader and read first\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 265\u001b[0;31m \u001b[0mreader\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mread\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0muri\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mformat\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m\"i\"\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m**\u001b[0m\u001b[0mkwargs\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 266\u001b[0m \u001b[0;32mwith\u001b[0m \u001b[0mreader\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 267\u001b[0m \u001b[0;32mreturn\u001b[0m \u001b[0mreader\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mget_data\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;36m0\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", - "\u001b[0;32m/usr/local/lib/python3.9/site-packages/imageio/core/functions.py\u001b[0m in \u001b[0;36mget_reader\u001b[0;34m(uri, format, mode, **kwargs)\u001b[0m\n\u001b[1;32m 170\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 171\u001b[0m \u001b[0;31m# Create request object\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 172\u001b[0;31m \u001b[0mrequest\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mRequest\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0muri\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m\"r\"\u001b[0m \u001b[0;34m+\u001b[0m \u001b[0mmode\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m**\u001b[0m\u001b[0mkwargs\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 173\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 174\u001b[0m \u001b[0;31m# Get format\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", - "\u001b[0;32m/usr/local/lib/python3.9/site-packages/imageio/core/request.py\u001b[0m in \u001b[0;36m__init__\u001b[0;34m(self, uri, mode, **kwargs)\u001b[0m\n\u001b[1;32m 122\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 123\u001b[0m \u001b[0;31m# Parse what was given\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 124\u001b[0;31m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_parse_uri\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0muri\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 125\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 126\u001b[0m \u001b[0;31m# Set extension\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", - "\u001b[0;32m/usr/local/lib/python3.9/site-packages/imageio/core/request.py\u001b[0m in \u001b[0;36m_parse_uri\u001b[0;34m(self, uri)\u001b[0m\n\u001b[1;32m 258\u001b[0m \u001b[0;31m# Reading: check that the file exists (but is allowed a dir)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 259\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0;32mnot\u001b[0m \u001b[0mos\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mpath\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mexists\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mfn\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 260\u001b[0;31m \u001b[0;32mraise\u001b[0m \u001b[0mFileNotFoundError\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m\"No such file: '%s'\"\u001b[0m \u001b[0;34m%\u001b[0m \u001b[0mfn\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 261\u001b[0m \u001b[0;32melse\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 262\u001b[0m \u001b[0;31m# Writing: check that the directory to write to does exist\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", - "\u001b[0;31mFileNotFoundError\u001b[0m: No such file: '/Users/pboonebenchsci.com/repos/boonepeter.github.io-code/snapcodes/src/imgs/all_dots.png'" - ] - } - ], - "source": [ - "process_and_plot(\"imgs/all_dots.png\")" - ] - }, - { - "cell_type": "code", - "execution_count": 13, - "id": "entire-instrumentation", - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "212\n" - ] - } - ], - "source": [ - "points = [\n", - " [0 for i in range(17)],\n", - " [0 for i in range(19)],\n", - " [0 for i in range(19)],\n", - " [0 for i in range(12)],\n", - " [0 for i in range(10)],\n", - " [0 for i in range(8)], \n", - " [0 for i in range(6)],\n", - " [0 for i in range(6)],\n", - " [0 for i in range(6)],\n", - " [0 for i in range(6)],\n", - " [0 for i in range(6)],\n", - " [0 for i in range(6)],\n", - " [0 for i in range(6)],\n", - " [0 for i in range(8)], \n", - " [0 for i in range(10)],\n", - " [0 for i in range(12)],\n", - " [0 for i in range(19)],\n", - " [0 for i in range(19)],\n", - " [0 for i in range(17)], \n", - "]\n", - "total = 0\n", - "for i in points:\n", - " for j in i:\n", - " total += 1\n", - "print(total)" - ] - }, - { - "cell_type": "code", - "execution_count": 14, - "id": "direct-debate", - "metadata": {}, - "outputs": [ - { - "ename": "FileNotFoundError", - "evalue": "No such file: '/Users/pboonebenchsci.com/repos/boonepeter.github.io-code/snapcodes/src/imgs/all_dots.png'", - "output_type": "error", - "traceback": [ - "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", - "\u001b[0;31mFileNotFoundError\u001b[0m Traceback (most recent call last)", - "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m\u001b[0m\n\u001b[0;32m----> 1\u001b[0;31m \u001b[0mbbs\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mcenters\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mget_bb\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m\"imgs/all_dots.png\"\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m", - "\u001b[0;32m\u001b[0m in \u001b[0;36mget_bb\u001b[0;34m(filepath)\u001b[0m\n\u001b[1;32m 1\u001b[0m \u001b[0;32mdef\u001b[0m \u001b[0mget_bb\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mfilepath\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m----> 2\u001b[0;31m \u001b[0mp\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mget_points\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mfilepath\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 3\u001b[0m \u001b[0ml\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mlabel\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mp\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mbackground\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;36m1\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 4\u001b[0m \u001b[0mrp\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mregionprops\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0ml\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 5\u001b[0m \u001b[0mfig\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0max\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mplt\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0msubplots\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", - "\u001b[0;32m\u001b[0m in \u001b[0;36mget_points\u001b[0;34m(filepath)\u001b[0m\n\u001b[1;32m 1\u001b[0m \u001b[0;32mdef\u001b[0m \u001b[0mget_points\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mfilepath\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m----> 2\u001b[0;31m \u001b[0mim\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mio\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mimread\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mfilepath\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 3\u001b[0m \u001b[0mim\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mrgb2gray\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mrgba2rgb\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mim\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 4\u001b[0m \u001b[0mt\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mthreshold_otsu\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mim\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 5\u001b[0m \u001b[0;32mreturn\u001b[0m \u001b[0mim\u001b[0m \u001b[0;34m>\u001b[0m \u001b[0mt\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", - "\u001b[0;32m/usr/local/lib/python3.9/site-packages/skimage/io/_io.py\u001b[0m in \u001b[0;36mimread\u001b[0;34m(fname, as_gray, plugin, **plugin_args)\u001b[0m\n\u001b[1;32m 46\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 47\u001b[0m \u001b[0;32mwith\u001b[0m \u001b[0mfile_or_url_context\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mfname\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;32mas\u001b[0m \u001b[0mfname\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m---> 48\u001b[0;31m \u001b[0mimg\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mcall_plugin\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m'imread'\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mfname\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mplugin\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mplugin\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m**\u001b[0m\u001b[0mplugin_args\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 49\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 50\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0;32mnot\u001b[0m \u001b[0mhasattr\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mimg\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m'ndim'\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", - "\u001b[0;32m/usr/local/lib/python3.9/site-packages/skimage/io/manage_plugins.py\u001b[0m in \u001b[0;36mcall_plugin\u001b[0;34m(kind, *args, **kwargs)\u001b[0m\n\u001b[1;32m 205\u001b[0m (plugin, kind))\n\u001b[1;32m 206\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 207\u001b[0;31m \u001b[0;32mreturn\u001b[0m \u001b[0mfunc\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m*\u001b[0m\u001b[0margs\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m**\u001b[0m\u001b[0mkwargs\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 208\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 209\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n", - "\u001b[0;32m/usr/local/lib/python3.9/site-packages/skimage/io/_plugins/imageio_plugin.py\u001b[0m in \u001b[0;36mimread\u001b[0;34m(*args, **kwargs)\u001b[0m\n\u001b[1;32m 8\u001b[0m \u001b[0;34m@\u001b[0m\u001b[0mwraps\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mimageio_imread\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 9\u001b[0m \u001b[0;32mdef\u001b[0m \u001b[0mimread\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m*\u001b[0m\u001b[0margs\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m**\u001b[0m\u001b[0mkwargs\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m---> 10\u001b[0;31m \u001b[0;32mreturn\u001b[0m \u001b[0mnp\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0masarray\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mimageio_imread\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m*\u001b[0m\u001b[0margs\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m**\u001b[0m\u001b[0mkwargs\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m", - "\u001b[0;32m/usr/local/lib/python3.9/site-packages/imageio/core/functions.py\u001b[0m in \u001b[0;36mimread\u001b[0;34m(uri, format, **kwargs)\u001b[0m\n\u001b[1;32m 263\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 264\u001b[0m \u001b[0;31m# Get reader and read first\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 265\u001b[0;31m \u001b[0mreader\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mread\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0muri\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mformat\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m\"i\"\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m**\u001b[0m\u001b[0mkwargs\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 266\u001b[0m \u001b[0;32mwith\u001b[0m \u001b[0mreader\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 267\u001b[0m \u001b[0;32mreturn\u001b[0m \u001b[0mreader\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mget_data\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;36m0\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", - "\u001b[0;32m/usr/local/lib/python3.9/site-packages/imageio/core/functions.py\u001b[0m in \u001b[0;36mget_reader\u001b[0;34m(uri, format, mode, **kwargs)\u001b[0m\n\u001b[1;32m 170\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 171\u001b[0m \u001b[0;31m# Create request object\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 172\u001b[0;31m \u001b[0mrequest\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mRequest\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0muri\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m\"r\"\u001b[0m \u001b[0;34m+\u001b[0m \u001b[0mmode\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m**\u001b[0m\u001b[0mkwargs\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 173\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 174\u001b[0m \u001b[0;31m# Get format\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", - "\u001b[0;32m/usr/local/lib/python3.9/site-packages/imageio/core/request.py\u001b[0m in \u001b[0;36m__init__\u001b[0;34m(self, uri, mode, **kwargs)\u001b[0m\n\u001b[1;32m 122\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 123\u001b[0m \u001b[0;31m# Parse what was given\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 124\u001b[0;31m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_parse_uri\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0muri\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 125\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 126\u001b[0m \u001b[0;31m# Set extension\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", - "\u001b[0;32m/usr/local/lib/python3.9/site-packages/imageio/core/request.py\u001b[0m in \u001b[0;36m_parse_uri\u001b[0;34m(self, uri)\u001b[0m\n\u001b[1;32m 258\u001b[0m \u001b[0;31m# Reading: check that the file exists (but is allowed a dir)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 259\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0;32mnot\u001b[0m \u001b[0mos\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mpath\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mexists\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mfn\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 260\u001b[0;31m \u001b[0;32mraise\u001b[0m \u001b[0mFileNotFoundError\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m\"No such file: '%s'\"\u001b[0m \u001b[0;34m%\u001b[0m \u001b[0mfn\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 261\u001b[0m \u001b[0;32melse\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 262\u001b[0m \u001b[0;31m# Writing: check that the directory to write to does exist\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", - "\u001b[0;31mFileNotFoundError\u001b[0m: No such file: '/Users/pboonebenchsci.com/repos/boonepeter.github.io-code/snapcodes/src/imgs/all_dots.png'" - ] - } - ], - "source": [ - "bbs, centers = get_bb(\"imgs/all_dots.png\")" - ] - }, - { - "cell_type": "code", - "execution_count": 15, - "id": "engaging-theology", - "metadata": {}, - "outputs": [], - "source": [ - "total = []\n", - "for i in points:\n", - " total.extend(i)" - ] - }, - { - "cell_type": "code", - "execution_count": 16, - "id": "enabling-reporter", - "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "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\n", - "text/plain": [ - "
" - ] - }, - "metadata": { - "needs_background": "light" - }, - "output_type": "display_data" - } - ], - "source": [ - "small_bbs, small_centers = get_bb(\"imgs/codes/snapcode.png\")" - ] - }, - { - "cell_type": "code", - "execution_count": 17, - "id": "structured-sleeping", - "metadata": {}, - "outputs": [ - { - "ename": "NameError", - "evalue": "name 'bbs' is not defined", - "output_type": "error", - "traceback": [ - "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", - "\u001b[0;31mNameError\u001b[0m Traceback (most recent call last)", - "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m\u001b[0m\n\u001b[0;32m----> 1\u001b[0;31m \u001b[0mprint\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mbbs\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;36m10\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m", - "\u001b[0;31mNameError\u001b[0m: name 'bbs' is not defined" - ] - } - ], - "source": [ - "print(bbs[:10])" - ] - }, - { - "cell_type": "code", - "execution_count": 18, - "id": "welsh-fortune", - "metadata": {}, - "outputs": [], - "source": [ - "def get_numbers(centers, bbs):\n", - " points = []\n", - " for i, b in enumerate(bbs):\n", - " for x, y in centers:\n", - " if x > b[0] and x < b[2] and y > b[1] and y < b[3]:\n", - " points.append(i)\n", - " return points" - ] - }, - { - "cell_type": "code", - "execution_count": 19, - "id": "earlier-electricity", - "metadata": {}, - "outputs": [], - "source": [ - "files = [\n", - " os.path.join(\"imgs/codes\", f) \n", - " for f in os.listdir(\"imgs/codes\") \n", - " if f.endswith(\"png\")\n", - "]" - ] - }, - { - "cell_type": "code", - "execution_count": 20, - "id": "known-devil", - "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "iVBORw0KGgoAAAANSUhEUgAAAQ8AAAD8CAYAAABpXiE9AAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjMuMywgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/Il7ecAAAACXBIWXMAAAsTAAALEwEAmpwYAABO0UlEQVR4nO29d5gc13mn+56OkxPCzGAwAGYwyJkgIgkSFteyLcvW6jpIWu2aoiXzyrZkr63nKjjpau21tZKvbeo6SLSCKdmKlHRFab22vJZAEiQBEJnAAIM8g8mpe0JPx+pz/6iuTlPV0zkM6n2eeaa66vQJVae+PuF3viOklJiYmJhkiqXUGTAxMalMTONhYmKSFabxMDExyQrTeJiYmGSFaTxMTEyywjQeJiYmWVF04yGE+GkhRJ8Q4pYQ4qPFTt/ExCQ/iGLqPIQQVuAG8JPAIPA68C4pZW/RMmFiYpIXit3yOAjcklLekVIGgK8DbytyHkxMTPKArcjpdQD34z4PAofiAwghngaejnzcX6R8mZg8yExKKVdl+qViG48lkVI+CzwLIIQoaJ9KCJHw38SknNCGFIowtNCfzZeKbTyGgM64z2sj54qKEMI0GCZlT/yPm5SyGEYkI4o95vE6sEkI0SWEcADvBF4oVuIWiwWLxWIaDpOKQwgRrb/lQlFbHlLKkBDiA8C/Albgi1LKq4VOt5xuuIlJrmj1ORwOlzQfRZ2qzZRcxzzM7onJcidP3ZlzUsqHM/3Ssv1JNrsnJg8CWnemFJTdbEuu5NLaKMdBKZMHi2zrr8ViKXr9XVbGI5sbbxoMk3Iivj5mWp+1sMWqz8vGeGTSdDMNhkklkI0h0cIVYzB1WYx5pGs4pJSEw2HTcJhUHFrdTZdijINUfMsjE8NRHkYjPg8ndK7PAX8MnEkz3OsFSDuTOCsh7eVDOBxOuxVisVgK2gKpaOORbn8w+xsYq/AWy8vRc7H44it8LKzV+nI0XdVgGb0Yx9PMR6pwP59mHMWIsxLSzhfxz/tk9NzSzzwPKUd+CNP54dTUqYWgYo1HOtY3n62NcPhYiquJFV5RjMImhhPixeixms09QBNQnxTupYTPUu7WDZcJFkssTinzE2f6ab+c8Dkc3lW0tAuBojya4mrhjGE6rZBCDqJWtPFIRb67KbFfFxVF2YlRhbfZYmFDoeRwJ4DjCPEiNttPJnwvGPwhsV9lLdxLOBxvTgjn9/8r8HgWpVDjtFheoqrqZxKuLCz8c5ZxZpr2y9TUvCXhisfzP5HysQKmXVhstlcSPodCOyiWMYwfUDWiUK2PijQeSzXX8mc4XgQex2o9SV3dWxOuzM29QDgcq/BW68soyjFstpPU18d+bWZnX1jilylzhNBaKuUdZyWknT0ngOPYbK/Q1PQfE664XN/N+zNPRToGpBDjHxU321LcFodxPMlpGKeZ/7eiEC9aKV/eyjMcqSnFwHw69T7fiutlZTwKN6OSGKeiKIvSCYcXp5vJ9Fq64dR081tGNe3SvMHqMyvtAq98oihKyRasFdt4VFS3JZ3uSiFQlF3Mzb0AiLjKvjc5dUAd45id/R5Sai/lHoO87iEY/LeE7y6OUx3IDAT+NXKshV0cLhPC4d14vf8rmrZ633KLM/20d+Hx/M9oV0X/XlYOodAOXK7voNWNVM+8GITD4ZTvST67LxVlPFJRGMMxF/nflDC+oR8mFlZ/tmVxOOMByrm44yakTCdcOsTSNh6gzDTO7NLWf1yFSrsQLPW848MUFyllURaFVozxSGVNC9dd+ePIf6NR8zngv6URNt1w8WFFmuEyIZPy5JtSpl0Iyrc8SxmPfLU+KsafRyrjUWqnKCYm5UgG70xW/jwqouWx1CBp5iSqQdW+avxAZG7S71ic6SpR4wcNF8vTLZaXsVgE4bAkHFZSxmmzvYKUYRRFGwQtF9l3YrmFsETyuXR5QKIo4cg9Mgp3EiEEihLWuUexe2m1nsRqVX95QyGF7O9RYh4tFjVtRQnplKc0pGqB5EP78YAajxjG/VXIVh2YrsI0ddoxwuFjGDeuEuMMhR5JK1wpyeSep1ueUCg9XYWiPErUXi0RZ7oY5zH7OPPBA288Cj3wY7e/Gj2WUuZFHehwxOIMBncgZaNufA7Ha3GfJIHAdt20nc7XEj77/dsM8+h0nooeBwLbDNMuJVVVpxM++/1bDfNZXR0L6/NtQ8oGg3BnEj57vZvRu0c1Na8vCpfrPaqtjcUpZX7iLAa5GpCyNx6pyLbgmhrUbn+Vlpb/IyG+8fFvko1M22Z7hVDoERyOV1mx4hej5ycnnycYPBr9bLG8RDj8GA7Ha6xe/csJcQwPfzVuDc0J4DhO52u0tr4zIdzIyFcJBmO/djbbSUKhR3E6T9He/q64cF/D7z+ccVkKwwngOFVVp+noeHfClfv3v0IgcCT6WbuX1dWn6ez8lej5gYEv4/PF9ggT4kWkfJzq6jOsX/9kQpy3bn0+rkWgpl1T8zpdXU8lhLt9+wsJcaaPqj6urX2djRvfl3Dlxo3P4fOVx30v5MxL2YvECtFlKcwYcXoKU6O0MxF/JcdRxmPeaVLxBUignJ5HqnckV6NS9sajEBgpGv1+P9lWZHWAcjHJM0FGaYdCoQzUqErKz0ZplyNqVzEx/4rBoERyOY1ejHA4bBDH4vBGaS2Ntpvb4rRDoZBO+OVHxXZbcumrxW/jpx37/X7m5rIX9WhGQVVNqnF6vV7DyillzKNZMBjE7XbrhtPkzpprufn5eR2DJBf99/l8BIPBrMtTKBQlhKIoUa2B2+3WMQpq+dTZJfXY6/Ualiccji0XCIVCTE5O6hrpYDCYkPbs7GzO9ygUUssjhIimHZtxKQ8K1XV5II2HRii0IzLGAakk4pkQDG5nbOzrS0rJg8EdDA//k5qyNE47FNrJ4OA/xq08NY4zENhGf/8/xMVZOpm0EcHgjkgeRVxXba9uWL9/K7dvf4GYhF6/PH7/Nm7c+NyScQaDO+jr+yyqAC91nOkSCGyjt/dvkraE1C9PqSjUrEvFGo/cyFQinlmc+nLyxfL09GTnTcDjS8i50027lGRS7qVk9Nnfy8JI/Zd6PsuTB9R4FEJaXEp5erpplxJT6l+O5NLyKHt5upHEtjiDgbF7I8SLOi7t9dWOFstLSettclMwqmlr6xHyFedLCIGBsjZeM/FiZEOhsEF5EssNyc+m9ErL5HupjXnk9nwKQeK91BSzuT1zLb6UUvXlK08vB4ybppCsIjRegZud2jCTtNOP02hlazKPp61uNS734rClQsrH864wLQSVcC9N45EmtbVno8dSShYWNmGk8qyrO6eFxOPZlLPaMBafisfTk3Oc9fXno8dSSubnN6JXnoaG8wmf5+Z6DFWeDQ0XoseKouDx9OjGWUoaGy8mfJ6d7TYsTylparoYPQ6HJbOzXZTbvTSNRwo0BWNt7Vk2bfq1hGu9vX9DIBBTjlZVncbnO0Rd3Tm2bPk/o+evXfs7FhYOZJH6CeA4dXXn2Lr1/QlXrlz566xUkUK8hJSPUV9/nh07fjPh2vnz/09cedS0GxrOs3PnBxPCXb78DPPzsRaupgZtaLjA7t2/lRD21Kk/S3vNSWE5ARynsfEi+/b9TsKVc+f+nLm5/SXJVTIWy8uEw8doarrIvn2/m3Dt1Vf/tIzUwioPpEgsXVLPjSdeMwpaiPn1bOO0WJZ20Z9G6ml/T4hKqF6Fd5qTD4rh3CdTKuHplgw9v6QayeKvdFWR+SDbOI1UsFLKtJWW6ZfbSOVZPmRS7mKQypdrOapWTeORkkTlpobL5VqkIgwEggnfAVW16vcHcstBUtper5dAINs4F5dHSsnk5KRu5Ux+sXw+X0TCH0PPkEkpGRwcLIjhzIV4x9VSSrxeLz6fr8S5ipGsFNYYHx8nFCo/tbA55pEGCwub6O39G0CgKErEcOxNCqU+cI9nE1eu/L+Ew5JQKISUu3JK2+Pp4fLlZ6JTtaqcOjdV5Pz8Ri5c+Au08qgVc69O2pt4/fVPY7Vao2kblWd2tpuzZz8NqL+SqjFaHGcpmZ/fyGuv/VnEGZAkEAjk/HwKwcxMF6+99mdRyXswGKDc7iXkYDyEEJ3Al4FW1DfnWSnlM0KIFuAbwAbgHvDLUkqXUDttzwBvARaA90gpz+vFXT7EVITxg6P6YdT/Ujbi9x9JEa4QaWcep34ek+NsIhg8iv7yj2SVZ2OKZeilVlrG38t0yl0qYvk0HhAvh3yq5NLyCAEfklKeF0LUA+eEEP8GvAf4dynlJ4UQHwU+CnwE+BlgU+TvEPB3kf9lTCFUkYVIO99x5kvdmhy2VFRCHqFy8hlBU0Lm+gd8D/hJoA9oj5xrB/oix58D3hUXPhouRZzSYrHo/qG2dsw/8++B/4s4Ck/5Z/QeRd6ls9m883kZ8xBCbAD2AaeBVinlSOTSKGq3BqADuB/3tcHIuZG4cwghngaezke+iouMHtXVnSMcDuP3+yPjI/pyblX8JQkEgpFBUEn5SKUfVGLPp77+HFJCMBiIDBTntiSguvoMNpsNKSV+vz8ylqFfN+rrzyGEIBAI4vf7Ij+mi5cP1NS8jt1uIxRS8Pl8OvWtcORsPIQQdcC3gf8qpZyNn4+WUmpWMW2klM8Cz0bizui75cL8vJHo6OfTDLc4rEnxMRaPZfdsvN6DKa4mxpmucC21ALGwdSgn4yGEsKMajn+SUn4ncnpMCNEupRwRQrQD45HzQ0Bn3NfXRs4tO5qbL0WPZ2e7UZR69Pqxzc2X4z5JXK71lJsE+UGmpSX2fGZnuwmF6sjl2bS0vJHweXa2yzDOFSuuxH2STE+v012SsHLllYTPLtd6w/qWb3KZbRHAF4BrUsq/iLv0AvAk8MnI/+/Fnf+AEOLrqAOlM3Hdm4qnru4c8/P7aW6+xMMP/1/R82fOfIqZmb3Rz3b7qwSDR2luvszBgx9OiOPEiY+nmAUxKQZO5yn8/sO0tFzm0KGPRs+fPv1Jpqd3ZxHjCeA4LS1vcPTo7yVcefXVP2V6OjZVrDnmXrHiCo8++gcJYf/3//4DPB5tWYAa58qVVzh27I8Swv34xx/H7d6TRT4zJ5eWxyPAfwHeEEJcjJz7PVSj8U0hxHuBfkBzEf7PqNO0t1CnahPdWFc4Ri4CjFwGJlNuascHFSNhWyE8VyQrSlOlka5rw2K62MjaeEgpT2K8MOAJnfAS+E2dsMuCQMC/6Jw2aBqPkcx4ZmZmkSNgk+ITDOo/n1wVnno/Lsnq45jhSjQARqriZEOh+a4tFqbCNE9oRmF2tpszZz4VGVH3EQhsSwqpPvCZmQ2cOvVJhFCl7T6fF8imWWySX9Tn43arKk9QHSd7PBtzitXt3sCLL34Cm82KlOrSBa93k25Yl2s9L730CYQQBIMhvN4FwuGdi8JNT6/jRz/6o6gC2Ov14vdvzSmfmWAaj7yhKv8UpT5hjCP5uvY/HG4wCBcftnyxWCwIIXA4HFitVt0w2i9h4r695Y72fOoNxg6yVfU2Mjf30BJhYnXD5TIat4ilL2VjSeuQaTzyRr79bpYPQgicTieNjY00NTXR2NhIbW0tTqcTu92OzaZfjbRuWygUYn5+HrfbjdvtZm5uDq/XW6YGpZRK4VL6ZM0c04epiS4Wi4Xa2lpaW1tZs2YNDQ0NOJ3OnP1KqJs8hXC73UxOTjIyMhLZu8V8noWkED5Ml5HxiJXDbn8Fi8USWTGqDYAVWnUXS9/pfC2yCjXEYtVoYjhQ+9Sx8pRWYepwOGhtbaW7u5umpibsdntB01MUhenpaYaGhrh///6iAebyJb6+vRqpb6Ei1bdY2jbbK3GrnrVB1cVpm8YjjlTGw5jvUzjV3VLpa2mXOp/6OJ1OOjs76enpoba2tiSeq+bn57l161aFGJFSPsfM0za9p6fJqlW9cZ8kU1OdhMPFc3K7enUs/ampTkPF3+rV16LH4bDC5ORaiq0wtVqtdHZ2snXr1pIZDY26ujr27NlDT08Pt27d4u7duxWhfWltvZbweWKio2j1ra3t+qK0y15hWm5ozopXrerlTW9KHCz6l3/5CDMz+wqafmPjRWZm9rJ6dS9PPPEn0fM//OHvMTUVm2ZzOl/D7z/C6tXXePOb/zR6XkrJt7/9gRQ+MfJPU1MTO3fupLW1tWx8ZAohokZkzZo19Pb2Mjk5WepsLUJzJt3aeo2f+qlPJlz7/vd/N8VsST44ARynre06P/Mzn1qU9uTk4mndQrBsjEfq3ldhXwwhhKEDZJ3QhleK1YO0WCx0dXWxfft2nE5nxt9XFHUF59zcHKFQiNnZWd0BT6fTSW1tLTU1NVRVVWG32w2ndZMRQrB69Wqam5u5fv06t27dqohWSKkp5ijEsjEesX7gYtVd9j4/00xZSkNfpclpG+3KXqxd7Z1OJ7t27aKzszPtF1lRFLxeL+Pj40xOTuJ2u1lYWEjbKa/FYsFut1NbW0tLSwttbW00NzfjcDiWbPHY7XZ27txJc3MzFy9eLBufo0bOilVtS3HGa/QMRTHqkMYyMh4q2syFtqXgwMAAXq+34OmqCtGYZFhKydTUFB6PJyGcJkGO377R5/Nx7ty5gjsMrq6u5sCBA6xevTqt8IFAgOHhYQYGBnC5XFlXTE3v4ff7mZ6e5vbt21RVVdHe3s66detobm5OaciEEKxdu5a6ujrOnj2L2+3OKh+FQPXrKiNbQyr09/cXpb4BUa2Muh2oZGhoiLm54gkMl9Fsy4+B44Abh6MXq9UWcR6rOQxuQu0r/kSBcqumL8QMVVV9KEoo4lE9Oe1YPquq+gD1JVUNx96C5bOxsZFDhw7R0NCwZFiv18u9e/e4d+/eIuOXb6xWK62trWzevHlJIwLqjMypU6fKwIDE17dr2GxWgsFgpL7tpbD1LbGu22z2SH0LIKV+XTdnW1JSCIfBmacvZaOB05dkh8HFc3JbXV2dluFQFIWBgQGuXbvGwsJCXvOQKs3h4WHGxsZoa2tjx44dKfNZV1fH4cOHy8CAJDpV1u8ZF6q+Jdb14qYdYxkZj1LLvstTnu5wODhw4MCShmN2dpbLly8zNjZW1GXdGoqiMDQ0xMTEBNu2baO7u9uwFVJXV8eBAwd4+eWXSzgGUsr6Vuq6rrKMui3x5TiBOqsRf+7B8w1qsVjYu3cv3d3dhmG0vvKlS5eK1ldfCm2MY/fu3VRXVxuGGx0d5dSpU2W5m1p2xNfXF3XOZV+HzW5L2hxPce3B8Q3a1dXF+vXrDa9LKenr6+P69etl9QJKKbl//z4ej4dDhw5RW1urG661tZUtW7bQ29tbktZSYXk8xbXyqMPL0ni0tfVFj6UMMz6+Rtf/43KmqamJ7du3p1wu39fXR29vb9kuSpuenub06dOGBkQIwebNm5menmZkZNl4tASgvT1Wh0OhEBMTHZSbf9tlZDxOoKru+vjZn/10wpXnn/9ACr8Hyw+r1crOnTtTCsBu3rxZ1oZDYykDYrVa2bVrF9PT0xWwHiY1mg/T9vY+fu7nYm6BpZT84z++bwnv68Vn2Wx0LYRxUazWZVPMtOjs7KS1tdXw+vDwMNeuXSt7w6ExPT3NpUuXDLtWDQ0N9PT0FDlX+ceoDgshCr66ORuWzVtlpPiDxbu9L2ecTidbt241VG663W4uXLhQVCViPhgeHubmzZuGYxvd3d3U1dUVOVf5xciYSynL8nktG+OhkfwAPB5PwYVO5URnZ6fhAGMwGOTChQtlM6uSKX19fYaL5JxOZ8pZpUogpj5OPD84OFg2svx4ltGYh8rExBq+/e0PYrVaCQYDkTUYxVllWGpsNhsbNmwwbHXcu3ePqampIucqf4RCIa5cucKxY8d0XR92dnZy48aNsnzRMmF8vJ1vfes3sVot+P0BPJ55pCw/59jLyHjEFJ7Gm96Uv2PhXFixYgX19fqj8V6vlxs3bhQ5R/lnenqa0dFR1q5du+hadXU1bW1t3Lt3r/gZywvxDpCNjEX51OFlZDzKQ3VXSjo6OgynZu/du1ex3ZV4pJTcuHGDtrY23dbH+vXr6e/vr1DdR2XV4WVkPF6nXMQzpcBms7Fq1Srda8FgkIGBgSLnqHC4XC4mJydpa2tbdK2xsZHq6uqirc3JL5VVh5eR8SgEsV+v2tqzCKHuKKbqCZIdG5eWhoYGampqdK9NTk4yPz9f5BwVDiklAwMDuh7QHA4Hq1ator+/v0S5KwaxelldfSbqANnn80UGXYtTL03jkSaxTYb1KP2vxcqVKw27LENDQxXajDdmYmKCQCCgK4RbuXLlMjceMVILxwpbL03jkSbt7fGDjZLR0XakLJ5T5aVobm7WPR8KhSp6hsUIzQ2invFoaGiIOoNa7qxZczPh8/h4O6FQHaYD5BJjt79CMPgI7e03eNvb/jLh2le/+jSzs4V1qpwuVqvVcMm9z+dbFgOlyUgpmZ6eZuXKlYuu1dfX43Q6l2W5VU4Ax1mz5iZvf/szCVe+9a3fZHw8eX/kwrDsRGL5JBw2buqX06+aw+EwXLquOSlejrhcLt3zVqvVcPxnuVPM7qlpPFKgKPovnc/ni/osLQdSeSUvpk/LYjM7O6u79MBqteJwOEqQo2KTaCjC4XBRW1um8UgDzbO5oijMzc1x8uTJsvo1r66uNnT2Mjs7W+TcFI9QKGTYAkzHV2ulMzs7x8LCAoqi4Pf7uXr1Kh5P8WbVzDGPNHC51vEP//AkQlgIhxXC4fehOrktD6qqqgwl6eVk5PKNz+fD7/frrjjVE5AtN+bnN/Lcc09FvKeHI62wQm42lUjOd1gIYQXOAkNSyrcKIbqArwMrgHPAf5FSBoQQTuDLwH5gCniHlPJerukXlpijWUU5tkSY0mE03qHtt7KcMerjNzY2FjknxSRWL8PhY+g3virDAfJvA9cArZ34P4C/lFJ+XQjxWeC9wN9F/ruklD1CiHdGwr0jD+kXkMqSC+tR6A2vSom2H4zeep5y2T6zMJRHvcxpzEMIsRb4WeDzkc8CeBPwfCTIc8B/jBy/LfKZyPUnRNk/4TPAzwHHsVqt2Gw2nUpZ+iI8CE10PdTd2cp9Ba2M/glxArv9JFbrS6h7r/wYeAE4kGGcsXophAW73aEz5lX4eplrrfsr4MPETOAKwC2l1Drag0BH5LgDuA8gpQwJIWYi4RMcNAghngaezjFfece42wKlVpg+CIODmeJwOMpOKCbl4xj79MmuDkn5WN7jTJesjYcQ4q3AuJTynBDieL4yJKV8Fng2kkbZaKo7OmJKvnA4zOho2wPnVLmSqKqqKjvj0dFxK+Hz2FhbzmrQtWtvx32SjIy0oij1OcWZLrm0PB4Bfl4I8RagCnXM4xmgSQhhi7Q+1gJDkfBDQCcwKISwAY2oA6dli9V6EkV5lI6Om/zCL/x19LyUkueeew+zsw+VMHcmlcEJ4DgdHbf4pV/6m4Qr3/zmrzM8vDnrONeuvc073vF3CVf+8R/fy9hYmStMpZQfk1KulVJuAN4J/EhK+W7UjtwvRoI9CXwvcvxC5DOR6z+SZb5ay0g7IYRI6XC5kKhpx/5MlqZc71ch8lPMMhZipO0jwNeFEH8CXAC+EDn/BeArQohbwDSqwSlrjDQS2ih/saitraW1tZWWlpaEmQUpJbOzsxXv+LcQ2Gw2enp6qKuri94zRVFwu91RfyDFncZe/DsZCuXfMXcwWDxdT16Mh5TyBGpbCinlHWDROmEppQ/4pXykVyw0j+zx/eZwOFw0P5k1NTVs3ryZzs5Owz1Y9BaGmagOkXfuXOy7dvXq1YAqMBscHOTmzZtFcZDt9fqQUkZbBl6vl5kZd05xBoMBwuFwtIU8MzNTVEXxgznHlyGjo2186UtPIoQgEAhEDEdhlXyrV69m3759hj5JTXKjqqqKnp4e2tvbOX/+PGNjYwVNb3q6k2ef/U/Y7XaklHi9XkKhrTnFOTbWzt///bujzoBUqfr2POV4aUzjkZKYU+W5OaPB0fwr+VavXs3BgwepqqrKe9zLCYvFknIj7HSora3l4MGDnDlzpkAGJKYG9XoPot9TyrQOxeKcn9+/RJjCYRqPlBRfyed0Otm7d2/eDEeq3dErHSFEXlbPOp1ODhw4wEsvvVSAZn8h6lB5KExN45GSM3HHJwzC5Hd0e8uWLXkTfVmtVurq6piZmclLfMuZqqoqtm/fzunTp/PsEyOTOhSfrl7YeN+kpXd9aRqPtDme4lp+HqTT6aSjo8PwupSS+fl55ubmCIfDNDY2UlNTY+jLA5b3Go+lpl8VRYl6Upufn6e+vp7GxkZDOX9bWxv19fUFHHQ8nuJach3KJGxpMI1HmnR2xpR8fr+f8fE1QBP5VPI1NzcbesAKBoNcvXqV/v7+6L6lNpuNmpoaVq5cybp162hqanqg1rk4nc5F3TspJR6Ph+HhYYaHh5mZmSEUCkVnOpqamti/fz9NTU2L4rPZbLS1tRXMeHR23knI5/DwasJhfTXounWxsF6vj4mJ/Ne3XHlwaloWWCwvEQ4/Rmfnbd75zs8lXPvbv/3lJTyqZ05LS4vhL+mtW7e4dStR3hwKhZidnWV2dpZ79+7R0NDAunXr6OjoiBqhMtfh5UQ4rPqwsFqtBAIBJiYmGBwcZHx8XHc1sZQSl8vF+fPneeyxx3QN7erVq/O8s94J4DidnXd497v/PuHKl7/8FMPDMWNgtb6Mohxj3bo7vPvdn08I+5nPvB2PJ9MFdIXFNB4psNlsGK1odzjs5FseYDTWoSgKIyMjKb8bDodxu9243W6uX79OS0sLNpuN8fHx/GayjPB6vZw5cwabzcb09HTaoi+32838/Lxu66O2thabzVYUJ0rJ3U2LxYKOV0VAbWWV237tpvFIgaIYL6oqhDrQaOZASpmRojUQCDA6OpqvbJU12Uyvahsk6WGz2Yo2Q5XsYDtVKzEQMFw6WzKW7zxeHtAcICc/U7fbXZDtDI362lar1XBfFpPMcTqdhuK7hYWFgrQ6QqHEl18bm0kMo5+u2+3G6y2/7TPNlkcajIys5itfeS8WiyAYDOJ2u1GUHXlPx2hLSCEEPT09hn15k8zYsGEDtbW1utcWFhYKsox/dLSNL3zhP2O3O5AyzMKCl5mZ9bphh4ZW8dxzTyGE2uKYmXEXVTmaLqbxSImq0lOUekZHt6QMkw+mpqaiA4DJrFy5kocffpizZ8+aBiQH1q1bx7ZtxkvWJyYm8pxiTKU8MWHkV3Uu4b+i1CcMpOqHLT2m8UhJcZV8MzMzTE1NRRdvJbNmzRoOHjzIxYsXl9XG1cXAZrOxefNmNm/ebDid7fV6lxyYzpxM6lB5KEfTRZTzVJ4QQhoNXpWTh6h80tbWxpEjR1IKvzweD1evXmVwcHDZ3od80tTUxO7du1m1alVKUVlvby+9vb1FzFnxSDUIHA6Hz0kpM9YdLKOWR8wIOp2nsNlsBIPBSBNfkijtjYWtrT0b9c8RDmszKFrYmLS4puZ1LBaB3x8gGAwkhXs9b6UYGxvj7t279PT0GIapra1l//79rFmzht7e3mW9sVMuOBwOuru72bx585JrYKamprh9+3bKMNkRq2t2+6s4nU4UJYTP54+4fNCvl1p98/n8cYOti+ul0/kaDoeDYDCE3++LzNjkv17qsYyMRwy//zDGM5uJ0t50hV4LC6kEOvmTC0sp6e3tpa6ujra2NsNwVquVtWvXsnLlSq5fv87du3d1t158UFm1ahU7d+5kxYoVS4adn5/n/PnzBXfwFAweTdtZcer6FsPvP5J2Xc83y9J4rF9/N3osJQwNrTR0Crt+/b3osd/vZ3S0FT0Z8IYNsXBSSu7fX0E43KAbZ64EAgFef/11Dhw4kNKAgLqga8+ePbS1tXH58uUHvhVit9vZsmULPT09aUn15+fnOXXqVFEWD3Z19Sd8HhpaRSBQg14d6uoaiB5LGaa/vwUpF9e37u6BhM8DAysIhWp148w3y8Z4CPESUj7G+vV3+ZVf+VLCtc997p2Mj8emupqbL+Ny7Wb9+ns89dRz0fPBYJBPfepnCAYfAcDheJVA4CgbNtzjV3/1Kwlx/tVfvY3p6d0FK4/f7+f06dNs376d7u7uJRe/tbW10dTUxPXr17lz584DORayatUqdu/eTVNT05ILAqWUTExMcOHChQJvBn4COE5XVz/ve98/JVx59tn/RH//huhnu/1VgsGjdHUN8PTTX00I+6lPvQWXS6tvapzd3QO8//3fSAj3mc+8ncFB4y5vPlk2xiMfqBWufFahBoNBLl++zPj4OLt27VpyqX5VVRW7du2ipaWFCxcuRBfQLXeEEHR1dbFr1y7dfWuTCQQC3Lhxg1u3bi3DvXwr2wFySdD8jS4+L1lYSFzzsLCweJGAlJKxsbEEJaDRy6coyqI4C4WUkpGREVwuF1u3bqWrqytlK8RqtbJu3TpCoRDnz58vSh5LTWtrK3v27El5X0C9l1NTU1y+fJnp6eki5S6WdjLJYyzJKtTY+VDaima/v3g76C07ebrP54s22UOhEJcvX8bjSdREaA9NyjBSSqSUTE5O8oMf/CDhIWvHwWAoehwIBHjxxRfx+Yq7gbTP5+PSpUu89tprTE1NLblatqOj44FxY7hu3bolDUcgEODq1aucPHmy6IYDwOVyR2b0woTDYcbGxhblI1bfAtFjv9/Piy++qGsU5ubmoz9wiqLQ19fH9LSrwCWJsYx0Hj9GdaDipqqqL7IiNhCZqt2DOgh6AviJaFghZqitvRVdKKVO1e6NC0s0zpqam1gsFgIBfyTOvUlxFg+Hw8HmzZvZtGmT4UsTDAb54Q9/WOTtBUrD0aNHWbNmjeH1ycnJkrQ2VGL10uHoxeFwImUYr9dHOLwLvXqp1Ter1YLfHyAQ8GNUL53O6zgcDhQlhNfrRcrkuq5i6jxSEnMK6/MdWiJMTDKcngPZphRTZ8WXC2u/orW1tXR2dhqGWX79eX1SqW1nZmZ47bXXirrPTiKxehkIHDVw8TC3KGx69a0phSzBdICcAYWQAYs0wxUfKWVK4+ByuR6YAdPJyUk2bdqkO8Pi9XpLvBZo+dbLZWQ8Yqo7IV5ECKHTtRGLwlosL0XHPRaHLQ9Hs3pUVVUZroGRUjI0NKR7bTkyNTWFz+fT3YZB22WvdPqXRAfIFosFKZMH+BfXy9R1uDzq5TIyHjGkfHyRD44YiTc9HH4sRUylf0BGpFpW7vf7C7A6tHxRxX2jdHV1LbrmcDjo6ekpk5mn4xjLbxLrWiZ1uFQsS+PR3X0/ehwOK/T3NyNlI3rNvI0bByNHErd7hqmptZSbo9lk6uvrU659GRwcLMp2mOXEwMCA4axLZ2cn/f39TE1NlSBnMXp6BqPHUkJ/f7OhGrSnJ9ZyDAaD9Pc3A/p1uFQsI+PxIvA43d33+Y3f+GbClU996mcYH4/5UmhsvMDMzD42bhzkAx94Pnre6/XyR3/0GKHQI8XKdMZYLBa2b99uOA3r9/sXOUp+EJiammJiYkJXzm+329m2bRuvvfZaCdb/nACO09MzyAc/+J2EK3/5l2/j3r1Y69Fme4VQ6BF6eob47d/+bkLYP/iDR5iZ2VeE/KbPstF5pJqKsloTbaTRptF2u73sd1jr7u5m7dq1htcHBgYeSF8f2gbkRsahtbWVTZs2FTlXqdFzgGyEw6FfZ0tJeb8pGZBqLUeycs/r1W/SezyeqN/ScmTFihVs27bNcN2Gz+cr0LLyymByctLQmY8Qgq1bty650LCYJM+WxVxCLKYcu6HLxnhovhCSjcjU1BRud+KKyWTHs6Aq9F5++eWyXdZeW1vLgQMHDFtNUkpu3LjxQLY6NMLhMFeuXEnpGd1ow6dCk5wnRVEWreTVjEnyzN/t27cXqaTLgWWnMLVYZlm1agi73Y7fH8DtdhMMbkdPyWezzdPaOoqUYebm5pmbm6WUylEjampqOHToUErfFKOjo5w6deqBEYalYvPmzezatcuwheZyuTh16pTuj0j+iamZV6wYpLq6KrJZ1xweTw969dJqnaOtbRQhLCwsLEQcICerUTPDVJimRFXUhcMNjI0ZrT5NVPKFQnUMDRnNWpSHo9l0DIfP5+Py5cum4Yhw+/ZtWlpaDMeGmpubOXjwIGfOnCmCAYmpmScn03eAPDRkOkAuIsvP0WxDQwP79+9PaTgUReHChQsPvBOgeBRF4dKlSzQ0NBi6MVixYgUHDx7k/PnzBXYEtPzqpUZO3RYhRBPweWAn6qDDrwJ9wDeADcA94JellC6htiGfAd4CLADvkVKmVO48iA6QNVavXs3+/fsNhWCgviS9vb3cuHFjWe9Jmy0tLS088sgjhuNEoE7Pnz17Nqud5yqJQnRbcjUezwEvSyk/L4RwADXA7wHTUspPCiE+CjRLKT8ihHgL8EFU43EIeEZKabSCTYs/A+MRK0dj40XsdhuBQJD5+fnIKHZxnMLmis1mo6enhy1btqR0bCOlpL+/n/Pnzy97Q5oL7e3tHDhwIKUD5FAoxJUrVwrkBzbR2XZ1dRWKEsbjmY+sudF3gLxixRsIIfB6fSwseJIcG8dk7I2NF6IOkOfn5yJd18V1vayMhxCiEbgIdMu4SIQQfcBxKeWIEKIdOCGl3CKE+Fzk+GvJ4VKkkZXxMOb7lIu0V4+mpiZ27txJa2trSjd6muG4ePGiOc6RBukYECklo6OjvPHGG3nuAmZSL9MN+3MZxKlSbgOmXcAE8CUhxB7gHPDbQGucQRgFWiPHHcD9uO8PRs4lGA8hxNPA0znki02bhuM+Se7ebSQUqqOcpL3xZLJFgGk4MmdkZCTqUNro/gohaG9vp7m5mWvXrtHf35/3+7t583DC5/7+Fvz+KvTq5ebNsddCSsnt23W6Dre3bEn87b17t9HQqXK+ycV42ICHgA9KKU8LIZ4BPhofQEophRAZNW2klM8Cz4La8kj3exbLy4TDx9i0aZjf/d0XEq79yZ88wdBQeakLQe2irFmzhs2bN6elPVAUhbt373LlyhXTcGSIZkAefvjhlGMgVVVV7N27l3Xr1tHb28vExESO3cITwHE2bx7mQx/6QcKVT3/6Z7l1qyP62eF4jUDgCJs3j/DhD/9zQtiPfewIExOaE281zi1bRvjIR/4lIdwf//ET3L27Lof8pk8uxmMQGJRSno58fh7VeIwJIdrjui3jketDQLznmrWRc3nByIepei1fqeQHi8XC2rVr2bRpU1qevkFdHHX16lVu375tDo5mycjICC+//DIHDx5M6UxaCMGKFSs4evQoExMT3Lx5Mw9GRI/k52j8XFOpTxNiSPEe5JusFaZSylHgvhBC2wH6CaAXeAF4MnLuSeB7keMXgF8RKoeBmVTjHVnkRztKOK8KcspnGrOpqYmjR4+yf/9+mpub0zIcc3NznD59mlu3bpmGI0fcbjcnT55kcHBwyXtptVppa2vj6NGjHD16NCdlqp7hSdaYGDlvmpmZ0VUOJ+dfSlnUup7rbMte1KlaB3AHeArVIH0TWAf0o07VTkemav8a+GnUqdqnpJRnl4g/Y4Wp3e5h3bpphLCgKCFcLjdu93rKQTW6YcMGdu3albLZHI+iKAwPD3P58uUHwhdpMbFarXR1dbF9+/Ylx5k0/H4/V69e5c6dOxmkFFONdnZOYbfbIx79FxgZaY24ijhBvMLU4Vhg/XoXIAiFgoyNjbOwsIlkH6Y22zwbNrixWKyEw2FmZ2cZH2+nInyYSikvAnqJPqETVgK/mUt6qVGVd8FgLbdvx2sj1i8KUwo6OzvZt2/fkl6+NTweD729vdy/f9+cii0AiqJw69Ytpqam2LVr15KbYIO6GnvPnj2EQiEGBgZSho0RU43eu7eUalT9HwjUcPNmTdx1/TocCtVx61Zd3LUO3XCF4gFVmBaXqqoqdu7cmZbhCIVC3Lt3j76+PrO1UQRcLhevvPIKnZ2dbN26lbq6upThrVYrO3bsYGpqKk1p+/L1YbqMFsaVLz09PezduzdlGEVRGBsb48aNG0xOThYnYyYJVFVVsWHDBjZu3KjrDzWe3t5eent7i5Sz3Cm7botJehg5KoaYOKmvry+tzZxMCofP5+P69esMDg7S09PD+vXrDVW+7e3tXL9+vaJ+xPKNaTyKQKrd2vv6+ujt7X2gK2G5MT8/z8WLFxkdHeXw4cO6z6+6ujq6sdiDyjJyBlSZqGtvTMNRjszNzRmK8fS363iwMFseRSDVJsXbtm0jFAoxPDxsGpEyoqGhgX379hk6mk5lWB4UTONRBIaGhli/fr3uVKDmXrCwSkaTdKmtraWrq4uurq6Uepzh4WGz5VHqDDwIjI+PMzk5yapVq3Sva0rGVatW4Xa7GRgYYGxsDI/H88BX0GJgtVppampi/fr1rFmzxrC1oaE9owcdc6q2SDQ1NXHkyJGUzn3iCQaDuFwuxsfHGRsbM5vJeUQIQU1NDU1NTbS2trJy5Upqa2vT0uH4fD5effVVpqeni5DT/FFW/jyKwXIyHgAdHR08/PDDKZ386KEoCh6Ph+HhYe7cuZNyDMXEGKvVSnt7Oxs2bKClpQW73Z7W2iINv9/PxYsXuX///tKBywzTeMRRicYDYOXKlezbt4/GRiNnuKnx+XxcunSpIitwKamqquLhhx9e0tGSETMzM5w/f77kW1Zmi2k84qhU4wHqGoktW7awYcOGtBdlxePz+fj3f/93U76eAQ899BDd3d0Zfy8QCHD79m1u3bqF3+8vQM6Kg6kwLWvijfCJpGuJPiX9fj+XL1/m7t27bNy4kY6OjiXl0PE4nU5WrFjB4ODg0oFNsNlsKVW+evh8PgYHB7l9+zZzc3qLzFI9byisz9xSph3DNB4F4bjB+UT/qXNzc1y8eJG+vj7a29tZv349jY2NKRWpoA74NTU1mcYjTZxO55IzKKAuSpyZmWFgYIDh4eEMWnbHU1wrtM/c0qVtGo8CsHXrKKAOdN6+Xa/rezIer9fLnTt3uHfvHnV1dbS3t7NmzRqampoMZwA0D2Tl3O0sF1LdR0VRmJiYYGRkhMnJSebm5jLuEm/dGtu2IRgMcOdOQ8RPR+H9iG7bFktbdTOg7+u0EJjGI0+sXn2N8fFtbN06ysc+9sPo+T/8w2MMDBi7vItHc+gyOzvLzZs3WbdunaEPkJaWFlatWsXk5GRFj/8UGm2lrN4gqaIonDt3jsHBwSzu4YvA42zdOsbv//6/JVz50IceYnw8uwHx9DgBHGfbtjH+8A9/lHDlox89lHZ9yxXTeOQBi8Vi2Cx2OjMfEAXVkAwMDLBu3Trd/rrD4eDo0aPMzMzgcrkSNlL2+XzRJrfX6yUYDOL3+5eNkRFCYLfbsdls1NbWYrFYsFqtCX5JrVYrjY2NNDc3G44nTUxMcP/+/axab1arFaMtXjIZv8o3dnt29S0bTOORB6SUhgKuXIRd4XCY/v5+Qy9XNpuNFStW6G5Hqb0QiqIQDofxer3Mzs4yNTXF5OQk8/PzFSM600Rdzc3NrFy5ksbGRurq6rDZbAnjQ5lMwWpbWGTb7UtliAMBfV+kxSD/m1YZYxqPPCCl1FUcairRRDdymTE0NERPTw/Nzc0ZfU97kbSXy+Fw0NjYSGdnJ6FQiIWFBQYHBxkcHGRubq4sx06cTift7e2sXbs2K1FXKqamphgZyd7/tualPPm+eTwe3G5XTnlLl2QDFgqFImlnX98ywdR55A3Vea3T6WXt2kkUJYzLNc3MTBe5Ol9uaWnh0UcfzUoTshTBYJDBwUFu3rxZNl7m7XY73d3ddHd3U1NTkzeDoeHz+Th58iRutzuHWNTnbbPN09k5hcViJRgMMDk5leSsuBAOt+OdKk9js6kOkF0uFy6XvrNvU+dR1qhaAL+/mtu3te1p8uN8eXp6mrNnz7Jnz56018aki91up6uri46OjpKLoSwWC+3t7Wzfvp2Ghoa8Gw1Q/aecP38+R8MB2vMMheq4ezfe72n3ojD5x8ip8rpFYQqJaTzyRirntbk7pB0eHmZmZoYdO3bQ3t6e8fqYpXA4HGzbto2Ojg6uXbvG0NBQUVt3jY2NbNu2jfb29rQ9zGeC3+/n/v373Lx5M03HxUtRSofb5eHs2+y2VBhCCOrq6li9ejUrVqygtrY26nfC6XQmNE8tFktWv96aM+br16/jcrkKOh7idDrZuHEjGzduTHs/m3jiBwgDgUDC5/n5ebxeb3R1st7GSQ8K5tqWOB5U45FMvIFwOp3RX23NyGgDpU1NTTQ0NOBwONI2KKFQiJGREW7evJl3I+J0Olm/fj3d3d1LbnegIaXE5/PhdrtxuVzMzs7i9/uj09R+vz/BeGQ38xArY0PDeYQQeDyeyMxUvOw7Fq6m5nUcDgc+nxefzx+5Vhx5enX1Gaqrq/D7/Xi93sh7sTht03jEYRqPzBBC4HQ6WblyJRs2bGDVqlVpdw9CoRCjo6MMDw8zPj6eoCnJBJvNRmNjY3QGJV2jEQwGGRoa4v79+7hcrgI7HV7qffg+quw7nfdGC5tvMk/bHDA1yRrtV3twcJDh4WFWrlzJ1q1b09opzWazsXbtWjo6OvD5fFGtyNzcHB6PZ1F3AVRjVVVVhd1up7GxkZUrV9LS0pK20x2IScevXr2K2+0u+nTytm3j0eN79xrxep3ojTNs3z4R90ly40YNoVCdbth8s2PHRMLnmzdrCQRqipK2aTweQMLhMOPj40xNTdHR0cG2bduor1+6sgkhqK6uZu3ataxduxYpJeFwGJ/Pt+jF1lo6QoisBkDn5+fp7e3NUjqePU1NF3G797Jt2zgf//iPo+c/8Ymf4Nq1mNLXan0ZRTnG9u0TfOITLybE8aEPPcTAQHqtquw4ARxnx44J/viPTyZc+fCHD3DrVo3ut/KNaTweYBRFYWBggImJCTZv3sz69esz0pJohiGf08d+v5/+/n5u3LiRdfcoF/LRuinEFHMGqRctJdN4mOD1erl06RIDAwNs3ryZ9vb2Jd0C5BttcPb69evMzMwUNe14jJbhB4OJknOjwVh1cWNpNlSXUrKwkI9p6PQwB0xNEhBC0NzczKZNm4piRAKBAGNjYwWZ0ckOVb1ZXe1nwwbViAWDQe7c0VwrnEBVbsYUxRs3zgECKcO4XG5GR1sphsJUS1t1zaBK4wcGmiPuABLTNgdMTQqOtk7nzJkz1NfXs27dOtrb26mrq8ubeEtRFObn5xkZGaG/v5/5+fkyMBoaaqvB63UmjHEkX49XFPf2xq+ibdUJm2+M0l61KEwhMY2HiS5SSmZnZ7ly5QrXrl2jqamJ9vZ2mpqaaGxsxG63Y7Val+zfSylRFIVgMMjMzAyTk5NMTEzgdruLugI0fdJVCpsKU7PbYpIRmi+Nqqoqqqurqa+vj3ZttP/aUv9AIIDH48Hr9eL3+wkEAmXUwniwKDuRmBDid4D3oapW3gCeAtqBrwMrgHPAf5FSBoQQTuDLwH5gCniHlPLeEvFnYDxi5RDiJSwWC+GwEldZ9dWBVuvJyJRj/K9gcRzIpiaxPFarBUUxKo9J8Yl/Pi9isVgjLalcnk8sTovlZYQQKEq8z5Xsn3khjEd0t+9M/4AO4C5QHfn8TeA9kf/vjJz7LPDrkePfAD4bOX4n8I000pAWi0X3D/VOx/3JNP5eyCJsqf4qIY8P8l8hnk/hnrnRexR5l85mYwNyHfOwAdVCiCBQA4wAbwL+U+T6c8D/Dfwd8LbIMcDzwF8LIYQsQDt2x47J6LGiKNy4UW3oFHbnTm0TH3WgcHh4NepIeeEVeumya1dso6FQSKGvr6poTm5NlmbXrpgjKEVRuH7dmfPz2b07Fqff7+fGjZqiOVVOl6yNh5RySAjx58AA4AV+iNpNcUsptbbWIGoLhcj/+5HvhoQQM6hdm8n4eIUQTwNPZ5ofIV5EysfZsWOS//7fX0m49oEP7GRwMObfcuXKK0xO7mTnzin+7M9ei56fnZ3lPe9ZTzD4SKbJ5x2tPLt2TfHJT55OuPb+92/h/v3iOLk10cdieYlw+DF27Zrm059O7EY8/fSmrJwQOxyvEggcZffuaf78z88lXHvXu9qZmmrMKc/5xrgjtARCiGbU1kQXsAaoBX461wxJKZ+VUj6caR/MYjGeRrTZEq85nfrOiqurq7Fay2UCyngWw2bLry8Pk8xJNYaQra+VVHFWVWXurqDQZG08gP8A3JVSTkgpg8B3gEeAJiGE9gauBYYix0NAJ0DkeiPqwGleSDXt5/cnrsI0cgZTTk6BU/XmAoHK3fZwuZCqvnm92cnqQyH9OKWUeDzlt7l5LsZjADgshKgR6mT/E0AvqvztFyNhngS+Fzl+IfKZyPUf5Xe8Q40qeRZmdHSUqamEnpGur85gMMjzzz9PKFQ6z9eJqOVJrqQTExNMTEzqfcGkiGhVN3GWTvX4llzf0kWre8mvxbVr15ibKw//svHkMuZxWgjxPHAeCAEXgGeB/wl8XQjxJ5FzX4h85QvAV4QQt4Bp1BmXvNPXV8UHP7gTm82O3+9ncnI1gcC2hDDaA+/rq+a3fms3iqLgdruZnf0dYG8hspU1169X8eu/vhWbzR5ZDt+8qDwmpePatSqefnoTdrsdr9fH1FQDfn9uz6e318HTT2/CarXi8XiYnKxGUXbmKcf5I6cOvpTy48DHk07fAQ7qhPUBv5RLeqlR5bjhcEPSYOKmRWG0/8FgDXfvxjuNXRxf6YiVJ3HwTa88JsVHez71DAzEz4Dk8nyMHBsvDlMOlMvoYB7IRLJbHvLe1FRCHh9kCvF8KuuZLyPjcSbu+IRBGG0G43XScw8X3/fUizM3FeHScabrwi5VnMtZiZruvVyqbuirj1Pfy3TrWybPuxBxFo5lZDziOZ7iWrY+JSs9zkL40iwnjuchXPI9MgqbbrhCpJ1LnPllWRqP3btdCKGKeefm5rh7txF1Zjh7dd6ePe7IkWR62sX9+y3kqkTdu1eNMxyWjI+PMTralnOc+/ZpPihCXLvmQFHqc4qvUti3T52NkFLick3T39+M3r3ct28WbSGw1+vj+vUqpNRXgz700FwkzjBXrtgIBmt1w+3fr23pIJmbm+fmTX016P7989G0g8EQV6/aDH2dPvywJ6E8d+406JbnwAEPWmvE6/XR22svmvp4GRmPE8Bx9uxx8Rd/cSF6VkrJu9/dwdhY5uo8zU/lnj1unnnmUvS8oij8wi/M4nbvzThOp/MUfv9h9u5185nPvBE9Pz8/z9vf7sbvP5xxnE1Nl3C797Bv3wx//ddXo+ff974erl1bvobDaj2JojzKvn2z/O3f9kbPh0Ih3vpWNzMz+yJnTgDHeeihWT772b6EON7xjlbu3o0NSGvP56GH5nj22RvR8+9970YuXYr/5ovA4+zfP8/nP38rIc6f/dlahoe1+qamvX//PF/84p2EcO96Vzu9vTFfp1p5Hn7Yw5e+dDd6XlEUjh+fjqtvapwHDnj48pfvR8NJKXnb2xq4ebM46uNcdB5lhZEyVAhBbW12DmEdDn1Vn9VqTXvbgGSqq6t1z9fW1madz5oa/e85HMtbiWqk5LTZbEn32Vitm3zvjBxBJztCSuVhrb5+cd3Qc3tSVZWodDbyH2u1Wqmv1zMIiZGqTqf11dOFYNkYD23Xcj3C4ey0aEY+QzQHN/mO00hhuHScxsrE5YxRudVr8WU3vg/J98hYYZwYLlV9S7duJMeR6nmlK15Mla98s2yMh/ZSJt//QCCAyzWt842lMZKBz8/P43Zn56TXSBo/NDSU9R6qMzOL1YeqI97yUyXmk2SnxBrabnLJJL+c4XCY6enEujE3p6+jSPbkHjMQiXEGAgEmJxevutD7YUjOo9+vL2t3uVy4XO5F55MNRSgUYnrapRtHIVhGYx4q1687+a3f2oXVaiUUUhgfH2dmpmPpL+qgVTZVtboLIQTBYJCRkWG83g1Zxak5d+nrq+YDH1BVg17vAsPD1ShKT1Zxer0L0Th/4ze2I6Vkbm6W/v6mrOKrFLTnc+2ag/e/fwtCWPD7/QwPD+HzdS0Kf/WqnV/91W7sdhuKEmZ6eorR0ZUJYbTnc+2ag1/7tU1oA5E3buh3B65csfHUU11YLJboznpud7tOOCv/+T934HA4ooZdHQRdXJ6rV208+eR6hBD4/T6Gh8P4fIvFjJcvW3jXu9qw2ewoSojJySlGRlqWvnF5YhkZD/UXIxCo4erV+H5sLk5h1fA+XxVvvBFfeVYvCpNpnF6vk8uXtTGVZmKeC7KPc2HBwaVLWr+5OYf4KoXY87l0aennEwjUcOVKfN3Qu0ex53PhgvZ8Gg3D+f3VXLwYP76if99DoTreeCN+LMQ4Tq/XyfnzWtp1wEqdsGp5Ll6ML49enIVjGRmPSlH8FTvO8lIl5pd076VIM9xScWajUs5X2tnGWThMB8gmJg8ARu9RxKWguW9L/okZVqfzFBaLwO8PxI3yl4v0O5bP6uozSBnG5/NHzutLr9XyWCKbVGszDIvl3DbbK9jtdsLhcNyAnn6catoSv98fN5hXyHsUS7uq6nT0+SwuT3bLB6qr1fvg9/siP1a5xWezncThcBIOK5F7ZPx8qqtPR8dwcitPAcnWAXIx/kjhuFUIUQCntsVzSFvcfGbq+DmTcpfyHhUi7WLHV/h7GWnBp3IkXhIHyCVD3WJPFi29gwdjnpyCwRCXLlGWTogPHozttfrGGxa8Xid6eTx0KBYuGAxy8aJ+eQ4fjk0fSim5eFEdJNSL8/Dh2NS217vA5csWiuW098iRWNrBYIjz55Wcn8+RIzEPdJcvCzwee07xHT2aOLV84ULY8Pk88kgsbDAY4uzZYNblKdTG2xVrPIpBVdVpfL5DHDy4wFe+Mphw7U1vsjA0VB5OiNesucHw8GYOHvTy1a8OR8+/4x2tnDsXU8lq5Tl0yMvXvjaaEMexY0pceVTp9eHDPr7xjfGEcD//8/VcuhSbXWhpucz09G4OH/bzrW9NRM9LKdm718309K78FTSJqqpT+HyHOXLEz7e/najXOHBgPqvn09LyBtPTuzhyJMB3v+uKnn/725t47bUUXzTkBHCco0eDfO97idqgt761ltNxvq2rq0/j9R7ikUeCfP/789HzUkp2754um/qmUfYisVSti0JZVI3UTm7Lx+4aSaWT70+qvWZTlTVVHKnSztfetkYIYZznbOuGsaQ//3Ut+Z4blUeVnetL15ci1X3IteVe9sajlCSrCjUURWF2tny0E0bOcZMVsqnKMz8fXx61UunVrWQV7Py8virW7XYX3O+mkQI4GAzmVa0L6UvOjVl8M5MdJQcCgUVhgOg+v9lQyB/YsjcepWx5aLMq8esdQqEQ//Iv/4LL5TL6WtGJSaxj98rlcjEwMJAQThu1Ty7Pd7/7Xd3K6fF44mT/kv7+fu7fv58QZmFBfUnjp879fj9f/OIXDY1VvtBe6GAwlHDuq1/9Km63O6s4NbVuvPTb6/UyNDRk9JW0mJycTLjvk5OT9Pf3J4TR1q/ES9mDwSDf+c53CiI7z7XlUT5t7xRIKQ0NRTEGTi9ehCeesGC323G7vbjd+5Fyd0HTzAStop8/H+bNb7bj9wdwuyUezwbd8BcuSB5/XGKzWXG5PMzMHNItz9WrNg4dWqC+voGFBQ9TU1YCgc26cZ47F+LYsRAgmJqaYW7ubcCePJUwNefPhzl0aAGbzc7s7CzT00dzfj6vvx7kyBF1OnVqaoq5uY05xXfjRg07dgzQ3NxCMBhkYmIWr1f/Xp49G2TvXjcOhwOXy8X09PasylPILguYxmMJYk6IYzvOrdcNU1rUPIRCddy5o+cqIFH+nOgk2rg8UjYyPt7I+Dg6JMaZ6LS3WPco5oT4/v18OQyOlefuXb3yZBcfNDE93URsHV6XTphY2jGnysnrstJP3zQeaVA4A1IpDmkrQVJdCCpB6p9JHvNXnkJ36aEC5Olxx0ta0vyXJT6+EzrXs3GcWwlkUu5KiDMTB8j5Trv4z3ypd0Vnacfylqen6rpAMcY+jqe4lq3j3ErgeIprleD4udRpF/+ZF6PVARVkPEC1mKn0CIU0II88Ehspd7tdXL3qwMip8qOParM0Qc6eDRk6ua0Ejh2LH/lXlY65lufYscSZjHyoQR97LBbn7Owcly6hq259/PFY/QiFQpw+7c+5PI8/Hjv2eDx5KU+2LKXXyeuC0lKvX1lqbUvyXyqdfr7XvNjtr0iQ8pFHgtLtdkf/XC6XbG3tjaw1+LEUQsiNG+9LkPLRR0Nybm4u+rdnz3Q0XL7yVfi/H0uQ8tixkPR4PAl/u3ZNZlUeIV6MxKlIn8+X8Kfdu0zjdDjU5/PYY4oMBALRP7/fL9varsfFqZbn8cfDUlGUhL89e1w5lefxx+UienqyK0+ufzm8G1mtbSl7nUcyS7UslurvZYLTqe8AWQhBXV3sV8VisRg6LzZyeFzOpLp/Rs6Wl8JqNa5qRk6Hl8Jm01eDCiESnAmnUqJWVek/46XTNm60x9eNYpFOvc93q7zijAcUz4AYKf5AFUJphMNhw7B+v3Ec5Uqq+xsvyMqEVM1lTZiVKbGl6qmvpXIKHAik51g4k7SzLU+2lMJwQAUbj2IYECP58/379xmPEz9IKRkeHlkUTvN3WqkkO+0NhUJZlydeqRrP+Pg4IyOL7106aAY8uSr09fUxMTG5KHyyw+RAIMDY2OiicOlgVJ65uTlGRrKLMxvSNRyFMB4VNWAaz1KzLxBrfud6486eDfLEExasVivz8x7u3w8QCGxLCDM7q8q7L1wI88QTVoLBACMj45Fd4CqT118PcPRoEKezimAwyOjoKCMjrTnFeeaMn6NHQ9jtDvx+H/fuTTE7252HOBWsVhuzs7P093sXPR81XICHH/bhdDoJBPwMD48wOppbeU6d8nLgQBiHw8nCwgL9/f3Mzi52vlwI0v2BLNQkQsUaD1h69gViNzg76xtzcnvunHauBn2nyup/j8fOmTN2oJpiO6TNHzHFamyXtGqgYVGYTOMMBGo4f147VwXszTlOv7+as2fj49R3gBwK1XHhgvbJSb7KE0u7Edi9KEy+yaRVXUh3nRVtPCA9AwLZtkLypQ4sFyVquiwHx8/xcRbCYXBplLXlYjigghSmS5GuPwooXB/QxKRQZDqGl6HhWN4K06VItwUCiV0ZKFyf0MQkF7Id9C/WzgJLvm1CiC8KIcaFEFfizrUIIf5NCHEz8r85cl4IIT4jhLglhLgshHgo7jtPRsLfFEI8WYjChMPhjAyB9nAsFgsWi6Vosl4TEyPi62Sm9VFKWdQtSZbstgghHgPmgS9LKXdGzn0KmJZSflII8VGgWUr5ESHEW4APAm8BDgHPSCkPCSFagLPAw6iKtnPAfimla4m0s2oS5FMoZmJSCeTYFc+q27Jky0NK+RKQvFP024DnIsfPAf8x7vyXIyrdU0CTEKId+Cng36SU0xGD8W/AT2ea2XTRLLDZHTFZ7pSyrmc75tEqpdSUPaOANlneAcT7qRuMnDM6vwghxNPA01nmK4GoBj+DwVQTk0qh1Lsm5jxgKqWU2XYvDOJ7FngWsu+2JBMOh82ujMmyoVxmC7P9SR6LdEeI/Ne02kNAZ1y4tZFzRueLhta8M7szJpVIOdbfbI3HC4A2Y/Ik8L24878SmXU5DMxEujf/CrxZCNEcmZl5c+RcSYjvJ5bLgzAxSUarn+VkMOJZstsihPgaqquklUKIQeDjwCeBbwoh3gv0A78cCf7PqDMtt4AF4CkAKeW0ECLeJ9t/k1ImD8IWHT2dh9a1Mbs4JsWkEjVH5a4wnQP6Sp2PNFkJLF7KWX5USj6hcvJaKfkE/byul1Ku0gucinJXmPZlM/9cCoQQZyshr5WST6icvFZKPiG/eTXnME1MTLLCNB4mJiZZUe7G49lSZyADKiWvlZJPqJy8Vko+IY95LesBUxMTk/Kl3FseJiYmZYppPExMTLKibI2HEOKnhRB9Ed8gHy1xXjqFED8WQvQKIa4KIX47cj5jvyZFyq9VCHFBCPGDyOcuIcTpSH6+IYRwRM47I59vRa5vKHI+m4QQzwshrgshrgkhjpTxPf2dyLO/IoT4mhCiqhzuqyilv51cd3UrxB9gBW4D3YADuARsL2F+2oGHIsf1wA1gO/Ap4KOR8x8F/kfk+C3A/0J1nnkYOF3k/P4u8FXgB5HP3wTeGTn+LPDrkePfAD4bOX4n8I0i5/M54H2RYwfQVI73FHUF+F2gOu5+vqcc7ivwGPAQcCXuXEb3EGgB7kT+N0eOm5dMu5iVJYMbcgT417jPHwM+Vup8xeXne8BPoqpf2yPn2lFFbQCfA94VFz4argh5Wwv8O/Am4AeRijIJ2JLvLer6oiORY1sknChSPhsjL6RIOl+O91RzKdESuU8/QPVRUxb3FdiQZDwyuofAu4DPxZ1PCGf0V67dlrT9fxSbSBN0H3CazP2aFIO/Aj4MaM4eVgBuKaW2xVl8XqL5jFyfiYQvBl3ABPClSBfr80KIWsrwnkoph4A/BwaAEdT7dI7yvK9QQH878ZSr8ShLhBB1wLeB/yqlnI2/JlWTXdJ5byHEW4FxKeW5JQOXHhtqc/vvpJT7AA9qEztKOdxTgMiYwdtQDd4aoJYCesLLJ4W8h+VqPEru/yMZIYQd1XD8k5TyO5HTmfo1KTSPAD8vhLgHfB216/IMqjtIbR1TfF6i+YxcbwSmipBPUH/dBqWUpyOfn0c1JuV2TwH+A3BXSjkhpQwC30G91+V4X6FI/nbK1Xi8DmyKjGY7UAedXihVZoS6Pv8LwDUp5V/EXcrUr0lBkVJ+TEq5Vkq5AfWe/UhK+W7gx8AvGuRTy/8vRsIX5ZdeSjkK3BdCbImcegLopczuaYQB4LAQoiZSF7S8lt191Um/cP52ijHglOUg0FtQZzVuA79f4rw8itr0uwxcjPy9BbUf++/ATeB/Ay2R8AL4m0je3wAeLkGejxObbekGzqD6WfkW4Iycr4p8vhW53l3kPO5F9ap/Gfj/UEf6y/KeAp8ArgNXgK+g7ldZ8vsKfA11HCaI2pp7bzb3EPjVSH5vAU+lk7YpTzcxMcmKcu22mJiYlDmm8TAxMckK03iYmJhkhWk8TExMssI0HiYmJllhGg8TE5OsMI2HiYlJVvz/38RUAQbzZRQAAAAASUVORK5CYII=\n", - "text/plain": [ - "
" - ] - }, - "metadata": { - "needs_background": "light" - }, - "output_type": "display_data" - }, - { - "ename": "NameError", - "evalue": "name 'bbs' is not defined", - "output_type": "error", - "traceback": [ - "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", - "\u001b[0;31mNameError\u001b[0m Traceback (most recent call last)", - "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m\u001b[0m\n\u001b[1;32m 2\u001b[0m \u001b[0;32mfor\u001b[0m \u001b[0mf\u001b[0m \u001b[0;32min\u001b[0m \u001b[0mfiles\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 3\u001b[0m \u001b[0m_\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mcenters\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mget_bb\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mf\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m----> 4\u001b[0;31m \u001b[0mnums\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mget_numbers\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mcenters\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mbbs\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 5\u001b[0m \u001b[0;32mfor\u001b[0m \u001b[0mn\u001b[0m \u001b[0;32min\u001b[0m \u001b[0mnums\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 6\u001b[0m \u001b[0mcounts\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0mn\u001b[0m\u001b[0;34m]\u001b[0m \u001b[0;34m+=\u001b[0m \u001b[0;36m1\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", - "\u001b[0;31mNameError\u001b[0m: name 'bbs' is not defined" - ] - } - ], - "source": [ - "counts = {i:0 for i in range(212)}\n", - "for f in files:\n", - " _, centers = get_bb(f)\n", - " nums = get_numbers(centers, bbs)\n", - " for n in nums:\n", - " counts[n] += 1\n", - "print(counts)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "supposed-brass", - "metadata": {}, - "outputs": [], - "source": [ - "image = io.imread(\"./imgs/codes/snapcode.png\")\n", - "print(image[700][30:-50])\n" - ] - }, - { - "cell_type": "code", - "execution_count": 21, - "id": "athletic-gravity", - "metadata": {}, - "outputs": [ - { - "ename": "NameError", - "evalue": "name 'image' is not defined", - "output_type": "error", - "traceback": [ - "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", - "\u001b[0;31mNameError\u001b[0m Traceback (most recent call last)", - "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m\u001b[0m\n\u001b[0;32m----> 1\u001b[0;31m \u001b[0mbinary\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mimage\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;36m0\u001b[0m\u001b[0;34m]\u001b[0m \u001b[0;34m>\u001b[0m \u001b[0;36m250\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 2\u001b[0m \u001b[0mbinary\u001b[0m \u001b[0;34m&=\u001b[0m \u001b[0mimage\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;36m1\u001b[0m\u001b[0;34m]\u001b[0m \u001b[0;34m>\u001b[0m \u001b[0;36m250\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 3\u001b[0m \u001b[0mbinary\u001b[0m \u001b[0;34m&=\u001b[0m \u001b[0mimage\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;36m2\u001b[0m\u001b[0;34m]\u001b[0m \u001b[0;34m<\u001b[0m \u001b[0;36m5\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 4\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 5\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n", - "\u001b[0;31mNameError\u001b[0m: name 'image' is not defined" - ] - } - ], - "source": [ - "binary = image[:,:,0] > 250\n", - "binary &= image[:,:,1] > 250\n", - "binary &= image[:,:,2] < 5\n", - "\n", - "\n", - "l = label(binary, background=0)\n", - "rp = regionprops(l)\n", - "bbox = rp[0].bbox\n", - "print(rp)\n", - "print(bbox)\n", - "binary = binary[bbox[0]:bbox[2], bbox[1]:bbox[3]]\n" - ] - }, - { - "cell_type": "code", - "execution_count": 22, - "id": "prime-curtis", - "metadata": {}, - "outputs": [], - "source": [ - "def threshold_and_crop(filepath, color=[250, 250, 5]):\n", - " im = io.imread(filepath)\n", - " binary = im[:,:,0] > color[0]\n", - " binary &= im[:,:,1] > color[1]\n", - " binary &= im[:,:,2] < color[2]\n", - " #io.imshow(img_as_ubyte(binary))\n", - " labeled = label(binary, background=0)\n", - " rp = regionprops(labeled)\n", - " max_size = 0\n", - " bbox = None\n", - " for r in rp:\n", - " if r.bbox_area > max_size:\n", - " bbox = r.bbox\n", - " max_size = r.bbox_area\n", - " return im[bbox[0]:bbox[2], bbox[1]:bbox[3], :]\n", - "\n" - ] - }, - { - "cell_type": "code", - "execution_count": 23, - "id": "binding-savannah", - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "array([[[0, 0, 0, 0],\n", - " [0, 0, 0, 0],\n", - " [0, 0, 0, 0],\n", - " ...,\n", - " [0, 0, 0, 0],\n", - " [0, 0, 0, 0],\n", - " [0, 0, 0, 0]],\n", - "\n", - " [[0, 0, 0, 0],\n", - " [0, 0, 0, 0],\n", - " [0, 0, 0, 0],\n", - " ...,\n", - " [0, 0, 0, 0],\n", - " [0, 0, 0, 0],\n", - " [0, 0, 0, 0]],\n", - "\n", - " [[0, 0, 0, 0],\n", - " [0, 0, 0, 0],\n", - " [0, 0, 0, 0],\n", - " ...,\n", - " [0, 0, 0, 0],\n", - " [0, 0, 0, 0],\n", - " [0, 0, 0, 0]],\n", - "\n", - " ...,\n", - "\n", - " [[0, 0, 0, 0],\n", - " [0, 0, 0, 0],\n", - " [0, 0, 0, 0],\n", - " ...,\n", - " [0, 0, 0, 0],\n", - " [0, 0, 0, 0],\n", - " [0, 0, 0, 0]],\n", - "\n", - " [[0, 0, 0, 0],\n", - " [0, 0, 0, 0],\n", - " [0, 0, 0, 0],\n", - " ...,\n", - " [0, 0, 0, 0],\n", - " [0, 0, 0, 0],\n", - " [0, 0, 0, 0]],\n", - "\n", - " [[0, 0, 0, 0],\n", - " [0, 0, 0, 0],\n", - " [0, 0, 0, 0],\n", - " ...,\n", - " [0, 0, 0, 0],\n", - " [0, 0, 0, 0],\n", - " [0, 0, 0, 0]]], dtype=uint8)" - ] - }, - "execution_count": 23, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "threshold_and_crop(\"./imgs/codes/snapcode.png\")" - ] - }, - { - "cell_type": "code", - "execution_count": 24, - "id": "bottom-savings", - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "array([[[0, 0, 0, 0],\n", - " [0, 0, 0, 0],\n", - " [0, 0, 0, 0],\n", - " ...,\n", - " [0, 0, 0, 0],\n", - " [0, 0, 0, 0],\n", - " [0, 0, 0, 0]],\n", - "\n", - " [[0, 0, 0, 0],\n", - " [0, 0, 0, 0],\n", - " [0, 0, 0, 0],\n", - " ...,\n", - " [0, 0, 0, 0],\n", - " [0, 0, 0, 0],\n", - " [0, 0, 0, 0]],\n", - "\n", - " [[0, 0, 0, 0],\n", - " [0, 0, 0, 0],\n", - " [0, 0, 0, 0],\n", - " ...,\n", - " [0, 0, 0, 0],\n", - " [0, 0, 0, 0],\n", - " [0, 0, 0, 0]],\n", - "\n", - " ...,\n", - "\n", - " [[0, 0, 0, 0],\n", - " [0, 0, 0, 0],\n", - " [0, 0, 0, 0],\n", - " ...,\n", - " [0, 0, 0, 0],\n", - " [0, 0, 0, 0],\n", - " [0, 0, 0, 0]],\n", - "\n", - " [[0, 0, 0, 0],\n", - " [0, 0, 0, 0],\n", - " [0, 0, 0, 0],\n", - " ...,\n", - " [0, 0, 0, 0],\n", - " [0, 0, 0, 0],\n", - " [0, 0, 0, 0]],\n", - "\n", - " [[0, 0, 0, 0],\n", - " [0, 0, 0, 0],\n", - " [0, 0, 0, 0],\n", - " ...,\n", - " [0, 0, 0, 0],\n", - " [0, 0, 0, 0],\n", - " [0, 0, 0, 0]]], dtype=uint8)" - ] - }, - "execution_count": 24, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "threshold_and_crop(\"imgs/new/29939adc9b4ffa549817d3c2eb3fc04b (1).png\")" - ] - }, - { - "cell_type": "code", - "execution_count": 25, - "id": "unlimited-marking", - "metadata": {}, - "outputs": [], - "source": [ - "files = os.listdir(\"imgs/people\")\n", - "files = [os.path.join(\"imgs/people\", f) for f in files if f.endswith(\".jpeg\")]" - ] - }, - { - "cell_type": "code", - "execution_count": 26, - "id": "white-horizon", - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "imgs/people/FECYsfjXwAIEYmJ.jpeg\n" - ] - }, - { - "ename": "TypeError", - "evalue": "'NoneType' object is not subscriptable", - "output_type": "error", - "traceback": [ - "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", - "\u001b[0;31mTypeError\u001b[0m Traceback (most recent call last)", - "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m\u001b[0m\n\u001b[1;32m 1\u001b[0m \u001b[0mprint\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mfiles\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;36m9\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m----> 2\u001b[0;31m \u001b[0mthreshold_and_crop\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mfiles\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;36m9\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m", - "\u001b[0;32m\u001b[0m in \u001b[0;36mthreshold_and_crop\u001b[0;34m(filepath, color)\u001b[0m\n\u001b[1;32m 13\u001b[0m \u001b[0mbbox\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mr\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mbbox\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 14\u001b[0m \u001b[0mmax_size\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mr\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mbbox_area\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m---> 15\u001b[0;31m \u001b[0;32mreturn\u001b[0m \u001b[0mim\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0mbbox\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;36m0\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0mbbox\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;36m2\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mbbox\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;36m1\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0mbbox\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;36m3\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m:\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 16\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n", - "\u001b[0;31mTypeError\u001b[0m: 'NoneType' object is not subscriptable" - ] - } - ], - "source": [ - "print(files[9])\n", - "threshold_and_crop(files[9])\n" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "noted-andorra", - "metadata": {}, - "outputs": [], - "source": [] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "returning-saying", - "metadata": {}, - "outputs": [], - "source": [] - }, - { - "cell_type": "code", - "execution_count": 27, - "id": "ranking-argument", - "metadata": {}, - "outputs": [], - "source": [ - "def get_bb_2(filepath):\n", - " im = threshold_and_crop(filepath)\n", - " p = get_points_2(im)\n", - " l = label(p, background=1)\n", - " rp = regionprops(l)\n", - " #fig, ax = plt.subplots()\n", - " #ax.imshow(l, cmap=plt.cm.gray)\n", - " minx, miny, (maxx, maxy) = 0, 0, l.shape\n", - " max_size = l.shape[0] * l.shape[1] // 500\n", - " min_size = l.shape[0] * l.shape[1] // 2000\n", - "\n", - " bbs = []\n", - " centers = []\n", - " for props in rp:\n", - " y0, x0 = props.centroid\n", - " minr, minc, maxr, maxc = props.bbox\n", - " bx = (minc, maxc, maxc, minc, minc)\n", - " by = (minr, minr, maxr, maxr, minr)\n", - " if props.bbox_area < max_size and props.bbox_area > min_size:\n", - " bbs.append((props.bbox[0] / maxx, props.bbox[1] / maxx, props.bbox[2] / maxx, props.bbox[3] / maxx))\n", - " centers.append(\n", - " (\n", - " (((minr / maxy) + (maxr / maxy)) / 2), \n", - " (((minc / maxx) + (maxc / maxx)) / 2)\n", - " ),\n", - " )\n", - " # ax.plot(bx, by, '-b', linewidth=2.5)\n", - " #ax.axis()\n", - " #plt.show()\n", - " return bbs, centers" - ] - }, - { - "cell_type": "code", - "execution_count": 28, - "id": "distinguished-ocean", - "metadata": {}, - "outputs": [], - "source": [ - "n = [os.path.join(\"imgs/new\", f) for f in os.listdir('imgs/new') if f.endswith('.png')]" - ] - }, - { - "cell_type": "code", - "execution_count": 29, - "id": "moved-chester", - "metadata": {}, - "outputs": [], - "source": [ - "files += n" - ] - }, - { - "cell_type": "code", - "execution_count": 31, - "id": "permanent-interpretation", - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "[1, 3, 4, 5, 6, 7, 8, 9, 11, 12, 13, 15, 18, 19, 20, 21, 23, 25, 28, 31, 32, 33, 34, 38, 39, 42, 43, 46, 47, 48, 50, 51, 54, 57, 58, 64, 65, 67, 68, 70, 71, 74, 77, 82, 83, 90, 91, 93, 94, 96, 108, 111, 113, 115, 117, 124, 125, 127, 130, 132, 136, 139, 141, 143, 147, 148, 150, 151, 153, 154, 156, 159, 160, 162, 163, 164, 165, 166, 167, 168, 169, 173, 177, 179, 181, 182, 185, 186, 187, 188, 192, 193, 196, 199, 201, 202, 204, 205, 210]\n", - "[1, 2, 3, 5, 6, 7, 8, 12, 14, 18, 20, 21, 23, 24, 25, 26, 29, 34, 38, 39, 41, 42, 45, 47, 48, 55, 58, 61, 64, 68, 72, 75, 82, 83, 91, 93, 94, 98, 100, 101, 105, 115, 119, 122, 124, 125, 129, 131, 132, 133, 136, 138, 141, 142, 147, 151, 152, 154, 157, 158, 159, 161, 164, 165, 166, 168, 171, 174, 179, 181, 184, 185, 189, 193, 196, 197, 199, 200, 202, 203, 204, 205, 206, 208, 209, 210]\n", - "[2, 4, 5, 8, 10, 13, 14, 15, 18, 19, 22, 23, 24, 30, 32, 38, 40, 41, 42, 44, 48, 49, 51, 55, 56, 57, 58, 60, 63, 64, 66, 68, 72, 75, 76, 77, 79, 80, 82, 83, 90, 91, 93, 94, 96, 104, 105, 108, 110, 111, 112, 116, 119, 122, 123, 124, 126, 127, 131, 133, 139, 143, 147, 149, 150, 151, 159, 160, 161, 162, 165, 166, 168, 169, 170, 172, 174, 177, 179, 180, 181, 183, 185, 186, 193, 197, 198, 199, 200, 201, 202, 205, 206, 207, 208, 209, 210]\n", - "[4, 8, 11, 12, 13, 14, 18, 19, 22, 23, 25, 26, 27, 28, 29, 30, 31, 32, 34, 38, 39, 40, 41, 44, 46, 47, 48, 55, 58, 59, 60, 61, 65, 68, 69, 72, 73, 74, 75, 76, 77, 80, 82, 90, 91, 93, 94, 96, 98, 99, 101, 104, 105, 108, 110, 111, 112, 114, 115, 118, 119, 120, 122, 125, 132, 133, 136, 139, 143, 145, 147, 148, 153, 156, 157, 158, 160, 161, 162, 165, 169, 172, 173, 174, 175, 179, 181, 185, 186, 187, 188, 189, 190, 191, 193, 196, 200, 203, 204, 205, 206, 208]\n", - "[2, 3, 4, 5, 7, 12, 15, 18, 19, 22, 25, 26, 28, 31, 38, 39, 40, 41, 42, 43, 45, 46, 47, 48, 51, 52, 53, 54, 56, 58, 65, 66, 68, 72, 74, 76, 78, 79, 81, 82, 83, 84, 90, 91, 93, 94, 96, 97, 98, 101, 104, 108, 110, 112, 115, 116, 122, 125, 129, 132, 133, 135, 143, 144, 147, 148, 149, 156, 159, 165, 167, 168, 170, 171, 173, 177, 179, 182, 183, 184, 187, 189, 191, 192, 193, 198, 199, 200, 201, 202, 204, 205, 206, 207, 210]\n", - "[1, 2, 3, 4, 5, 7, 9, 10, 11, 12, 13, 15, 18, 19, 20, 22, 25, 27, 29, 32, 38, 40, 41, 46, 47, 50, 52, 53, 56, 57, 61, 64, 66, 69, 71, 72, 75, 76, 77, 79, 80, 81, 83, 90, 91, 93, 94, 96, 97, 99, 101, 104, 105, 108, 110, 115, 117, 119, 121, 123, 124, 125, 126, 127, 129, 133, 135, 138, 141, 142, 143, 144, 147, 149, 150, 154, 157, 159, 161, 165, 167, 168, 169, 170, 171, 177, 179, 181, 183, 185, 186, 187, 190, 192, 197, 198, 199, 200, 202, 206, 207, 209, 210]\n", - "[2, 4, 8, 10, 13, 18, 19, 20, 24, 26, 27, 28, 29, 30, 38, 40, 42, 43, 47, 49, 50, 52, 53, 54, 55, 57, 58, 61, 64, 66, 67, 70, 75, 77, 78, 82, 84, 90, 91, 93, 94, 96, 100, 101, 103, 108, 111, 115, 119, 120, 123, 130, 131, 134, 140, 141, 142, 143, 147, 149, 152, 153, 156, 157, 160, 164, 165, 166, 167, 173, 175, 177, 180, 181, 185, 186, 187, 188, 189, 193, 196, 197, 199, 201, 202, 203, 205, 206, 207]\n", - "[4, 5, 7, 8, 12, 13, 14, 18, 20, 21, 25, 28, 29, 31, 32, 38, 39, 42, 43, 46, 48, 51, 52, 53, 57, 61, 64, 66, 72, 75, 77, 78, 80, 81, 82, 83, 90, 91, 93, 94, 96, 97, 98, 101, 103, 104, 105, 108, 111, 112, 114, 117, 120, 121, 122, 124, 125, 129, 132, 136, 141, 143, 147, 149, 150, 154, 157, 158, 160, 161, 163, 164, 168, 169, 174, 175, 180, 184, 186, 187, 188, 196, 197, 203, 205, 206, 207, 208]\n", - "[2, 3, 4, 5, 7, 9, 11, 14, 18, 22, 23, 25, 27, 28, 30, 32, 34, 38, 39, 41, 42, 44, 46, 48, 50, 54, 55, 56, 59, 60, 61, 65, 67, 68, 69, 71, 72, 74, 76, 78, 79, 81, 83, 84, 90, 91, 93, 94, 96, 99, 100, 103, 104, 105, 108, 110, 111, 112, 113, 114, 117, 119, 122, 123, 124, 125, 130, 131, 132, 135, 136, 138, 139, 143, 144, 147, 148, 149, 151, 152, 154, 160, 161, 164, 166, 169, 170, 172, 177, 180, 181, 182, 183, 186, 187, 190, 196, 197, 198, 199, 200, 203, 205, 207, 209, 210]\n", - "imgs/people/FECYsfjXwAIEYmJ.jpeg\n", - "[3, 4, 6, 9, 14, 18, 22, 23, 26, 27, 29, 30, 33, 34, 38, 40, 42, 43, 44, 46, 49, 50, 53, 55, 57, 61, 66, 71, 72, 73, 74, 77, 83, 90, 91, 93, 94, 96, 98, 99, 100, 104, 105, 111, 112, 114, 115, 118, 120, 122, 123, 126, 130, 132, 133, 135, 136, 137, 140, 141, 145, 147, 148, 149, 151, 154, 156, 158, 161, 162, 165, 171, 174, 177, 179, 184, 186, 189, 196, 199, 200, 201, 203, 207, 209, 210]\n", - "[1, 2, 8, 11, 13, 14, 18, 20, 21, 23, 24, 25, 26, 27, 28, 29, 32, 33, 38, 40, 41, 42, 45, 48, 50, 56, 57, 58, 59, 61, 67, 69, 72, 73, 74, 75, 77, 80, 81, 82, 90, 91, 93, 94, 96, 98, 99, 101, 106, 111, 113, 114, 115, 121, 123, 124, 126, 127, 129, 130, 139, 141, 142, 143, 144, 147, 148, 150, 156, 157, 159, 162, 163, 169, 170, 172, 173, 174, 175, 177, 179, 180, 182, 183, 184, 185, 187, 188, 190, 192, 197, 198, 201, 203, 204, 206, 207, 208, 209, 210]\n", - "[1, 2, 3, 4, 5, 7, 9, 10, 11, 12, 13, 15, 18, 19, 20, 22, 25, 27, 29, 32, 38, 40, 41, 46, 47, 50, 52, 53, 56, 57, 61, 64, 66, 69, 71, 72, 75, 76, 77, 79, 80, 81, 83, 90, 91, 93, 94, 96, 97, 99, 101, 104, 105, 108, 110, 115, 117, 119, 121, 123, 124, 125, 126, 127, 129, 133, 135, 138, 141, 142, 143, 144, 147, 149, 150, 154, 157, 159, 161, 165, 167, 168, 169, 170, 171, 177, 179, 181, 183, 185, 186, 187, 190, 192, 197, 198, 199, 200, 202, 206, 207, 209, 210]\n", - "[1, 2, 3, 6, 9, 11, 12, 13, 14, 15, 18, 20, 22, 26, 27, 30, 32, 34, 38, 41, 43, 44, 45, 48, 53, 54, 56, 58, 59, 60, 65, 66, 68, 70, 71, 72, 75, 76, 78, 79, 82, 90, 91, 93, 94, 96, 100, 101, 102, 104, 107, 108, 110, 111, 112, 115, 116, 118, 119, 120, 131, 132, 133, 136, 137, 142, 143, 144, 148, 150, 152, 153, 154, 156, 159, 160, 161, 162, 164, 165, 166, 167, 168, 173, 177, 179, 181, 185, 186, 187, 188, 190, 193, 196, 198, 199, 200, 201, 204, 207, 208, 210]\n", - "[1, 2, 4, 5, 7, 8, 10, 11, 14, 18, 20, 23, 27, 30, 32, 33, 38, 39, 41, 42, 44, 45, 47, 48, 50, 53, 54, 57, 58, 59, 61, 62, 64, 65, 68, 71, 73, 76, 78, 81, 82, 83, 84, 90, 91, 93, 94, 96, 98, 103, 106, 113, 114, 117, 121, 123, 126, 127, 129, 130, 131, 132, 133, 136, 138, 141, 142, 144, 148, 152, 154, 156, 158, 160, 164, 166, 167, 169, 172, 173, 175, 185, 186, 190, 191, 196, 199, 200, 203, 208]\n", - "[1, 2, 3, 4, 5, 7, 9, 10, 11, 18, 19, 24, 25, 26, 27, 29, 30, 38, 40, 43, 44, 45, 47, 48, 56, 57, 60, 61, 67, 69, 71, 72, 79, 91, 93, 97, 98, 103, 115, 116, 117, 122, 127, 129, 130, 135, 137, 151, 163, 164, 165, 169, 171, 177, 178, 179, 182, 184, 186, 187, 188, 190, 197, 199, 204, 205, 207, 208]\n", - "[1, 2, 4, 5, 7, 10, 12, 13, 14, 18, 19, 20, 22, 24, 25, 26, 27, 28, 32, 34, 38, 39, 43, 44, 46, 47, 48, 49, 56, 58, 63, 66, 68, 69, 70, 71, 73, 74, 79, 80, 90, 91, 93, 94, 96, 98, 100, 101, 104, 105, 108, 115, 116, 117, 118, 119, 122, 123, 124, 125, 126, 131, 132, 133, 135, 136, 138, 139, 140, 141, 143, 147, 149, 150, 151, 157, 165, 166, 167, 169, 170, 174, 177, 181, 183, 186, 189, 196, 201, 203, 206, 210]\n", - "[1, 2, 5, 7, 11, 13, 14, 15, 18, 19, 20, 21, 25, 26, 27, 29, 30, 32, 33, 38, 39, 40, 42, 44, 45, 50, 53, 54, 56, 57, 58, 69, 71, 73, 74, 76, 77, 80, 83, 84, 90, 91, 93, 94, 96, 97, 98, 105, 108, 112, 114, 116, 118, 122, 124, 125, 129, 130, 134, 136, 137, 139, 140, 141, 142, 143, 144, 148, 149, 153, 156, 157, 159, 162, 164, 165, 166, 168, 170, 171, 172, 174, 175, 177, 179, 181, 183, 187, 188, 189, 190, 193, 197, 201, 202, 203, 206, 208, 209, 210]\n", - "[1, 2, 4, 9, 10, 12, 14, 18, 22, 25, 27, 28, 30, 31, 34, 38, 39, 40, 41, 43, 44, 45, 49, 50, 54, 57, 61, 62, 64, 65, 66, 68, 69, 70, 72, 73, 74, 75, 79, 90, 91, 93, 94, 96, 101, 102, 103, 104, 105, 108, 111, 114, 117, 125, 126, 127, 128, 131, 133, 135, 137, 138, 139, 140, 142, 143, 149, 152, 157, 160, 162, 167, 172, 173, 174, 175, 177, 179, 180, 181, 185, 187, 196, 197, 198, 199, 200, 201, 204, 205, 206, 207, 208, 210]\n", - "[]\n", - "imgs/people/FEK1L9cXoAgulGK.jpeg\n", - "[3, 6, 7, 8, 9, 11, 12, 15, 18, 21, 22, 25, 28, 31, 32, 34, 38, 39, 40, 42, 43, 48, 50, 52, 55, 56, 57, 58, 61, 62, 65, 68, 72, 73, 76, 78, 79, 80, 82, 90, 91, 93, 94, 96, 97, 99, 101, 102, 105, 108, 110, 111, 112, 115, 116, 118, 119, 120, 122, 123, 127, 129, 131, 133, 134, 135, 136, 137, 143, 149, 151, 154, 156, 159, 161, 164, 165, 166, 167, 168, 169, 170, 171, 174, 177, 179, 180, 181, 182, 184, 185, 186, 187, 190, 191, 196, 198, 200, 201, 203, 204, 205, 209, 210]\n", - "[2, 3, 5, 10, 18, 20, 21, 23, 24, 25, 26, 28, 29, 31, 32, 33, 34, 38, 44, 46, 47, 48, 49, 51, 53, 55, 56, 58, 59, 64, 65, 66, 68, 69, 71, 73, 75, 76, 77, 78, 79, 83, 84, 90, 91, 93, 94, 96, 97, 98, 99, 104, 105, 107, 108, 112, 115, 118, 119, 120, 122, 123, 124, 125, 126, 127, 130, 131, 132, 135, 139, 144, 148, 151, 152, 153, 154, 156, 157, 159, 160, 164, 165, 166, 168, 169, 170, 175, 177, 179, 183, 184, 186, 188, 190, 192, 193, 197, 199, 200, 202, 205, 207, 208, 210]\n", - "[1, 4, 5, 6, 8, 9, 13, 18, 20, 21, 23, 25, 26, 29, 31, 38, 40, 42, 47, 48, 49, 55, 56, 58, 61, 67, 68, 69, 71, 72, 77, 78, 80, 91, 93, 98, 99, 104, 105, 111, 122, 123, 130, 136, 138, 139, 147, 149, 159, 162, 165, 167, 169, 170, 181, 183, 188, 189, 196, 197, 198, 199, 200, 203, 204, 205, 207]\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "[1, 3, 5, 9, 10, 12, 13, 15, 18, 19, 20, 21, 23, 24, 29, 30, 32, 33, 34, 38, 39, 41, 43, 46, 49, 50, 51, 52, 54, 56, 57, 58, 61, 62, 63, 64, 66, 67, 69, 70, 72, 73, 76, 78, 81, 82, 87, 90, 93, 94, 96, 97, 100, 101, 102, 108, 110, 111, 113, 115, 118, 119, 121, 126, 127, 129, 138, 139, 140, 146, 150, 152, 153, 155, 157, 158, 159, 160, 161, 162, 163, 164, 165, 169, 170, 171, 173, 175, 177, 178, 179, 181, 183, 184, 186, 187, 190, 192, 193, 196, 200, 201, 202, 204, 206]\n", - "[3, 4, 7, 8, 9, 10, 13, 15, 18, 19, 20, 22, 23, 27, 28, 29, 34, 38, 39, 41, 42, 44, 45, 49, 50, 51, 54, 55, 56, 57, 59, 62, 65, 68, 69, 70, 72, 73, 75, 77, 78, 79, 80, 82, 83, 87, 90, 93, 94, 96, 97, 98, 99, 100, 101, 102, 103, 105, 108, 109, 112, 114, 118, 121, 128, 129, 131, 134, 135, 136, 137, 139, 141, 144, 147, 148, 150, 151, 152, 154, 155, 157, 159, 161, 162, 164, 166, 170, 171, 172, 173, 177, 178, 180, 182, 186, 187, 190, 191, 196, 198, 200, 201, 203, 205, 206, 209, 210]\n", - "[1, 2, 4, 6, 7, 8, 9, 11, 12, 14, 18, 19, 21, 28, 29, 30, 31, 32, 33, 38, 39, 42, 44, 45, 48, 49, 50, 52, 53, 54, 56, 60, 63, 65, 67, 68, 71, 72, 75, 76, 87, 90, 93, 94, 96, 97, 98, 104, 107, 114, 117, 118, 120, 122, 123, 124, 126, 130, 134, 138, 140, 144, 145, 148, 149, 150, 153, 154, 155, 158, 159, 161, 162, 164, 165, 166, 169, 172, 180, 181, 183, 185, 186, 189, 191, 192, 193, 196, 200, 202, 204, 205, 206, 209, 210]\n", - "[6, 9, 11, 14, 18, 20, 22, 26, 28, 30, 31, 33, 38, 39, 41, 42, 43, 44, 45, 48, 51, 52, 54, 59, 60, 61, 63, 65, 66, 69, 70, 74, 75, 77, 78, 79, 80, 84, 87, 90, 93, 94, 96, 97, 98, 100, 101, 102, 103, 107, 109, 111, 115, 116, 118, 119, 121, 124, 125, 127, 128, 131, 132, 135, 136, 138, 139, 141, 144, 150, 151, 152, 153, 155, 158, 160, 163, 167, 169, 170, 172, 177, 178, 181, 184, 186, 192, 196, 198, 199, 200, 203, 205, 208, 209]\n", - "[3, 4, 6, 8, 9, 10, 11, 12, 18, 20, 21, 23, 25, 26, 27, 31, 33, 34, 38, 39, 41, 42, 43, 48, 51, 53, 55, 60, 61, 63, 64, 65, 67, 68, 70, 72, 78, 79, 80, 81, 87, 90, 93, 94, 96, 98, 99, 101, 105, 109, 114, 115, 116, 120, 121, 122, 123, 126, 128, 130, 132, 133, 134, 136, 138, 139, 140, 145, 148, 149, 151, 153, 155, 158, 159, 164, 166, 169, 171, 174, 178, 179, 180, 182, 183, 185, 187, 188, 189, 193, 197, 199, 201, 203, 204, 207]\n", - "[1, 4, 8, 9, 10, 11, 18, 19, 21, 23, 24, 26, 27, 28, 29, 30, 32, 33, 38, 39, 42, 43, 47, 48, 50, 51, 52, 54, 55, 56, 57, 59, 61, 62, 65, 66, 67, 69, 71, 72, 73, 74, 78, 79, 82, 87, 90, 93, 94, 96, 105, 108, 111, 112, 113, 114, 115, 117, 120, 121, 126, 130, 131, 133, 136, 137, 138, 144, 147, 152, 154, 155, 157, 161, 164, 165, 168, 169, 170, 171, 172, 177, 179, 182, 183, 184, 185, 187, 188, 190, 191, 198, 200, 201, 202, 207, 210]\n", - "[1, 4, 6, 7, 14, 15, 18, 19, 26, 28, 29, 32, 33, 34, 38, 39, 41, 43, 44, 45, 46, 47, 50, 51, 52, 53, 54, 55, 56, 57, 63, 64, 65, 66, 67, 76, 77, 79, 81, 82, 83, 87, 90, 93, 94, 96, 97, 100, 101, 103, 104, 105, 107, 116, 119, 120, 122, 126, 127, 128, 130, 132, 133, 137, 138, 139, 140, 144, 146, 148, 149, 152, 154, 155, 157, 158, 161, 168, 170, 171, 172, 173, 178, 180, 181, 183, 184, 185, 188, 190, 191, 198, 199, 200, 201, 202, 205, 207, 208, 209]\n", - "[3, 5, 6, 10, 13, 15, 18, 20, 21, 23, 24, 25, 28, 29, 30, 32, 34, 38, 39, 42, 46, 50, 56, 58, 60, 62, 64, 65, 67, 70, 72, 73, 75, 76, 78, 81, 84, 87, 90, 93, 94, 96, 100, 102, 107, 108, 109, 115, 118, 119, 120, 121, 122, 123, 124, 125, 127, 128, 130, 132, 134, 138, 145, 146, 147, 150, 151, 153, 155, 157, 159, 161, 163, 164, 166, 169, 173, 175, 178, 179, 180, 182, 183, 184, 186, 187, 190, 192, 193, 197, 200, 203, 204, 205]\n", - "[2, 3, 6, 7, 8, 9, 11, 12, 13, 18, 19, 21, 23, 28, 29, 30, 31, 33, 34, 38, 39, 41, 43, 44, 46, 49, 51, 53, 55, 56, 57, 58, 59, 61, 63, 67, 68, 73, 75, 79, 80, 81, 82, 83, 84, 87, 90, 93, 94, 96, 97, 98, 100, 102, 104, 105, 106, 109, 110, 111, 112, 114, 117, 119, 120, 122, 125, 127, 128, 132, 138, 140, 141, 144, 146, 148, 149, 151, 155, 157, 158, 160, 166, 168, 169, 173, 174, 178, 180, 181, 183, 186, 187, 189, 191, 192, 193, 197, 199, 202, 203, 204, 206, 207]\n", - "[1, 3, 6, 8, 9, 11, 12, 13, 18, 19, 20, 23, 24, 27, 31, 33, 38, 39, 41, 42, 43, 44, 46, 47, 49, 51, 52, 55, 56, 58, 59, 61, 62, 64, 65, 70, 72, 73, 74, 75, 76, 77, 79, 82, 83, 84, 87, 90, 93, 94, 96, 97, 98, 100, 102, 110, 111, 113, 116, 117, 119, 120, 126, 129, 130, 134, 137, 138, 139, 140, 146, 151, 152, 153, 154, 155, 157, 158, 159, 161, 163, 167, 168, 169, 171, 172, 173, 174, 177, 179, 187, 189, 190, 191, 192, 193, 196, 197, 198, 202, 203, 204, 206, 207, 208, 210]\n", - "[1, 3, 4, 7, 10, 15, 18, 19, 21, 23, 28, 29, 33, 38, 39, 42, 43, 44, 47, 48, 49, 50, 51, 52, 53, 57, 58, 59, 62, 65, 66, 68, 69, 70, 72, 74, 79, 81, 84, 87, 90, 93, 94, 96, 97, 98, 99, 101, 102, 104, 105, 108, 109, 111, 112, 113, 114, 115, 117, 121, 124, 125, 127, 128, 131, 133, 134, 139, 144, 148, 149, 150, 151, 154, 155, 157, 160, 161, 165, 167, 168, 170, 171, 172, 173, 178, 179, 181, 182, 184, 185, 186, 196, 197, 198, 199, 201, 203, 204, 205, 207, 208]\n", - "[3, 5, 9, 11, 12, 14, 15, 18, 19, 20, 21, 22, 23, 25, 26, 31, 32, 38, 39, 41, 42, 43, 44, 47, 52, 53, 57, 59, 60, 61, 63, 64, 67, 68, 69, 70, 72, 79, 82, 83, 87, 90, 93, 94, 96, 97, 98, 99, 102, 103, 106, 107, 114, 116, 118, 121, 123, 124, 127, 129, 131, 132, 133, 135, 137, 138, 139, 145, 153, 155, 157, 168, 170, 172, 173, 174, 180, 183, 184, 186, 187, 188, 189, 196, 198, 199, 201, 203, 205, 207, 208, 210]\n", - "[1, 3, 5, 6, 7, 8, 9, 11, 12, 15, 18, 21, 24, 25, 26, 29, 31, 33, 38, 39, 41, 42, 43, 44, 45, 48, 49, 50, 51, 52, 55, 58, 61, 63, 64, 66, 67, 71, 72, 73, 75, 76, 77, 78, 79, 84, 87, 90, 93, 94, 96, 98, 100, 101, 103, 107, 113, 114, 115, 116, 118, 121, 123, 125, 126, 127, 128, 129, 131, 132, 135, 137, 138, 139, 140, 141, 144, 147, 148, 151, 152, 154, 155, 157, 158, 159, 161, 164, 166, 169, 170, 173, 174, 178, 179, 181, 182, 184, 187, 188, 192, 193, 202, 205, 208, 209, 210]\n", - "[1, 2, 3, 11, 15, 18, 19, 20, 22, 24, 27, 31, 33, 34, 38, 39, 43, 44, 46, 47, 56, 57, 58, 59, 61, 63, 66, 68, 70, 71, 74, 75, 76, 84, 87, 90, 93, 94, 96, 98, 104, 105, 106, 107, 108, 109, 110, 111, 115, 116, 118, 120, 121, 124, 125, 126, 129, 130, 131, 135, 137, 138, 139, 140, 141, 144, 145, 146, 147, 151, 152, 153, 155, 157, 159, 163, 166, 169, 175, 180, 181, 183, 184, 185, 187, 188, 189, 190, 192, 193, 196, 198, 199, 202, 203, 204, 205, 206, 207, 208, 209]\n", - "[1, 3, 4, 7, 9, 10, 12, 13, 15, 18, 20, 21, 23, 25, 26, 28, 29, 32, 33, 34, 38, 39, 41, 42, 43, 44, 45, 46, 51, 55, 56, 58, 61, 62, 70, 72, 73, 74, 77, 79, 81, 82, 83, 84, 87, 90, 93, 94, 96, 97, 99, 100, 101, 103, 106, 108, 109, 110, 113, 118, 121, 122, 125, 126, 127, 130, 131, 133, 134, 136, 137, 138, 140, 144, 146, 147, 148, 149, 155, 158, 160, 171, 172, 173, 174, 175, 177, 178, 181, 185, 186, 187, 189, 192, 193, 197, 199, 201, 202, 203, 204, 205]\n", - "[3, 4, 5, 8, 10, 11, 12, 18, 20, 21, 26, 30, 32, 33, 38, 39, 41, 42, 44, 45, 50, 51, 54, 55, 58, 59, 60, 61, 62, 66, 67, 68, 69, 70, 73, 74, 75, 77, 79, 80, 81, 84, 87, 90, 93, 94, 96, 97, 101, 102, 103, 105, 106, 109, 110, 111, 116, 119, 120, 122, 124, 125, 127, 128, 131, 133, 134, 136, 138, 141, 144, 146, 147, 149, 152, 155, 159, 163, 165, 167, 169, 171, 175, 177, 179, 180, 182, 184, 187, 190, 192, 193, 196, 197, 199, 202, 203, 204, 205, 209, 210]\n", - "[1, 3, 5, 9, 10, 12, 13, 15, 18, 19, 20, 21, 23, 24, 29, 30, 32, 33, 34, 38, 39, 41, 43, 46, 49, 50, 51, 52, 54, 56, 57, 58, 61, 62, 63, 64, 66, 67, 69, 70, 72, 73, 76, 78, 81, 82, 87, 90, 93, 94, 96, 97, 100, 101, 102, 108, 110, 111, 113, 115, 118, 119, 121, 126, 127, 129, 138, 139, 140, 146, 150, 152, 153, 155, 157, 158, 159, 160, 161, 162, 163, 164, 165, 169, 170, 171, 173, 175, 177, 178, 179, 181, 183, 184, 186, 187, 190, 192, 193, 196, 200, 201, 202, 204, 206]\n", - "[3, 5, 8, 9, 10, 11, 12, 15, 18, 19, 21, 24, 25, 29, 31, 38, 39, 42, 43, 44, 45, 46, 47, 49, 51, 55, 59, 62, 63, 65, 66, 67, 69, 70, 72, 78, 79, 83, 87, 90, 93, 94, 96, 98, 99, 101, 103, 106, 110, 111, 112, 114, 115, 116, 118, 119, 122, 123, 125, 127, 130, 131, 132, 134, 135, 137, 138, 140, 141, 144, 148, 152, 153, 154, 155, 157, 158, 159, 162, 163, 164, 169, 171, 172, 174, 175, 177, 181, 182, 183, 186, 187, 189, 191, 192, 193, 198, 199, 200, 201, 202, 204, 205, 206, 207]\n", - "[1, 2, 4, 8, 11, 12, 13, 15, 18, 21, 22, 23, 24, 26, 30, 31, 32, 34, 38, 39, 44, 45, 51, 52, 55, 56, 58, 61, 62, 67, 68, 69, 74, 79, 82, 84, 87, 90, 93, 94, 96, 97, 98, 102, 104, 106, 108, 111, 113, 114, 115, 118, 120, 121, 122, 123, 125, 126, 130, 132, 133, 139, 145, 146, 149, 150, 152, 154, 155, 157, 160, 161, 162, 165, 166, 167, 168, 170, 171, 172, 177, 178, 181, 182, 185, 186, 187, 191, 197, 199, 200, 201, 203, 204, 205, 206, 209]\n", - "[1, 2, 3, 4, 7, 8, 10, 12, 14, 18, 23, 25, 27, 28, 32, 33, 38, 39, 41, 45, 46, 49, 50, 51, 52, 54, 56, 59, 64, 65, 68, 69, 73, 75, 78, 82, 83, 87, 90, 93, 94, 96, 100, 101, 102, 103, 106, 111, 113, 115, 117, 119, 120, 124, 125, 126, 127, 129, 130, 134, 136, 137, 138, 140, 141, 144, 145, 147, 149, 150, 152, 153, 155, 157, 160, 163, 166, 167, 169, 170, 173, 175, 177, 179, 183, 186, 187, 189, 190, 196, 199, 200, 203, 204, 207, 209, 210]\n", - "[5, 6, 9, 10, 12, 13, 15, 18, 20, 21, 23, 25, 26, 27, 29, 30, 33, 34, 38, 39, 41, 42, 44, 46, 47, 49, 51, 53, 57, 60, 65, 68, 69, 72, 74, 75, 77, 78, 79, 80, 81, 83, 84, 87, 90, 93, 94, 96, 97, 98, 101, 105, 107, 108, 109, 112, 114, 115, 123, 124, 125, 126, 127, 128, 132, 133, 135, 137, 138, 144, 145, 149, 150, 154, 155, 157, 158, 159, 161, 162, 164, 167, 172, 173, 175, 179, 183, 185, 187, 188, 189, 193, 198, 202, 203, 206, 208, 210]\n", - "[1, 2, 3, 10, 11, 12, 13, 15, 18, 19, 20, 21, 24, 25, 26, 27, 32, 33, 38, 39, 41, 42, 43, 44, 47, 48, 49, 54, 55, 60, 61, 62, 63, 64, 66, 69, 70, 71, 72, 73, 74, 82, 87, 90, 93, 94, 96, 99, 100, 101, 103, 104, 105, 107, 112, 113, 120, 121, 122, 125, 126, 127, 131, 132, 139, 141, 144, 148, 149, 151, 152, 155, 158, 159, 162, 164, 166, 168, 173, 174, 177, 178, 180, 181, 182, 183, 184, 185, 186, 187, 188, 190, 191, 193, 201, 202, 206, 207, 210]\n", - "[5, 6, 7, 8, 13, 14, 15, 18, 19, 20, 21, 22, 23, 31, 32, 33, 34, 38, 39, 41, 42, 43, 45, 49, 52, 53, 54, 57, 58, 60, 61, 62, 64, 69, 71, 76, 77, 78, 79, 80, 82, 84, 87, 90, 93, 94, 96, 99, 100, 101, 108, 109, 110, 114, 117, 118, 120, 126, 127, 130, 132, 133, 134, 136, 137, 138, 139, 141, 144, 147, 148, 152, 155, 157, 160, 161, 162, 164, 169, 173, 178, 180, 181, 182, 183, 185, 188, 189, 197, 198, 208]\n", - "[2, 3, 4, 5, 8, 9, 10, 13, 18, 19, 22, 23, 24, 26, 27, 28, 29, 32, 33, 38, 39, 46, 48, 49, 50, 51, 57, 61, 64, 67, 69, 71, 72, 77, 78, 79, 83, 87, 90, 93, 94, 96, 97, 98, 100, 103, 105, 106, 114, 115, 117, 119, 121, 123, 125, 126, 127, 128, 129, 131, 135, 138, 141, 147, 148, 154, 155, 158, 161, 163, 164, 166, 167, 168, 169, 170, 172, 173, 175, 179, 180, 181, 182, 183, 185, 186, 189, 191, 193, 196, 197, 198, 199, 200, 204, 205, 209, 210]\n" - ] - } - ], - "source": [ - "all_bb, _ = get_bb_2(\"generated/all_dots_yellow.png\")\n", - "\n", - "for f in files:\n", - " try:\n", - " _, centers = get_bb_2(f)\n", - " nums = get_numbers(centers, all_bb)\n", - " print(nums)\n", - " except:\n", - " print(f)" - ] - }, - { - "cell_type": "code", - "execution_count": 32, - "id": "political-arena", - "metadata": {}, - "outputs": [], - "source": [ - "folders = [os.path.join('imgs', f) for f in os.listdir('imgs') if f != '.DS_Store']" - ] - }, - { - "cell_type": "code", - "execution_count": 33, - "id": "fatty-motor", - "metadata": {}, - "outputs": [], - "source": [ - "files = []\n", - "for f in folders:\n", - " files += [os.path.join(f, i) for i in os.listdir(f) if i.endswith(\".png\") or i.endswith(\".jpeg\")]" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "mounted-brass", - "metadata": {}, - "outputs": [], - "source": [] - }, - { - "cell_type": "code", - "execution_count": 34, - "id": "sophisticated-positive", - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "[6, 8, 9, 12, 13, 14, 15, 18, 19, 20, 22, 23, 24, 27, 32, 34, 38, 39, 41, 42, 47, 48, 52, 53, 55, 57, 60, 64, 66, 71, 72, 73, 74, 78, 80, 90, 91, 93, 94, 96, 97, 98, 99, 101, 105, 108, 110, 112, 117, 118, 119, 123, 125, 126, 127, 129, 131, 132, 139, 142, 143, 144, 145, 147, 148, 149, 152, 153, 154, 156, 157, 158, 159, 160, 161, 162, 163, 165, 166, 167, 169, 171, 172, 173, 174, 175, 179, 185, 187, 188, 189, 191, 192, 193, 196, 200, 201, 204, 205, 209]\n", - "[]\n", - "[]\n", - "imgs/twitter/FA4iYT9VEAc6bJg.jpeg\n", - "[3, 5, 7, 10, 11, 14, 15, 18, 19, 21, 22, 25, 26, 32, 33, 34, 38, 39, 41, 44, 45, 46, 53, 56, 57, 63, 64, 65, 66, 69, 70, 72, 74, 76, 77, 78, 80, 83, 90, 91, 93, 94, 96, 98, 100, 104, 105, 108, 111, 114, 115, 116, 118, 122, 127, 129, 130, 131, 134, 135, 139, 140, 141, 142, 146, 147, 149, 152, 153, 154, 156, 158, 160, 161, 162, 163, 164, 165, 167, 170, 171, 174, 180, 181, 182, 184, 186, 187, 188, 189, 190, 192, 193, 196, 198, 199, 200, 203, 205]\n", - "[3, 4, 6, 7, 8, 11, 12, 13, 15, 18, 19, 21, 23, 25, 28, 30, 34, 38, 40, 43, 44, 45, 51, 53, 54, 67, 69, 72, 76, 77, 79, 80, 81, 84, 90, 91, 93, 94, 96, 97, 100, 101, 102, 105, 108, 113, 114, 120, 123, 124, 126, 128, 131, 133, 135, 140, 142, 147, 149, 150, 152, 154, 156, 157, 159, 163, 166, 167, 168, 169, 170, 171, 175, 177, 179, 181, 187, 190, 192, 196, 199, 201, 202, 204, 207, 208, 210]\n", - "[8, 69, 71, 72, 80, 81, 91, 93, 99, 105, 116, 117, 121, 129, 131, 137, 138, 140, 150, 153, 158, 159, 160, 163, 164, 166, 168, 177, 184, 188, 196, 197, 201, 202, 203, 204, 205, 206, 209]\n", - "[3, 7, 8, 10, 13, 14, 15, 18, 20, 21, 22, 24, 27, 28, 29, 30, 33, 34, 38, 42, 43, 44, 45, 46, 51, 53, 54, 56, 57, 59, 60, 66, 67, 69, 73, 75, 76, 78, 79, 80, 81, 83, 84, 90, 91, 93, 94, 96, 97, 104, 105, 107, 112, 117, 118, 119, 120, 121, 123, 124, 129, 133, 134, 135, 140, 141, 143, 144, 147, 148, 151, 154, 159, 160, 161, 163, 164, 165, 168, 172, 173, 175, 179, 182, 183, 187, 188, 189, 199, 200, 201, 202, 203, 205, 206, 207, 210]\n", - "[1, 2, 5, 9, 11, 14, 18, 24, 26, 27, 28, 30, 31, 38, 40, 41, 42, 48, 50, 51, 53, 54, 55, 56, 58, 59, 60, 61, 62, 64, 65, 68, 70, 74, 75, 78, 79, 80, 82, 83, 90, 91, 93, 94, 96, 110, 111, 112, 114, 115, 116, 118, 120, 123, 124, 125, 126, 128, 130, 131, 132, 135, 136, 138, 143, 144, 150, 153, 154, 159, 160, 161, 167, 168, 172, 173, 175, 177, 179, 181, 182, 183, 185, 187, 188, 189, 193, 197, 199, 201, 203, 206, 207, 209]\n", - "[2, 3, 4, 5, 6, 9, 13, 14, 15, 18, 19, 20, 24, 28, 29, 30, 31, 33, 38, 39, 40, 41, 42, 43, 45, 46, 59, 61, 62, 63, 64, 65, 67, 70, 71, 72, 73, 74, 75, 79, 81, 82, 83, 84, 90, 91, 93, 94, 96, 97, 98, 102, 105, 114, 115, 118, 119, 121, 122, 124, 126, 127, 130, 131]\n", - "[1, 2, 4, 5, 6, 7, 8, 9, 10, 12, 14, 15, 18, 20, 21, 23, 24, 26, 28, 29, 30, 33, 34, 38, 39, 40, 43, 49, 50, 51, 52, 53, 54, 56, 57, 59, 62, 65, 67, 68, 69, 75, 76, 77, 80, 81, 83, 84, 90, 91, 93, 94, 96, 97, 99, 101, 104, 105, 116, 117, 121, 125, 126, 127, 129, 132, 133, 138, 139, 141, 142, 144, 148, 152, 156, 159, 161, 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, 173, 175, 177, 179, 181, 182, 185, 186, 189, 191, 196, 197, 198, 199, 200, 201, 202, 206, 207, 208]\n", - "[1, 2, 4, 5, 12, 15, 18, 20, 21, 22, 23, 25, 26, 27, 29, 30, 31, 33, 38, 39, 40, 41, 46, 49, 50, 53, 54, 55, 57, 65, 66, 68, 69, 72, 75, 76, 79, 81, 83, 84, 90, 91, 93, 94, 96, 97, 100, 102, 104, 108, 111, 114, 115, 116, 119, 120, 122, 125, 127, 129, 131, 132, 133, 135, 136, 138, 139, 142, 147, 149, 151, 152, 153, 155, 157, 165, 166, 167, 170, 171, 174, 177, 181, 182, 184, 185, 187, 188, 189, 191, 193, 196, 201, 202, 204, 206, 207, 208, 209, 210]\n", - "imgs/twitter/FA4SmddX0A4unCW.jpeg\n", - "[1, 3, 9, 10, 11, 12, 15, 18, 20, 21, 22, 23, 25, 27, 30, 31, 38, 40, 43, 44, 45, 48, 49, 51, 52, 55, 56, 57, 60, 62, 63, 65, 68, 69, 70, 72, 75, 76, 77, 81, 90, 91, 93, 94, 96, 98, 99, 101, 102, 103, 104, 108, 110, 111, 112, 113, 114, 115, 117, 118, 119, 120, 121, 124, 126, 127, 128, 131, 133, 136, 138, 139, 141, 144, 148, 149, 151, 152, 153, 156, 159, 160, 162, 163, 164, 165, 166, 169, 170, 175, 177, 179, 183, 185, 186, 192, 196, 199, 201, 202, 203, 204, 206, 207, 208]\n", - "[4, 5, 6, 8, 9, 14, 15, 18, 19, 20, 22, 24, 27, 28, 31, 32, 33, 38, 40, 41, 42, 44, 45, 47, 48, 49, 52, 53, 56, 62, 64, 68, 70, 73, 75, 78, 79, 80, 81, 82, 90, 91, 93, 94, 96, 97, 98, 99, 101, 102, 110, 111, 112, 117, 121, 124, 127, 129, 131, 133, 134, 139, 141, 142, 143, 144, 145, 148, 153, 154, 159, 161, 165, 166, 167, 168, 172, 173, 174, 175, 177, 183, 184, 185, 186, 191, 193, 200, 202, 205, 207, 208]\n", - "[2, 3, 7, 9, 12, 13, 14, 15, 18, 23, 24, 25, 31, 34, 38, 43, 44, 46, 49, 52, 57, 61, 66, 68, 69, 70, 72, 73, 76, 78, 79, 80, 82, 84, 90, 91, 93, 94, 96, 98, 99, 100, 101, 104, 105, 107, 108, 113, 115, 116, 118, 120, 123, 128, 130, 132, 133, 139, 141, 142, 144, 147, 148, 152, 153, 154, 156, 157, 159, 160, 164, 168, 172, 173, 174, 177, 179, 183, 186, 188, 192, 196, 197, 199, 202, 203, 204, 205, 207, 208, 210]\n", - "[1, 4, 7, 8, 9, 13, 18, 20, 21, 23, 25, 26, 28, 29, 31, 32, 33, 38, 39, 41, 42, 44, 45, 46, 50, 54, 65, 67, 68, 70, 71, 74, 76, 77, 80, 82, 90, 91, 93, 94, 96, 100, 105, 106, 108, 111, 113, 114, 115, 116, 117, 119, 122, 123, 124, 125, 127, 130, 132, 133, 142, 147, 153, 154, 155, 159, 164, 165, 166, 167, 169, 171, 172, 174, 177, 179, 184, 187, 191, 197, 202, 203, 204, 210]\n", - "[2, 3, 5, 13, 18, 19, 23, 31, 34, 38, 39, 40, 41, 42, 51, 52, 53, 54, 55, 56, 60, 66, 68, 73, 75, 77, 83, 91, 93, 95, 97, 98, 101, 104, 111, 114, 116, 119, 120, 122, 123, 127, 133, 135, 136, 138, 142, 149, 150, 159, 160, 162, 171, 173, 175, 177, 180, 182, 190, 191, 194]\n", - "imgs/twitter/FIkqnScXMAEsQeq.jpeg\n", - "[1, 2, 4, 5, 6, 12, 13, 14, 15, 18, 20, 21, 22, 23, 24, 26, 29, 32, 33, 38, 40, 43, 44, 46, 47, 50, 52, 57, 58, 59, 61, 62, 64, 66, 68, 71, 72, 73, 74, 77, 80, 90, 91, 93, 94, 96, 97, 98, 99, 102, 105, 108, 114, 116, 118, 120, 121, 122, 124, 126, 127, 131, 132, 133, 135, 136, 137, 143, 144, 150, 151, 152, 154, 162, 164, 167, 170, 173, 174, 175, 177, 179, 180, 181, 182, 189, 190, 193, 196, 197, 198, 199, 200, 204, 206, 207]\n", - "imgs/twitter/FA4qFzKWYAc35dw.jpeg\n", - "[6, 8, 12, 14, 18, 20, 21, 24, 27, 29, 30, 31, 38, 44, 46, 47, 49, 51, 54, 55, 59, 60, 62, 64, 65, 67, 68, 69, 71, 72, 74, 79, 81, 90, 91, 93, 94, 96, 98, 99, 100, 101, 102, 104, 107, 111, 112, 114, 115, 116, 118, 119, 120, 121, 123, 128, 132, 133, 136, 137, 138, 140, 142, 148, 149, 150, 152, 154, 156, 158, 159, 160, 162, 166, 168, 171, 173, 175, 179, 183, 186, 187, 189, 191, 192, 196, 198, 200, 201, 205, 207, 209]\n", - "[]\n", - "[1, 3, 4, 5, 8, 9, 10, 11, 18, 19, 21, 22, 25, 28, 29, 33, 34, 38, 40, 44, 45, 47, 48, 50, 51, 53, 56, 57, 58, 59, 62, 64, 65, 67, 72, 78, 80, 81, 83, 90, 91, 93, 94, 96, 97, 99, 100, 101, 103, 108, 110, 115, 116, 117, 118, 122, 126, 131, 133, 135, 136, 137, 139, 141, 143, 144, 147, 149, 150, 152, 153, 156, 159, 161, 162, 163, 165, 166, 168, 171, 172, 173, 177, 179, 181, 186, 187, 191, 193, 197, 199, 201, 205, 207, 208, 210]\n", - "[1, 2, 4, 6, 10, 12, 14, 15, 18, 20, 21, 22, 26, 27, 28, 29, 31, 33, 38, 44, 46, 48, 52, 53, 55, 56, 57, 58, 59, 60, 61, 64, 66, 67, 68, 74, 75, 76, 79, 81, 83, 84, 90, 91, 93, 94, 96, 97, 103, 105, 107, 108, 120, 121, 122, 123, 124, 126, 129, 132, 136, 138, 139, 142, 144, 147, 148, 149, 150, 153, 156, 160, 161, 162, 163, 168, 169, 170, 172, 173, 174, 177, 180, 182, 184, 190, 192, 193, 196, 197, 198, 200, 205, 206, 210]\n", - "imgs/twitter/FIotM6hWQAURLqG.jpeg\n", - "[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 13, 15, 18, 20, 21, 23, 29, 34, 38, 40, 45, 47, 49, 56, 57, 59, 61, 62, 65, 68, 69, 70, 71, 76, 77, 80, 82, 84, 90, 91, 93, 94, 96, 97, 100, 102, 104, 111, 113, 115, 117, 119, 122, 123, 124, 132, 133, 135, 137, 138, 141, 147, 148, 149, 152, 154, 156, 159, 160, 161, 162, 163, 165, 166, 167, 170, 171, 173, 174, 175, 180, 182, 184, 186, 188, 191, 192, 197, 198, 199, 200, 201, 203, 205, 206, 207, 210]\n", - "imgs/twitter/FIzI7g2VQAA_R9d.jpeg\n", - "imgs/twitter/FA6ijkxUUAARLJ_.jpeg\n", - "[1, 2, 3, 4, 7, 8, 14, 15, 18, 19, 20, 23, 24, 27, 30, 33, 38, 39, 42, 46, 47, 50, 51, 54, 57, 58, 61, 64, 69, 71, 76, 80, 81, 82, 90, 91, 93, 94, 96, 97, 99, 101, 102, 103, 104, 105, 106, 108, 110, 111, 112, 114, 116, 117, 123, 127, 129, 130, 131, 133, 134, 137, 140, 142, 143, 144, 147, 149, 150, 151, 153, 154, 156, 158, 159, 161, 162, 163, 164, 167, 168, 170, 172, 174, 175, 179, 187, 188, 189, 190, 191, 192, 193, 196, 199, 200, 201, 202, 203, 206, 208]\n", - "[91, 93, 97, 98, 99, 103, 111, 121, 122, 127, 135, 136, 137, 138, 147, 150, 159, 160, 164, 165, 166, 167, 168, 169, 179, 183, 196, 197, 199, 200, 201, 203, 204]\n", - "[5, 6, 7, 18, 19, 38, 41, 43, 44, 55, 56, 57, 59, 69, 77, 78, 79, 80, 91, 93, 97, 103, 111, 117, 121, 127, 129, 136, 137, 138, 139, 145, 147, 148, 158, 160, 161, 163, 167, 177, 185, 196, 197, 198, 200, 201, 202, 203, 204]\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "[2, 3, 6, 8, 9, 12, 18, 19, 22, 26, 27, 28, 29, 30, 31, 33, 34, 38, 43, 44, 47, 49, 53, 56, 58, 60, 65, 66, 67, 68, 69, 72, 74, 75, 76, 78, 80, 81, 82, 83, 84, 90, 91, 93, 94, 96, 98, 100, 103, 105, 111, 112, 116, 117, 118, 119, 123, 125, 132, 133, 135, 140, 143, 147, 148, 149, 151, 152, 154, 156, 159, 161, 165, 167, 170, 175, 179, 181, 183, 184, 185, 186, 188, 190, 193, 196, 198, 199, 203, 207, 208, 210]\n", - "[1, 2, 3, 4, 5, 7, 8, 10, 11, 12, 13, 15, 18, 20, 21, 22, 28, 29, 30, 32, 34, 38, 40, 41, 43, 44, 45, 49, 50, 54, 56, 62, 64, 66, 67, 68, 70, 72, 73, 74, 75, 78, 80, 81, 83, 90, 91, 93, 94, 96, 97, 98, 99, 103, 104, 105, 110, 111, 113, 115, 117, 120, 121, 122, 124, 126, 127, 130, 133, 135, 139, 142, 143, 144, 146, 147, 148, 150, 152, 153, 159, 160, 165, 166, 168, 170, 172, 173, 174, 177, 179, 181, 182, 183, 184, 185, 187, 188, 190, 192, 193, 196, 197, 199, 201, 204, 205]\n", - "imgs/twitter/FA5bEZlXMAA5G26.jpeg\n", - "[2, 3, 5, 6, 7, 9, 10, 13, 18, 20, 23, 24, 28, 30, 33, 38, 40, 41, 42, 43, 49, 51, 53, 54, 55, 56, 57, 58, 59, 60, 62, 63, 77, 78, 79, 81, 84, 90, 91, 93, 94, 96, 98, 101, 102, 104, 105, 113, 115, 118, 119, 123, 124, 125, 126, 127, 129, 130, 131, 138, 139, 140, 142, 143, 148, 149, 152, 156, 158, 160, 161, 162, 166, 169, 171, 173, 174, 175, 178, 181, 184, 186, 187, 189, 190, 192, 193, 197, 199, 200, 201, 204, 205, 206, 208]\n", - "[1, 2, 3, 10, 13, 14, 15, 18, 24, 25, 28, 34, 38, 39, 40, 42, 43, 45, 46, 48, 49, 51, 53, 54, 56, 58, 62, 64, 67, 68, 71, 74, 76, 78, 80, 81, 82, 83, 84, 90, 91, 93, 94, 96, 97, 98, 99, 101, 104, 113, 114, 115, 116, 117, 120, 125, 126, 127, 129, 130, 132, 135, 136, 143, 148, 149, 150, 152, 154, 156, 158, 159, 160, 162, 165, 168, 172, 174, 175, 181, 182, 186, 187, 189, 191, 192, 193, 197, 198, 199, 200, 201, 202, 205, 207, 208, 209]\n", - "[]\n", - "[]\n", - "[2, 3, 6, 12, 13, 15, 18, 21, 25, 27, 29, 30, 32, 38, 39, 40, 41, 44, 45, 46, 48, 52, 55, 56, 62, 64, 65, 72, 73, 79, 80, 81, 82, 84, 90, 91, 93, 94, 96, 98, 99, 103, 104, 112, 114, 115, 118, 120, 121, 124, 125, 126, 127, 129, 141, 142, 143, 144, 147, 149, 150, 154, 156, 157, 159, 160, 161, 162, 163, 164, 165, 167, 168, 169, 173, 174, 175, 177, 182, 183, 184, 185, 186, 190, 191, 192, 193, 196, 197, 199, 202, 204, 205, 208, 209]\n", - "[1, 2, 3, 4, 9, 10, 14, 15, 18, 19, 20, 21, 23, 28, 29, 31, 38, 39, 43, 47, 48, 51, 52, 53, 54, 57, 60, 61, 62, 65, 67, 68, 71, 72, 73, 75, 80, 81, 90, 91, 93, 94, 96, 97, 98, 99, 100, 105, 111, 113, 114, 116, 119, 120, 122, 123, 126, 127, 131, 132, 133, 135, 136, 138, 141, 143, 144, 153, 154, 159, 161, 162, 166, 167, 168, 169, 172, 177, 179, 181, 182, 183, 184, 185, 187, 196, 199, 200, 202, 203, 204, 205, 207, 208, 210]\n", - "imgs/twitter/FA4cRa-XMAkfx6B.jpeg\n", - "[4, 5, 6, 9, 10, 11, 18, 19, 20, 23, 25, 26, 29, 32, 34, 38, 40, 41, 43, 44, 45, 46, 47, 54, 56, 58, 59, 64, 67, 68, 69, 76, 77, 78, 79, 80, 81, 83, 84, 90, 91, 93, 94, 96, 97, 98, 99, 101, 103, 105, 108, 110, 113, 114, 115, 119, 120, 121, 127, 128, 133, 134, 138, 140, 142, 143, 144, 145, 148, 149, 150, 151, 154, 159, 160, 164, 165, 166, 167, 177, 179, 182, 184, 187, 188, 190, 192, 197, 200, 203, 205, 206, 207, 208, 210]\n", - "[2, 3, 4, 5, 6, 10, 11, 14, 18, 21, 25, 26, 31, 32, 38, 43, 45, 46, 48, 50, 55, 57, 59, 60, 61, 64, 69, 71, 73, 75, 82, 83, 91, 93, 94, 98, 99, 100, 103, 104, 105, 107, 110, 113, 116, 117, 118, 119, 122, 124, 125, 131, 136, 137, 138, 139, 141, 142, 148, 149, 150, 151, 154, 157, 159, 162, 163, 167, 170, 172, 174, 177, 180, 182, 183, 185, 186, 187, 188, 189, 190, 191, 192, 193, 196, 197, 199, 201, 204, 205, 207, 209, 210]\n", - "[1, 2, 3, 4, 8, 10, 14, 18, 20, 27, 28, 30, 32, 38, 39, 42, 44, 45, 51, 52, 55, 56, 58, 59, 61, 62, 67, 68, 70, 71, 72, 74, 76, 77, 90, 91, 93, 94, 96, 97, 102, 105, 110, 112, 114, 116, 122, 123, 124, 126, 141, 142, 144, 147, 150, 155, 159, 160, 162, 163, 164, 165, 166, 167, 168, 170, 171, 173, 175, 179, 181, 185, 187, 188, 189, 190, 191, 197, 198, 199, 200, 202, 203, 204, 208, 209, 210]\n", - "[]\n", - "[1, 2, 4, 9, 11, 12, 13, 18, 20, 22, 26, 31, 33, 34, 38, 40, 41, 42, 43, 44, 46, 48, 49, 51, 52, 57, 58, 60, 61, 66, 67, 68, 69, 71, 72, 76, 79, 80, 81, 82, 84, 90, 91, 93, 94, 96, 98, 100, 101, 103, 105, 106, 110, 112, 113, 116, 118, 119, 122, 123, 126, 130, 131, 133, 135, 138, 143, 148, 149, 154, 156, 160, 161, 162, 164, 165, 166, 169, 170, 171, 174, 177, 179, 181, 184, 185, 186, 189, 190, 191, 192, 193, 196, 198, 200, 205, 206, 207, 208, 209, 210]\n", - "[]\n", - "imgs/twitter/FA4Xqy-XEAYSGH1.jpeg\n", - "[1, 2, 3, 4, 5, 8, 11, 12, 13, 15, 18, 19, 24, 26, 27, 28, 31, 34, 38, 40, 41, 44, 46, 48, 51, 52, 53, 54, 56, 58, 60, 71, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 90, 91, 93, 94, 96, 98, 99, 100, 102, 110, 112, 115, 119, 124, 127, 132, 133, 136, 137, 140, 144, 147, 148, 150, 151, 152, 153, 154, 156, 157, 158, 161, 162, 164, 167, 171, 172, 184, 188, 189, 191, 192, 196, 202, 203, 206, 208, 210]\n", - "imgs/twitter/FA4PFdkWYBIuKRg.jpeg\n", - "imgs/twitter/FA4NgUfXIA80TGx.jpeg\n", - "imgs/twitter/FA4gaIcWUAMmySl.jpeg\n", - "[3, 8, 10, 14, 18, 19, 20, 21, 22, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 38, 39, 40, 43, 44, 45, 46, 47, 48, 51, 52, 54, 56, 59, 61, 65, 68, 73, 77, 80, 82, 83, 84, 90, 91, 93, 94, 96, 98, 100, 103, 104, 105, 108, 114, 115, 121, 123, 127, 129, 134, 135, 138, 139, 141, 144, 147, 149, 150, 152, 156, 159, 161, 162, 163, 167, 170, 172, 175, 177, 179, 184, 186, 187, 192, 193, 197, 199, 202, 204, 205, 206, 207, 208]\n", - "imgs/twitter/FA4z6EDXEAErNes.jpeg\n", - "[]\n", - "[3, 5, 10, 18, 20, 21, 23, 25, 27, 29, 30, 34, 38, 42, 46, 48, 49, 50, 51, 52, 53, 54, 57, 59, 60, 62, 63, 64, 65, 66, 68, 79, 81, 82, 90, 91, 93, 94, 96, 102, 111, 113, 114, 116, 117, 119, 121, 131, 132, 136, 137, 138, 139, 140, 141, 144, 149, 151, 152, 154, 156, 157, 159, 160, 163, 164, 168, 170, 172, 174, 180, 182, 184, 186, 187, 188, 190, 193, 196, 197, 198, 200, 204, 208, 210]\n", - "[2, 3, 4, 6, 7, 9, 14, 15, 18, 20, 22, 23, 25, 26, 28, 29, 31, 33, 34, 38, 44, 47, 49, 52, 53, 54, 57, 59, 60, 61, 62, 65, 66, 68, 71, 73, 74, 75, 81, 82, 83, 84, 90, 93, 94, 96, 98, 99, 100, 104, 105, 107, 110, 112, 113, 116, 117, 123, 126, 128, 130, 131, 133, 139, 141, 142, 143, 147, 148, 153, 154, 156, 159, 161, 164, 172, 174, 175, 180, 181, 182, 184, 186, 187, 189, 191, 192, 197, 198, 200, 202, 204, 205, 207, 210]\n", - "[3, 4, 6, 8, 9, 11, 12, 13, 18, 21, 27, 30, 32, 34, 38, 39, 42, 47, 50, 52, 53, 54, 55, 58, 59, 61, 62, 65, 66, 68, 70, 71, 75, 76, 81, 82, 83, 84, 90, 91, 93, 94, 96, 99, 106, 108, 112, 113, 114, 115, 117, 118, 120, 124, 125, 126, 127, 129, 131, 142, 143, 144, 147, 148, 151, 153, 154, 159, 160, 163, 165, 166, 169, 171, 172, 175, 177, 185, 186, 190, 193, 196, 198, 200, 201, 202, 203, 206, 209]\n", - "imgs/twitter/FA7ZyaNXIAMzXqs.jpeg\n", - "[2, 3, 5, 7, 8, 9, 12, 14, 18, 21, 22, 23, 25, 26, 27, 29, 30, 31, 38, 39, 42, 44, 45, 48, 51, 52, 53, 57, 58, 59, 60, 62, 63, 65, 66, 67, 69, 70, 71, 76, 78, 79, 81, 83, 90, 91, 93, 94, 96, 97, 98, 99, 100, 102, 103, 104, 106, 114, 115, 116, 119, 121, 127, 128, 131, 133, 134, 139, 142, 148, 151, 153, 154, 156, 157, 158, 162, 163, 166, 167, 168, 170, 175, 178, 179, 187, 188, 190, 191, 192, 198, 200, 203, 205, 208, 209, 210]\n", - "[1, 2, 3, 4, 6, 10, 11, 12, 14, 15, 18, 20, 21, 22, 25, 28, 31, 32, 33, 34, 38, 39, 41, 45, 47, 51, 55, 57, 59, 62, 65, 66, 71, 75, 77, 79, 81, 82, 90, 91, 93, 94, 96, 99, 103, 106, 108, 110, 111, 114, 115, 122, 123, 124, 125, 126, 127, 129, 130, 131, 132, 135, 139, 143, 144, 149, 150, 152, 154, 163, 164, 165, 166, 168, 172, 173, 174, 177, 179, 180, 182, 184, 185, 187, 191, 193, 196, 197, 201, 202, 204, 205, 210]\n", - "[]\n", - "[2, 4, 6, 9, 11, 12, 13, 18, 19, 20, 21, 23, 26, 27, 28, 29, 31, 38, 40, 41, 42, 44, 46, 49, 56, 61, 62, 70, 80, 91, 93, 97, 103, 110, 111, 116, 117, 121, 123, 129, 135, 136, 137, 138, 139, 148, 157, 159, 160, 161, 165, 166, 167, 168, 169, 171, 177, 179, 181, 182, 184, 185, 186, 187, 190, 197, 198, 200, 203, 204, 205]\n", - "[2, 4, 5, 8, 9, 11, 13, 15, 18, 19, 21, 22, 23, 24, 25, 26, 27, 28, 33, 34, 38, 40, 41, 43, 44, 45, 48, 49, 55, 57, 63, 64, 66, 67, 68, 72, 74, 75, 77, 80, 82, 83, 84, 90, 91, 93, 94, 96, 97, 99, 100, 105, 108, 110, 111, 112, 114, 115, 117, 120, 122, 123, 126, 127, 131, 133, 136, 137, 141, 143, 144, 156, 159, 160, 161, 164, 165, 166, 168, 169, 171, 173, 175, 177, 179, 180, 181, 184, 185, 186, 187, 188, 190, 192, 193, 198, 202, 203, 206, 208, 209]\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "[2, 3, 5, 8, 9, 10, 13, 18, 19, 21, 22, 23, 25, 27, 28, 31, 38, 40, 42, 43, 45, 46, 48, 49, 50, 53, 57, 58, 62, 65, 66, 67, 69, 70, 71, 76, 78, 79, 81, 90, 91, 93, 94, 96, 97, 101, 102, 104, 105, 112, 115, 116, 118, 121, 122, 124, 129, 134, 135, 142, 143, 144, 147, 150, 151, 153, 154, 157, 159, 161, 162, 165, 166, 167, 169, 172, 173, 174, 177, 179, 181, 182, 185, 187, 189, 190, 192, 193, 197, 201, 202, 203, 204, 206, 207, 209, 210]\n", - "[3, 4, 5, 6, 8, 10, 11, 14, 18, 19, 21, 22, 23, 25, 28, 30, 31, 38, 39, 40, 41, 42, 45, 46, 47, 50, 52, 54, 56, 58, 65, 66, 67, 68, 69, 70, 71, 72, 73, 82, 84, 90, 91, 93, 94, 96, 98, 99, 102, 104, 113, 116, 118, 119, 120, 123, 125, 127, 129, 130, 131, 132, 133, 136, 138, 139, 141, 142, 144, 147, 154, 155, 160, 164, 168, 169, 171, 173, 177, 179, 187, 188, 190, 193, 196, 198, 200, 202, 204, 206, 207, 208, 209, 210]\n", - "imgs/twitter/FA4WkUVWUAcer0X.jpeg\n", - "imgs/twitter/FA4330WXMAgRXOw.jpeg\n", - "[]\n", - "[1, 2, 3, 4, 5, 6, 8, 9, 11, 12, 18, 20, 21, 22, 23, 24, 25, 29, 30, 32, 33, 34, 38, 41, 43, 44, 45, 46, 48, 51, 52, 56, 57, 58, 60, 62, 67, 75, 76, 81, 82, 84, 90, 91, 93, 94, 96, 97, 100, 101, 102, 104, 105, 106, 108, 114, 115, 121, 123, 125, 126, 127, 131, 133, 136, 137, 141, 148, 150, 153, 154, 156, 158, 159, 161, 167, 169, 170, 171, 173, 175, 179, 180, 181, 183, 184, 189, 192, 196, 203, 204, 205, 206, 209, 210]\n", - "imgs/twitter/FA4OYJWWUBICFMU.jpeg\n", - "[1, 3, 8, 9, 11, 12, 13, 14, 18, 19, 20, 21, 24, 26, 38, 39, 40, 44, 49, 50, 51, 52, 53, 56, 58, 59, 61, 62, 66, 68, 69, 73, 75, 81, 83, 84, 90, 91, 93, 94, 96, 100, 102, 103, 104, 105, 108, 110, 111, 112, 116, 118, 119, 120, 122, 124, 132, 135, 136, 140, 141, 144, 146, 147, 150, 151, 153, 155, 158, 159, 160, 164, 165, 166, 168, 169, 170, 171, 173, 177, 179, 182, 184, 186, 187, 189, 192, 196, 197, 198, 200, 201, 203, 206, 209]\n", - "[2, 3, 7, 9, 11, 13, 18, 19, 20, 22, 23, 24, 25, 27, 28, 30, 31, 34, 38, 41, 42, 43, 44, 47, 48, 49, 52, 54, 57, 59, 61, 62, 63, 64, 68, 71, 72, 74, 75, 78, 79, 90, 91, 93, 94, 96, 98, 100, 101, 102, 104, 106, 107, 108, 110, 111, 112, 114, 116, 118, 119, 120, 121, 123, 126, 129, 131, 132, 133, 136, 137, 140, 141, 142, 143, 148, 150, 151, 154, 159, 160, 162, 163, 164, 166, 167, 168, 171, 174, 177, 180, 183, 185, 187, 189, 193, 197, 200, 202, 203, 204, 208, 209, 210]\n", - "[2, 4, 5, 7, 8, 11, 13, 14, 15, 18, 21, 24, 26, 28, 29, 33, 34, 38, 40, 41, 44, 46, 50, 52, 53, 54, 57, 59, 60, 62, 63, 64, 66, 69, 70, 71, 72, 73, 75, 78, 79, 80, 83, 90, 91, 93, 94, 96, 100, 101, 104, 105, 111, 113, 115, 116, 117, 122, 124, 126, 127, 129, 130, 132, 133, 135, 137, 138, 141, 143, 144, 148, 150, 151, 152, 156, 157, 165, 166, 169, 170, 172, 173, 175, 178, 183, 184, 185, 186, 189, 190, 191, 192, 197, 201, 202, 203, 204, 205, 208, 209, 210]\n", - "imgs/twitter/FA4YGyUWUAEIMf2.jpeg\n", - "[2, 3, 6, 10, 12, 15, 18, 19, 20, 21, 26, 27, 30, 31, 33, 34, 38, 39, 42, 45, 49, 50, 51, 52, 53, 56, 57, 59, 61, 63, 64, 67, 68, 70, 82, 84, 90, 91, 93, 94, 96, 98, 99, 103, 104, 105, 116, 119, 120, 122, 123, 124, 125, 126, 127, 131, 133, 135, 139, 141, 142, 143, 144, 147, 148, 151, 157, 159, 160, 162, 163, 168, 169, 173, 174, 177, 179, 182, 183, 187, 188, 189, 191, 192, 197, 199, 200, 201, 208, 209, 210]\n", - "[1, 3, 5, 6, 7, 8, 9, 13, 15, 18, 19, 21, 26, 30, 32, 33, 34, 38, 40, 42, 44, 45, 46, 48, 49, 54, 55, 62, 65, 66, 67, 68, 70, 71, 74, 76, 79, 84, 90, 91, 93, 94, 96, 97, 98, 104, 111, 113, 114, 122, 123, 124, 126, 129, 133, 136, 137, 139, 142, 143, 144, 148, 149, 151, 154, 159, 164, 165, 166, 168, 169, 170, 174, 177, 179, 181, 187, 189, 192, 193, 196, 199, 200, 203, 205, 207, 208, 209, 210]\n", - "[]\n", - "[1, 4, 5, 7, 9, 12, 13, 18, 20, 21, 22, 23, 25, 26, 27, 28, 29, 30, 33, 34, 38, 40, 41, 42, 47, 49, 50, 52, 53, 55, 59, 64, 67, 70, 71, 74, 75, 77, 83, 91, 93, 94, 97, 98, 105, 110, 117, 118, 119, 121, 124, 125, 127, 129, 130, 132, 136, 138, 139, 141, 142, 147, 149, 150, 153, 154, 157, 158, 160, 162, 163, 164, 167, 169, 170, 172, 174, 179, 180, 181, 186, 187, 188, 189, 191, 193, 196, 197, 198, 202, 203, 204, 208]\n", - "[1, 2, 5, 11, 13, 14, 18, 19, 22, 23, 24, 28, 32, 33, 38, 42, 43, 49, 50, 53, 54, 55, 57, 59, 60, 61, 64, 65, 70, 73, 74, 76, 78, 80, 83, 90, 91, 93, 94, 96, 99, 101, 102, 103, 104, 105, 107, 108, 110, 111, 122, 123, 125, 127, 131, 132, 133, 136, 138, 140, 142, 143, 144, 147, 148, 151, 153, 157, 160, 161, 163, 165, 166, 167, 168, 170, 171, 178, 179, 180, 182, 184, 185, 186, 187, 189, 191, 193, 197, 199, 202, 203, 205, 208, 209, 210]\n", - "imgs/twitter/FA4ZjmkWYAolRnZ.jpeg\n", - "[1, 2, 4, 6, 10, 12, 14, 15, 18, 20, 21, 22, 26, 27, 28, 29, 31, 33, 38, 44, 46, 48, 52, 53, 55, 56, 57, 58, 59, 60, 61, 64, 66, 67, 68, 74, 75, 76, 79, 81, 83, 84, 90, 91, 93, 94, 96, 97, 103, 105, 107, 108, 120, 121, 122, 123, 124, 126, 129, 132, 136, 138, 139, 142, 144, 147, 148, 149, 150, 153, 156, 160, 161, 162, 163, 168, 169, 170, 172, 173, 174, 177, 180, 182, 184, 190, 192, 193, 196, 197, 198, 200, 205, 206, 210]\n", - "imgs/twitter/FA4cFAqX0AkLZjl.jpeg\n", - "imgs/twitter/FA4cMaHWEAQ9371.jpeg\n", - "[]\n", - "[1, 2, 3, 5, 9, 10, 12, 13, 15, 18, 19, 24, 25, 26, 27, 28, 30, 34, 38, 40, 45, 46, 48, 50, 53, 59, 60, 64, 65, 67, 68, 73, 76, 83, 84, 90, 91, 93, 94, 96, 98, 99, 100, 102, 103, 106, 110, 113, 114, 115, 116, 118, 121, 122, 123, 126, 132, 133, 135, 136, 137, 138, 139, 143, 149, 151, 152, 156, 163, 166, 169, 170, 171, 173, 174, 177, 179, 183, 184, 185, 186, 187, 192, 196, 197, 198, 201, 202, 204, 205, 206, 207, 208, 209, 210]\n", - "[]\n", - "imgs/twitter/FA6czUfXIAIe2jv.jpeg\n", - "[18, 19, 22, 23, 26, 27, 30, 31, 38, 45, 50, 53, 56, 57, 60, 68, 76, 78, 93, 122, 123, 128, 129, 150, 156]\n", - "[3, 7, 8, 9, 15, 18, 19, 21, 22, 24, 25, 26, 28, 32, 33, 34, 38, 39, 42, 43, 47, 48, 49, 50, 52, 54, 55, 56, 65, 66, 67, 68, 69, 72, 75, 82, 90, 91, 93, 94, 96, 98, 101, 104, 105, 111, 112, 113, 115, 116, 117, 118, 122, 123, 130, 132, 133, 137, 141, 144, 147, 149, 153, 154, 156, 158, 159, 160, 162, 163, 164, 165, 169, 171, 173, 174, 175, 180, 182, 183, 186, 188, 189, 191, 192, 193, 196, 199, 200, 203, 204, 205, 206, 207, 208]\n", - "[2, 4, 5, 7, 8, 9, 12, 14, 18, 19, 22, 25, 26, 28, 31, 33, 38, 40, 43, 46, 47, 49, 50, 52, 57, 58, 59, 60, 61, 62, 66, 67, 68, 69, 70, 73, 75, 84, 90, 91, 93, 94, 96, 97, 100, 102, 103, 104, 105, 106, 111, 112, 113, 115, 116, 117, 119, 120, 121, 123, 124, 125, 127, 130, 132, 138, 141, 142, 143, 144, 147, 148, 149, 151, 152, 154, 156, 157, 158, 160, 161, 165, 169, 171, 172, 174, 177, 181, 183, 186, 188, 190, 191, 193, 196, 197, 198, 205, 207, 210]\n", - "[2, 3, 4, 8, 9, 12, 13, 14, 18, 19, 20, 23, 25, 26, 29, 38, 42, 43, 45, 47, 49, 52, 53, 54, 57, 58, 59, 60, 61, 62, 64, 65, 67, 69, 76, 77, 81, 90, 91, 93, 94, 96, 97, 98, 99, 105, 107, 108, 111, 112, 113, 115, 116, 117, 119, 120, 122, 123, 126, 129, 131, 133, 135, 136, 137, 138, 141, 142, 143, 147, 150, 151, 153, 159, 160, 162, 163, 164, 165, 166, 168, 169, 170, 174, 175, 183, 187, 189, 193, 198, 200, 201, 202, 204, 205, 209, 210]\n", - "imgs/twitter/FA4wPOzWQAIcXdW.jpeg\n", - "imgs/twitter/FA4X8oTWEAILtqS.jpeg\n", - "[0, 1, 2, 3, 5, 12, 13, 14, 16, 19, 20, 21, 22, 30, 31, 32, 34, 35, 36, 38, 39, 40, 50, 52, 54, 56, 59, 63, 65, 66, 75, 85, 87, 89, 91, 92, 105, 107, 113, 115, 117, 120, 121, 123, 124, 125, 126, 127, 128, 131, 134, 137, 138, 139, 143, 147, 149, 152, 154, 155, 158, 160, 162, 170, 173, 178, 179, 181, 182]\n", - "[1, 2, 3, 4, 6, 10, 11, 14, 15, 18, 19, 21, 22, 23, 27, 33, 34, 38, 39, 42, 47, 48, 50, 51, 52, 53, 54, 55, 56, 64, 66, 67, 79, 80, 83, 84, 90, 91, 93, 94, 96, 97, 104, 108, 114, 115, 116, 119, 120, 122, 123, 124, 125, 126, 127, 131, 132, 133, 136, 142, 143, 147, 150, 156, 157, 158, 159, 160, 162, 168, 170, 171, 172, 175, 179, 180, 181, 186, 187, 191, 196, 197, 199, 201, 203]\n", - "[2, 5, 9, 10, 12, 18, 22, 23, 24, 26, 29, 30, 31, 33, 38, 39, 40, 43, 45, 46, 47, 51, 53, 55, 61, 62, 65, 66, 67, 68, 71, 75, 76, 78, 80, 81, 82, 90, 91, 93, 94, 96, 102, 103, 116, 118, 119, 120, 121, 123, 126, 131, 132, 138, 140, 142, 144, 150, 156, 159, 160, 161, 163, 166, 168, 170, 171, 172, 177, 179, 182, 183, 184, 185, 187, 191, 192, 198, 199, 200, 201, 202, 204, 206, 207, 210]\n", - "[1, 4, 5, 6, 7, 8, 9, 10, 14, 15, 18, 19, 20, 21, 23, 24, 26, 29, 30, 34, 38, 41, 43, 44, 46, 47, 48, 52, 53, 54, 55, 57, 58, 60, 61, 62, 64, 65, 68, 71, 75, 78, 79, 80, 81, 84, 90, 91, 93, 94, 96, 97, 99, 101, 102, 103, 105, 107, 108, 111, 115, 117, 118, 119, 120, 124, 128, 130, 133, 134, 135, 138, 139, 142, 144, 147, 149, 150, 156, 157, 160, 161, 163, 164, 167, 168, 169, 171, 172, 175, 177, 179, 180, 183, 185, 186, 187, 190, 192, 196, 200, 201, 205, 206, 207, 208, 209, 210]\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "[3, 4, 8, 21, 31, 36, 40, 41, 67, 115, 127, 139, 149, 150, 156]\n", - "[1, 2, 4, 8, 9, 10, 13, 15, 18, 23, 24, 28, 29, 33, 38, 39, 40, 41, 42, 44, 46, 47, 48, 50, 51, 52, 54, 55, 56, 57, 58, 61, 62, 63, 64, 65, 66, 67, 68, 71, 72, 73, 74, 76, 77, 78, 82, 84, 90, 91, 93, 94, 96, 99, 101, 102, 103, 104, 105, 110, 111, 115, 116, 117, 120, 124, 125, 126, 127, 129, 135, 140, 142, 143, 146, 147, 149, 152, 153, 154, 156, 157, 158, 164, 165, 166, 169, 170, 171, 172, 174, 179, 182, 183, 188, 193, 196, 206, 208]\n", - "[1, 2, 3, 4, 6, 8, 11, 18, 21, 23, 24, 30, 31, 34, 38, 39, 41, 44, 45, 47, 48, 49, 50, 53, 54, 59, 60, 61, 64, 67, 69, 72, 76, 77, 78, 79, 81, 82, 83, 84, 90, 91, 93, 94, 96, 97, 101, 102, 103, 104, 105, 111, 117, 118, 119, 121, 125, 127, 129, 134, 135, 138, 139, 141, 142, 143, 147, 151, 153, 154, 156, 160, 161, 162, 163, 164, 168, 170, 172, 173, 177, 181, 182, 183, 184, 186, 187, 188, 190, 193, 196, 197, 198, 199, 200, 201, 202, 203, 204, 210]\n", - "[2, 4, 5, 7, 8, 9, 10, 11, 15, 18, 19, 21, 22, 28, 29, 34, 38, 39, 42, 44, 48, 52, 55, 60, 61, 63, 67, 68, 69, 71, 72, 75, 81, 82, 83, 91, 93, 94, 97, 98, 99, 101, 103, 106, 111, 113, 115, 118, 119, 122, 127, 131, 133, 136, 137, 143, 149, 150, 151, 152, 159, 161, 166, 168, 169, 170, 173, 177, 179, 181, 182, 183, 186, 187, 196, 199, 200, 203, 204, 206, 208, 209]\n", - "imgs/twitter/FA4Nkg2X0AEVeAF.jpeg\n", - "[2, 3, 4, 6, 9, 11, 12, 13, 14, 18, 20, 21, 23, 24, 25, 26, 31, 32, 33, 38, 39, 40, 41, 42, 44, 48, 49, 50, 51, 53, 58, 59, 60, 63, 65, 68, 69, 71, 72, 75, 76, 77, 80, 83, 90, 91, 93, 94, 96, 97, 98, 99, 102, 104, 108, 111, 112, 116, 118, 120, 122, 123, 126, 127, 129, 130, 131, 135, 136, 137, 140, 148, 151, 152, 154, 156, 160, 161, 163, 165, 166, 167, 169, 174, 177, 181, 186, 187, 188, 189, 196, 198, 199, 200, 204, 205, 206, 207, 209, 210]\n", - "[4, 7, 10, 11, 12, 18, 20, 21, 23, 25, 30, 33, 34, 38, 40, 43, 46, 47, 50, 51, 55, 56, 60, 65, 66, 78, 79, 82, 83, 90, 91, 93, 94, 96, 98, 100, 101, 103, 104, 105, 108, 110, 112, 114, 116, 117, 118, 120, 122, 123, 127, 132, 133, 136, 139, 147, 149, 151, 152, 154, 156, 158, 159, 164, 166, 168, 169, 173, 174, 175, 177, 179, 180, 184, 186, 189, 193, 197, 201, 202, 205, 206, 207, 208, 209, 210]\n", - "[1, 3, 4, 7, 11, 12, 13, 15, 18, 20, 21, 23, 25, 26, 27, 30, 31, 32, 34, 38, 39, 42, 43, 44, 45, 46, 49, 54, 55, 56, 60, 64, 67, 69, 70, 71, 72, 76, 77, 80, 83, 84, 90, 91, 93, 94, 96, 100, 112, 114, 115, 118, 119, 121, 122, 126, 133, 135, 136, 138, 139, 143, 147, 149, 153, 154, 156, 157, 159, 160, 164, 165, 166, 169, 170, 172, 173, 174, 177, 180, 181, 184, 189, 190, 191, 202, 203, 207, 209, 210]\n", - "[5, 9, 12, 18, 19, 20, 21, 23, 25, 27, 29, 32, 33, 34, 38, 39, 47, 48, 51, 52, 53, 61, 62, 63, 64, 66, 71, 73, 76, 79, 82, 83, 84, 90, 91, 93, 94, 96, 99, 102, 110, 111, 112, 115, 116, 117, 118, 119, 120, 121, 123, 126, 127, 128, 131, 133, 137, 139, 143, 144, 148, 149, 151, 152, 153, 154, 156, 157, 158, 159, 161, 162, 163, 164, 165, 166, 169, 170, 171, 173, 174, 175, 179, 181, 182, 183, 187, 190, 193, 196, 198, 199, 201, 203, 205, 206, 208, 209]\n", - "[1, 2, 3, 5, 6, 7, 9, 11, 12, 18, 23, 28, 29, 31, 34, 38, 39, 41, 42, 44, 48, 49, 51, 52, 54, 59, 61, 62, 64, 65, 66, 73, 75, 77, 78, 79, 80, 81, 90, 91, 93, 94, 96, 97, 98, 101, 104, 105, 113, 117, 118, 122, 126, 129, 130, 132, 133, 135, 136, 137, 138, 140, 141, 151, 152, 154, 156, 157, 161, 162, 164, 165, 166, 168, 169, 170, 171, 172, 175, 177, 181, 184, 185, 186, 192, 193, 196, 197, 198, 203, 204, 208]\n", - "[2, 5, 6, 7, 8, 10, 11, 13, 14, 15, 18, 19, 20, 27, 28, 30, 31, 38, 40, 41, 42, 43, 44, 46, 48, 49, 51, 52, 53, 55, 56, 57, 58, 59, 60, 62, 68, 69, 70, 72, 74, 75, 76, 78, 84, 90, 91, 93, 94, 96, 108, 110, 111, 114, 118, 119, 120, 121, 123, 124, 126, 127, 128, 130, 131, 133, 135, 139, 141, 143, 147, 149, 150, 152, 154, 156, 161, 162, 164, 166, 167, 168, 170, 171, 172, 177, 179, 180, 183, 184, 185, 186, 187, 189, 190, 192, 196, 197, 198, 200, 207, 208, 209, 210]\n", - "[2, 3, 4, 6, 7, 9, 14, 18, 22, 24, 27, 29, 31, 33, 34, 38, 40, 44, 47, 48, 50, 52, 55, 59, 61, 64, 67, 68, 69, 70, 72, 73, 74, 78, 82, 84, 90, 91, 93, 94, 96, 103, 104, 105, 108, 111, 112, 113, 114, 116, 117, 118, 119, 120, 121, 125, 127, 129, 130, 131, 132, 133, 136, 138, 139, 141, 143, 144, 147, 148, 150, 151, 152, 153, 154, 160, 162, 163, 165, 172, 174, 177, 179, 183, 184, 186, 188, 189, 191, 192, 193, 196, 197, 202, 203, 207, 210]\n", - "[2, 4, 6, 7, 8, 9, 10, 11, 14, 15, 18, 20, 21, 23, 24, 28, 29, 32, 33, 34, 38, 39, 40, 46, 48, 51, 54, 55, 57, 61, 62, 64, 65, 66, 68, 70, 72, 73, 75, 76, 77, 78, 80, 83, 90, 91, 93, 94, 96, 98, 99, 101, 102, 104, 105, 108, 110, 111, 112, 113, 115, 116, 117, 119, 122, 123, 125, 132, 133, 136, 142, 143, 144, 147, 156, 159, 160, 166, 167, 168, 173, 174, 177, 180, 182, 183, 185, 186, 189, 191, 192, 197, 199, 203, 204, 208, 210]\n", - "[1, 3, 5, 6, 7, 10, 11, 13, 15, 18, 21, 23, 26, 29, 30, 31, 32, 33, 34, 38, 39, 41, 42, 43, 46, 52, 54, 55, 61, 65, 66, 67, 68, 69, 73, 76, 77, 78, 79, 80, 82, 83, 90, 91, 93, 94, 96, 99, 100, 101, 104, 105, 108, 110, 112, 113, 117, 118, 119, 120, 122, 126, 127, 129, 131, 132, 136, 138, 139, 140, 141, 143, 144, 151, 152, 156, 159, 161, 166, 167, 170, 173, 174, 175, 179, 180, 181, 182, 185, 188, 189, 190, 191, 192, 199, 200, 202, 203, 204, 205, 206, 208, 210]\n", - "[2, 4, 9, 12, 13, 15, 18, 19, 20, 21, 22, 23, 28, 29, 38, 42, 44, 46, 48, 51, 52, 57, 58, 59, 64, 67, 71, 74, 75, 76, 81, 82, 90, 91, 93, 94, 96, 98, 104, 107, 108, 111, 113, 114, 116, 117, 118, 121, 122, 129, 131, 132, 133, 139, 140, 142, 143, 147, 148, 150, 152, 156, 157, 159, 161, 162, 163, 164, 166, 167, 169, 171, 174, 175, 177, 179, 180, 184, 185, 190, 191, 192, 193, 196, 197, 199, 201, 203, 207, 208, 209]\n", - "[6, 7, 8, 9, 10, 11, 12, 14, 15, 18, 20, 26, 27, 29, 31, 32, 38, 39, 40, 41, 43, 44, 46, 47, 48, 49, 50, 52, 56, 60, 61, 64, 66, 68, 71, 73, 75, 77, 80, 83, 84, 90, 91, 93, 94, 96, 97, 98, 103, 104, 108, 119, 121, 122, 123, 124, 126, 129, 133, 137, 138, 142, 144, 145, 147, 154, 156, 157, 169, 171, 175, 179, 180, 181, 182, 184, 186, 187, 188, 189, 192, 193, 196, 198, 199, 205, 207, 208]\n", - "imgs/twitter/FA6b0i1WQAEVRvZ.jpeg\n", - "[3, 9, 11, 13, 18, 19, 20, 21, 22, 23, 24, 26, 29, 31, 32, 38, 40, 45, 50, 51, 55, 58, 60, 61, 65, 69, 71, 72, 77, 78, 79, 80, 81, 82, 83, 90, 91, 93, 94, 96, 97, 98, 101, 102, 103, 105, 111, 112, 115, 116, 118, 120, 121, 125, 127, 129, 130, 131, 133, 134, 136, 137, 139, 141, 143, 144, 148, 149, 152, 154, 156, 157, 158, 161, 163, 164, 166, 167, 170, 174, 175, 184, 188, 190, 191, 192, 193, 196, 198, 199, 202, 203, 205, 206, 207]\n", - "[3, 4, 6, 8, 18, 22, 24, 25, 26, 27, 29, 31, 34, 38, 39, 40, 41, 43, 44, 45, 47, 48, 51, 52, 53, 57, 60, 64, 65, 66, 67, 68, 71, 72, 75, 77, 79, 80, 81, 83, 90, 91, 93, 94, 96, 98, 99, 101, 102, 104, 105, 108, 111, 112, 114, 115, 121, 123, 124, 125, 126, 127, 129, 130, 132, 136, 138, 142, 143, 145, 148, 150, 153, 154, 158, 159, 160, 161, 162, 165, 166, 169, 170, 171, 172, 174, 175, 179, 181, 182, 183, 185, 187, 192, 193, 200, 201, 204, 205, 208]\n", - "[]\n", - "[1, 2, 3, 4, 7, 8, 10, 11, 13, 15, 18, 20, 26, 27, 29, 30, 34, 38, 40, 41, 43, 44, 45, 46, 49, 50, 52, 54, 55, 56, 62, 66, 68, 69, 73, 74, 75, 81, 82, 83, 84, 90, 91, 93, 94, 96, 97, 99, 100, 101, 104, 111, 112, 113, 114, 115, 120, 122, 124, 126, 129, 131, 133, 141, 143, 144, 147, 149, 151, 154, 159, 160, 161, 164, 166, 168, 170, 173, 177, 179, 180, 181, 182, 183, 184, 186, 188, 189, 191, 192, 193, 198, 200, 201, 203, 204, 205, 209, 210]\n", - "[]\n", - "imgs/twitter/FA4QOZVWUBA-Tdp.jpeg\n", - "[1, 2, 3, 4, 5, 9, 11, 13, 14, 18, 22, 23, 24, 28, 29, 38, 40, 45, 46, 47, 48, 50, 52, 54, 55, 56, 58, 60, 61, 62, 63, 64, 65, 67, 68, 71, 72, 76, 77, 78, 79, 80, 84, 90, 91, 93, 94, 96, 99, 100, 101, 102, 103, 105, 106, 111, 112, 114, 115, 116, 118, 119, 122, 126, 127, 129, 130, 132, 133, 135, 136, 137, 138, 139, 143, 144, 150, 152, 159, 160, 161, 162, 164, 168, 172, 175, 177, 179, 180, 181, 184, 185, 188, 189, 190, 191, 193, 197, 198, 200, 201, 202, 203, 204, 205, 209]\n", - "imgs/twitter/FA4h9VBX0BA9H-Z.jpeg\n", - "[2, 9, 13, 14, 15, 18, 22, 25, 26, 28, 29, 32, 33, 38, 39, 41, 43, 46, 47, 54, 56, 57, 58, 64, 65, 67, 72, 74, 76, 77, 78, 79, 82, 90, 91, 93, 94, 96, 100, 105, 113, 114, 115, 119, 120, 122, 123, 124, 125, 126, 131, 132, 133, 136, 139, 141, 143, 147, 150, 151, 153, 154, 157, 158, 160, 162, 164, 170, 171, 172, 174, 179, 185, 186, 187, 196, 197, 198, 199, 200, 201, 203, 205, 208, 209, 210]\n", - "imgs/twitter/FA6Mcj0WYAArfDH.jpeg\n", - "[1, 4, 5, 7, 11, 12, 13, 14, 18, 20, 21, 24, 26, 27, 28, 32, 38, 39, 40, 42, 44, 48, 49, 50, 51, 52, 54, 55, 56, 58, 61, 65, 67, 68, 75, 76, 81, 90, 91, 93, 94, 96, 99, 101, 103, 104, 105, 108, 111, 113, 115, 117, 118, 120, 121, 122, 124, 125, 126, 127, 132, 133, 139, 141, 143, 149, 151, 156, 158, 162, 167, 168, 169, 170, 172, 175, 180, 181, 183, 184, 185, 186, 190, 192, 193, 196, 197, 198, 203, 205, 207]\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "[1, 3, 7, 9, 11, 13, 14, 15, 18, 20, 21, 23, 24, 25, 28, 29, 30, 32, 33, 34, 38, 39, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 52, 53, 54, 55, 57, 59, 61, 64, 65, 66, 68, 69, 72, 77, 80, 81, 82, 90, 91, 93, 94, 96, 97, 98, 99, 100, 105, 108, 110, 112, 116, 122, 123, 126, 127, 135, 143, 147, 148, 152, 154, 156, 161, 162, 163, 164, 166, 167, 168, 170, 172, 175, 181, 183, 184, 185, 187, 191, 193, 196, 197, 198, 199, 200, 204, 205, 207, 210]\n", - "[1, 2, 3, 6, 8, 9, 10, 11, 13, 15, 18, 19, 22, 23, 24, 30, 31, 32, 34, 38, 39, 40, 45, 46, 47, 48, 49, 51, 53, 54, 56, 59, 61, 62, 66, 68, 69, 70, 72, 73, 74, 80, 82, 83, 84, 90, 91, 93, 94, 96, 97, 98, 102, 104, 112, 113, 117, 118, 119, 120, 121, 125, 127, 129, 130, 131, 134, 136, 137, 140, 141, 148, 154, 155, 157, 159, 160, 164, 165, 166, 167, 168, 169, 171, 177, 185, 186, 188, 191, 193, 198, 200, 201, 202, 204, 206, 208, 210]\n", - "[4, 8, 9, 59, 60, 67, 104, 151, 204, 206]\n", - "[1, 2, 5, 7, 9, 10, 12, 14, 15, 18, 20, 21, 22, 25, 28, 33, 38, 39, 40, 42, 44, 46, 50, 51, 52, 53, 58, 62, 64, 65, 66, 67, 68, 74, 75, 76, 77, 78, 79, 82, 84, 90, 91, 93, 94, 96, 98, 102, 103, 104, 105, 111, 112, 113, 115, 116, 118, 119, 120, 123, 124, 125, 127, 129, 130, 131, 134, 138, 141, 143, 144, 147, 148, 149, 150, 152, 153, 156, 159, 162, 166, 174, 175, 177, 180, 182, 183, 187, 189, 191, 193, 197, 203, 204, 207, 208, 209]\n", - "imgs/twitter/FA4NtWVXMAAGE9O.jpeg\n", - "[5, 7, 8, 11, 12, 15, 18, 19, 20, 23, 25, 28, 30, 31, 38, 39, 43, 44, 46, 47, 49, 53, 55, 56, 57, 58, 65, 74, 75, 76, 77, 78, 79, 80, 81, 84, 90, 91, 93, 94, 96, 97, 100, 101, 104, 105, 108, 110, 115, 119, 121, 123, 124, 125, 129, 130, 132, 133, 139, 140, 142, 143, 144, 145, 147, 149, 150, 153, 154, 159, 162, 163, 165, 167, 168, 170, 171, 172, 177, 180, 183, 184, 185, 190, 197, 201, 203, 204, 205, 206, 207, 210]\n", - "imgs/twitter/FA4anBBVEAQ42NA.jpeg\n", - "imgs/twitter/FJDF5kmXMAMdAtI.jpeg\n", - "[1, 2, 3, 7, 8, 9, 15, 18, 20, 21, 22, 25, 27, 29, 31, 33, 38, 40, 41, 43, 44, 47, 48, 49, 51, 52, 57, 58, 61, 63, 64, 65, 68, 70, 71, 73, 74, 75, 78, 79, 82, 84, 90, 91, 93, 94, 96, 100, 103, 105, 114, 121, 124, 126, 133, 135, 141, 142, 143, 144, 147, 148, 149, 151, 152, 153, 154, 156, 159, 161, 162, 163, 165, 167, 168, 169, 170, 172, 174, 177, 180, 181, 184, 186, 189, 190, 192, 196, 198, 200, 201, 202, 204, 205, 206, 208, 209, 210]\n", - "[4, 5, 10, 12, 16, 18, 22, 24, 29, 38, 41, 43, 48, 53, 54, 55, 60, 65, 67, 68, 69, 75, 76, 78, 91, 93, 97, 98, 99, 104, 116, 117, 121, 122, 127, 129, 134, 135, 136, 147, 150]\n", - "[]\n", - "[1, 2, 4, 6, 10, 12, 13, 14, 18, 19, 20, 22, 24, 26, 27, 29, 30, 31, 32, 33, 34, 38, 39, 43, 44, 45, 46, 48, 50, 51, 52, 53, 54, 55, 60, 63, 65, 66, 68, 70, 71, 72, 74, 76, 77, 79, 81, 82, 87, 90, 93, 94, 96, 97, 98, 99, 102, 111, 112, 114, 116, 118, 121, 124, 125, 127, 129, 130, 131, 132, 134, 136, 137, 138, 139, 144, 147, 148, 149, 153, 154, 155, 160, 163, 166, 169, 170, 172, 177, 179, 181, 182, 185, 186, 188, 189, 190, 192, 193, 197, 198, 200, 201, 202, 204, 206, 207, 208]\n", - "[2, 3, 4, 6, 9, 10, 11, 13, 18, 21, 24, 26, 28, 29, 31, 33, 38, 39, 41, 42, 43, 44, 46, 49, 51, 53, 54, 55, 56, 58, 60, 61, 62, 65, 66, 67, 68, 69, 70, 76, 78, 79, 83, 84, 87, 90, 93, 94, 96, 97, 98, 103, 104, 107, 110, 111, 112, 113, 120, 121, 122, 123, 125, 126, 127, 129, 130, 131, 135, 144, 150, 151, 152, 153, 155, 160, 162, 163, 165, 168, 171, 172, 175, 179, 181, 184, 185, 186, 187, 188, 189, 191, 196, 198, 200, 206, 207, 209]\n", - "[2, 3, 5, 7, 13, 14, 18, 21, 22, 24, 25, 26, 27, 29, 31, 38, 39, 41, 42, 43, 44, 45, 46, 54, 55, 56, 58, 59, 60, 62, 64, 65, 67, 68, 72, 75, 77, 83, 87, 90, 93, 94, 96, 97, 100, 101, 102, 105, 106, 107, 109, 110, 111, 113, 115, 117, 118, 120, 121, 124, 129, 130, 131, 133, 134, 136, 137, 139, 140, 141, 144, 145, 148, 149, 150, 151, 154, 155, 159, 162, 163, 168, 171, 174, 179, 180, 185, 189, 196, 197, 198, 202, 204, 205, 208, 209, 210]\n", - "[1, 2, 4, 6, 12, 13, 14, 18, 19, 21, 22, 23, 25, 27, 28, 32, 33, 38, 39, 42, 43, 44, 45, 46, 49, 50, 51, 53, 54, 55, 57, 59, 60, 61, 62, 63, 66, 68, 69, 70, 78, 79, 80, 81, 84, 87, 90, 93, 94, 96, 102, 103, 104, 105, 107, 109, 110, 119, 120, 121, 124, 127, 128, 131, 133, 136, 138, 141, 144, 145, 147, 148, 153, 155, 158, 161, 164, 165, 166, 167, 168, 170, 171, 172, 177, 180, 187, 191, 198, 199, 200, 201, 204, 207, 210]\n", - "[3, 4, 9, 14, 15, 18, 19, 20, 21, 22, 24, 26, 29, 30, 31, 33, 34, 38, 39, 44, 47, 48, 49, 52, 55, 57, 58, 60, 61, 62, 63, 64, 65, 67, 70, 71, 72, 74, 75, 76, 77, 78, 80, 83, 87, 90, 93, 94, 96, 97, 98, 99, 101, 106, 110, 111, 113, 114, 116, 118, 119, 120, 123, 126, 129, 131, 133, 137, 138, 140, 141, 144, 146, 148, 149, 153, 154, 155, 158, 159, 161, 162, 164, 166, 168, 169, 170, 172, 175, 180, 185, 187, 188, 190, 191, 193, 196, 199, 203, 207, 208, 210]\n", - "[3, 8, 9, 11, 15, 18, 19, 20, 23, 24, 29, 30, 32, 33, 38, 39, 41, 42, 46, 51, 52, 53, 55, 57, 58, 59, 61, 62, 65, 68, 71, 72, 74, 75, 76, 78, 79, 80, 81, 82, 83, 84, 87, 90, 93, 94, 96, 97, 98, 101, 105, 106, 107, 108, 109, 111, 112, 115, 116, 117, 119, 123, 128, 131, 132, 134, 135, 136, 138, 139, 141, 145, 146, 147, 150, 153, 154, 155, 157, 158, 159, 160, 161, 163, 164, 167, 168, 169, 170, 171, 173, 174, 180, 182, 187, 188, 189, 196, 197, 201, 203, 209]\n", - "[1, 3, 4, 5, 6, 7, 8, 9, 11, 12, 13, 15, 18, 19, 20, 21, 23, 25, 28, 31, 32, 33, 34, 38, 39, 42, 43, 46, 47, 48, 50, 51, 54, 57, 58, 64, 65, 67, 68, 70, 71, 74, 77, 82, 83, 90, 91, 93, 94, 96, 108, 111, 113, 115, 117, 124, 125, 127, 130, 132, 136, 139, 141, 143, 147, 148, 150, 151, 153, 154, 156, 159, 160, 162, 163, 164, 165, 166, 167, 168, 169, 173, 177, 179, 181, 182, 185, 186, 187, 188, 192, 193, 196, 199, 201, 202, 204, 205, 210]\n", - "[1, 2, 3, 5, 6, 7, 8, 12, 14, 18, 20, 21, 23, 24, 25, 26, 29, 34, 38, 39, 41, 42, 45, 47, 48, 55, 58, 61, 64, 68, 72, 75, 82, 83, 91, 93, 94, 98, 100, 101, 105, 115, 119, 122, 124, 125, 129, 131, 132, 133, 136, 138, 141, 142, 147, 151, 152, 154, 157, 158, 159, 161, 164, 165, 166, 168, 171, 174, 179, 181, 184, 185, 189, 193, 196, 197, 199, 200, 202, 203, 204, 205, 206, 208, 209, 210]\n", - "[2, 4, 5, 8, 10, 13, 14, 15, 18, 19, 22, 23, 24, 30, 32, 38, 40, 41, 42, 44, 48, 49, 51, 55, 56, 57, 58, 60, 63, 64, 66, 68, 72, 75, 76, 77, 79, 80, 82, 83, 90, 91, 93, 94, 96, 104, 105, 108, 110, 111, 112, 116, 119, 122, 123, 124, 126, 127, 131, 133, 139, 143, 147, 149, 150, 151, 159, 160, 161, 162, 165, 166, 168, 169, 170, 172, 174, 177, 179, 180, 181, 183, 185, 186, 193, 197, 198, 199, 200, 201, 202, 205, 206, 207, 208, 209, 210]\n", - "[4, 8, 11, 12, 13, 14, 18, 19, 22, 23, 25, 26, 27, 28, 29, 30, 31, 32, 34, 38, 39, 40, 41, 44, 46, 47, 48, 55, 58, 59, 60, 61, 65, 68, 69, 72, 73, 74, 75, 76, 77, 80, 82, 90, 91, 93, 94, 96, 98, 99, 101, 104, 105, 108, 110, 111, 112, 114, 115, 118, 119, 120, 122, 125, 132, 133, 136, 139, 143, 145, 147, 148, 153, 156, 157, 158, 160, 161, 162, 165, 169, 172, 173, 174, 175, 179, 181, 185, 186, 187, 188, 189, 190, 191, 193, 196, 200, 203, 204, 205, 206, 208]\n", - "[2, 3, 4, 5, 7, 12, 15, 18, 19, 22, 25, 26, 28, 31, 38, 39, 40, 41, 42, 43, 45, 46, 47, 48, 51, 52, 53, 54, 56, 58, 65, 66, 68, 72, 74, 76, 78, 79, 81, 82, 83, 84, 90, 91, 93, 94, 96, 97, 98, 101, 104, 108, 110, 112, 115, 116, 122, 125, 129, 132, 133, 135, 143, 144, 147, 148, 149, 156, 159, 165, 167, 168, 170, 171, 173, 177, 179, 182, 183, 184, 187, 189, 191, 192, 193, 198, 199, 200, 201, 202, 204, 205, 206, 207, 210]\n", - "[1, 2, 3, 4, 5, 7, 9, 10, 11, 12, 13, 15, 18, 19, 20, 22, 25, 27, 29, 32, 38, 40, 41, 46, 47, 50, 52, 53, 56, 57, 61, 64, 66, 69, 71, 72, 75, 76, 77, 79, 80, 81, 83, 90, 91, 93, 94, 96, 97, 99, 101, 104, 105, 108, 110, 115, 117, 119, 121, 123, 124, 125, 126, 127, 129, 133, 135, 138, 141, 142, 143, 144, 147, 149, 150, 154, 157, 159, 161, 165, 167, 168, 169, 170, 171, 177, 179, 181, 183, 185, 186, 187, 190, 192, 197, 198, 199, 200, 202, 206, 207, 209, 210]\n", - "[2, 4, 8, 10, 13, 18, 19, 20, 24, 26, 27, 28, 29, 30, 38, 40, 42, 43, 47, 49, 50, 52, 53, 54, 55, 57, 58, 61, 64, 66, 67, 70, 75, 77, 78, 82, 84, 90, 91, 93, 94, 96, 100, 101, 103, 108, 111, 115, 119, 120, 123, 130, 131, 134, 140, 141, 142, 143, 147, 149, 152, 153, 156, 157, 160, 164, 165, 166, 167, 173, 175, 177, 180, 181, 185, 186, 187, 188, 189, 193, 196, 197, 199, 201, 202, 203, 205, 206, 207]\n", - "[4, 5, 7, 8, 12, 13, 14, 18, 20, 21, 25, 28, 29, 31, 32, 38, 39, 42, 43, 46, 48, 51, 52, 53, 57, 61, 64, 66, 72, 75, 77, 78, 80, 81, 82, 83, 90, 91, 93, 94, 96, 97, 98, 101, 103, 104, 105, 108, 111, 112, 114, 117, 120, 121, 122, 124, 125, 129, 132, 136, 141, 143, 147, 149, 150, 154, 157, 158, 160, 161, 163, 164, 168, 169, 174, 175, 180, 184, 186, 187, 188, 196, 197, 203, 205, 206, 207, 208]\n", - "[2, 3, 4, 5, 7, 9, 11, 14, 18, 22, 23, 25, 27, 28, 30, 32, 34, 38, 39, 41, 42, 44, 46, 48, 50, 54, 55, 56, 59, 60, 61, 65, 67, 68, 69, 71, 72, 74, 76, 78, 79, 81, 83, 84, 90, 91, 93, 94, 96, 99, 100, 103, 104, 105, 108, 110, 111, 112, 113, 114, 117, 119, 122, 123, 124, 125, 130, 131, 132, 135, 136, 138, 139, 143, 144, 147, 148, 149, 151, 152, 154, 160, 161, 164, 166, 169, 170, 172, 177, 180, 181, 182, 183, 186, 187, 190, 196, 197, 198, 199, 200, 203, 205, 207, 209, 210]\n", - "imgs/people/FECYsfjXwAIEYmJ.jpeg\n", - "[3, 4, 6, 9, 14, 18, 22, 23, 26, 27, 29, 30, 33, 34, 38, 40, 42, 43, 44, 46, 49, 50, 53, 55, 57, 61, 66, 71, 72, 73, 74, 77, 83, 90, 91, 93, 94, 96, 98, 99, 100, 104, 105, 111, 112, 114, 115, 118, 120, 122, 123, 126, 130, 132, 133, 135, 136, 137, 140, 141, 145, 147, 148, 149, 151, 154, 156, 158, 161, 162, 165, 171, 174, 177, 179, 184, 186, 189, 196, 199, 200, 201, 203, 207, 209, 210]\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "[1, 2, 8, 11, 13, 14, 18, 20, 21, 23, 24, 25, 26, 27, 28, 29, 32, 33, 38, 40, 41, 42, 45, 48, 50, 56, 57, 58, 59, 61, 67, 69, 72, 73, 74, 75, 77, 80, 81, 82, 90, 91, 93, 94, 96, 98, 99, 101, 106, 111, 113, 114, 115, 121, 123, 124, 126, 127, 129, 130, 139, 141, 142, 143, 144, 147, 148, 150, 156, 157, 159, 162, 163, 169, 170, 172, 173, 174, 175, 177, 179, 180, 182, 183, 184, 185, 187, 188, 190, 192, 197, 198, 201, 203, 204, 206, 207, 208, 209, 210]\n", - "[1, 2, 3, 4, 5, 7, 9, 10, 11, 12, 13, 15, 18, 19, 20, 22, 25, 27, 29, 32, 38, 40, 41, 46, 47, 50, 52, 53, 56, 57, 61, 64, 66, 69, 71, 72, 75, 76, 77, 79, 80, 81, 83, 90, 91, 93, 94, 96, 97, 99, 101, 104, 105, 108, 110, 115, 117, 119, 121, 123, 124, 125, 126, 127, 129, 133, 135, 138, 141, 142, 143, 144, 147, 149, 150, 154, 157, 159, 161, 165, 167, 168, 169, 170, 171, 177, 179, 181, 183, 185, 186, 187, 190, 192, 197, 198, 199, 200, 202, 206, 207, 209, 210]\n", - "[1, 2, 3, 6, 9, 11, 12, 13, 14, 15, 18, 20, 22, 26, 27, 30, 32, 34, 38, 41, 43, 44, 45, 48, 53, 54, 56, 58, 59, 60, 65, 66, 68, 70, 71, 72, 75, 76, 78, 79, 82, 90, 91, 93, 94, 96, 100, 101, 102, 104, 107, 108, 110, 111, 112, 115, 116, 118, 119, 120, 131, 132, 133, 136, 137, 142, 143, 144, 148, 150, 152, 153, 154, 156, 159, 160, 161, 162, 164, 165, 166, 167, 168, 173, 177, 179, 181, 185, 186, 187, 188, 190, 193, 196, 198, 199, 200, 201, 204, 207, 208, 210]\n", - "[1, 2, 4, 5, 7, 8, 10, 11, 14, 18, 20, 23, 27, 30, 32, 33, 38, 39, 41, 42, 44, 45, 47, 48, 50, 53, 54, 57, 58, 59, 61, 62, 64, 65, 68, 71, 73, 76, 78, 81, 82, 83, 84, 90, 91, 93, 94, 96, 98, 103, 106, 113, 114, 117, 121, 123, 126, 127, 129, 130, 131, 132, 133, 136, 138, 141, 142, 144, 148, 152, 154, 156, 158, 160, 164, 166, 167, 169, 172, 173, 175, 185, 186, 190, 191, 196, 199, 200, 203, 208]\n", - "[1, 2, 3, 4, 5, 7, 9, 10, 11, 18, 19, 24, 25, 26, 27, 29, 30, 38, 40, 43, 44, 45, 47, 48, 56, 57, 60, 61, 67, 69, 71, 72, 79, 91, 93, 97, 98, 103, 115, 116, 117, 122, 127, 129, 130, 135, 137, 151, 163, 164, 165, 169, 171, 177, 178, 179, 182, 184, 186, 187, 188, 190, 197, 199, 204, 205, 207, 208]\n", - "[1, 2, 4, 5, 7, 10, 12, 13, 14, 18, 19, 20, 22, 24, 25, 26, 27, 28, 32, 34, 38, 39, 43, 44, 46, 47, 48, 49, 56, 58, 63, 66, 68, 69, 70, 71, 73, 74, 79, 80, 90, 91, 93, 94, 96, 98, 100, 101, 104, 105, 108, 115, 116, 117, 118, 119, 122, 123, 124, 125, 126, 131, 132, 133, 135, 136, 138, 139, 140, 141, 143, 147, 149, 150, 151, 157, 165, 166, 167, 169, 170, 174, 177, 181, 183, 186, 189, 196, 201, 203, 206, 210]\n", - "[1, 2, 5, 7, 11, 13, 14, 15, 18, 19, 20, 21, 25, 26, 27, 29, 30, 32, 33, 38, 39, 40, 42, 44, 45, 50, 53, 54, 56, 57, 58, 69, 71, 73, 74, 76, 77, 80, 83, 84, 90, 91, 93, 94, 96, 97, 98, 105, 108, 112, 114, 116, 118, 122, 124, 125, 129, 130, 134, 136, 137, 139, 140, 141, 142, 143, 144, 148, 149, 153, 156, 157, 159, 162, 164, 165, 166, 168, 170, 171, 172, 174, 175, 177, 179, 181, 183, 187, 188, 189, 190, 193, 197, 201, 202, 203, 206, 208, 209, 210]\n", - "[1, 2, 4, 9, 10, 12, 14, 18, 22, 25, 27, 28, 30, 31, 34, 38, 39, 40, 41, 43, 44, 45, 49, 50, 54, 57, 61, 62, 64, 65, 66, 68, 69, 70, 72, 73, 74, 75, 79, 90, 91, 93, 94, 96, 101, 102, 103, 104, 105, 108, 111, 114, 117, 125, 126, 127, 128, 131, 133, 135, 137, 138, 139, 140, 142, 143, 149, 152, 157, 160, 162, 167, 172, 173, 174, 175, 177, 179, 180, 181, 185, 187, 196, 197, 198, 199, 200, 201, 204, 205, 206, 207, 208, 210]\n", - "[]\n", - "imgs/people/FEK1L9cXoAgulGK.jpeg\n", - "[3, 6, 7, 8, 9, 11, 12, 15, 18, 21, 22, 25, 28, 31, 32, 34, 38, 39, 40, 42, 43, 48, 50, 52, 55, 56, 57, 58, 61, 62, 65, 68, 72, 73, 76, 78, 79, 80, 82, 90, 91, 93, 94, 96, 97, 99, 101, 102, 105, 108, 110, 111, 112, 115, 116, 118, 119, 120, 122, 123, 127, 129, 131, 133, 134, 135, 136, 137, 143, 149, 151, 154, 156, 159, 161, 164, 165, 166, 167, 168, 169, 170, 171, 174, 177, 179, 180, 181, 182, 184, 185, 186, 187, 190, 191, 196, 198, 200, 201, 203, 204, 205, 209, 210]\n", - "[2, 3, 5, 10, 18, 20, 21, 23, 24, 25, 26, 28, 29, 31, 32, 33, 34, 38, 44, 46, 47, 48, 49, 51, 53, 55, 56, 58, 59, 64, 65, 66, 68, 69, 71, 73, 75, 76, 77, 78, 79, 83, 84, 90, 91, 93, 94, 96, 97, 98, 99, 104, 105, 107, 108, 112, 115, 118, 119, 120, 122, 123, 124, 125, 126, 127, 130, 131, 132, 135, 139, 144, 148, 151, 152, 153, 154, 156, 157, 159, 160, 164, 165, 166, 168, 169, 170, 175, 177, 179, 183, 184, 186, 188, 190, 192, 193, 197, 199, 200, 202, 205, 207, 208, 210]\n", - "[1, 4, 5, 6, 8, 9, 13, 18, 20, 21, 23, 25, 26, 29, 31, 38, 40, 42, 47, 48, 49, 55, 56, 58, 61, 67, 68, 69, 71, 72, 77, 78, 80, 91, 93, 98, 99, 104, 105, 111, 122, 123, 130, 136, 138, 139, 147, 149, 159, 162, 165, 167, 169, 170, 181, 183, 188, 189, 196, 197, 198, 199, 200, 203, 204, 205, 207]\n", - "[1, 3, 5, 9, 10, 12, 13, 15, 18, 19, 20, 21, 23, 24, 29, 30, 32, 33, 34, 38, 39, 41, 43, 46, 49, 50, 51, 52, 54, 56, 57, 58, 61, 62, 63, 64, 66, 67, 69, 70, 72, 73, 76, 78, 81, 82, 87, 90, 93, 94, 96, 97, 100, 101, 102, 108, 110, 111, 113, 115, 118, 119, 121, 126, 127, 129, 138, 139, 140, 146, 150, 152, 153, 155, 157, 158, 159, 160, 161, 162, 163, 164, 165, 169, 170, 171, 173, 175, 177, 178, 179, 181, 183, 184, 186, 187, 190, 192, 193, 196, 200, 201, 202, 204, 206]\n", - "[3, 4, 7, 8, 9, 10, 13, 15, 18, 19, 20, 22, 23, 27, 28, 29, 34, 38, 39, 41, 42, 44, 45, 49, 50, 51, 54, 55, 56, 57, 59, 62, 65, 68, 69, 70, 72, 73, 75, 77, 78, 79, 80, 82, 83, 87, 90, 93, 94, 96, 97, 98, 99, 100, 101, 102, 103, 105, 108, 109, 112, 114, 118, 121, 128, 129, 131, 134, 135, 136, 137, 139, 141, 144, 147, 148, 150, 151, 152, 154, 155, 157, 159, 161, 162, 164, 166, 170, 171, 172, 173, 177, 178, 180, 182, 186, 187, 190, 191, 196, 198, 200, 201, 203, 205, 206, 209, 210]\n", - "[]\n", - "[1, 2, 4, 6, 7, 8, 9, 11, 12, 14, 18, 19, 21, 28, 29, 30, 31, 32, 33, 38, 39, 42, 44, 45, 48, 49, 50, 52, 53, 54, 56, 60, 63, 65, 67, 68, 71, 72, 75, 76, 87, 90, 93, 94, 96, 97, 98, 104, 107, 114, 117, 118, 120, 122, 123, 124, 126, 130, 134, 138, 140, 144, 145, 148, 149, 150, 153, 154, 155, 158, 159, 161, 162, 164, 165, 166, 169, 172, 180, 181, 183, 185, 186, 189, 191, 192, 193, 196, 200, 202, 204, 205, 206, 209, 210]\n", - "[6, 9, 11, 14, 18, 20, 22, 26, 28, 30, 31, 33, 38, 39, 41, 42, 43, 44, 45, 48, 51, 52, 54, 59, 60, 61, 63, 65, 66, 69, 70, 74, 75, 77, 78, 79, 80, 84, 87, 90, 93, 94, 96, 97, 98, 100, 101, 102, 103, 107, 109, 111, 115, 116, 118, 119, 121, 124, 125, 127, 128, 131, 132, 135, 136, 138, 139, 141, 144, 150, 151, 152, 153, 155, 158, 160, 163, 167, 169, 170, 172, 177, 178, 181, 184, 186, 192, 196, 198, 199, 200, 203, 205, 208, 209]\n", - "[3, 4, 6, 8, 9, 10, 11, 12, 18, 20, 21, 23, 25, 26, 27, 31, 33, 34, 38, 39, 41, 42, 43, 48, 51, 53, 55, 60, 61, 63, 64, 65, 67, 68, 70, 72, 78, 79, 80, 81, 87, 90, 93, 94, 96, 98, 99, 101, 105, 109, 114, 115, 116, 120, 121, 122, 123, 126, 128, 130, 132, 133, 134, 136, 138, 139, 140, 145, 148, 149, 151, 153, 155, 158, 159, 164, 166, 169, 171, 174, 178, 179, 180, 182, 183, 185, 187, 188, 189, 193, 197, 199, 201, 203, 204, 207]\n", - "[1, 4, 8, 9, 10, 11, 18, 19, 21, 23, 24, 26, 27, 28, 29, 30, 32, 33, 38, 39, 42, 43, 47, 48, 50, 51, 52, 54, 55, 56, 57, 59, 61, 62, 65, 66, 67, 69, 71, 72, 73, 74, 78, 79, 82, 87, 90, 93, 94, 96, 105, 108, 111, 112, 113, 114, 115, 117, 120, 121, 126, 130, 131, 133, 136, 137, 138, 144, 147, 152, 154, 155, 157, 161, 164, 165, 168, 169, 170, 171, 172, 177, 179, 182, 183, 184, 185, 187, 188, 190, 191, 198, 200, 201, 202, 207, 210]\n", - "[1, 4, 6, 7, 14, 15, 18, 19, 26, 28, 29, 32, 33, 34, 38, 39, 41, 43, 44, 45, 46, 47, 50, 51, 52, 53, 54, 55, 56, 57, 63, 64, 65, 66, 67, 76, 77, 79, 81, 82, 83, 87, 90, 93, 94, 96, 97, 100, 101, 103, 104, 105, 107, 116, 119, 120, 122, 126, 127, 128, 130, 132, 133, 137, 138, 139, 140, 144, 146, 148, 149, 152, 154, 155, 157, 158, 161, 168, 170, 171, 172, 173, 178, 180, 181, 183, 184, 185, 188, 190, 191, 198, 199, 200, 201, 202, 205, 207, 208, 209]\n", - "[3, 5, 6, 10, 13, 15, 18, 20, 21, 23, 24, 25, 28, 29, 30, 32, 34, 38, 39, 42, 46, 50, 56, 58, 60, 62, 64, 65, 67, 70, 72, 73, 75, 76, 78, 81, 84, 87, 90, 93, 94, 96, 100, 102, 107, 108, 109, 115, 118, 119, 120, 121, 122, 123, 124, 125, 127, 128, 130, 132, 134, 138, 145, 146, 147, 150, 151, 153, 155, 157, 159, 161, 163, 164, 166, 169, 173, 175, 178, 179, 180, 182, 183, 184, 186, 187, 190, 192, 193, 197, 200, 203, 204, 205]\n", - "[2, 3, 6, 7, 8, 9, 11, 12, 13, 18, 19, 21, 23, 28, 29, 30, 31, 33, 34, 38, 39, 41, 43, 44, 46, 49, 51, 53, 55, 56, 57, 58, 59, 61, 63, 67, 68, 73, 75, 79, 80, 81, 82, 83, 84, 87, 90, 93, 94, 96, 97, 98, 100, 102, 104, 105, 106, 109, 110, 111, 112, 114, 117, 119, 120, 122, 125, 127, 128, 132, 138, 140, 141, 144, 146, 148, 149, 151, 155, 157, 158, 160, 166, 168, 169, 173, 174, 178, 180, 181, 183, 186, 187, 189, 191, 192, 193, 197, 199, 202, 203, 204, 206, 207]\n", - "[1, 3, 6, 8, 9, 11, 12, 13, 18, 19, 20, 23, 24, 27, 31, 33, 38, 39, 41, 42, 43, 44, 46, 47, 49, 51, 52, 55, 56, 58, 59, 61, 62, 64, 65, 70, 72, 73, 74, 75, 76, 77, 79, 82, 83, 84, 87, 90, 93, 94, 96, 97, 98, 100, 102, 110, 111, 113, 116, 117, 119, 120, 126, 129, 130, 134, 137, 138, 139, 140, 146, 151, 152, 153, 154, 155, 157, 158, 159, 161, 163, 167, 168, 169, 171, 172, 173, 174, 177, 179, 187, 189, 190, 191, 192, 193, 196, 197, 198, 202, 203, 204, 206, 207, 208, 210]\n", - "[1, 3, 4, 7, 10, 15, 18, 19, 21, 23, 28, 29, 33, 38, 39, 42, 43, 44, 47, 48, 49, 50, 51, 52, 53, 57, 58, 59, 62, 65, 66, 68, 69, 70, 72, 74, 79, 81, 84, 87, 90, 93, 94, 96, 97, 98, 99, 101, 102, 104, 105, 108, 109, 111, 112, 113, 114, 115, 117, 121, 124, 125, 127, 128, 131, 133, 134, 139, 144, 148, 149, 150, 151, 154, 155, 157, 160, 161, 165, 167, 168, 170, 171, 172, 173, 178, 179, 181, 182, 184, 185, 186, 196, 197, 198, 199, 201, 203, 204, 205, 207, 208]\n", - "[3, 5, 9, 11, 12, 14, 15, 18, 19, 20, 21, 22, 23, 25, 26, 31, 32, 38, 39, 41, 42, 43, 44, 47, 52, 53, 57, 59, 60, 61, 63, 64, 67, 68, 69, 70, 72, 79, 82, 83, 87, 90, 93, 94, 96, 97, 98, 99, 102, 103, 106, 107, 114, 116, 118, 121, 123, 124, 127, 129, 131, 132, 133, 135, 137, 138, 139, 145, 153, 155, 157, 168, 170, 172, 173, 174, 180, 183, 184, 186, 187, 188, 189, 196, 198, 199, 201, 203, 205, 207, 208, 210]\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "[1, 3, 5, 6, 7, 8, 9, 11, 12, 15, 18, 21, 24, 25, 26, 29, 31, 33, 38, 39, 41, 42, 43, 44, 45, 48, 49, 50, 51, 52, 55, 58, 61, 63, 64, 66, 67, 71, 72, 73, 75, 76, 77, 78, 79, 84, 87, 90, 93, 94, 96, 98, 100, 101, 103, 107, 113, 114, 115, 116, 118, 121, 123, 125, 126, 127, 128, 129, 131, 132, 135, 137, 138, 139, 140, 141, 144, 147, 148, 151, 152, 154, 155, 157, 158, 159, 161, 164, 166, 169, 170, 173, 174, 178, 179, 181, 182, 184, 187, 188, 192, 193, 202, 205, 208, 209, 210]\n", - "[1, 2, 3, 11, 15, 18, 19, 20, 22, 24, 27, 31, 33, 34, 38, 39, 43, 44, 46, 47, 56, 57, 58, 59, 61, 63, 66, 68, 70, 71, 74, 75, 76, 84, 87, 90, 93, 94, 96, 98, 104, 105, 106, 107, 108, 109, 110, 111, 115, 116, 118, 120, 121, 124, 125, 126, 129, 130, 131, 135, 137, 138, 139, 140, 141, 144, 145, 146, 147, 151, 152, 153, 155, 157, 159, 163, 166, 169, 175, 180, 181, 183, 184, 185, 187, 188, 189, 190, 192, 193, 196, 198, 199, 202, 203, 204, 205, 206, 207, 208, 209]\n", - "[1, 3, 4, 7, 9, 10, 12, 13, 15, 18, 20, 21, 23, 25, 26, 28, 29, 32, 33, 34, 38, 39, 41, 42, 43, 44, 45, 46, 51, 55, 56, 58, 61, 62, 70, 72, 73, 74, 77, 79, 81, 82, 83, 84, 87, 90, 93, 94, 96, 97, 99, 100, 101, 103, 106, 108, 109, 110, 113, 118, 121, 122, 125, 126, 127, 130, 131, 133, 134, 136, 137, 138, 140, 144, 146, 147, 148, 149, 155, 158, 160, 171, 172, 173, 174, 175, 177, 178, 181, 185, 186, 187, 189, 192, 193, 197, 199, 201, 202, 203, 204, 205]\n", - "[3, 4, 5, 8, 10, 11, 12, 18, 20, 21, 26, 30, 32, 33, 38, 39, 41, 42, 44, 45, 50, 51, 54, 55, 58, 59, 60, 61, 62, 66, 67, 68, 69, 70, 73, 74, 75, 77, 79, 80, 81, 84, 87, 90, 93, 94, 96, 97, 101, 102, 103, 105, 106, 109, 110, 111, 116, 119, 120, 122, 124, 125, 127, 128, 131, 133, 134, 136, 138, 141, 144, 146, 147, 149, 152, 155, 159, 163, 165, 167, 169, 171, 175, 177, 179, 180, 182, 184, 187, 190, 192, 193, 196, 197, 199, 202, 203, 204, 205, 209, 210]\n", - "[1, 3, 5, 9, 10, 12, 13, 15, 18, 19, 20, 21, 23, 24, 29, 30, 32, 33, 34, 38, 39, 41, 43, 46, 49, 50, 51, 52, 54, 56, 57, 58, 61, 62, 63, 64, 66, 67, 69, 70, 72, 73, 76, 78, 81, 82, 87, 90, 93, 94, 96, 97, 100, 101, 102, 108, 110, 111, 113, 115, 118, 119, 121, 126, 127, 129, 138, 139, 140, 146, 150, 152, 153, 155, 157, 158, 159, 160, 161, 162, 163, 164, 165, 169, 170, 171, 173, 175, 177, 178, 179, 181, 183, 184, 186, 187, 190, 192, 193, 196, 200, 201, 202, 204, 206]\n", - "[3, 5, 8, 9, 10, 11, 12, 15, 18, 19, 21, 24, 25, 29, 31, 38, 39, 42, 43, 44, 45, 46, 47, 49, 51, 55, 59, 62, 63, 65, 66, 67, 69, 70, 72, 78, 79, 83, 87, 90, 93, 94, 96, 98, 99, 101, 103, 106, 110, 111, 112, 114, 115, 116, 118, 119, 122, 123, 125, 127, 130, 131, 132, 134, 135, 137, 138, 140, 141, 144, 148, 152, 153, 154, 155, 157, 158, 159, 162, 163, 164, 169, 171, 172, 174, 175, 177, 181, 182, 183, 186, 187, 189, 191, 192, 193, 198, 199, 200, 201, 202, 204, 205, 206, 207]\n", - "[1, 2, 4, 8, 11, 12, 13, 15, 18, 21, 22, 23, 24, 26, 30, 31, 32, 34, 38, 39, 44, 45, 51, 52, 55, 56, 58, 61, 62, 67, 68, 69, 74, 79, 82, 84, 87, 90, 93, 94, 96, 97, 98, 102, 104, 106, 108, 111, 113, 114, 115, 118, 120, 121, 122, 123, 125, 126, 130, 132, 133, 139, 145, 146, 149, 150, 152, 154, 155, 157, 160, 161, 162, 165, 166, 167, 168, 170, 171, 172, 177, 178, 181, 182, 185, 186, 187, 191, 197, 199, 200, 201, 203, 204, 205, 206, 209]\n", - "[1, 2, 3, 4, 7, 8, 10, 12, 14, 18, 23, 25, 27, 28, 32, 33, 38, 39, 41, 45, 46, 49, 50, 51, 52, 54, 56, 59, 64, 65, 68, 69, 73, 75, 78, 82, 83, 87, 90, 93, 94, 96, 100, 101, 102, 103, 106, 111, 113, 115, 117, 119, 120, 124, 125, 126, 127, 129, 130, 134, 136, 137, 138, 140, 141, 144, 145, 147, 149, 150, 152, 153, 155, 157, 160, 163, 166, 167, 169, 170, 173, 175, 177, 179, 183, 186, 187, 189, 190, 196, 199, 200, 203, 204, 207, 209, 210]\n", - "[5, 6, 9, 10, 12, 13, 15, 18, 20, 21, 23, 25, 26, 27, 29, 30, 33, 34, 38, 39, 41, 42, 44, 46, 47, 49, 51, 53, 57, 60, 65, 68, 69, 72, 74, 75, 77, 78, 79, 80, 81, 83, 84, 87, 90, 93, 94, 96, 97, 98, 101, 105, 107, 108, 109, 112, 114, 115, 123, 124, 125, 126, 127, 128, 132, 133, 135, 137, 138, 144, 145, 149, 150, 154, 155, 157, 158, 159, 161, 162, 164, 167, 172, 173, 175, 179, 183, 185, 187, 188, 189, 193, 198, 202, 203, 206, 208, 210]\n", - "[1, 2, 3, 10, 11, 12, 13, 15, 18, 19, 20, 21, 24, 25, 26, 27, 32, 33, 38, 39, 41, 42, 43, 44, 47, 48, 49, 54, 55, 60, 61, 62, 63, 64, 66, 69, 70, 71, 72, 73, 74, 82, 87, 90, 93, 94, 96, 99, 100, 101, 103, 104, 105, 107, 112, 113, 120, 121, 122, 125, 126, 127, 131, 132, 139, 141, 144, 148, 149, 151, 152, 155, 158, 159, 162, 164, 166, 168, 173, 174, 177, 178, 180, 181, 182, 183, 184, 185, 186, 187, 188, 190, 191, 193, 201, 202, 206, 207, 210]\n", - "[5, 6, 7, 8, 13, 14, 15, 18, 19, 20, 21, 22, 23, 31, 32, 33, 34, 38, 39, 41, 42, 43, 45, 49, 52, 53, 54, 57, 58, 60, 61, 62, 64, 69, 71, 76, 77, 78, 79, 80, 82, 84, 87, 90, 93, 94, 96, 99, 100, 101, 108, 109, 110, 114, 117, 118, 120, 126, 127, 130, 132, 133, 134, 136, 137, 138, 139, 141, 144, 147, 148, 152, 155, 157, 160, 161, 162, 164, 169, 173, 178, 180, 181, 182, 183, 185, 188, 189, 197, 198, 208]\n", - "[2, 3, 4, 5, 8, 9, 10, 13, 18, 19, 22, 23, 24, 26, 27, 28, 29, 32, 33, 38, 39, 46, 48, 49, 50, 51, 57, 61, 64, 67, 69, 71, 72, 77, 78, 79, 83, 87, 90, 93, 94, 96, 97, 98, 100, 103, 105, 106, 114, 115, 117, 119, 121, 123, 125, 126, 127, 128, 129, 131, 135, 138, 141, 147, 148, 154, 155, 158, 161, 163, 164, 166, 167, 168, 169, 170, 172, 173, 175, 179, 180, 181, 182, 183, 185, 186, 189, 191, 193, 196, 197, 198, 199, 200, 204, 205, 209, 210]\n", - "[1, 2, 3, 5, 6, 7, 8, 12, 14, 18, 20, 21, 23, 24, 25, 26, 29, 34, 38, 39, 41, 42, 45, 47, 48, 55, 58, 61, 64, 68, 72, 75, 82, 83, 91, 93, 94, 98, 100, 101, 105, 115, 119, 122, 124, 125, 129, 131, 132, 133, 136, 138, 141, 142, 147, 151, 152, 154, 157, 158, 159, 161, 164, 165, 166, 168, 171, 174, 179, 181, 184, 185, 189, 193, 196, 197, 199, 200, 202, 203, 204, 205, 206, 208, 209, 210]\n", - "[]\n", - "[2, 3, 4, 5, 7, 9, 11, 14, 18, 22, 23, 25, 27, 28, 30, 32, 34, 38, 39, 41, 42, 44, 46, 48, 50, 54, 55, 56, 59, 60, 61, 65, 67, 68, 69, 71, 72, 74, 76, 78, 79, 81, 83, 84, 90, 91, 93, 94, 96, 99, 100, 103, 104, 105, 108, 110, 111, 112, 113, 114, 117, 119, 122, 123, 124, 125, 130, 131, 132, 135, 136, 138, 139, 143, 144, 147, 148, 149, 151, 152, 154, 160, 161, 164, 166, 169, 170, 172, 177, 180, 181, 182, 183, 186, 187, 190, 196, 197, 198, 199, 200, 203, 205, 207, 209, 210]\n", - "[3, 4, 6, 9, 14, 18, 22, 23, 26, 27, 29, 30, 33, 34, 38, 40, 42, 43, 44, 46, 49, 50, 53, 55, 57, 61, 66, 71, 72, 73, 74, 77, 83, 90, 91, 93, 94, 96, 98, 99, 100, 104, 105, 111, 112, 114, 115, 118, 120, 122, 123, 126, 130, 132, 133, 135, 136, 137, 140, 141, 145, 147, 148, 149, 151, 154, 156, 158, 161, 162, 165, 171, 174, 177, 179, 184, 186, 189, 196, 199, 200, 201, 203, 207, 209, 210]\n", - "[1, 2, 3, 4, 5, 7, 9, 10, 11, 18, 19, 24, 25, 26, 27, 29, 30, 38, 40, 43, 44, 45, 47, 48, 56, 57, 60, 61, 67, 69, 71, 72, 79, 91, 93, 97, 98, 103, 115, 116, 117, 122, 127, 129, 130, 135, 137, 151, 163, 164, 165, 169, 171, 177, 178, 179, 182, 184, 186, 187, 188, 190, 197, 199, 204, 205, 207, 208]\n", - "[1, 2, 4, 5, 7, 10, 12, 13, 14, 18, 19, 20, 22, 24, 25, 26, 27, 28, 32, 34, 38, 39, 43, 44, 46, 47, 48, 49, 56, 58, 63, 66, 68, 69, 70, 71, 73, 74, 79, 80, 90, 91, 93, 94, 96, 98, 100, 101, 104, 105, 108, 115, 116, 117, 118, 119, 122, 123, 124, 125, 126, 131, 132, 133, 135, 136, 138, 139, 140, 141, 143, 147, 149, 150, 151, 157, 165, 166, 167, 169, 170, 174, 177, 181, 183, 186, 189, 196, 201, 203, 206, 210]\n", - "[1, 2, 5, 7, 11, 13, 14, 15, 18, 19, 20, 21, 25, 26, 27, 29, 30, 32, 33, 38, 39, 40, 42, 44, 45, 50, 53, 54, 56, 57, 58, 69, 71, 73, 74, 76, 77, 80, 83, 84, 90, 91, 93, 94, 96, 97, 98, 105, 108, 112, 114, 116, 118, 122, 124, 125, 129, 130, 134, 136, 137, 139, 140, 141, 142, 143, 144, 148, 149, 153, 156, 157, 159, 162, 164, 165, 166, 168, 170, 171, 172, 174, 175, 177, 179, 181, 183, 187, 188, 189, 190, 193, 197, 201, 202, 203, 206, 208, 209, 210]\n", - "[1, 2, 4, 9, 10, 12, 14, 18, 22, 25, 27, 28, 30, 31, 34, 38, 39, 40, 41, 43, 44, 45, 49, 50, 54, 57, 61, 62, 64, 65, 66, 68, 69, 70, 72, 73, 74, 75, 79, 90, 91, 93, 94, 96, 101, 102, 103, 104, 105, 108, 111, 114, 117, 125, 126, 127, 128, 131, 133, 135, 137, 138, 139, 140, 142, 143, 149, 152, 157, 160, 162, 167, 172, 173, 174, 175, 177, 179, 180, 181, 185, 187, 196, 197, 198, 199, 200, 201, 204, 205, 206, 207, 208, 210]\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "[]\n", - "[]\n", - "[1, 4, 5, 6, 8, 9, 13, 18, 20, 21, 23, 25, 26, 29, 31, 38, 40, 42, 47, 48, 49, 55, 56, 58, 61, 67, 68, 69, 71, 72, 77, 78, 80, 91, 93, 98, 99, 104, 105, 111, 122, 123, 130, 136, 138, 139, 147, 149, 159, 162, 165, 167, 169, 170, 181, 183, 188, 189, 196, 197, 198, 199, 200, 203, 204, 205, 207]\n", - "[1, 2, 3, 4, 6, 9, 14, 18, 20, 21, 22, 23, 27, 28, 29, 30, 32, 38, 39, 41, 43, 44, 45, 49, 53, 58, 59, 62, 64, 65, 66, 67, 70, 71, 73, 76, 77, 83, 87, 90, 93, 94, 96, 99, 100, 101, 103, 104, 105, 106, 107, 108, 109, 110, 112, 113, 115, 118, 119, 120, 130, 131, 134, 140, 141, 144, 145, 146, 150, 153, 155, 157, 159, 161, 163, 169, 170, 171, 172, 173, 174, 175, 178, 182, 183, 184, 185, 188, 190, 192, 193, 196, 197, 202, 204, 206, 207, 209]\n", - "[2, 4, 7, 8, 9, 11, 14, 18, 19, 20, 21, 22, 23, 26, 30, 38, 39, 43, 50, 52, 55, 59, 60, 61, 68, 69, 70, 71, 72, 74, 77, 79, 81, 83, 87, 90, 93, 94, 96, 97, 99, 102, 105, 107, 109, 111, 112, 113, 114, 116, 117, 118, 123, 124, 129, 130, 131, 132, 133, 134, 136, 139, 140, 141, 144, 147, 149, 151, 153, 155, 158, 159, 161, 162, 166, 168, 170, 171, 174, 175, 178, 183, 184, 186, 187, 188, 193, 196, 198, 201, 202, 203, 205, 207, 209, 210]\n", - "[2, 3, 4, 12, 15, 18, 19, 22, 25, 28, 29, 32, 33, 34, 38, 39, 41, 47, 51, 52, 53, 54, 58, 61, 66, 67, 68, 70, 71, 72, 73, 76, 79, 81, 87, 90, 93, 94, 96, 103, 105, 106, 107, 108, 112, 113, 114, 115, 116, 117, 126, 127, 132, 133, 136, 137, 139, 145, 148, 149, 153, 154, 155, 157, 163, 164, 165, 167, 170, 172, 173, 174, 178, 179, 182, 183, 186, 189, 190, 192, 193, 197, 199, 202, 203, 204, 205, 207, 208, 209, 210]\n", - "[2, 3, 4, 5, 6, 10, 12, 15, 18, 20, 21, 22, 23, 30, 32, 38, 39, 47, 50, 52, 53, 55, 56, 57, 58, 59, 61, 66, 68, 69, 71, 75, 77, 78, 79, 81, 83, 84, 87, 90, 93, 94, 96, 97, 100, 101, 102, 103, 105, 107, 108, 109, 110, 111, 112, 114, 115, 122, 125, 126, 129, 130, 131, 133, 135, 137, 139, 140, 145, 146, 147, 149, 150, 153, 154, 155, 157, 158, 159, 162, 163, 164, 165, 173, 177, 179, 181, 186, 189, 190, 192, 193, 198, 200, 204, 205, 210]\n", - "[2, 5, 6, 7, 10, 13, 14, 15, 18, 19, 20, 21, 22, 23, 25, 28, 29, 30, 33, 34, 38, 39, 41, 43, 44, 45, 46, 49, 50, 52, 53, 54, 55, 56, 58, 62, 64, 68, 71, 72, 73, 74, 75, 77, 78, 79, 80, 81, 87, 90, 93, 94, 96, 97, 98, 99, 102, 103, 105, 107, 109, 110, 114, 115, 116, 117, 118, 120, 122, 123, 125, 129, 131, 132, 133, 135, 137, 138, 139, 140, 141, 144, 145, 146, 151, 152, 153, 155, 158, 161, 162, 163, 164, 166, 167, 169, 172, 173, 174, 177, 178, 183, 184, 185, 187, 189, 190, 192, 193, 198, 203, 206, 208, 210]\n", - "[3, 5, 8, 9, 10, 11, 14, 15, 18, 20, 22, 23, 26, 27, 29, 31, 32, 33, 38, 39, 42, 43, 44, 45, 47, 52, 54, 55, 56, 57, 58, 62, 63, 65, 69, 70, 73, 74, 76, 77, 78, 83, 84, 87, 90, 93, 94, 96, 98, 100, 101, 102, 103, 104, 105, 106, 111, 112, 114, 115, 116, 117, 119, 123, 127, 128, 131, 134, 135, 137, 139, 148, 149, 150, 152, 153, 154, 155, 158, 159, 160, 161, 164, 165, 166, 167, 168, 172, 175, 179, 187, 188, 189, 192, 193, 196, 198, 199, 200, 204, 206]\n", - "[3, 4, 7, 9, 11, 12, 14, 15, 18, 19, 20, 21, 27, 28, 29, 31, 34, 38, 39, 41, 42, 43, 44, 46, 50, 51, 52, 56, 57, 58, 68, 71, 73, 76, 77, 78, 83, 87, 90, 93, 94, 96, 100, 102, 103, 104, 105, 106, 107, 108, 109, 110, 113, 115, 118, 119, 120, 125, 126, 130, 131, 134, 135, 136, 138, 139, 141, 149, 152, 153, 155, 159, 164, 166, 172, 175, 180, 183, 184, 185, 187, 191, 193, 197, 199, 200, 202, 205, 208, 210]\n", - "[1, 2, 5, 8, 10, 11, 12, 14, 18, 20, 22, 23, 25, 26, 27, 28, 32, 38, 39, 43, 44, 45, 46, 47, 48, 49, 51, 52, 54, 55, 56, 58, 60, 61, 62, 63, 64, 65, 66, 68, 70, 72, 73, 74, 75, 76, 79, 84, 87, 90, 93, 94, 96, 97, 98, 100, 103, 106, 107, 108, 111, 112, 114, 117, 119, 121, 122, 123, 126, 127, 131, 133, 134, 137, 140, 141, 144, 147, 148, 151, 152, 155, 158, 159, 162, 163, 164, 166, 167, 169, 172, 173, 177, 180, 182, 183, 185, 186, 187, 190, 191, 193, 197, 198, 200, 204, 205, 206, 207]\n", - "[1, 2, 4, 5, 6, 7, 10, 11, 12, 13, 14, 15, 18, 20, 22, 23, 29, 31, 32, 33, 34, 38, 39, 43, 45, 50, 52, 55, 56, 58, 59, 62, 67, 73, 74, 75, 77, 78, 79, 83, 84, 87, 90, 93, 94, 96, 97, 99, 100, 104, 105, 107, 113, 115, 116, 118, 120, 121, 123, 124, 125, 126, 130, 135, 140, 141, 145, 147, 149, 155, 157, 160, 162, 163, 166, 167, 168, 174, 178, 179, 180, 181, 182, 185, 187, 190, 192, 193, 196, 198, 199, 201, 204, 207, 210]\n", - "[4, 10, 11, 12, 13, 15, 18, 20, 21, 22, 23, 25, 26, 28, 29, 30, 34, 38, 39, 48, 51, 52, 54, 56, 57, 58, 59, 60, 63, 64, 69, 70, 72, 74, 76, 77, 79, 80, 83, 84, 87, 90, 93, 94, 96, 97, 98, 99, 102, 103, 106, 107, 109, 111, 112, 113, 114, 116, 118, 119, 120, 123, 124, 125, 128, 129, 130, 131, 134, 136, 137, 138, 139, 140, 145, 148, 150, 151, 153, 155, 157, 159, 160, 162, 163, 166, 171, 172, 175, 178, 179, 180, 181, 185, 188, 190, 191, 192, 193, 197, 201, 202, 204, 205, 207, 210]\n", - "[3, 5, 6, 9, 10, 13, 18, 21, 22, 23, 26, 28, 29, 32, 34, 38, 39, 42, 44, 45, 47, 48, 49, 50, 51, 54, 56, 57, 58, 60, 61, 64, 65, 66, 68, 69, 70, 71, 72, 73, 75, 76, 79, 80, 82, 87, 90, 93, 94, 96, 98, 100, 101, 102, 103, 104, 107, 108, 110, 112, 116, 118, 122, 124, 125, 129, 132, 134, 135, 137, 138, 141, 144, 145, 147, 149, 151, 152, 153, 154, 155, 157, 159, 161, 162, 166, 167, 172, 173, 175, 180, 183, 184, 185, 188, 189, 191, 196, 199, 200, 201, 202, 204, 206, 209]\n", - "[3, 5, 7, 8, 12, 13, 18, 20, 21, 22, 23, 24, 25, 26, 29, 30, 32, 33, 34, 38, 39, 41, 42, 43, 44, 45, 49, 50, 51, 52, 53, 54, 57, 58, 60, 61, 62, 66, 68, 69, 70, 72, 73, 75, 78, 79, 81, 82, 83, 84, 87, 90, 93, 94, 96, 97, 99, 102, 104, 108, 112, 114, 115, 116, 119, 121, 122, 126, 127, 128, 129, 131, 132, 133, 134, 135, 137, 138, 140, 146, 152, 154, 155, 158, 159, 160, 161, 162, 168, 169, 170, 172, 175, 177, 178, 179, 182, 183, 188, 191, 192, 193, 197, 200, 201, 203, 206, 207, 208]\n", - "[2, 3, 5, 6, 8, 10, 12, 13, 14, 18, 19, 21, 23, 24, 25, 27, 34, 38, 39, 41, 43, 45, 48, 49, 51, 53, 55, 57, 59, 61, 62, 63, 64, 65, 74, 75, 79, 80, 81, 87, 90, 93, 94, 96, 97, 98, 100, 101, 102, 103, 104, 105, 106, 107, 108, 111, 113, 114, 116, 118, 120, 125, 130, 131, 132, 133, 134, 135, 136, 140, 145, 146, 148, 151, 152, 155, 158, 159, 160, 161, 164, 165, 166, 168, 169, 173, 179, 181, 182, 183, 187, 188, 189, 192, 193, 196, 197, 198, 200, 201, 203, 204, 205, 206, 207]\n", - "[2, 3, 4, 7, 9, 10, 12, 14, 18, 20, 21, 22, 25, 27, 29, 32, 38, 39, 42, 43, 44, 45, 48, 49, 50, 52, 54, 55, 56, 57, 58, 60, 62, 64, 65, 66, 68, 70, 74, 79, 87, 90, 93, 94, 96, 97, 100, 101, 104, 105, 106, 108, 110, 111, 112, 113, 115, 120, 122, 125, 126, 129, 130, 133, 134, 135, 140, 141, 144, 145, 147, 149, 150, 151, 153, 154, 155, 158, 159, 160, 161, 162, 166, 168, 169, 171, 172, 180, 183, 184, 185, 186, 190, 191, 192, 197, 198, 200, 204, 205, 207, 208]\n", - "[1, 3, 5, 7, 9, 13, 15, 18, 20, 21, 22, 25, 29, 31, 32, 38, 39, 42, 46, 49, 51, 52, 53, 56, 57, 58, 61, 62, 63, 67, 68, 70, 72, 76, 77, 80, 81, 82, 87, 90, 93, 94, 96, 97, 99, 102, 103, 104, 105, 107, 109, 111, 112, 113, 114, 118, 119, 120, 121, 123, 124, 126, 127, 128, 129, 130, 131, 133, 135, 137, 138, 139, 144, 145, 147, 148, 150, 155, 157, 160, 162, 163, 164, 165, 166, 168, 170, 172, 174, 175, 180, 184, 185, 187, 188, 196, 198, 199, 201, 204, 205, 206, 207]\n" - ] - } - ], - "source": [ - "all_bb, _ = get_bb_2(\"generated/all_dots_yellow.png\")\n", - "\n", - "for f in files:\n", - " try:\n", - " _, centers = get_bb_2(f)\n", - " nums = get_numbers(centers, all_bb)\n", - " print(nums)\n", - " except:\n", - " print(f)" - ] - }, - { - "cell_type": "code", - "execution_count": 35, - "id": "mediterranean-membership", - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "imgs/twitter/FA4iYT9VEAc6bJg.jpeg\n", - "imgs/twitter/FA4SmddX0A4unCW.jpeg\n", - "imgs/twitter/FIkqnScXMAEsQeq.jpeg\n", - "imgs/twitter/FA4qFzKWYAc35dw.jpeg\n", - "imgs/twitter/FIotM6hWQAURLqG.jpeg\n", - "imgs/twitter/FIzI7g2VQAA_R9d.jpeg\n", - "imgs/twitter/FA6ijkxUUAARLJ_.jpeg\n", - "imgs/twitter/FA5bEZlXMAA5G26.jpeg\n", - "imgs/twitter/FA4cRa-XMAkfx6B.jpeg\n", - "imgs/twitter/FA4Xqy-XEAYSGH1.jpeg\n", - "imgs/twitter/FA4PFdkWYBIuKRg.jpeg\n", - "imgs/twitter/FA4NgUfXIA80TGx.jpeg\n", - "imgs/twitter/FA4gaIcWUAMmySl.jpeg\n", - "imgs/twitter/FA4z6EDXEAErNes.jpeg\n", - "imgs/twitter/FA7ZyaNXIAMzXqs.jpeg\n", - "imgs/twitter/FA4WkUVWUAcer0X.jpeg\n", - "imgs/twitter/FA4330WXMAgRXOw.jpeg\n", - "imgs/twitter/FA4OYJWWUBICFMU.jpeg\n", - "imgs/twitter/FA4YGyUWUAEIMf2.jpeg\n", - "imgs/twitter/FA4ZjmkWYAolRnZ.jpeg\n", - "imgs/twitter/FA4cFAqX0AkLZjl.jpeg\n", - "imgs/twitter/FA4cMaHWEAQ9371.jpeg\n", - "imgs/twitter/FA6czUfXIAIe2jv.jpeg\n", - "imgs/twitter/FA4wPOzWQAIcXdW.jpeg\n", - "imgs/twitter/FA4X8oTWEAILtqS.jpeg\n", - "imgs/twitter/FA4Nkg2X0AEVeAF.jpeg\n", - "imgs/twitter/FA6b0i1WQAEVRvZ.jpeg\n", - "imgs/twitter/FA4QOZVWUBA-Tdp.jpeg\n", - "imgs/twitter/FA4h9VBX0BA9H-Z.jpeg\n", - "imgs/twitter/FA6Mcj0WYAArfDH.jpeg\n", - "imgs/twitter/FA4NtWVXMAAGE9O.jpeg\n", - "imgs/twitter/FA4anBBVEAQ42NA.jpeg\n", - "imgs/twitter/FJDF5kmXMAMdAtI.jpeg\n", - "imgs/people/FECYsfjXwAIEYmJ.jpeg\n", - "imgs/people/FEK1L9cXoAgulGK.jpeg\n", - "{0: 1, 1: 76, 2: 94, 3: 97, 4: 92, 5: 81, 6: 64, 7: 69, 8: 73, 9: 89, 10: 73, 11: 73, 12: 79, 13: 79, 14: 77, 15: 79, 16: 2, 17: 0, 18: 158, 19: 75, 20: 94, 21: 94, 22: 80, 23: 88, 24: 64, 25: 78, 26: 79, 27: 73, 28: 77, 29: 91, 30: 72, 31: 72, 32: 73, 33: 77, 34: 82, 35: 1, 36: 2, 37: 0, 38: 159, 39: 101, 40: 65, 41: 77, 42: 81, 43: 83, 44: 94, 45: 71, 46: 78, 47: 67, 48: 78, 49: 74, 50: 73, 51: 73, 52: 82, 53: 74, 54: 76, 55: 77, 56: 84, 57: 83, 58: 80, 59: 67, 60: 64, 61: 87, 62: 71, 63: 40, 64: 75, 65: 79, 66: 75, 67: 75, 68: 97, 69: 76, 70: 62, 71: 72, 72: 85, 73: 63, 74: 65, 75: 77, 76: 77, 77: 70, 78: 71, 79: 84, 80: 71, 81: 71, 82: 69, 83: 78, 84: 71, 85: 1, 86: 0, 87: 46, 88: 0, 89: 1, 90: 144, 91: 114, 92: 1, 93: 160, 94: 149, 95: 1, 96: 144, 97: 83, 98: 86, 99: 70, 100: 66, 101: 73, 102: 63, 103: 68, 104: 84, 105: 98, 106: 34, 107: 40, 108: 76, 109: 21, 110: 57, 111: 84, 112: 69, 113: 61, 114: 74, 115: 88, 116: 77, 117: 67, 118: 76, 119: 77, 120: 74, 121: 69, 122: 81, 123: 82, 124: 71, 125: 72, 126: 84, 127: 89, 128: 32, 129: 76, 130: 67, 131: 86, 132: 74, 133: 90, 134: 43, 135: 70, 136: 77, 137: 63, 138: 82, 139: 81, 140: 55, 141: 76, 142: 54, 143: 69, 144: 84, 145: 31, 146: 21, 147: 89, 148: 75, 149: 83, 150: 70, 151: 68, 152: 71, 153: 69, 154: 87, 155: 52, 156: 63, 157: 67, 158: 56, 159: 96, 160: 79, 161: 80, 162: 79, 163: 66, 164: 80, 165: 76, 166: 89, 167: 70, 168: 80, 169: 84, 170: 81, 171: 70, 172: 78, 173: 69, 174: 74, 175: 70, 176: 0, 177: 92, 178: 28, 179: 92, 180: 63, 181: 79, 182: 65, 183: 75, 184: 74, 185: 76, 186: 84, 187: 95, 188: 67, 189: 74, 190: 71, 191: 61, 192: 73, 193: 87, 194: 1, 195: 0, 196: 92, 197: 87, 198: 77, 199: 80, 200: 87, 201: 77, 202: 72, 203: 85, 204: 89, 205: 89, 206: 74, 207: 84, 208: 78, 209: 67, 210: 89, 211: 0}\n" - ] - } - ], - "source": [ - "counts = {i:0 for i in range(212)}\n", - "for f in files:\n", - " try:\n", - " _, centers = get_bb_2(f)\n", - " nums = get_numbers(centers, all_bb)\n", - " for n in nums:\n", - " counts[n] += 1\n", - " except:\n", - " print(f)\n", - "print(counts)" - ] - }, - { - "cell_type": "code", - "execution_count": 36, - "id": "female-walnut", - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 87, 90, 91, 93, 94, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, 173, 174, 175, 177, 178, 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, 192, 193, 196, 197, 198, 199, 200, 201, 202, 203, 204, 205, 206, 207, 208, 209, 210]\n", - "[18, 38, 93, 94]\n" - ] - } - ], - "source": [ - "d = {0: 0, 1: 38, 2: 42, 3: 47, 4: 45, 5: 41, 6: 28, 7: 35, 8: 32, 9: 41, 10: 38, 11: 35, 12: 41, 13: 38, 14: 37, 15: 35, 16: 1, 17: 0, 18: 76, 19: 37, 20: 47, 21: 44, 22: 41, 23: 43, 24: 29, 25: 43, 26: 40, 27: 38, 28: 34, 29: 49, 30: 34, 31: 30, 32: 44, 33: 38, 34: 37, 35: 0, 36: 0, 37: 0, 38: 76, 39: 61, 40: 19, 41: 41, 42: 44, 43: 46, 44: 47, 45: 35, 46: 34, 47: 32, 48: 37, 49: 37, 50: 37, 51: 36, 52: 35, 53: 32, 54: 35, 55: 40, 56: 43, 57: 42, 58: 48, 59: 27, 60: 28, 61: 49, 62: 31, 63: 24, 64: 34, 65: 36, 66: 35, 67: 31, 68: 46, 69: 41, 70: 36, 71: 36, 72: 49, 73: 35, 74: 36, 75: 36, 76: 35, 77: 37, 78: 36, 79: 48, 80: 28, 81: 28, 82: 31, 83: 38, 84: 30, 85: 0, 86: 0, 87: 45, 88: 0, 89: 0, 90: 69, 91: 31, 92: 0, 93: 76, 94: 71, 95: 0, 96: 69, 97: 41, 98: 43, 99: 30, 100: 35, 101: 39, 102: 29, 103: 34, 104: 37, 105: 47, 106: 22, 107: 27, 108: 40, 109: 21, 110: 28, 111: 41, 112: 34, 113: 27, 114: 38, 115: 43, 116: 32, 117: 29, 118: 35, 119: 35, 120: 33, 121: 30, 122: 38, 123: 35, 124: 33, 125: 41, 126: 39, 127: 38, 128: 19, 129: 35, 130: 39, 131: 43, 132: 35, 133: 39, 134: 29, 135: 37, 136: 36, 137: 34, 138: 43, 139: 40, 140: 33, 141: 39, 142: 13, 143: 20, 144: 40, 145: 24, 146: 17, 147: 41, 148: 36, 149: 42, 150: 29, 151: 34, 152: 34, 153: 34, 154: 36, 155: 45, 156: 14, 157: 40, 158: 32, 159: 43, 160: 31, 161: 39, 162: 36, 163: 28, 164: 39, 165: 37, 166: 40, 167: 31, 168: 35, 169: 44, 170: 37, 171: 32, 172: 39, 173: 33, 174: 32, 175: 30, 176: 0, 177: 41, 178: 23, 179: 42, 180: 33, 181: 42, 182: 28, 183: 40, 184: 32, 185: 39, 186: 42, 187: 48, 188: 34, 189: 36, 190: 36, 191: 23, 192: 30, 193: 40, 194: 0, 195: 0, 196: 43, 197: 40, 198: 39, 199: 42, 200: 43, 201: 38, 202: 34, 203: 39, 204: 44, 205: 43, 206: 38, 207: 44, 208: 33, 209: 31, 210: 43, 211: 0}\n", - "\n", - "all_points = []\n", - "no_points = [i for i in range(212)]\n", - "for k, v in d.items():\n", - " if v < 5:\n", - " no_points.remove(k)\n", - " if v > 70:\n", - " all_points.append(k)\n", - "print(no_points)\n", - "print(all_points)\n", - " " - ] - }, - { - "cell_type": "code", - "execution_count": 37, - "id": "tender-findings", - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "[(0.025, 0.07604166666666666, 0.058333333333333334, 0.109375),\n", - " (0.025, 0.12708333333333333, 0.058333333333333334, 0.16041666666666668),\n", - " (0.025, 0.178125, 0.058333333333333334, 0.21145833333333333),\n", - " (0.025, 0.22916666666666666, 0.058333333333333334, 0.2625),\n", - " (0.025, 0.28020833333333334, 0.058333333333333334, 0.31354166666666666),\n", - " (0.025, 0.3302083333333333, 0.058333333333333334, 0.36354166666666665),\n", - " (0.025, 0.38125, 0.058333333333333334, 0.41458333333333336),\n", - " (0.025, 0.4322916666666667, 0.058333333333333334, 0.465625),\n", - " (0.025, 0.48333333333333334, 0.058333333333333334, 0.5166666666666667),\n", - " (0.025, 0.534375, 0.058333333333333334, 0.5677083333333334),\n", - " (0.025, 0.5854166666666667, 0.058333333333333334, 0.61875),\n", - " (0.025, 0.6364583333333333, 0.058333333333333334, 0.6697916666666667),\n", - " (0.025, 0.6864583333333333, 0.058333333333333334, 0.7197916666666667),\n", - " (0.025, 0.7375, 0.058333333333333334, 0.7708333333333334),\n", - " (0.025, 0.7885416666666667, 0.058333333333333334, 0.821875),\n", - " (0.025, 0.8395833333333333, 0.058333333333333334, 0.8729166666666667),\n", - " (0.025, 0.890625, 0.058333333333333334, 0.9239583333333333),\n", - " (0.07604166666666666, 0.025, 0.109375, 0.058333333333333334),\n", - " (0.07604166666666666, 0.07604166666666666, 0.109375, 0.109375),\n", - " (0.07604166666666666, 0.12708333333333333, 0.109375, 0.16041666666666668),\n", - " (0.07604166666666666, 0.178125, 0.109375, 0.21145833333333333),\n", - " (0.07604166666666666, 0.22916666666666666, 0.109375, 0.2625),\n", - " (0.07604166666666666, 0.28020833333333334, 0.109375, 0.31354166666666666),\n", - " (0.07604166666666666, 0.3302083333333333, 0.109375, 0.36354166666666665),\n", - " (0.07604166666666666, 0.38125, 0.109375, 0.41458333333333336),\n", - " (0.07604166666666666, 0.4322916666666667, 0.109375, 0.465625),\n", - " (0.07604166666666666, 0.48333333333333334, 0.109375, 0.5166666666666667),\n", - " (0.07604166666666666, 0.534375, 0.109375, 0.5677083333333334),\n", - " (0.07604166666666666, 0.5854166666666667, 0.109375, 0.61875),\n", - " (0.07604166666666666, 0.6364583333333333, 0.109375, 0.6697916666666667),\n", - " (0.07604166666666666, 0.6864583333333333, 0.109375, 0.7197916666666667),\n", - " (0.07604166666666666, 0.7375, 0.109375, 0.7708333333333334),\n", - " (0.07604166666666666, 0.7885416666666667, 0.109375, 0.821875),\n", - " (0.07604166666666666, 0.8395833333333333, 0.109375, 0.8729166666666667),\n", - " (0.07604166666666666, 0.890625, 0.109375, 0.9239583333333333),\n", - " (0.07604166666666666, 0.9416666666666667, 0.109375, 0.975),\n", - " (0.12708333333333333, 0.025, 0.16041666666666668, 0.058333333333333334),\n", - " (0.12708333333333333, 0.07604166666666666, 0.16041666666666668, 0.109375),\n", - " (0.12708333333333333,\n", - " 0.12708333333333333,\n", - " 0.16041666666666668,\n", - " 0.16041666666666668),\n", - " (0.12708333333333333, 0.178125, 0.16041666666666668, 0.21145833333333333),\n", - " (0.12708333333333333, 0.22916666666666666, 0.16041666666666668, 0.2625),\n", - " (0.12708333333333333,\n", - " 0.28020833333333334,\n", - " 0.16041666666666668,\n", - " 0.31354166666666666),\n", - " (0.12708333333333333, 0.33125, 0.16041666666666668, 0.36354166666666665),\n", - " (0.12708333333333333, 0.38125, 0.16041666666666668, 0.41458333333333336),\n", - " (0.12708333333333333, 0.4322916666666667, 0.16041666666666668, 0.465625),\n", - " (0.12708333333333333,\n", - " 0.48333333333333334,\n", - " 0.16041666666666668,\n", - " 0.5166666666666667),\n", - " (0.12708333333333333, 0.534375, 0.16041666666666668, 0.5677083333333334),\n", - " (0.12708333333333333, 0.5854166666666667, 0.16041666666666668, 0.61875),\n", - " (0.12708333333333333,\n", - " 0.6364583333333333,\n", - " 0.16041666666666668,\n", - " 0.6697916666666667),\n", - " (0.12708333333333333,\n", - " 0.6864583333333333,\n", - " 0.16041666666666668,\n", - " 0.7197916666666667),\n", - " (0.12708333333333333, 0.7375, 0.16041666666666668, 0.7708333333333334),\n", - " (0.12708333333333333, 0.7885416666666667, 0.16041666666666668, 0.821875),\n", - " (0.12708333333333333,\n", - " 0.8395833333333333,\n", - " 0.16041666666666668,\n", - " 0.8729166666666667),\n", - " (0.12708333333333333, 0.890625, 0.16041666666666668, 0.9239583333333333),\n", - " (0.12708333333333333, 0.9416666666666667, 0.16041666666666668, 0.975),\n", - " (0.178125, 0.025, 0.21145833333333333, 0.058333333333333334),\n", - " (0.178125, 0.07604166666666666, 0.21145833333333333, 0.109375),\n", - " (0.178125, 0.12708333333333333, 0.21145833333333333, 0.16041666666666668),\n", - " (0.178125, 0.178125, 0.21145833333333333, 0.21145833333333333),\n", - " (0.178125, 0.22916666666666666, 0.21145833333333333, 0.2625),\n", - " (0.178125, 0.28020833333333334, 0.21145833333333333, 0.31354166666666666),\n", - " (0.178125, 0.6864583333333333, 0.21145833333333333, 0.7197916666666667),\n", - " (0.178125, 0.7375, 0.21145833333333333, 0.7708333333333334),\n", - " (0.178125, 0.7885416666666667, 0.21145833333333333, 0.821875),\n", - " (0.178125, 0.8395833333333333, 0.21145833333333333, 0.8729166666666667),\n", - " (0.178125, 0.890625, 0.21145833333333333, 0.9239583333333333),\n", - " (0.178125, 0.9416666666666667, 0.21145833333333333, 0.975),\n", - " (0.22916666666666666, 0.025, 0.2625, 0.058333333333333334),\n", - " (0.22916666666666666, 0.07604166666666666, 0.2625, 0.109375),\n", - " (0.22916666666666666, 0.12708333333333333, 0.2625, 0.16041666666666668),\n", - " (0.22916666666666666, 0.178125, 0.2625, 0.21145833333333333),\n", - " (0.22916666666666666, 0.22916666666666666, 0.2625, 0.2625),\n", - " (0.22916666666666666, 0.7375, 0.2625, 0.7708333333333334),\n", - " (0.22916666666666666, 0.7885416666666667, 0.2625, 0.821875),\n", - " (0.22916666666666666, 0.8395833333333333, 0.2625, 0.8729166666666667),\n", - " (0.22916666666666666, 0.890625, 0.2625, 0.9239583333333333),\n", - " (0.22916666666666666, 0.9416666666666667, 0.2625, 0.975),\n", - " (0.28020833333333334, 0.025, 0.31354166666666666, 0.058333333333333334),\n", - " (0.28020833333333334, 0.07604166666666666, 0.31354166666666666, 0.109375),\n", - " (0.28020833333333334,\n", - " 0.12708333333333333,\n", - " 0.31354166666666666,\n", - " 0.16041666666666668),\n", - " (0.28020833333333334, 0.178125, 0.31354166666666666, 0.21145833333333333),\n", - " (0.28020833333333334, 0.7885416666666667, 0.31354166666666666, 0.821875),\n", - " (0.28020833333333334,\n", - " 0.8395833333333333,\n", - " 0.31354166666666666,\n", - " 0.8729166666666667),\n", - " (0.28020833333333334, 0.890625, 0.31354166666666666, 0.9239583333333333),\n", - " (0.28020833333333334, 0.9416666666666667, 0.31354166666666666, 0.975),\n", - " (0.3302083333333333, 0.025, 0.36354166666666665, 0.058333333333333334),\n", - " (0.3302083333333333, 0.07604166666666666, 0.36354166666666665, 0.109375),\n", - " (0.3302083333333333,\n", - " 0.12708333333333333,\n", - " 0.36354166666666665,\n", - " 0.16041666666666668),\n", - " (0.3302083333333333,\n", - " 0.8395833333333333,\n", - " 0.36354166666666665,\n", - " 0.8729166666666667),\n", - " (0.3302083333333333, 0.890625, 0.36354166666666665, 0.9239583333333333),\n", - " (0.3302083333333333, 0.9416666666666667, 0.36354166666666665, 0.975),\n", - " (0.38125, 0.025, 0.41458333333333336, 0.058333333333333334),\n", - " (0.38125, 0.07604166666666666, 0.41458333333333336, 0.109375),\n", - " (0.38125, 0.12708333333333333, 0.41458333333333336, 0.16041666666666668),\n", - " (0.38125, 0.8395833333333333, 0.41458333333333336, 0.8729166666666667),\n", - " (0.38125, 0.890625, 0.41458333333333336, 0.9239583333333333),\n", - " (0.38125, 0.9416666666666667, 0.41458333333333336, 0.975),\n", - " (0.4322916666666667, 0.025, 0.465625, 0.058333333333333334),\n", - " (0.4322916666666667, 0.07604166666666666, 0.465625, 0.109375),\n", - " (0.4322916666666667, 0.12708333333333333, 0.465625, 0.16041666666666668),\n", - " (0.4322916666666667, 0.8395833333333333, 0.465625, 0.8729166666666667),\n", - " (0.4322916666666667, 0.890625, 0.465625, 0.9239583333333333),\n", - " (0.4322916666666667, 0.9416666666666667, 0.465625, 0.975),\n", - " (0.48333333333333334, 0.025, 0.5166666666666667, 0.058333333333333334),\n", - " (0.48333333333333334, 0.07604166666666666, 0.5166666666666667, 0.109375),\n", - " (0.48333333333333334,\n", - " 0.12708333333333333,\n", - " 0.5166666666666667,\n", - " 0.16041666666666668),\n", - " (0.48333333333333334,\n", - " 0.8395833333333333,\n", - " 0.5166666666666667,\n", - " 0.8729166666666667),\n", - " (0.48333333333333334, 0.890625, 0.5166666666666667, 0.9239583333333333),\n", - " (0.48333333333333334, 0.9416666666666667, 0.5166666666666667, 0.975),\n", - " (0.534375, 0.025, 0.5677083333333334, 0.058333333333333334),\n", - " (0.534375, 0.07604166666666666, 0.5677083333333334, 0.109375),\n", - " (0.534375, 0.12708333333333333, 0.5677083333333334, 0.16041666666666668),\n", - " (0.534375, 0.8395833333333333, 0.5677083333333334, 0.8729166666666667),\n", - " (0.534375, 0.890625, 0.5677083333333334, 0.9239583333333333),\n", - " (0.534375, 0.9416666666666667, 0.5677083333333334, 0.975),\n", - " (0.5854166666666667, 0.025, 0.61875, 0.058333333333333334),\n", - " (0.5854166666666667, 0.07604166666666666, 0.61875, 0.109375),\n", - " (0.5854166666666667, 0.12708333333333333, 0.61875, 0.16041666666666668),\n", - " (0.5854166666666667, 0.8395833333333333, 0.61875, 0.8729166666666667),\n", - " (0.5854166666666667, 0.890625, 0.61875, 0.9239583333333333),\n", - " (0.5854166666666667, 0.9416666666666667, 0.61875, 0.975),\n", - " (0.6364583333333333, 0.025, 0.6697916666666667, 0.058333333333333334),\n", - " (0.6364583333333333, 0.07604166666666666, 0.6697916666666667, 0.109375),\n", - " (0.6364583333333333,\n", - " 0.12708333333333333,\n", - " 0.6697916666666667,\n", - " 0.16041666666666668),\n", - " (0.6364583333333333,\n", - " 0.8395833333333333,\n", - " 0.6697916666666667,\n", - " 0.8729166666666667),\n", - " (0.6364583333333333, 0.890625, 0.6697916666666667, 0.9239583333333333),\n", - " (0.6364583333333333, 0.9416666666666667, 0.6697916666666667, 0.975),\n", - " (0.6864583333333333, 0.025, 0.7197916666666667, 0.058333333333333334),\n", - " (0.6864583333333333, 0.07604166666666666, 0.7197916666666667, 0.109375),\n", - " (0.6864583333333333,\n", - " 0.12708333333333333,\n", - " 0.7197916666666667,\n", - " 0.16041666666666668),\n", - " (0.6864583333333333, 0.178125, 0.7197916666666667, 0.21145833333333333),\n", - " (0.6864583333333333, 0.7885416666666667, 0.7197916666666667, 0.821875),\n", - " (0.6864583333333333,\n", - " 0.8395833333333333,\n", - " 0.7197916666666667,\n", - " 0.8729166666666667),\n", - " (0.6864583333333333, 0.890625, 0.7197916666666667, 0.9239583333333333),\n", - " (0.6864583333333333, 0.9416666666666667, 0.7197916666666667, 0.975),\n", - " (0.7375, 0.025, 0.7708333333333334, 0.058333333333333334),\n", - " (0.7375, 0.07604166666666666, 0.7708333333333334, 0.109375),\n", - " (0.7375, 0.12708333333333333, 0.7708333333333334, 0.16041666666666668),\n", - " (0.7375, 0.178125, 0.7708333333333334, 0.21145833333333333),\n", - " (0.7375, 0.22916666666666666, 0.7708333333333334, 0.2625),\n", - " (0.7375, 0.7375, 0.7708333333333334, 0.7708333333333334),\n", - " (0.7375, 0.7885416666666667, 0.7708333333333334, 0.821875),\n", - " (0.7375, 0.8395833333333333, 0.7708333333333334, 0.8729166666666667),\n", - " (0.7375, 0.890625, 0.7708333333333334, 0.9239583333333333),\n", - " (0.7375, 0.9416666666666667, 0.7708333333333334, 0.975),\n", - " (0.7885416666666667, 0.025, 0.821875, 0.058333333333333334),\n", - " (0.7885416666666667, 0.07604166666666666, 0.821875, 0.109375),\n", - " (0.7885416666666667, 0.12708333333333333, 0.821875, 0.16041666666666668),\n", - " (0.7885416666666667, 0.178125, 0.821875, 0.21145833333333333),\n", - " (0.7885416666666667, 0.22916666666666666, 0.821875, 0.2625),\n", - " (0.7885416666666667, 0.28020833333333334, 0.821875, 0.31354166666666666),\n", - " (0.7885416666666667, 0.6864583333333333, 0.821875, 0.7197916666666667),\n", - " (0.7885416666666667, 0.7375, 0.821875, 0.7708333333333334),\n", - " (0.7885416666666667, 0.7885416666666667, 0.821875, 0.821875),\n", - " (0.7885416666666667, 0.8395833333333333, 0.821875, 0.8729166666666667),\n", - " (0.7885416666666667, 0.890625, 0.821875, 0.9239583333333333),\n", - " (0.7885416666666667, 0.9416666666666667, 0.821875, 0.975),\n", - " (0.8395833333333333, 0.025, 0.8729166666666667, 0.058333333333333334),\n", - " (0.8395833333333333, 0.07604166666666666, 0.8729166666666667, 0.109375),\n", - " (0.8395833333333333,\n", - " 0.12708333333333333,\n", - " 0.8729166666666667,\n", - " 0.16041666666666668),\n", - " (0.8395833333333333, 0.178125, 0.8729166666666667, 0.21145833333333333),\n", - " (0.8395833333333333, 0.22916666666666666, 0.8729166666666667, 0.2625),\n", - " (0.8395833333333333,\n", - " 0.28020833333333334,\n", - " 0.8729166666666667,\n", - " 0.31354166666666666),\n", - " (0.8395833333333333, 0.33125, 0.8729166666666667, 0.36354166666666665),\n", - " (0.8395833333333333, 0.38125, 0.8729166666666667, 0.41458333333333336),\n", - " (0.8395833333333333, 0.4322916666666667, 0.8729166666666667, 0.465625),\n", - " (0.8395833333333333,\n", - " 0.48333333333333334,\n", - " 0.8729166666666667,\n", - " 0.5166666666666667),\n", - " (0.8395833333333333, 0.534375, 0.8729166666666667, 0.5677083333333334),\n", - " (0.8395833333333333, 0.5854166666666667, 0.8729166666666667, 0.61875),\n", - " (0.8395833333333333,\n", - " 0.6364583333333333,\n", - " 0.8729166666666667,\n", - " 0.6697916666666667),\n", - " (0.8395833333333333,\n", - " 0.6864583333333333,\n", - " 0.8729166666666667,\n", - " 0.7197916666666667),\n", - " (0.8395833333333333, 0.7375, 0.8729166666666667, 0.7708333333333334),\n", - " (0.8395833333333333, 0.7885416666666667, 0.8729166666666667, 0.821875),\n", - " (0.8395833333333333,\n", - " 0.8395833333333333,\n", - " 0.8729166666666667,\n", - " 0.8729166666666667),\n", - " (0.8395833333333333, 0.890625, 0.8729166666666667, 0.9239583333333333),\n", - " (0.8395833333333333, 0.9416666666666667, 0.8729166666666667, 0.975),\n", - " (0.890625, 0.025, 0.9239583333333333, 0.058333333333333334),\n", - " (0.890625, 0.07604166666666666, 0.9239583333333333, 0.109375),\n", - " (0.890625, 0.12708333333333333, 0.9239583333333333, 0.16041666666666668),\n", - " (0.890625, 0.178125, 0.9239583333333333, 0.21145833333333333),\n", - " (0.890625, 0.22916666666666666, 0.9239583333333333, 0.2625),\n", - " (0.890625, 0.28020833333333334, 0.9239583333333333, 0.31354166666666666),\n", - " (0.890625, 0.3302083333333333, 0.9239583333333333, 0.36354166666666665),\n", - " (0.890625, 0.38125, 0.9239583333333333, 0.41458333333333336),\n", - " (0.890625, 0.4322916666666667, 0.9239583333333333, 0.465625),\n", - " (0.890625, 0.48333333333333334, 0.9239583333333333, 0.5166666666666667),\n", - " (0.890625, 0.534375, 0.9239583333333333, 0.5677083333333334),\n", - " (0.890625, 0.5854166666666667, 0.9239583333333333, 0.61875),\n", - " (0.890625, 0.6364583333333333, 0.9239583333333333, 0.6697916666666667),\n", - " (0.890625, 0.6864583333333333, 0.9239583333333333, 0.7197916666666667),\n", - " (0.890625, 0.7375, 0.9239583333333333, 0.7708333333333334),\n", - " (0.890625, 0.7885416666666667, 0.9239583333333333, 0.821875),\n", - " (0.890625, 0.8395833333333333, 0.9239583333333333, 0.8729166666666667),\n", - " (0.890625, 0.890625, 0.9239583333333333, 0.9239583333333333),\n", - " (0.890625, 0.9416666666666667, 0.9239583333333333, 0.975),\n", - " (0.9416666666666667, 0.07604166666666666, 0.975, 0.109375),\n", - " (0.9416666666666667, 0.12708333333333333, 0.975, 0.16041666666666668),\n", - " (0.9416666666666667, 0.178125, 0.975, 0.21145833333333333),\n", - " (0.9416666666666667, 0.22916666666666666, 0.975, 0.2625),\n", - " (0.9416666666666667, 0.28020833333333334, 0.975, 0.31354166666666666),\n", - " (0.9416666666666667, 0.3302083333333333, 0.975, 0.36354166666666665),\n", - " (0.9416666666666667, 0.38125, 0.975, 0.41458333333333336),\n", - " (0.9416666666666667, 0.4322916666666667, 0.975, 0.465625),\n", - " (0.9416666666666667, 0.48333333333333334, 0.975, 0.5166666666666667),\n", - " (0.9416666666666667, 0.534375, 0.975, 0.5677083333333334),\n", - " (0.9416666666666667, 0.5854166666666667, 0.975, 0.61875),\n", - " (0.9416666666666667, 0.6364583333333333, 0.975, 0.6697916666666667),\n", - " (0.9416666666666667, 0.6864583333333333, 0.975, 0.7197916666666667),\n", - " (0.9416666666666667, 0.7375, 0.975, 0.7708333333333334),\n", - " (0.9416666666666667, 0.7885416666666667, 0.975, 0.821875),\n", - " (0.9416666666666667, 0.8395833333333333, 0.975, 0.8729166666666667),\n", - " (0.9416666666666667, 0.890625, 0.975, 0.9239583333333333)]" - ] - }, - "execution_count": 37, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "all_bb" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "qualified-forge", - "metadata": {}, - "outputs": [], - "source": [] - } - ], - "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.7" - } - }, - "nbformat": 4, - "nbformat_minor": 5 -} diff --git a/boonepeter.github.io-code/snapcodes/src/exploring/snapcodes.ipynb b/boonepeter.github.io-code/snapcodes/src/exploring/snapcodes.ipynb deleted file mode 100644 index fab8fe0..0000000 --- a/boonepeter.github.io-code/snapcodes/src/exploring/snapcodes.ipynb +++ /dev/null @@ -1,557 +0,0 @@ -{ - "cells": [ - { - "cell_type": "code", - "execution_count": 2, - "id": "turned-listening", - "metadata": {}, - "outputs": [], - "source": [ - "import os\n", - "import matplotlib.pyplot as plt\n", - "from skimage import io, img_as_ubyte\n", - "from skimage.filters import threshold_otsu\n", - "from skimage.color import rgb2gray\n", - "from skimage.measure import label, regionprops\n", - "from skimage.transform import resize, rotate" - ] - }, - { - "cell_type": "code", - "execution_count": 4, - "id": "healthy-curve", - "metadata": {}, - "outputs": [], - "source": [ - "folder = \"./imgs/new\"\n", - "\n", - "files = [os.path.join(folder, i) for i in os.listdir(folder) if not i == '.DS_Store']\n", - "\n" - ] - }, - { - "cell_type": "code", - "execution_count": 11, - "id": "legal-rebate", - "metadata": {}, - "outputs": [], - "source": [ - "def im_to_binary(im, w=1000, h=1000, mask=None):\n", - " \n", - " i = io.imread(im)\n", - " i = rgb2gray(i)\n", - " if mask is not None:\n", - " i = resize(i, (mask.shape[0], mask.shape[1]))\n", - " i = i & mask\n", - " else:\n", - " i = resize(i, (w, h))\n", - "\n", - " t = threshold_otsu(i)\n", - " return i > t\n" - ] - }, - { - "cell_type": "code", - "execution_count": 12, - "id": "interior-climb", - "metadata": {}, - "outputs": [], - "source": [ - "filepath = 'imgs/mask.jpeg'\n", - "im = io.imread(filepath)\n", - "mask = im > threshold_otsu(im)" - ] - }, - { - "cell_type": "code", - "execution_count": 14, - "id": "fantastic-attention", - "metadata": {}, - "outputs": [ - { - "name": "stderr", - "output_type": "stream", - "text": [ - ":4: FutureWarning: Non RGB image conversion is now deprecated. For RGBA images, please use rgb2gray(rgba2rgb(rgb)) instead. In version 0.19, a ValueError will be raised if input image last dimension length is not 3.\n", - " i = rgb2gray(i)\n" - ] - }, - { - "ename": "TypeError", - "evalue": "unsupported operand type(s) for -: 'NoneType' and 'int'", - "output_type": "error", - "traceback": [ - "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", - "\u001b[0;31mTypeError\u001b[0m Traceback (most recent call last)", - "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m\u001b[0m\n\u001b[0;32m----> 1\u001b[0;31m \u001b[0mj\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mim_to_binary\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mfiles\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;36m0\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;32mNone\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 2\u001b[0m \u001b[0;32mfor\u001b[0m \u001b[0mf\u001b[0m \u001b[0;32min\u001b[0m \u001b[0mfiles\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;36m1\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 3\u001b[0m \u001b[0ma\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mim_to_binary\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mf\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;32mNone\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 4\u001b[0m \u001b[0mj\u001b[0m \u001b[0;34m&=\u001b[0m \u001b[0ma\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 5\u001b[0m \u001b[0mio\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mimshow\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mimg_as_ubyte\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mj\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", - "\u001b[0;32m\u001b[0m in \u001b[0;36mim_to_binary\u001b[0;34m(im, w, h, mask)\u001b[0m\n\u001b[1;32m 7\u001b[0m \u001b[0mi\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mi\u001b[0m \u001b[0;34m&\u001b[0m \u001b[0mmask\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 8\u001b[0m \u001b[0;32melse\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m----> 9\u001b[0;31m \u001b[0mi\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mresize\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mi\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m(\u001b[0m\u001b[0mw\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mh\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 10\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 11\u001b[0m \u001b[0mt\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mthreshold_otsu\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mi\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", - "\u001b[0;32m/usr/local/lib/python3.9/site-packages/skimage/transform/_warps.py\u001b[0m in \u001b[0;36mresize\u001b[0;34m(image, output_shape, order, mode, cval, clip, preserve_range, anti_aliasing, anti_aliasing_sigma)\u001b[0m\n\u001b[1;32m 160\u001b[0m \u001b[0;32melse\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 161\u001b[0m \u001b[0;31m# 3 control points necessary to estimate exact AffineTransform\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 162\u001b[0;31m \u001b[0msrc_corners\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mnp\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0marray\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;36m1\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;36m1\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m[\u001b[0m\u001b[0;36m1\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mrows\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m[\u001b[0m\u001b[0mcols\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mrows\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;34m-\u001b[0m \u001b[0;36m1\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 163\u001b[0m \u001b[0mdst_corners\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mnp\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mzeros\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0msrc_corners\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mshape\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mdtype\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mnp\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mdouble\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 164\u001b[0m \u001b[0;31m# take into account that 0th pixel is at position (0.5, 0.5)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", - "\u001b[0;31mTypeError\u001b[0m: unsupported operand type(s) for -: 'NoneType' and 'int'" - ] - } - ], - "source": [ - "j = im_to_binary(files[0], None)\n", - "for f in files[1:]:\n", - " a = im_to_binary(f, None)\n", - " j &= a\n", - "io.imshow(img_as_ubyte(j))" - ] - }, - { - "cell_type": "code", - "execution_count": 5, - "id": "measured-baking", - "metadata": {}, - "outputs": [], - "source": [ - "io.imsave('and.jpeg', img_as_ubyte(j))" - ] - }, - { - "cell_type": "code", - "execution_count": 6, - "id": "resident-product", - "metadata": {}, - "outputs": [ - { - "name": "stderr", - "output_type": "stream", - "text": [ - ":3: FutureWarning: Non RGB image conversion is now deprecated. For RGBA images, please use rgb2gray(rgba2rgb(rgb)) instead. In version 0.19, a ValueError will be raised if input image last dimension length is not 3.\n", - " i = rgb2gray(i)\n" - ] - }, - { - "data": { - "text/plain": [ - "" - ] - }, - "execution_count": 6, - "metadata": {}, - "output_type": "execute_result" - }, - { - "data": { - "image/png": "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\n", - "text/plain": [ - "
" - ] - }, - "metadata": { - "needs_background": "light" - }, - "output_type": "display_data" - } - ], - "source": [ - "j = im_to_binary(files[0])\n", - "for f in files[1:]:\n", - " a = im_to_binary(f)\n", - " j |= a\n", - "io.imshow(img_as_ubyte(j))" - ] - }, - { - "cell_type": "code", - "execution_count": 7, - "id": "broken-rotation", - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "['./imgs/codes/snapcode.png', './imgs/codes/snapcode 15.png', './imgs/codes/snapcode 14.png', './imgs/codes/snapcode 13.png', './imgs/codes/snapcode 12.png', './imgs/codes/snapcode 9.png', './imgs/codes/snapcode 10.png', './imgs/codes/snapcode 11.png', './imgs/codes/snapcode 8.png', './imgs/codes/snapcode 5.png', './imgs/codes/snapcode 4.png', './imgs/codes/snapcode 6.png', './imgs/codes/snapcode 7.png', './imgs/codes/snapcode 3.png', './imgs/codes/snapcode 2.png']\n" - ] - } - ], - "source": [ - "folder = \"./imgs/codes\"\n", - "\n", - "files = [os.path.join(folder, i) for i in os.listdir(folder) if not i == '.DS_Store']\n", - "print(files)\n" - ] - }, - { - "cell_type": "code", - "execution_count": 8, - "id": "collectible-senator", - "metadata": {}, - "outputs": [ - { - "name": "stderr", - "output_type": "stream", - "text": [ - ":3: FutureWarning: Non RGB image conversion is now deprecated. For RGBA images, please use rgb2gray(rgba2rgb(rgb)) instead. In version 0.19, a ValueError will be raised if input image last dimension length is not 3.\n", - " i = rgb2gray(i)\n" - ] - }, - { - "data": { - "text/plain": [ - "" - ] - }, - "execution_count": 8, - "metadata": {}, - "output_type": "execute_result" - }, - { - "data": { - "image/png": "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\n", - "text/plain": [ - "
" - ] - }, - "metadata": { - "needs_background": "light" - }, - "output_type": "display_data" - } - ], - "source": [ - "j = im_to_binary(files[0])\n", - "for f in files[1:]:\n", - " a = im_to_binary(f)\n", - " j &= a\n", - "io.imshow(img_as_ubyte(j))" - ] - }, - { - "cell_type": "code", - "execution_count": 9, - "id": "owned-array", - "metadata": { - "scrolled": true - }, - "outputs": [ - { - "name": "stderr", - "output_type": "stream", - "text": [ - ":3: FutureWarning: Non RGB image conversion is now deprecated. For RGBA images, please use rgb2gray(rgba2rgb(rgb)) instead. In version 0.19, a ValueError will be raised if input image last dimension length is not 3.\n", - " i = rgb2gray(i)\n" - ] - }, - { - "data": { - "text/plain": [ - "" - ] - }, - "execution_count": 9, - "metadata": {}, - "output_type": "execute_result" - }, - { - "data": { - "image/png": "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\n", - "text/plain": [ - "
" - ] - }, - "metadata": { - "needs_background": "light" - }, - "output_type": "display_data" - } - ], - "source": [ - "j = im_to_binary(files[0])\n", - "for f in files[1:]:\n", - " a = im_to_binary(f)\n", - " j |= a\n", - "io.imshow(img_as_ubyte(j))" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "anonymous-bishop", - "metadata": {}, - "outputs": [], - "source": [] - }, - { - "cell_type": "code", - "execution_count": 10, - "id": "streaming-company", - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "['./imgs/codes/snapcode.png', './imgs/codes/snapcode 15.png', './imgs/codes/snapcode 14.png', './imgs/codes/snapcode 13.png', './imgs/codes/snapcode 12.png', './imgs/codes/snapcode 9.png', './imgs/codes/snapcode 10.png', './imgs/codes/snapcode 11.png', './imgs/codes/snapcode 8.png', './imgs/codes/snapcode 5.png', './imgs/codes/snapcode 4.png', './imgs/codes/snapcode 6.png', './imgs/codes/snapcode 7.png', './imgs/codes/snapcode 3.png', './imgs/codes/snapcode 2.png']\n" - ] - } - ], - "source": [ - "folder = \"./imgs/codes\"\n", - "\n", - "files = [os.path.join(folder, i) for i in os.listdir(folder) if not i == '.DS_Store']\n", - "print(files)\n" - ] - }, - { - "cell_type": "code", - "execution_count": 11, - "id": "conscious-waters", - "metadata": {}, - "outputs": [ - { - "name": "stderr", - "output_type": "stream", - "text": [ - ":3: FutureWarning: Non RGB image conversion is now deprecated. For RGBA images, please use rgb2gray(rgba2rgb(rgb)) instead. In version 0.19, a ValueError will be raised if input image last dimension length is not 3.\n", - " i = rgb2gray(i)\n" - ] - }, - { - "data": { - "text/plain": [ - "" - ] - }, - "execution_count": 11, - "metadata": {}, - "output_type": "execute_result" - }, - { - "data": { - "image/png": "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\n", - "text/plain": [ - "
" - ] - }, - "metadata": { - "needs_background": "light" - }, - "output_type": "display_data" - } - ], - "source": [ - "j = im_to_binary(files[0])\n", - "for f in files[1:]:\n", - " a = im_to_binary(f)\n", - " j &= a\n", - "io.imshow(img_as_ubyte(j))" - ] - }, - { - "cell_type": "code", - "execution_count": 12, - "id": "announced-authority", - "metadata": { - "scrolled": true - }, - "outputs": [ - { - "name": "stderr", - "output_type": "stream", - "text": [ - ":3: FutureWarning: Non RGB image conversion is now deprecated. For RGBA images, please use rgb2gray(rgba2rgb(rgb)) instead. In version 0.19, a ValueError will be raised if input image last dimension length is not 3.\n", - " i = rgb2gray(i)\n" - ] - }, - { - "data": { - "text/plain": [ - "" - ] - }, - "execution_count": 12, - "metadata": {}, - "output_type": "execute_result" - }, - { - "data": { - "image/png": "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\n", - "text/plain": [ - "
" - ] - }, - "metadata": { - "needs_background": "light" - }, - "output_type": "display_data" - } - ], - "source": [ - "j = im_to_binary(files[0])\n", - "for f in files[1:]:\n", - " a = im_to_binary(f)\n", - " j |= a\n", - "io.imshow(img_as_ubyte(j))" - ] - }, - { - "cell_type": "markdown", - "id": "corporate-classic", - "metadata": {}, - "source": [ - "## Cropped people" - ] - }, - { - "cell_type": "code", - "execution_count": 16, - "id": "controlling-petite", - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "['./imgs/people/cropped/FEIu0F9XMAcFnnC.jpeg', './imgs/people/cropped/FEK1L9cXoAgulGK.png', './imgs/people/cropped/person_E_1SliPVkAU9LRZ.jpeg', './imgs/people/cropped/person_FD9XmqWXIAYvYz6.jpeg', './imgs/people/cropped/FEJNLkmXIAMnJQP.jpeg', './imgs/people/cropped/person_FA4M9uIWQBQ7Y09.jpeg', './imgs/people/cropped/person_E_y5sW7UYAUhvVJ.jpeg', './imgs/people/cropped/personFD_8QyqXwAALMdW.jpeg', './imgs/people/cropped/FECYsfjXwAIEYmJ.png', './imgs/people/cropped/person_66c49c2d2e645826cd079524d1109bbf.jpeg', './imgs/people/cropped/FEJjiv8XwAInJVO.jpeg']\n" - ] - } - ], - "source": [ - "folder = \"./imgs/people/cropped\"\n", - "\n", - "files = [os.path.join(folder, i) for i in os.listdir(folder) if not i == '.DS_Store']\n", - "print(files)\n" - ] - }, - { - "cell_type": "code", - "execution_count": 17, - "id": "intensive-relief", - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "" - ] - }, - "execution_count": 17, - "metadata": {}, - "output_type": "execute_result" - }, - { - "data": { - "image/png": "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\n", - "text/plain": [ - "
" - ] - }, - "metadata": { - "needs_background": "light" - }, - "output_type": "display_data" - } - ], - "source": [ - "j = im_to_binary(files[0])\n", - "for f in files[1:]:\n", - " a = im_to_binary(f)\n", - " j &= a\n", - "io.imshow(img_as_ubyte(j))" - ] - }, - { - "cell_type": "code", - "execution_count": 18, - "id": "personal-color", - "metadata": { - "scrolled": false - }, - "outputs": [ - { - "data": { - "text/plain": [ - "" - ] - }, - "execution_count": 18, - "metadata": {}, - "output_type": "execute_result" - }, - { - "data": { - "image/png": "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\n", - "text/plain": [ - "
" - ] - }, - "metadata": { - "needs_background": "light" - }, - "output_type": "display_data" - } - ], - "source": [ - "j = im_to_binary(files[0])\n", - "for f in files[1:]:\n", - " a = im_to_binary(f)\n", - " j |= a\n", - "io.imshow(img_as_ubyte(j))" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "attached-funds", - "metadata": {}, - "outputs": [], - "source": [] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "aggregate-mongolia", - "metadata": {}, - "outputs": [], - "source": [] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "material-support", - "metadata": {}, - "outputs": [], - "source": [] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "smart-norway", - "metadata": {}, - "outputs": [], - "source": [] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "corresponding-girlfriend", - "metadata": {}, - "outputs": [], - "source": [] - } - ], - "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.7" - } - }, - "nbformat": 4, - "nbformat_minor": 5 -} diff --git a/boonepeter.github.io-code/snapcodes/src/generated/all_dots.png b/boonepeter.github.io-code/snapcodes/src/generated/all_dots.png deleted file mode 100644 index 6f97baf..0000000 Binary files a/boonepeter.github.io-code/snapcodes/src/generated/all_dots.png and /dev/null differ diff --git a/boonepeter.github.io-code/snapcodes/src/generated/all_dots_yellow copy.png b/boonepeter.github.io-code/snapcodes/src/generated/all_dots_yellow copy.png deleted file mode 100644 index 9717894..0000000 Binary files a/boonepeter.github.io-code/snapcodes/src/generated/all_dots_yellow copy.png and /dev/null differ diff --git a/boonepeter.github.io-code/snapcodes/src/generated/all_dots_yellow.png b/boonepeter.github.io-code/snapcodes/src/generated/all_dots_yellow.png deleted file mode 100644 index 9717894..0000000 Binary files a/boonepeter.github.io-code/snapcodes/src/generated/all_dots_yellow.png and /dev/null differ diff --git a/boonepeter.github.io-code/snapcodes/src/generated/mask.jpeg b/boonepeter.github.io-code/snapcodes/src/generated/mask.jpeg deleted file mode 100644 index efa5a15..0000000 Binary files a/boonepeter.github.io-code/snapcodes/src/generated/mask.jpeg and /dev/null differ diff --git a/boonepeter.github.io-code/snapcodes/src/img_to_points.py b/boonepeter.github.io-code/snapcodes/src/img_to_points.py deleted file mode 100644 index bc566f1..0000000 --- a/boonepeter.github.io-code/snapcodes/src/img_to_points.py +++ /dev/null @@ -1,305 +0,0 @@ -import argparse -from skimage import io -import numpy as np -from skimage import io, img_as_ubyte -from skimage.filters import threshold_otsu -from skimage.color import rgb2gray, rgba2rgb -from skimage.measure import label, regionprops - -## BBOX of points from all_dots_yellow.png -ALL_BBOX = [ - [0.025, 0.076, 0.0583, 0.1094], - [0.025, 0.1271, 0.0583, 0.1604], - [0.025, 0.1781, 0.0583, 0.2115], - [0.025, 0.2292, 0.0583, 0.2625], - [0.025, 0.2802, 0.0583, 0.3135], - [0.025, 0.3302, 0.0583, 0.3635], - [0.025, 0.3812, 0.0583, 0.4146], - [0.025, 0.4323, 0.0583, 0.4656], - [0.025, 0.4833, 0.0583, 0.5167], - [0.025, 0.5344, 0.0583, 0.5677], - [0.025, 0.5854, 0.0583, 0.6188], - [0.025, 0.6365, 0.0583, 0.6698], - [0.025, 0.6865, 0.0583, 0.7198], - [0.025, 0.7375, 0.0583, 0.7708], - [0.025, 0.7885, 0.0583, 0.8219], - [0.025, 0.8396, 0.0583, 0.8729], - [0.025, 0.8906, 0.0583, 0.924], - [0.076, 0.025, 0.1094, 0.0583], - [0.076, 0.076, 0.1094, 0.1094], - [0.076, 0.1271, 0.1094, 0.1604], - [0.076, 0.1781, 0.1094, 0.2115], - [0.076, 0.2292, 0.1094, 0.2625], - [0.076, 0.2802, 0.1094, 0.3135], - [0.076, 0.3302, 0.1094, 0.3635], - [0.076, 0.3812, 0.1094, 0.4146], - [0.076, 0.4323, 0.1094, 0.4656], - [0.076, 0.4833, 0.1094, 0.5167], - [0.076, 0.5344, 0.1094, 0.5677], - [0.076, 0.5854, 0.1094, 0.6188], - [0.076, 0.6365, 0.1094, 0.6698], - [0.076, 0.6865, 0.1094, 0.7198], - [0.076, 0.7375, 0.1094, 0.7708], - [0.076, 0.7885, 0.1094, 0.8219], - [0.076, 0.8396, 0.1094, 0.8729], - [0.076, 0.8906, 0.1094, 0.924], - [0.076, 0.9417, 0.1094, 0.975], - [0.1271, 0.025, 0.1604, 0.0583], - [0.1271, 0.076, 0.1604, 0.1094], - [0.1271, 0.1271, 0.1604, 0.1604], - [0.1271, 0.1781, 0.1604, 0.2115], - [0.1271, 0.2292, 0.1604, 0.2625], - [0.1271, 0.2802, 0.1604, 0.3135], - [0.1271, 0.3312, 0.1604, 0.3635], - [0.1271, 0.3812, 0.1604, 0.4146], - [0.1271, 0.4323, 0.1604, 0.4656], - [0.1271, 0.4833, 0.1604, 0.5167], - [0.1271, 0.5344, 0.1604, 0.5677], - [0.1271, 0.5854, 0.1604, 0.6188], - [0.1271, 0.6365, 0.1604, 0.6698], - [0.1271, 0.6865, 0.1604, 0.7198], - [0.1271, 0.7375, 0.1604, 0.7708], - [0.1271, 0.7885, 0.1604, 0.8219], - [0.1271, 0.8396, 0.1604, 0.8729], - [0.1271, 0.8906, 0.1604, 0.924], - [0.1271, 0.9417, 0.1604, 0.975], - [0.1781, 0.025, 0.2115, 0.0583], - [0.1781, 0.076, 0.2115, 0.1094], - [0.1781, 0.1271, 0.2115, 0.1604], - [0.1781, 0.1781, 0.2115, 0.2115], - [0.1781, 0.2292, 0.2115, 0.2625], - [0.1781, 0.2802, 0.2115, 0.3135], - [0.1781, 0.6865, 0.2115, 0.7198], - [0.1781, 0.7375, 0.2115, 0.7708], - [0.1781, 0.7885, 0.2115, 0.8219], - [0.1781, 0.8396, 0.2115, 0.8729], - [0.1781, 0.8906, 0.2115, 0.924], - [0.1781, 0.9417, 0.2115, 0.975], - [0.2292, 0.025, 0.2625, 0.0583], - [0.2292, 0.076, 0.2625, 0.1094], - [0.2292, 0.1271, 0.2625, 0.1604], - [0.2292, 0.1781, 0.2625, 0.2115], - [0.2292, 0.2292, 0.2625, 0.2625], - [0.2292, 0.7375, 0.2625, 0.7708], - [0.2292, 0.7885, 0.2625, 0.8219], - [0.2292, 0.8396, 0.2625, 0.8729], - [0.2292, 0.8906, 0.2625, 0.924], - [0.2292, 0.9417, 0.2625, 0.975], - [0.2802, 0.025, 0.3135, 0.0583], - [0.2802, 0.076, 0.3135, 0.1094], - [0.2802, 0.1271, 0.3135, 0.1604], - [0.2802, 0.1781, 0.3135, 0.2115], - [0.2802, 0.7885, 0.3135, 0.8219], - [0.2802, 0.8396, 0.3135, 0.8729], - [0.2802, 0.8906, 0.3135, 0.924], - [0.2802, 0.9417, 0.3135, 0.975], - [0.3302, 0.025, 0.3635, 0.0583], - [0.3302, 0.076, 0.3635, 0.1094], - [0.3302, 0.1271, 0.3635, 0.1604], - [0.3302, 0.8396, 0.3635, 0.8729], - [0.3302, 0.8906, 0.3635, 0.924], - [0.3302, 0.9417, 0.3635, 0.975], - [0.3812, 0.025, 0.4146, 0.0583], - [0.3812, 0.076, 0.4146, 0.1094], - [0.3812, 0.1271, 0.4146, 0.1604], - [0.3812, 0.8396, 0.4146, 0.8729], - [0.3812, 0.8906, 0.4146, 0.924], - [0.3812, 0.9417, 0.4146, 0.975], - [0.4323, 0.025, 0.4656, 0.0583], - [0.4323, 0.076, 0.4656, 0.1094], - [0.4323, 0.1271, 0.4656, 0.1604], - [0.4323, 0.8396, 0.4656, 0.8729], - [0.4323, 0.8906, 0.4656, 0.924], - [0.4323, 0.9417, 0.4656, 0.975], - [0.4833, 0.025, 0.5167, 0.0583], - [0.4833, 0.076, 0.5167, 0.1094], - [0.4833, 0.1271, 0.5167, 0.1604], - [0.4833, 0.8396, 0.5167, 0.8729], - [0.4833, 0.8906, 0.5167, 0.924], - [0.4833, 0.9417, 0.5167, 0.975], - [0.5344, 0.025, 0.5677, 0.0583], - [0.5344, 0.076, 0.5677, 0.1094], - [0.5344, 0.1271, 0.5677, 0.1604], - [0.5344, 0.8396, 0.5677, 0.8729], - [0.5344, 0.8906, 0.5677, 0.924], - [0.5344, 0.9417, 0.5677, 0.975], - [0.5854, 0.025, 0.6188, 0.0583], - [0.5854, 0.076, 0.6188, 0.1094], - [0.5854, 0.1271, 0.6188, 0.1604], - [0.5854, 0.8396, 0.6188, 0.8729], - [0.5854, 0.8906, 0.6188, 0.924], - [0.5854, 0.9417, 0.6188, 0.975], - [0.6365, 0.025, 0.6698, 0.0583], - [0.6365, 0.076, 0.6698, 0.1094], - [0.6365, 0.1271, 0.6698, 0.1604], - [0.6365, 0.8396, 0.6698, 0.8729], - [0.6365, 0.8906, 0.6698, 0.924], - [0.6365, 0.9417, 0.6698, 0.975], - [0.6865, 0.025, 0.7198, 0.0583], - [0.6865, 0.076, 0.7198, 0.1094], - [0.6865, 0.1271, 0.7198, 0.1604], - [0.6865, 0.1781, 0.7198, 0.2115], - [0.6865, 0.7885, 0.7198, 0.8219], - [0.6865, 0.8396, 0.7198, 0.8729], - [0.6865, 0.8906, 0.7198, 0.924], - [0.6865, 0.9417, 0.7198, 0.975], - [0.7375, 0.025, 0.7708, 0.0583], - [0.7375, 0.076, 0.7708, 0.1094], - [0.7375, 0.1271, 0.7708, 0.1604], - [0.7375, 0.1781, 0.7708, 0.2115], - [0.7375, 0.2292, 0.7708, 0.2625], - [0.7375, 0.7375, 0.7708, 0.7708], - [0.7375, 0.7885, 0.7708, 0.8219], - [0.7375, 0.8396, 0.7708, 0.8729], - [0.7375, 0.8906, 0.7708, 0.924], - [0.7375, 0.9417, 0.7708, 0.975], - [0.7885, 0.025, 0.8219, 0.0583], - [0.7885, 0.076, 0.8219, 0.1094], - [0.7885, 0.1271, 0.8219, 0.1604], - [0.7885, 0.1781, 0.8219, 0.2115], - [0.7885, 0.2292, 0.8219, 0.2625], - [0.7885, 0.2802, 0.8219, 0.3135], - [0.7885, 0.6865, 0.8219, 0.7198], - [0.7885, 0.7375, 0.8219, 0.7708], - [0.7885, 0.7885, 0.8219, 0.8219], - [0.7885, 0.8396, 0.8219, 0.8729], - [0.7885, 0.8906, 0.8219, 0.924], - [0.7885, 0.9417, 0.8219, 0.975], - [0.8396, 0.025, 0.8729, 0.0583], - [0.8396, 0.076, 0.8729, 0.1094], - [0.8396, 0.1271, 0.8729, 0.1604], - [0.8396, 0.1781, 0.8729, 0.2115], - [0.8396, 0.2292, 0.8729, 0.2625], - [0.8396, 0.2802, 0.8729, 0.3135], - [0.8396, 0.3312, 0.8729, 0.3635], - [0.8396, 0.3812, 0.8729, 0.4146], - [0.8396, 0.4323, 0.8729, 0.4656], - [0.8396, 0.4833, 0.8729, 0.5167], - [0.8396, 0.5344, 0.8729, 0.5677], - [0.8396, 0.5854, 0.8729, 0.6188], - [0.8396, 0.6365, 0.8729, 0.6698], - [0.8396, 0.6865, 0.8729, 0.7198], - [0.8396, 0.7375, 0.8729, 0.7708], - [0.8396, 0.7885, 0.8729, 0.8219], - [0.8396, 0.8396, 0.8729, 0.8729], - [0.8396, 0.8906, 0.8729, 0.924], - [0.8396, 0.9417, 0.8729, 0.975], - [0.8906, 0.025, 0.924, 0.0583], - [0.8906, 0.076, 0.924, 0.1094], - [0.8906, 0.1271, 0.924, 0.1604], - [0.8906, 0.1781, 0.924, 0.2115], - [0.8906, 0.2292, 0.924, 0.2625], - [0.8906, 0.2802, 0.924, 0.3135], - [0.8906, 0.3302, 0.924, 0.3635], - [0.8906, 0.3812, 0.924, 0.4146], - [0.8906, 0.4323, 0.924, 0.4656], - [0.8906, 0.4833, 0.924, 0.5167], - [0.8906, 0.5344, 0.924, 0.5677], - [0.8906, 0.5854, 0.924, 0.6188], - [0.8906, 0.6365, 0.924, 0.6698], - [0.8906, 0.6865, 0.924, 0.7198], - [0.8906, 0.7375, 0.924, 0.7708], - [0.8906, 0.7885, 0.924, 0.8219], - [0.8906, 0.8396, 0.924, 0.8729], - [0.8906, 0.8906, 0.924, 0.924], - [0.8906, 0.9417, 0.924, 0.975], - [0.9417, 0.076, 0.975, 0.1094], - [0.9417, 0.1271, 0.975, 0.1604], - [0.9417, 0.1781, 0.975, 0.2115], - [0.9417, 0.2292, 0.975, 0.2625], - [0.9417, 0.2802, 0.975, 0.3135], - [0.9417, 0.3302, 0.975, 0.3635], - [0.9417, 0.3812, 0.975, 0.4146], - [0.9417, 0.4323, 0.975, 0.4656], - [0.9417, 0.4833, 0.975, 0.5167], - [0.9417, 0.5344, 0.975, 0.5677], - [0.9417, 0.5854, 0.975, 0.6188], - [0.9417, 0.6365, 0.975, 0.6698], - [0.9417, 0.6865, 0.975, 0.7198], - [0.9417, 0.7375, 0.975, 0.7708], - [0.9417, 0.7885, 0.975, 0.8219], - [0.9417, 0.8396, 0.975, 0.8729], - [0.9417, 0.8906, 0.975, 0.924], -] - -def color_crop(im, color=[(250, 255), (245, 255), (0, 10)]): - """Crop an image to the min and max occurances of a color range. - Accepts an image and list of colors (channels and colors must match). - """ - assert len(color) == im.shape[-1] - binary = np.ones(im.shape[:-1], dtype=bool) - for i in range(3): - binary &= (im[:,:,i] >= color[i][0]) & (im[:,:,i] <= color[i][1]) - labeled = label(binary, background=0) - rp = regionprops(labeled) - bbox = max(rp, key=lambda x: x.bbox_area).bbox - return im[bbox[0]:bbox[2], bbox[1]:bbox[3], :] - -def _get_points(image): - im = rgb2gray(image) - t = threshold_otsu(im) - return im > t - - -def get_bbox_and_centers(im, color=[(250, 255), (245, 255), (0, 10)]): - im = color_crop(im, color=color) - p = _get_points(im) - l = label(p, background=1) - rp = regionprops(l) - (maxx, maxy) = l.shape - max_size = l.shape[0] * l.shape[1] // 500 - min_size = l.shape[0] * l.shape[1] // 2000 - - bbs = [] - centers = [] - for props in rp: - minr, minc, maxr, maxc = props.bbox - if props.bbox_area < max_size and props.bbox_area > min_size: - bbs.append((props.bbox[0] / maxx, props.bbox[1] / maxx, props.bbox[2] / maxx, props.bbox[3] / maxx)) - centers.append( - ( - (((minr / maxy) + (maxr / maxy)) / 2), - (((minc / maxx) + (maxc / maxx)) / 2) - ), - ) - return bbs, centers - -def get_numbers(centers, bbs): - points = [] - for i, b in enumerate(bbs): - for x, y in centers: - if x > b[0] and x < b[2] and y > b[1] and y < b[3]: - points.append(i) - return points - -def img_to_points(filepath, check_counts=False): - im = io.imread(filepath) - color = [(250, 255), (245, 255), (0, 10)] - # convert to 3 channel - if im.shape[-1] == 4: - im = rgba2rgb(im) - # convert to uint8 (0-255) - im = img_as_ubyte(im) - try: - _, centers = get_bbox_and_centers(im, color) - except: - try: - # for some reason, some of the colors are off - # when the images are read in - color = [(250, 255), (245, 255), (75, 90)] - _, centers = get_bbox_and_centers(im, color) - except Exception as e: - raise e - if check_counts and (len(centers) < 50 or len(centers) > 120): - raise Exception("Too many or too few points") - return get_numbers(centers, ALL_BBOX) - - -if __name__ == "__main__": - parser = argparse.ArgumentParser() - parser.add_argument("filepath", type=str) - parser.add_argument("--check_counts", action="store_true") - args = parser.parse_args() - print(img_to_points(args.filepath, args.check_counts)) - - diff --git a/boonepeter.github.io-code/snapcodes/src/img_to_svg.py b/boonepeter.github.io-code/snapcodes/src/img_to_svg.py deleted file mode 100644 index d41b9c5..0000000 --- a/boonepeter.github.io-code/snapcodes/src/img_to_svg.py +++ /dev/null @@ -1,21 +0,0 @@ -import argparse -from img_to_points import img_to_points -from points_to_svg import points_to_svg - -def img_to_svg(filepath, output_filepath): - """ - Converts an image to an SVG file. - """ - points = img_to_points(filepath, True) - print(points) - svg = points_to_svg(points) - with open(output_filepath, "w") as f: - f.write(svg) - - -if __name__ == "__main__": - parser = argparse.ArgumentParser(description="Convert an image to an SVG file.") - parser.add_argument("-i", "--input", help="Input filepath", required=True) - parser.add_argument("-o", "--output", help="Output filepath", required=True) - args = parser.parse_args() - img_to_svg(args.input, args.output) \ No newline at end of file diff --git a/boonepeter.github.io-code/snapcodes/src/output.svg b/boonepeter.github.io-code/snapcodes/src/output.svg deleted file mode 100644 index 5994d74..0000000 --- a/boonepeter.github.io-code/snapcodes/src/output.svg +++ /dev/null @@ -1,300 +0,0 @@ - - - - - diff --git a/boonepeter.github.io-code/snapcodes/src/points_to_svg.py b/boonepeter.github.io-code/snapcodes/src/points_to_svg.py deleted file mode 100644 index 0d565ae..0000000 --- a/boonepeter.github.io-code/snapcodes/src/points_to_svg.py +++ /dev/null @@ -1,78 +0,0 @@ -import argparse - -positions = [ - [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17], - [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18], - [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18], - [0, 1, 2, 3, 4, 5, 13, 14, 15, 16, 17, 18], - [0, 1, 2, 3, 4, 14, 15, 16, 17, 18], - [0, 1, 2, 3, 15, 16, 17, 18], - [0, 1, 2, 16, 17, 18], - [0, 1, 2, 16, 17, 18], - [0, 1, 2, 16, 17, 18], - [0, 1, 2, 16, 17, 18], - [0, 1, 2, 16, 17, 18], - [0, 1, 2, 16, 17, 18], - [0, 1, 2, 16, 17, 18], - [0, 1, 2, 3, 15, 16, 17, 18], - [0, 1, 2, 3, 4, 14, 15, 16, 17, 18], - [0, 1, 2, 3, 4, 5, 13, 14, 15, 16, 17, 18], - [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18], - [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18], - [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17], -] - -BORDER = 56.42 -BORDER_C = 72.42 -MULT = 48.8425 -DIAMETER = 32 -SVG = ''' - - - - -''' - -def points_to_svg(points): - counter = 0 - path = "" - points.sort() - for r in range(len(positions)): - for c in range(len(positions[r])): - col = positions[r][c] - if len(points) == 0: - break - if points[0] == counter: - path += f"""M{col * MULT + BORDER_C},{r * MULT + BORDER} - A16,16,0,0,0,{col * MULT + BORDER_C},{r * MULT + BORDER + DIAMETER} - A16,16,0,0,0,{col * MULT + BORDER_C},{r * MULT + BORDER} - """ - points.pop(0) - counter += 1 - return SVG.format(path=path) - - -if __name__ == "__main__": - parser = argparse.ArgumentParser() - parser.add_argument("--points", type=str, help="Points to draw") - parser.add_argument("--output", type=str, help="Output file") - parser.add_argument("--show", action="store_true", help="Show SVG") - parser.set_defaults(points=",".join([str(i) for i in range(212)])) - args = parser.parse_args() - points = args.points.split(",") - points = [int(i) for i in points] - svg = points_to_svg(points) - if args.output: - with open(args.output, "w") as f: - f.write(svg) - if args.show: - import subprocess, os, platform - if platform.system() == 'Darwin': # macOS - subprocess.call(('open', args.output)) - elif platform.system() == 'Windows': # Windows - os.startfile(args.output) - else: # linux variants - subprocess.call(('xdg-open', args.output)) - if not args.show or not args.output: - print(svg) diff --git a/boonepeter.github.io-code/snapcodes/src/process_all.py b/boonepeter.github.io-code/snapcodes/src/process_all.py deleted file mode 100644 index cbf2cff..0000000 --- a/boonepeter.github.io-code/snapcodes/src/process_all.py +++ /dev/null @@ -1,15 +0,0 @@ -import os - -from img_to_svg import img_to_svg - - -files = os.listdir("./imgs/twitter") -files = [os.path.join("./imgs/twitter", f) for f in files if f.endswith(".jpeg")] - -for f in files: - output_path = f.replace(".jpeg", ".svg") - try: - img_to_svg(f, output_path) - except Exception as e: - print(f"Error processing {f}") - print(e) \ No newline at end of file diff --git a/boonepeter.github.io-code/snapcodes/src/snapcode.png b/boonepeter.github.io-code/snapcodes/src/snapcode.png deleted file mode 100644 index 0f68460..0000000 Binary files a/boonepeter.github.io-code/snapcodes/src/snapcode.png and /dev/null differ diff --git a/boonepeter.github.io-code/spotify-codes-part-2/src/decode_barcode.py b/boonepeter.github.io-code/spotify-codes-part-2/src/decode_barcode.py index 0633869..115aa40 100644 --- a/boonepeter.github.io-code/spotify-codes-part-2/src/decode_barcode.py +++ b/boonepeter.github.io-code/spotify-codes-part-2/src/decode_barcode.py @@ -17,7 +17,6 @@ if __name__ == "__main__": filename = args.filename token = args.token heights = get_heights(filename) - print(f"Heights: {heights}") # drop the fist, last, and 12th bar heights = heights[1:11] + heights[12:-1] decoded = spotify_bar_decode(heights) diff --git a/boonepeter.github.io-code/spotify-codes-part-2/src/get_heights.py b/boonepeter.github.io-code/spotify-codes-part-2/src/get_heights.py index 8070bd1..a263351 100644 --- a/boonepeter.github.io-code/spotify-codes-part-2/src/get_heights.py +++ b/boonepeter.github.io-code/spotify-codes-part-2/src/get_heights.py @@ -1,78 +1,45 @@ -from skimage import io -from skimage.color import rgb2gray -from skimage.filters import threshold_otsu -from skimage.measure import label, regionprops +import numpy as np import matplotlib.pyplot as plt -import matplotlib.patches as patches from skimage import io -from skimage.color import rgb2gray from skimage.filters import threshold_otsu, gaussian +from skimage.morphology import closing, square from skimage.measure import label, regionprops -import matplotlib.pyplot as plt +from skimage.color import rgb2gray import matplotlib.patches as patches -def get_heights(filename: str) -> list: - """Open an image and return a list of the bar heights. - Also saves three images: the processed binary image, the original image with drawings, and a smoothed binary image. - """ +from sklearn.cluster import KMeans + +def get_heights(filename: str): image = io.imread(filename) im = rgb2gray(image) binary_im = im > threshold_otsu(im) + smooth_im = gaussian(binary_im.astype(float), sigma=1) + morph_im = closing(smooth_im > 0.5, square(3)) - # Apply Gaussian smoothing to binary image to make bars look rounder - smooth_im = gaussian(binary_im, sigma=2) - # Threshold again to obtain a smoothed binary - smooth_binary = smooth_im > 0.5 - labeled = label(smooth_binary) - bar_dimensions = [r.bbox for r in regionprops(labeled)] - bar_dimensions.sort(key=lambda x: x[1]) # Sort left to right - # The first object (spotify logo) is the max height of the bars - logo = bar_dimensions[0] - max_height = logo[2] - logo[0] - sequence = [] - # Create figure and axis for drawing - fig, ax = plt.subplots() - ax.imshow(smooth_binary, cmap='gray') - # Draw rectangle around logo - logo_rect = patches.Rectangle( - (logo[1], logo[0]), - logo[3]-logo[1], - logo[2]-logo[0], - linewidth=2, - edgecolor='yellow', - facecolor='none' - ) - ax.add_patch(logo_rect) - # Add 'Logo' text near the rectangle - ax.text(logo[1], logo[0] - 10, 'Logo', color='yellow', fontsize=12, weight='bold') - # Draw bars and center markers - for bar in bar_dimensions[1:]: - height = bar[2] - bar[0] - ratio = height / max_height - ratio *= 8 - ratio //= 1 - val = int(ratio - 1) - sequence.append(val) - # Draw rectangle around bar - rect = patches.Rectangle( - (bar[1], bar[0]), - bar[3]-bar[1], - bar[2]-bar[0], - linewidth=1, - edgecolor='red', - facecolor='none' - ) - ax.add_patch(rect) - # Draw center marker (white circle) - center_x = (bar[1] + bar[3]) / 2 - center_y = (bar[0] + bar[2]) / 2 - center_marker = patches.Circle((center_x, center_y), radius=5, color='black') - ax.add_patch(center_marker) - # Save processed binary image used for calculations - plt.imsave('processed_binary_image.png', binary_im, cmap='gray') - # Save smoothed binary image - plt.imsave('img_smooth.png', smooth_binary, cmap='gray') - # Save image with drawings - plt.axis('off') - plt.savefig('image_with_drawings.png', bbox_inches='tight', pad_inches=0) - plt.close() - return sequence \ No newline at end of file + labeled = label(morph_im) + bar_dims = [r.bbox for r in regionprops(labeled)] + bar_dims.sort(key=lambda x: x[1]) # left to right + + bars = bar_dims[1:] # skip logo + bar_heights_raw = [] + + for bar in bars: + top, left, bottom, right = bar + effective_height = bottom - top # use bounding box height directly + bar_heights_raw.append(effective_height) + print(len(bars)) + # Cluster measured heights to 8 clusters representing discrete bar levels + bar_heights_raw_np = np.array(bar_heights_raw).reshape(-1, 1) + + kmeans = KMeans(n_clusters=8, random_state=0).fit(bar_heights_raw_np) + cluster_centers = np.sort(kmeans.cluster_centers_.flatten()) + + # Assign each bar height to closest cluster center index (0 to 7) + predicted_levels = [] + for h in bar_heights_raw: + diffs = np.abs(cluster_centers - h) + closest_cluster = np.argmin(diffs) + predicted_levels.append(closest_cluster) + + + print(len(predicted_levels)) + return predicted_levels diff --git a/boonepeter.github.io-code/spotify-codes-part-2/src/image_with_drawings.png b/boonepeter.github.io-code/spotify-codes-part-2/src/image_with_drawings.png deleted file mode 100644 index 14db9c2..0000000 Binary files a/boonepeter.github.io-code/spotify-codes-part-2/src/image_with_drawings.png and /dev/null differ diff --git a/boonepeter.github.io-code/spotify-codes-part-2/src/img_smooth.png b/boonepeter.github.io-code/spotify-codes-part-2/src/img_smooth.png deleted file mode 100644 index 89f9646..0000000 Binary files a/boonepeter.github.io-code/spotify-codes-part-2/src/img_smooth.png and /dev/null differ diff --git a/boonepeter.github.io-code/spotify-codes-part-2/src/processed_binary_image.png b/boonepeter.github.io-code/spotify-codes-part-2/src/processed_binary_image.png deleted file mode 100644 index 70b7648..0000000 Binary files a/boonepeter.github.io-code/spotify-codes-part-2/src/processed_binary_image.png and /dev/null differ diff --git a/boonepeter.github.io-code/spotify-codes/calc_crc8.py b/boonepeter.github.io-code/spotify-codes/calc_crc8.py deleted file mode 100644 index f09897f..0000000 --- a/boonepeter.github.io-code/spotify-codes/calc_crc8.py +++ /dev/null @@ -1,11 +0,0 @@ -import crc8 - -hash = crc8.crc8() -media_ref = 67775490487 -ref_bytes = media_ref.to_bytes(5, byteorder="big") -print(ref_bytes) -# b'\x0f\xc7\xbb\xe9\xb7' -hash.update(ref_bytes) -check_bits = hash.digest() -print(check_bits) -# b'\x0c' \ No newline at end of file diff --git a/boonepeter.github.io-code/spotify-codes/get_heights.py b/boonepeter.github.io-code/spotify-codes/get_heights.py deleted file mode 100644 index 000c28b..0000000 --- a/boonepeter.github.io-code/spotify-codes/get_heights.py +++ /dev/null @@ -1,52 +0,0 @@ -from skimage import io -from skimage.measure import label, regionprops -from skimage.filters import threshold_otsu -from skimage.color import rgb2gray - - -from skimage import io -from skimage.color import rgb2gray -from skimage.filters import threshold_sauvola -from skimage.exposure import equalize_adapthist -from skimage.measure import label, regionprops -from skimage.morphology import closing, square - -def get_heights(filename: str) -> list: - """Open an image and return a list of the bar heights.""" - # Load image and convert to grayscale - image = io.imread(filename) - im = rgb2gray(image) - - # Apply adaptive histogram equalization to enhance contrast - im_eq = equalize_adapthist(im, clip_limit=0.03) - - # Adaptive thresholding using Sauvola method - window_size = 25 # Adjust window size if needed - thresh_sauvola = threshold_sauvola(im_eq, window_size=window_size) - binary_im = im_eq > thresh_sauvola - - # Morphological closing to fill gaps and clean noise - binary_im = closing(binary_im, square(3)) - - # Label connected components - labeled = label(binary_im) - - # Get bounding boxes for each detected object - bar_dimensions = [r.bbox for r in regionprops(labeled)] - - # Sort bounding boxes by horizontal position (xmin) - bar_dimensions.sort(key=lambda x: x[1]) - - # Use the first detected object (logo) as max height reference - logo = bar_dimensions[0] - max_height = logo[2] - logo[0] - - sequence = [] - for bar in bar_dimensions[1:]: - height = bar[2] - bar[0] - ratio = height / max_height - ratio *= 8 - ratio = int(ratio) # truncate decimal part - sequence.append(ratio - 1) - - return sequence diff --git a/final-loop/spotify-codes-part-2/.cache b/final-loop/spotify-codes-part-2/.cache new file mode 100644 index 0000000..573b327 --- /dev/null +++ b/final-loop/spotify-codes-part-2/.cache @@ -0,0 +1 @@ +{"access_token": "BQAHRFXWQMMKWNbUO3sfhk92iUGi5VJNZmB2lTjRim-g2AIe88mgDvyc1NywjCVBTeZK-b3PkXzGDANJDDOouitEt5P8z0jpVuPrpalwAg0PzEwtKBXr8PHvacajO9B3s7Wy0s7G3CFlfGfbOfmXtW_vF8G2_ooGnlFp_oM8RcOyBl7D5Okf6kr07CWIJty4mNeTf1Ifd212u1tBnbU64lckqlQ0f0W105mt", "token_type": "Bearer", "expires_in": 3600, "refresh_token": "AQCSe9ARCDB-Q6gzna_KKAlcEuNOx2IC9BSVXS5GZxNDi4AjJdA4Kn3hp1YPfiPfogd2rz-5zLbyjUxiRj9oTd-q5EItEPZHIVt-eMf7gCGHfj6h-hLpRrnhgMZjzRAS7CY", "scope": "user-modify-playback-state user-read-playback-state", "expires_at": 1757966002} \ No newline at end of file diff --git a/final-loop/spotify-codes-part-2/requirements.txt b/final-loop/spotify-codes-part-2/requirements.txt new file mode 100644 index 0000000..a77113c --- /dev/null +++ b/final-loop/spotify-codes-part-2/requirements.txt @@ -0,0 +1,21 @@ +certifi>=2023.5.7 +chardet>=5.1.0 +crccheck>=1.0 +cycler>=0.11.0 +decorator>=5.1.1 +idna>=3.5 +imageio>=2.31.1 +kiwisolver>=1.4.4 +matplotlib>=3.7.1 +networkx>=3.1 +numpy>=1.24.2 +Pillow>=10.0.0 +pyparsing>=3.0.9 +python-dateutil>=2.8.2 +PyWavelets>=1.4.1 +requests>=2.31.0 +scikit-image>=0.25.2 +scipy>=1.11.1 +six>=1.16.0 +tifffile>=2023.7.23 +urllib3>=2.0.4 diff --git a/final-loop/spotify-codes-part-2/src/crc.py b/final-loop/spotify-codes-part-2/src/crc.py new file mode 100644 index 0000000..48085db --- /dev/null +++ b/final-loop/spotify-codes-part-2/src/crc.py @@ -0,0 +1,31 @@ + +def crc(data, polynomial): + n = len(polynomial) - 1 + initial_length = len(data) + check_bits = data + [0] * n + for i in range(initial_length): + if check_bits[i] == 1: + for j, p in enumerate(polynomial): + check_bits[i + j] = check_bits[i + j] ^ p + return check_bits[-n:] + +def check_crc(data, polynomial, check_bits): + full_data = data + check_bits + for i in range(len(data)): + if full_data[i] == 1: + for j, p in enumerate(polynomial): + full_data[i + j] = full_data[i + j] ^ p + return 1 not in full_data +data = [0,0,1,0,0,0,1,0,1,1,1,1,0,1,1,1,1,0,0,0,1,1,1,1,0,1,1,0,1,0,1,1,0,0,0,0,1,1,0,1] +check = [1,1,0,0,1,1,0,0] +poly = [1,0,0,0,0,0,1,1,1] +print(check_crc(data, poly, check)) + +if __name__ == "__main__": + example = "0010001011110111100011110110101100001101" + long = [int(i) for i in example] + polynomial = [1, 0, 0, 0, 0, 0, 1, 1, 1] # crc8 polynomial + check = crc(long, polynomial) + print(f"Check bits: {check}") + checked = check_crc(long, polynomial, check) + print(f"Checked: {checked}") \ No newline at end of file diff --git a/final-loop/spotify-codes-part-2/src/decode_barcode.py b/final-loop/spotify-codes-part-2/src/decode_barcode.py new file mode 100644 index 0000000..0bd7463 --- /dev/null +++ b/final-loop/spotify-codes-part-2/src/decode_barcode.py @@ -0,0 +1,57 @@ +import argparse +import pprint +from get_heights import get_heights +from encode_decode import spotify_bar_decode +from get_uri import get_uri, get_info +import cv2 + + +def process_frame(frame, token): + heights = get_heights(frame) + print(len(heights)) # assumes get_heights can take image array + if len(heights) != 23: + return None # skip bad frames + else: + print("ON TROUVE UN CODE") + + heights = heights[1:11] + heights[12:-1] + decoded = spotify_bar_decode(heights) + uri = get_uri(decoded, token) + summary, full_response = get_info(uri["target"], token) + return summary + + +if __name__ == "__main__": + parser = argparse.ArgumentParser() + parser.add_argument("--token", required=True) + args = parser.parse_args() + token = args.token + + cap = cv2.VideoCapture(0) # 0 for default webcam + + while True: + ret, frame = cap.read() + if not ret: + break + + # Définir les dimensions et la marge du cadre + height, width, _ = frame.shape + margin = 100 # ajustez la taille du cadre ici + frame = frame[margin:height - margin, margin:width - margin] + + try: + summary = process_frame(frame, token) + except Exception: + continue + + if summary: + print("Summary:") + pprint.pprint(summary) + + cv2.imshow("Live Barcode", frame) + + if cv2.waitKey(1) & 0xFF == ord('q'): + break + + cap.release() + cv2.destroyAllWindows() diff --git a/final-loop/spotify-codes-part-2/src/encode_decode.py b/final-loop/spotify-codes-part-2/src/encode_decode.py new file mode 100644 index 0000000..e53a965 --- /dev/null +++ b/final-loop/spotify-codes-part-2/src/encode_decode.py @@ -0,0 +1,118 @@ +import numpy as np +import crccheck + +# This code was written by "Doyle" on Stack Overflow +# https://stackoverflow.com/a/64950150/10703868 + + +# Utils for conversion between int, array of binary +# and array of bytes (as ints) +def int_to_bin(num, length, endian): + if endian == 'l': + return [num >> i & 1 for i in range(0, length)] + elif endian == 'b': + return [num >> i & 1 for i in range(length-1, -1, -1)] + +def bin_to_int(bin,length): + return int("".join([str(bin[i]) for i in range(length-1,-1,-1)]),2) + +def bin_to_bytes(bin, length): + b = bin[0:length] + [0] * (-length % 8) + return [(b[i]<<7) + (b[i+1]<<6) + (b[i+2]<<5) + (b[i+3]<<4) + + (b[i+4]<<3) + (b[i+5]<<2) + (b[i+6]<<1) + b[i+7] for i in range(0,len(b),8)] + +# Return the circular right shift of an array by 'n' positions +def shift_right(arr, n): + return arr[-n % len(arr):len(arr):] + arr[0:-n % len(arr)] + +gray_code = [0,1,3,2,7,6,4,5] +gray_code_inv = [[0,0,0],[0,0,1],[0,1,1],[0,1,0], + [1,1,0],[1,1,1],[1,0,1],[1,0,0]] + +# CRC using Rocksoft model: +# NOTE: this is not quite any of their predefined CRC's +# 8: number of check bits (degree of poly) +# 0x7: representation of poly without high term (x^8+x^2+x+1) +# 0x0: initial fill of register +# True: byte reverse data +# True: byte reverse check +# 0xff: Mask check (i.e. invert) +spotify_crc = crccheck.crc.Crc(8, 0x7, 0x0, True, True, 0xff) + +def calc_spotify_crc(bin37): + bytes = bin_to_bytes(bin37, 37) + return int_to_bin(spotify_crc.calc(bytes), 8, 'b') + +def check_spotify_crc(bin45): + data = bin_to_bytes(bin45,37) + return spotify_crc.calc(data) == bin_to_bytes(bin45[37:], 8)[0] + +# Simple convolutional encoder +def encode_cc(dat): + gen1 = [1,0,1,1,0,1,1] + gen2 = [1,1,1,1,0,0,1] + punct = [1,1,0] + dat_pad = dat[-6:] + dat # 6 bits are needed to initialize + # register for tail-biting + stream1 = np.convolve(dat_pad, gen1, mode='valid') % 2 + stream2 = np.convolve(dat_pad, gen2, mode='valid') % 2 + enc = [val for pair in zip(stream1, stream2) for val in pair] + return [enc[i] for i in range(len(enc)) if punct[i % 3]] + +# To create a generator matrix for a code, we encode each row +# of the identity matrix. Note that the CRC is not quite linear +# because of the check mask so we apply the lamda function to +# invert it. Given a 37 bit media reference we can encode by +# ref * spotify_generator + spotify_mask (mod 2) +_i37 = np.identity(37, dtype=bool) +crc_generator = [_i37[r].tolist() + + list(map(lambda x : 1-x, calc_spotify_crc(_i37[r].tolist()))) + for r in range(37)] +spotify_generator = 1*np.array([encode_cc(crc_generator[r]) for r in range(37)], dtype=bool) +del _i37 + +spotify_mask = 1*np.array(encode_cc(37*[0] + 8*[1]), dtype=bool) + +# The following matrix is used to "invert" the convolutional code. +# In particular, we choose a 45 vector basis for the columns of the +# generator matrix (by deleting those in positions equal to 2 mod 4) +# and then inverting the matrix. By selecting the corresponding 45 +# elements of the convolutionally encoded vector and multiplying +# on the right by this matrix, we get back to the unencoded data, +# assuming there are no errors. +# Note: numpy does not invert binary matrices, i.e. GF(2), so we +# hard code the following 3 row vectors to generate the matrix. +conv_gen = [[0,1,0,1,1,1,1,0,1,1,0,0,0,1]+31*[0], + [1,0,1,0,1,0,1,0,0,0,1,1,1] + 32*[0], + [0,0,1,0,1,1,1,1,1,1,0,0,1] + 32*[0] ] + +conv_generator_inv = 1*np.array([shift_right(conv_gen[(s-27) % 3],s) for s in range(27,72)], dtype=bool) + + +# Given an integer media reference, returns list of 20 barcode levels +def spotify_bar_code(ref): + bin37 = np.array([int_to_bin(ref, 37, 'l')], dtype=bool) + enc = (np.add(1*np.dot(bin37, spotify_generator), spotify_mask) % 2).flatten() + perm = [enc[7*i % 60] for i in range(60)] + return [gray_code[4*perm[i]+2*perm[i+1]+perm[i+2]] for i in range(0,len(perm),3)] + +# Equivalent function but using CRC and CC encoders. +def spotify_bar_code2(ref): + bin37 = int_to_bin(ref, 37, 'l') + enc_crc = bin37 + calc_spotify_crc(bin37) + enc_cc = encode_cc(enc_crc) + perm = [enc_cc[7*i % 60] for i in range(60)] + return [gray_code[4*perm[i]+2*perm[i+1]+perm[i+2]] for i in range(0,len(perm),3)] + +# Given 20 (clean) barcode levels, returns media reference +def spotify_bar_decode(levels): + level_bits = np.array([gray_code_inv[levels[i]] for i in range(20)], dtype=bool).flatten() + conv_bits = [level_bits[43*i % 60] for i in range(60)] + cols = [i for i in range(60) if i % 4 != 2] # columns to invert + conv_bits45 = np.array([conv_bits[c] for c in cols], dtype=bool) + bin45 = (1*np.dot(conv_bits45, conv_generator_inv) % 2).tolist() + if check_spotify_crc(bin45): + return bin_to_int(bin45, 37) + else: + print('Error in levels; Use real decoder!!!') + return -1 \ No newline at end of file diff --git a/final-loop/spotify-codes-part-2/src/get_heights.py b/final-loop/spotify-codes-part-2/src/get_heights.py new file mode 100644 index 0000000..38b8ea4 --- /dev/null +++ b/final-loop/spotify-codes-part-2/src/get_heights.py @@ -0,0 +1,48 @@ +import numpy as np +import matplotlib.pyplot as plt +from skimage import io +from skimage.filters import threshold_otsu, gaussian +from skimage.morphology import closing, square +from skimage.measure import label, regionprops +from skimage.color import rgb2gray +import matplotlib.patches as patches +from sklearn.cluster import KMeans +import warnings + +warnings.filterwarnings("ignore", category=FutureWarning, message=".*square.*deprecated.*") + + +def get_heights(image): + # image = io.imread(filename) + im = rgb2gray(image) + binary_im = im > threshold_otsu(im) + smooth_im = gaussian(binary_im.astype(float), sigma=1) + morph_im = closing(smooth_im > 0.5, square(3)) + labeled = label(morph_im) + bar_dims = [r.bbox for r in regionprops(labeled)] + bar_dims.sort(key=lambda x: x[1]) # left to right + + bars = bar_dims[1:] # skip logo + bar_heights_raw = [] + if(len(bars)!=23): + return [0] + for bar in bars: + top, left, bottom, right = bar + effective_height = bottom - top # use bounding box height directly + bar_heights_raw.append(effective_height) + + # Cluster measured heights to 8 clusters representing discrete bar levels + bar_heights_raw_np = np.array(bar_heights_raw).reshape(-1, 1) + + kmeans = KMeans(n_clusters=8, random_state=0).fit(bar_heights_raw_np) + cluster_centers = np.sort(kmeans.cluster_centers_.flatten()) + + # Assign each bar height to closest cluster center index (0 to 7) + predicted_levels = [] + for h in bar_heights_raw: + diffs = np.abs(cluster_centers - h) + closest_cluster = np.argmin(diffs) + predicted_levels.append(int(closest_cluster)) + + + return predicted_levels diff --git a/final-loop/spotify-codes-part-2/src/get_uri.py b/final-loop/spotify-codes-part-2/src/get_uri.py new file mode 100644 index 0000000..5937308 --- /dev/null +++ b/final-loop/spotify-codes-part-2/src/get_uri.py @@ -0,0 +1,56 @@ +from typing import Tuple +import requests + +HEADERS_LUT = { + "X-Client-Id": "58bd3c95768941ea9eb4350aaa033eb3", + "Accept-Encoding": "gzip, deflate", + "Connection": "close", + "App-Platform": "iOS", + "Accept": "*/*", + "User-Agent": "Spotify/8.5.68 iOS/13.4 (iPhone9,3)", + "Accept-Language": "en", + "Spotify-App-Version": "8.5.68", +} +MEDIA_REF_LUT_URL = "https://spclient.wg.spotify.com:443/scannable-id/id" + +def get_uri(media_ref: int, token: str): + """Query Spotify internal API to get the URI of the media reference.""" + header = { + **HEADERS_LUT, + "Authorization": f"Bearer {token}" + } + url = f'{MEDIA_REF_LUT_URL}/{media_ref}?format=json' + response = requests.get(url, headers=header) + response.raise_for_status() + return response.json() + +def get_info(uri: str, token: str) -> Tuple[dict, dict]: + """Query the Spotify API to get information about a URI.""" + info_headers = { + "Content-Type": "application/json", + "Accept": "application/json", + "Authorization": f"Bearer {token}" + } + split = uri.split(":") + content_type = split[-2] + "s" + id = split[-1] + response = requests.get(f"https://api.spotify.com/v1/{content_type}/{id}", headers=info_headers) + response.raise_for_status() + resp = response.json() + result = { + "name": resp["name"], + "type": split[-2], + "url": resp["external_urls"]["spotify"], + } + if "artists" in resp: + result['artists'] = [] + for a in resp['artists']: + result["artists"].append(a["name"]) + if "album" in resp: + result['album'] = resp['album']['name'] + + if "description" in resp: + result["description"] = resp['description'] + + return result, resp + diff --git a/final-loop/spotify-codes-part-2/src/permute.py b/final-loop/spotify-codes-part-2/src/permute.py new file mode 100644 index 0000000..e4b0f8c --- /dev/null +++ b/final-loop/spotify-codes-part-2/src/permute.py @@ -0,0 +1,11 @@ + + + +def permute(bits, step=7): + for i in range(len(bits)): + yield bits[(i * step) % len(bits)] + +if __name__ == "__main__": + bits = "111000111100101111101110111001011100110000100100011100110011" + print("".join(permute(bits))) + # 111100110001110101101000011110010110101100111111101000111000 diff --git a/final-loop/spotify-codes-part-2/src/pics/spotify_playlist_37i9dQZF1DXcBWIGoYBM5M.jpg b/final-loop/spotify-codes-part-2/src/pics/spotify_playlist_37i9dQZF1DXcBWIGoYBM5M.jpg new file mode 100644 index 0000000..64eb04b Binary files /dev/null and b/final-loop/spotify-codes-part-2/src/pics/spotify_playlist_37i9dQZF1DXcBWIGoYBM5M.jpg differ diff --git a/final-loop/spotify-codes-part-2/src/pics/spotify_track_6vQN2a9QSgWcm74KEZYfDL.jpg b/final-loop/spotify-codes-part-2/src/pics/spotify_track_6vQN2a9QSgWcm74KEZYfDL.jpg new file mode 100644 index 0000000..47ed030 Binary files /dev/null and b/final-loop/spotify-codes-part-2/src/pics/spotify_track_6vQN2a9QSgWcm74KEZYfDL.jpg differ diff --git a/final-loop/spotify-codes-part-2/src/simple_convolutional_code.py b/final-loop/spotify-codes-part-2/src/simple_convolutional_code.py new file mode 100644 index 0000000..6619784 --- /dev/null +++ b/final-loop/spotify-codes-part-2/src/simple_convolutional_code.py @@ -0,0 +1,35 @@ +from typing import List + + +def encode(bits: List[int], polynomial: List[int], tail_bite=False): + """Convolutionally encode the stream of bits using the generator polynomial. + If tail_bite == True, prepend the tail of the input. Otherwise use 0s to fill. + """ + if tail_bite: + tail = bits[-(len(polynomial) - 1):] + else: + tail = [0 for i in range(len(polynomial) - 1)] + full = tail + bits + polynomial.reverse() # Reverse since we're working the other direction + parity_bits = [] + for i in range(len(bits)): + parity = 0 + for j in range(len(polynomial)): + parity ^= full[i + j] * polynomial[j] + parity_bits.append(parity) + return parity_bits + + +if __name__ == "__main__": + g0 = [1, 0, 1, 1, 0, 1, 1] + g1 = [1, 1, 1, 1, 0, 0, 1] + bits = "010001001110111111110001110101101011011001100" + g0_expected = "100011100111110100110011110100000010001001011" + g1_expected = "110011100010110110110100101101011100110011011" + bits = [int(i) for i in bits] + + p0 = encode(bits, g0, True) + p1 = encode(bits, g1, True) + + print(g0_expected == "".join(str(i) for i in p0)) + print(g1_expected == "".join(str(i) for i in p1)) \ No newline at end of file diff --git a/final-loop/spotify-codes-part-2/src/step_by_step.py b/final-loop/spotify-codes-part-2/src/step_by_step.py new file mode 100644 index 0000000..a8f9559 --- /dev/null +++ b/final-loop/spotify-codes-part-2/src/step_by_step.py @@ -0,0 +1,15 @@ + + + + +media_ref = 57639171874 +binary = f"{bin(media_ref)[2:]:0>37}" +print(binary) +# pad with 3 bits to the right: +binary = f"{binary:0<39}" +print(binary) + +a = "100011100111110100110011110100000010001001011" +b = "110011100010110110110100101101011100110011011" +c = zip(a, b) +print("".join(i + j for i, j in c)) \ No newline at end of file diff --git a/mid_image.jpg b/mid_image.jpg deleted file mode 100644 index d31e881..0000000 Binary files a/mid_image.jpg and /dev/null differ diff --git a/rebirth.jpg b/rebirth.jpg new file mode 100644 index 0000000..cb42d9b Binary files /dev/null and b/rebirth.jpg differ diff --git a/rectangle_edges.jpg b/rectangle_edges.jpg deleted file mode 100644 index eb23c93..0000000 Binary files a/rectangle_edges.jpg and /dev/null differ diff --git a/spotify_template.png b/spotify_template.png deleted file mode 100644 index d775283..0000000 Binary files a/spotify_template.png and /dev/null differ diff --git a/stream_logo.py b/stream_logo.py deleted file mode 100644 index 7b0147f..0000000 --- a/stream_logo.py +++ /dev/null @@ -1,44 +0,0 @@ -import cv2 -from ultralytics import YOLO - -model = YOLO('yolov5s.pt') # Replace with your trained logo detection model path -cap = cv2.VideoCapture(0) # Webcam input - -if not cap.isOpened(): - print("Error: Could not open video stream.") - exit() - -while True: - ret, frame = cap.read() - if not ret: - break - - results = model(frame) - - for result in results: - boxes = result.boxes.xyxy.cpu().numpy() - scores = result.boxes.conf.cpu().numpy() - class_ids = result.boxes.cls.cpu().numpy() - - for box, score, cls_id in zip(boxes, scores, class_ids): - if score < 0.3: - continue - - x1, y1, x2, y2 = map(int, box) - label = model.names[int(cls_id)] - - # Draw bounding box and label - cv2.rectangle(frame, (x1, y1), (x2, y2), (0, 255, 0), 2) - cv2.putText(frame, f'{label} {score:.2f}', (x1, y1 - 10), - cv2.FONT_HERSHEY_SIMPLEX, 0.5, (0, 255, 0), 2) - - # Log detection to console - print(f"Detected: {label} | Confidence: {score:.2f} | Box: ({x1}, {y1}), ({x2}, {y2})") - - cv2.imshow('Logo Detection', frame) - - if cv2.waitKey(1) & 0xFF == 27: - break - -cap.release() -cv2.destroyAllWindows() diff --git a/yolov5su.pt b/yolov5su.pt deleted file mode 100644 index e6cba26..0000000 Binary files a/yolov5su.pt and /dev/null differ