├── .gitignore
├── README.md
├── images
├── dog.jpg
├── fgsm_formula.png
├── funny_cat.jpg
├── ifgsm_formula.png
├── iterative_fgsm_total.jpg
├── iterative_fgsm_total.png
├── step_1_to_9.jpg
├── streamlit_app.gif
└── subscribe.jpg
├── notebooks
├── end2end.ipynb
└── end2end_old.ipynb
├── poetry.lock
├── pyproject.toml
└── src
├── __init__.py
├── fgsm.py
├── imagenet_class_labels.py
├── model.py
├── streamlit_app.py
└── viz.py
/.gitignore:
--------------------------------------------------------------------------------
1 | .DS_Store
2 | .idea/
3 | .venv/
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 |
2 |
Breaking deep learning models with adversarial examples 😈
3 | Or maybe it's just that beautiful things are so easily broken by the world.
4 | -- Cassandra Clare, City of Fallen Angels
5 |
6 |
7 | 
8 |
9 | ## Table of Contents
10 |
11 | 1. [What is this repo about?](#what-is-this-repo-about)
12 | 2. [Quick setup](#quick-setup)
13 | 3. [Fast Gradient Sign method](#fast-gradient-sign-method)
14 | 4. [Adversarial example generator](#adversarial-example-generator)
15 | 5. [Let's connect!](#lets-connect)
16 |
17 |
18 | ## What is this repo about?
19 |
20 | PyTorch code and [streamlit app](https://share.streamlit.io/paulescu/adversarial-machine-learning/main/src/streamlit_app.py) that demonstrate how easy it is to break deep learning models in computer vision.
21 | More precisely, Inception V3.
22 |
23 | If you do not know what adversarial examples are go check my blog post.
24 |
25 | [📝 Adversarial examples to break deep learning models](http://datamachines.xyz/2021/07/05/adversarial-examples-to-break-deep-learning-models/)
26 |
27 | Also available in [Medium](https://towardsdatascience.com/adversarial-examples-to-break-deep-learning-models-e7f543833eae) and in [Hackernoon](https://hackernoon.com/adversarial-examples-in-machine-learning-explained)
28 |
29 | ## Quick setup
30 |
31 | Create a virtualenv with your preferred tool (`virtualenv`, `conda`, `poetry`)
32 | and activate it.
33 |
34 | Then install the code as a local package
35 | ```
36 | $ (venv) pip install .
37 | ```
38 |
39 |
40 | ## Fast Gradient Sign method
41 |
42 | We use the vanilla fast gradient sign method
43 |
44 | 
45 |
46 |
47 | And its iterative version.
48 |
49 | 
50 |
51 |
52 | In the code you can find the "magic" that transforms a nice puppy into a paper towel.
53 |
54 | 
55 |
56 | ## Adversarial example generator
57 |
58 | 👉 [Streamlit app to generate adversarial examples](https://share.streamlit.io/paulescu/adversarial-machine-learning/main/src/streamlit_app.py)
59 | 
60 |
61 | ## Let's connect
62 |
63 | If you want to learn more about real-world ML topics and become a better data scientist
64 |
65 | 👉 [Subscribe](http://datamachines.xyz/subscribe) to the datamachines newsletter.
66 |
67 | 👉🏽 Follow me on [Twitter](https://twitter.com/paulabartabajo_) and/or [LinkedIn](https://www.linkedin.com/in/pau-labarta-bajo-4432074b/)
68 |
--------------------------------------------------------------------------------
/images/dog.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Paulescu/adversarial-machine-learning/2e34528d356357a4c6abd9fde6d7356e684eee53/images/dog.jpg
--------------------------------------------------------------------------------
/images/fgsm_formula.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Paulescu/adversarial-machine-learning/2e34528d356357a4c6abd9fde6d7356e684eee53/images/fgsm_formula.png
--------------------------------------------------------------------------------
/images/funny_cat.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Paulescu/adversarial-machine-learning/2e34528d356357a4c6abd9fde6d7356e684eee53/images/funny_cat.jpg
--------------------------------------------------------------------------------
/images/ifgsm_formula.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Paulescu/adversarial-machine-learning/2e34528d356357a4c6abd9fde6d7356e684eee53/images/ifgsm_formula.png
--------------------------------------------------------------------------------
/images/iterative_fgsm_total.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Paulescu/adversarial-machine-learning/2e34528d356357a4c6abd9fde6d7356e684eee53/images/iterative_fgsm_total.jpg
--------------------------------------------------------------------------------
/images/iterative_fgsm_total.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Paulescu/adversarial-machine-learning/2e34528d356357a4c6abd9fde6d7356e684eee53/images/iterative_fgsm_total.png
--------------------------------------------------------------------------------
/images/step_1_to_9.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Paulescu/adversarial-machine-learning/2e34528d356357a4c6abd9fde6d7356e684eee53/images/step_1_to_9.jpg
--------------------------------------------------------------------------------
/images/streamlit_app.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Paulescu/adversarial-machine-learning/2e34528d356357a4c6abd9fde6d7356e684eee53/images/streamlit_app.gif
--------------------------------------------------------------------------------
/images/subscribe.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Paulescu/adversarial-machine-learning/2e34528d356357a4c6abd9fde6d7356e684eee53/images/subscribe.jpg
--------------------------------------------------------------------------------
/poetry.lock:
--------------------------------------------------------------------------------
1 | [[package]]
2 | name = "absl-py"
3 | version = "0.13.0"
4 | description = "Abseil Python Common Libraries, see https://github.com/abseil/abseil-py."
5 | category = "main"
6 | optional = false
7 | python-versions = "*"
8 |
9 | [package.dependencies]
10 | six = "*"
11 |
12 | [[package]]
13 | name = "altair"
14 | version = "4.2.0"
15 | description = "Altair: A declarative statistical visualization library for Python."
16 | category = "main"
17 | optional = false
18 | python-versions = ">=3.7"
19 |
20 | [package.dependencies]
21 | entrypoints = "*"
22 | jinja2 = "*"
23 | jsonschema = ">=3.0"
24 | numpy = "*"
25 | pandas = ">=0.18"
26 | toolz = "*"
27 |
28 | [package.extras]
29 | dev = ["black", "docutils", "ipython", "flake8", "pytest", "sphinx", "mistune (<2.0.0)", "m2r", "vega-datasets", "recommonmark"]
30 |
31 | [[package]]
32 | name = "appnope"
33 | version = "0.1.2"
34 | description = "Disable App Nap on macOS >= 10.9"
35 | category = "main"
36 | optional = false
37 | python-versions = "*"
38 |
39 | [[package]]
40 | name = "argon2-cffi"
41 | version = "20.1.0"
42 | description = "The secure Argon2 password hashing algorithm."
43 | category = "main"
44 | optional = false
45 | python-versions = "*"
46 |
47 | [package.dependencies]
48 | cffi = ">=1.0.0"
49 | six = "*"
50 |
51 | [package.extras]
52 | dev = ["coverage[toml] (>=5.0.2)", "hypothesis", "pytest", "sphinx", "wheel", "pre-commit"]
53 | docs = ["sphinx"]
54 | tests = ["coverage[toml] (>=5.0.2)", "hypothesis", "pytest"]
55 |
56 | [[package]]
57 | name = "astor"
58 | version = "0.8.1"
59 | description = "Read/rewrite/write Python ASTs"
60 | category = "main"
61 | optional = false
62 | python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,>=2.7"
63 |
64 | [[package]]
65 | name = "async-generator"
66 | version = "1.10"
67 | description = "Async generators and context managers for Python 3.5+"
68 | category = "main"
69 | optional = false
70 | python-versions = ">=3.5"
71 |
72 | [[package]]
73 | name = "atomicwrites"
74 | version = "1.4.0"
75 | description = "Atomic file writes."
76 | category = "dev"
77 | optional = false
78 | python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*"
79 |
80 | [[package]]
81 | name = "attrs"
82 | version = "21.2.0"
83 | description = "Classes Without Boilerplate"
84 | category = "main"
85 | optional = false
86 | python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*"
87 |
88 | [package.extras]
89 | dev = ["coverage[toml] (>=5.0.2)", "hypothesis", "pympler", "pytest (>=4.3.0)", "six", "mypy", "pytest-mypy-plugins", "zope.interface", "furo", "sphinx", "sphinx-notfound-page", "pre-commit"]
90 | docs = ["furo", "sphinx", "zope.interface", "sphinx-notfound-page"]
91 | tests = ["coverage[toml] (>=5.0.2)", "hypothesis", "pympler", "pytest (>=4.3.0)", "six", "mypy", "pytest-mypy-plugins", "zope.interface"]
92 | tests_no_zope = ["coverage[toml] (>=5.0.2)", "hypothesis", "pympler", "pytest (>=4.3.0)", "six", "mypy", "pytest-mypy-plugins"]
93 |
94 | [[package]]
95 | name = "backcall"
96 | version = "0.2.0"
97 | description = "Specifications for callback functions passed in to an API"
98 | category = "main"
99 | optional = false
100 | python-versions = "*"
101 |
102 | [[package]]
103 | name = "backports.zoneinfo"
104 | version = "0.2.1"
105 | description = "Backport of the standard library zoneinfo module"
106 | category = "main"
107 | optional = false
108 | python-versions = ">=3.6"
109 |
110 | [package.extras]
111 | tzdata = ["tzdata"]
112 |
113 | [[package]]
114 | name = "base58"
115 | version = "2.1.1"
116 | description = "Base58 and Base58Check implementation."
117 | category = "main"
118 | optional = false
119 | python-versions = ">=3.5"
120 |
121 | [package.extras]
122 | tests = ["mypy", "PyHamcrest (>=2.0.2)", "pytest (>=4.6)", "pytest-benchmark", "pytest-cov", "pytest-flake8"]
123 |
124 | [[package]]
125 | name = "bleach"
126 | version = "3.3.0"
127 | description = "An easy safelist-based HTML-sanitizing tool."
128 | category = "main"
129 | optional = false
130 | python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*"
131 |
132 | [package.dependencies]
133 | packaging = "*"
134 | six = ">=1.9.0"
135 | webencodings = "*"
136 |
137 | [[package]]
138 | name = "blinker"
139 | version = "1.4"
140 | description = "Fast, simple object-to-object and broadcast signaling"
141 | category = "main"
142 | optional = false
143 | python-versions = "*"
144 |
145 | [[package]]
146 | name = "cachetools"
147 | version = "5.0.0"
148 | description = "Extensible memoizing collections and decorators"
149 | category = "main"
150 | optional = false
151 | python-versions = "~=3.7"
152 |
153 | [[package]]
154 | name = "certifi"
155 | version = "2021.5.30"
156 | description = "Python package for providing Mozilla's CA Bundle."
157 | category = "main"
158 | optional = false
159 | python-versions = "*"
160 |
161 | [[package]]
162 | name = "cffi"
163 | version = "1.14.5"
164 | description = "Foreign Function Interface for Python calling C code."
165 | category = "main"
166 | optional = false
167 | python-versions = "*"
168 |
169 | [package.dependencies]
170 | pycparser = "*"
171 |
172 | [[package]]
173 | name = "chardet"
174 | version = "4.0.0"
175 | description = "Universal encoding detector for Python 2 and 3"
176 | category = "main"
177 | optional = false
178 | python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*"
179 |
180 | [[package]]
181 | name = "cleverhans"
182 | version = "3.1.0"
183 | description = ""
184 | category = "main"
185 | optional = false
186 | python-versions = "*"
187 |
188 | [package.dependencies]
189 | joblib = "*"
190 | matplotlib = "*"
191 | mnist = ">=0.2,<1.0"
192 | nose = "*"
193 | numpy = "*"
194 | pycodestyle = "*"
195 | scipy = "*"
196 | tensorflow-probability = "*"
197 |
198 | [package.extras]
199 | pytorch = ["torch (>=1.1.0)", "torchvision (==0.3.0)"]
200 | tf = ["tensorflow (>=1.0.0)"]
201 | tf_gpu = ["tensorflow-gpu (>=1.0.0)"]
202 |
203 | [[package]]
204 | name = "click"
205 | version = "8.0.4"
206 | description = "Composable command line interface toolkit"
207 | category = "main"
208 | optional = false
209 | python-versions = ">=3.6"
210 |
211 | [package.dependencies]
212 | colorama = {version = "*", markers = "platform_system == \"Windows\""}
213 | importlib-metadata = {version = "*", markers = "python_version < \"3.8\""}
214 |
215 | [[package]]
216 | name = "cloudpickle"
217 | version = "1.6.0"
218 | description = "Extended pickling support for Python objects"
219 | category = "main"
220 | optional = false
221 | python-versions = ">=3.5"
222 |
223 | [[package]]
224 | name = "colorama"
225 | version = "0.4.4"
226 | description = "Cross-platform colored terminal text."
227 | category = "main"
228 | optional = false
229 | python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*"
230 |
231 | [[package]]
232 | name = "cycler"
233 | version = "0.10.0"
234 | description = "Composable style cycles"
235 | category = "main"
236 | optional = false
237 | python-versions = "*"
238 |
239 | [package.dependencies]
240 | six = "*"
241 |
242 | [[package]]
243 | name = "decorator"
244 | version = "5.0.9"
245 | description = "Decorators for Humans"
246 | category = "main"
247 | optional = false
248 | python-versions = ">=3.5"
249 |
250 | [[package]]
251 | name = "defusedxml"
252 | version = "0.7.1"
253 | description = "XML bomb protection for Python stdlib modules"
254 | category = "main"
255 | optional = false
256 | python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*"
257 |
258 | [[package]]
259 | name = "dm-tree"
260 | version = "0.1.6"
261 | description = "Tree is a library for working with nested data structures."
262 | category = "main"
263 | optional = false
264 | python-versions = "*"
265 |
266 | [package.dependencies]
267 | six = ">=1.12.0"
268 |
269 | [[package]]
270 | name = "easydict"
271 | version = "1.9"
272 | description = "Access dict values as attributes (works recursively)."
273 | category = "main"
274 | optional = false
275 | python-versions = "*"
276 |
277 | [[package]]
278 | name = "entrypoints"
279 | version = "0.3"
280 | description = "Discover and load entry points from installed packages."
281 | category = "main"
282 | optional = false
283 | python-versions = ">=2.7"
284 |
285 | [[package]]
286 | name = "gast"
287 | version = "0.4.0"
288 | description = "Python AST that abstracts the underlying Python version"
289 | category = "main"
290 | optional = false
291 | python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*"
292 |
293 | [[package]]
294 | name = "gitdb"
295 | version = "4.0.9"
296 | description = "Git Object Database"
297 | category = "main"
298 | optional = false
299 | python-versions = ">=3.6"
300 |
301 | [package.dependencies]
302 | smmap = ">=3.0.1,<6"
303 |
304 | [[package]]
305 | name = "gitpython"
306 | version = "3.1.27"
307 | description = "GitPython is a python library used to interact with Git repositories"
308 | category = "main"
309 | optional = false
310 | python-versions = ">=3.7"
311 |
312 | [package.dependencies]
313 | gitdb = ">=4.0.1,<5"
314 | typing-extensions = {version = ">=3.7.4.3", markers = "python_version < \"3.8\""}
315 |
316 | [[package]]
317 | name = "idna"
318 | version = "2.10"
319 | description = "Internationalized Domain Names in Applications (IDNA)"
320 | category = "main"
321 | optional = false
322 | python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*"
323 |
324 | [[package]]
325 | name = "importlib-metadata"
326 | version = "4.5.0"
327 | description = "Read metadata from Python packages"
328 | category = "main"
329 | optional = false
330 | python-versions = ">=3.6"
331 |
332 | [package.dependencies]
333 | typing-extensions = {version = ">=3.6.4", markers = "python_version < \"3.8\""}
334 | zipp = ">=0.5"
335 |
336 | [package.extras]
337 | docs = ["sphinx", "jaraco.packaging (>=8.2)", "rst.linker (>=1.9)"]
338 | testing = ["pytest (>=4.6)", "pytest-checkdocs (>=2.4)", "pytest-flake8", "pytest-cov", "pytest-enabler (>=1.0.1)", "packaging", "pep517", "pyfakefs", "flufl.flake8", "pytest-black (>=0.3.7)", "pytest-mypy", "importlib-resources (>=1.3)"]
339 |
340 | [[package]]
341 | name = "ipykernel"
342 | version = "5.5.5"
343 | description = "IPython Kernel for Jupyter"
344 | category = "main"
345 | optional = false
346 | python-versions = ">=3.5"
347 |
348 | [package.dependencies]
349 | appnope = {version = "*", markers = "platform_system == \"Darwin\""}
350 | ipython = ">=5.0.0"
351 | jupyter-client = "*"
352 | tornado = ">=4.2"
353 | traitlets = ">=4.1.0"
354 |
355 | [package.extras]
356 | test = ["pytest (!=5.3.4)", "pytest-cov", "flaky", "nose", "jedi (<=0.17.2)"]
357 |
358 | [[package]]
359 | name = "ipython"
360 | version = "7.25.0"
361 | description = "IPython: Productive Interactive Computing"
362 | category = "main"
363 | optional = false
364 | python-versions = ">=3.7"
365 |
366 | [package.dependencies]
367 | appnope = {version = "*", markers = "sys_platform == \"darwin\""}
368 | backcall = "*"
369 | colorama = {version = "*", markers = "sys_platform == \"win32\""}
370 | decorator = "*"
371 | jedi = ">=0.16"
372 | matplotlib-inline = "*"
373 | pexpect = {version = ">4.3", markers = "sys_platform != \"win32\""}
374 | pickleshare = "*"
375 | prompt-toolkit = ">=2.0.0,<3.0.0 || >3.0.0,<3.0.1 || >3.0.1,<3.1.0"
376 | pygments = "*"
377 | traitlets = ">=4.2"
378 |
379 | [package.extras]
380 | all = ["Sphinx (>=1.3)", "ipykernel", "ipyparallel", "ipywidgets", "nbconvert", "nbformat", "nose (>=0.10.1)", "notebook", "numpy (>=1.17)", "pygments", "qtconsole", "requests", "testpath"]
381 | doc = ["Sphinx (>=1.3)"]
382 | kernel = ["ipykernel"]
383 | nbconvert = ["nbconvert"]
384 | nbformat = ["nbformat"]
385 | notebook = ["notebook", "ipywidgets"]
386 | parallel = ["ipyparallel"]
387 | qtconsole = ["qtconsole"]
388 | test = ["nose (>=0.10.1)", "requests", "testpath", "pygments", "nbformat", "ipykernel", "numpy (>=1.17)"]
389 |
390 | [[package]]
391 | name = "ipython-genutils"
392 | version = "0.2.0"
393 | description = "Vestigial utilities from IPython"
394 | category = "main"
395 | optional = false
396 | python-versions = "*"
397 |
398 | [[package]]
399 | name = "ipywidgets"
400 | version = "7.6.3"
401 | description = "IPython HTML widgets for Jupyter"
402 | category = "main"
403 | optional = false
404 | python-versions = "*"
405 |
406 | [package.dependencies]
407 | ipykernel = ">=4.5.1"
408 | ipython = {version = ">=4.0.0", markers = "python_version >= \"3.3\""}
409 | jupyterlab-widgets = {version = ">=1.0.0", markers = "python_version >= \"3.6\""}
410 | nbformat = ">=4.2.0"
411 | traitlets = ">=4.3.1"
412 | widgetsnbextension = ">=3.5.0,<3.6.0"
413 |
414 | [package.extras]
415 | test = ["pytest (>=3.6.0)", "pytest-cov", "mock"]
416 |
417 | [[package]]
418 | name = "jedi"
419 | version = "0.18.0"
420 | description = "An autocompletion tool for Python that can be used for text editors."
421 | category = "main"
422 | optional = false
423 | python-versions = ">=3.6"
424 |
425 | [package.dependencies]
426 | parso = ">=0.8.0,<0.9.0"
427 |
428 | [package.extras]
429 | qa = ["flake8 (==3.8.3)", "mypy (==0.782)"]
430 | testing = ["Django (<3.1)", "colorama", "docopt", "pytest (<6.0.0)"]
431 |
432 | [[package]]
433 | name = "jinja2"
434 | version = "3.0.1"
435 | description = "A very fast and expressive template engine."
436 | category = "main"
437 | optional = false
438 | python-versions = ">=3.6"
439 |
440 | [package.dependencies]
441 | MarkupSafe = ">=2.0"
442 |
443 | [package.extras]
444 | i18n = ["Babel (>=2.7)"]
445 |
446 | [[package]]
447 | name = "joblib"
448 | version = "1.0.1"
449 | description = "Lightweight pipelining with Python functions"
450 | category = "main"
451 | optional = false
452 | python-versions = ">=3.6"
453 |
454 | [[package]]
455 | name = "jsonschema"
456 | version = "3.2.0"
457 | description = "An implementation of JSON Schema validation for Python"
458 | category = "main"
459 | optional = false
460 | python-versions = "*"
461 |
462 | [package.dependencies]
463 | attrs = ">=17.4.0"
464 | importlib-metadata = {version = "*", markers = "python_version < \"3.8\""}
465 | pyrsistent = ">=0.14.0"
466 | six = ">=1.11.0"
467 |
468 | [package.extras]
469 | format = ["idna", "jsonpointer (>1.13)", "rfc3987", "strict-rfc3339", "webcolors"]
470 | format_nongpl = ["idna", "jsonpointer (>1.13)", "webcolors", "rfc3986-validator (>0.1.0)", "rfc3339-validator"]
471 |
472 | [[package]]
473 | name = "jupyter"
474 | version = "1.0.0"
475 | description = "Jupyter metapackage. Install all the Jupyter components in one go."
476 | category = "main"
477 | optional = false
478 | python-versions = "*"
479 |
480 | [package.dependencies]
481 | ipykernel = "*"
482 | ipywidgets = "*"
483 | jupyter-console = "*"
484 | nbconvert = "*"
485 | notebook = "*"
486 | qtconsole = "*"
487 |
488 | [[package]]
489 | name = "jupyter-client"
490 | version = "6.2.0"
491 | description = "Jupyter protocol implementation and client libraries"
492 | category = "main"
493 | optional = false
494 | python-versions = ">=3.6.1"
495 |
496 | [package.dependencies]
497 | jupyter-core = ">=4.6.0"
498 | nest-asyncio = ">=1.5"
499 | python-dateutil = ">=2.1"
500 | pyzmq = ">=13"
501 | tornado = ">=4.1"
502 | traitlets = "*"
503 |
504 | [package.extras]
505 | doc = ["sphinx (>=1.3.6)", "sphinx-rtd-theme", "sphinxcontrib-github-alt"]
506 | test = ["async-generator", "ipykernel", "ipython", "mock", "pytest-asyncio", "pytest-timeout", "pytest", "mypy", "pre-commit", "jedi (<0.18)"]
507 |
508 | [[package]]
509 | name = "jupyter-console"
510 | version = "6.4.0"
511 | description = "Jupyter terminal console"
512 | category = "main"
513 | optional = false
514 | python-versions = ">=3.6"
515 |
516 | [package.dependencies]
517 | ipykernel = "*"
518 | ipython = "*"
519 | jupyter-client = "*"
520 | prompt-toolkit = ">=2.0.0,<3.0.0 || >3.0.0,<3.0.1 || >3.0.1,<3.1.0"
521 | pygments = "*"
522 |
523 | [package.extras]
524 | test = ["pexpect"]
525 |
526 | [[package]]
527 | name = "jupyter-core"
528 | version = "4.7.1"
529 | description = "Jupyter core package. A base package on which Jupyter projects rely."
530 | category = "main"
531 | optional = false
532 | python-versions = ">=3.6"
533 |
534 | [package.dependencies]
535 | pywin32 = {version = ">=1.0", markers = "sys_platform == \"win32\""}
536 | traitlets = "*"
537 |
538 | [[package]]
539 | name = "jupyterlab-pygments"
540 | version = "0.1.2"
541 | description = "Pygments theme using JupyterLab CSS variables"
542 | category = "main"
543 | optional = false
544 | python-versions = "*"
545 |
546 | [package.dependencies]
547 | pygments = ">=2.4.1,<3"
548 |
549 | [[package]]
550 | name = "jupyterlab-widgets"
551 | version = "1.0.0"
552 | description = "A JupyterLab extension."
553 | category = "main"
554 | optional = false
555 | python-versions = ">=3.6"
556 |
557 | [[package]]
558 | name = "kiwisolver"
559 | version = "1.3.1"
560 | description = "A fast implementation of the Cassowary constraint solver"
561 | category = "main"
562 | optional = false
563 | python-versions = ">=3.6"
564 |
565 | [[package]]
566 | name = "markupsafe"
567 | version = "2.0.1"
568 | description = "Safely add untrusted strings to HTML/XML markup."
569 | category = "main"
570 | optional = false
571 | python-versions = ">=3.6"
572 |
573 | [[package]]
574 | name = "matplotlib"
575 | version = "3.4.2"
576 | description = "Python plotting package"
577 | category = "main"
578 | optional = false
579 | python-versions = ">=3.7"
580 |
581 | [package.dependencies]
582 | cycler = ">=0.10"
583 | kiwisolver = ">=1.0.1"
584 | numpy = ">=1.16"
585 | pillow = ">=6.2.0"
586 | pyparsing = ">=2.2.1"
587 | python-dateutil = ">=2.7"
588 |
589 | [[package]]
590 | name = "matplotlib-inline"
591 | version = "0.1.2"
592 | description = "Inline Matplotlib backend for Jupyter"
593 | category = "main"
594 | optional = false
595 | python-versions = ">=3.5"
596 |
597 | [package.dependencies]
598 | traitlets = "*"
599 |
600 | [[package]]
601 | name = "mistune"
602 | version = "0.8.4"
603 | description = "The fastest markdown parser in pure Python"
604 | category = "main"
605 | optional = false
606 | python-versions = "*"
607 |
608 | [[package]]
609 | name = "mnist"
610 | version = "0.2.2"
611 | description = "Python utilities to download and parse the MNIST dataset"
612 | category = "main"
613 | optional = false
614 | python-versions = "*"
615 |
616 | [package.dependencies]
617 | numpy = "*"
618 |
619 | [[package]]
620 | name = "more-itertools"
621 | version = "8.8.0"
622 | description = "More routines for operating on iterables, beyond itertools"
623 | category = "dev"
624 | optional = false
625 | python-versions = ">=3.5"
626 |
627 | [[package]]
628 | name = "nbclient"
629 | version = "0.5.3"
630 | description = "A client library for executing notebooks. Formerly nbconvert's ExecutePreprocessor."
631 | category = "main"
632 | optional = false
633 | python-versions = ">=3.6.1"
634 |
635 | [package.dependencies]
636 | async-generator = "*"
637 | jupyter-client = ">=6.1.5"
638 | nbformat = ">=5.0"
639 | nest-asyncio = "*"
640 | traitlets = ">=4.2"
641 |
642 | [package.extras]
643 | dev = ["codecov", "coverage", "ipython", "ipykernel", "ipywidgets", "pytest (>=4.1)", "pytest-cov (>=2.6.1)", "check-manifest", "flake8", "mypy", "tox", "bumpversion", "xmltodict", "pip (>=18.1)", "wheel (>=0.31.0)", "setuptools (>=38.6.0)", "twine (>=1.11.0)", "black"]
644 | sphinx = ["Sphinx (>=1.7)", "sphinx-book-theme", "mock", "moto", "myst-parser"]
645 | test = ["codecov", "coverage", "ipython", "ipykernel", "ipywidgets", "pytest (>=4.1)", "pytest-cov (>=2.6.1)", "check-manifest", "flake8", "mypy", "tox", "bumpversion", "xmltodict", "pip (>=18.1)", "wheel (>=0.31.0)", "setuptools (>=38.6.0)", "twine (>=1.11.0)", "black"]
646 |
647 | [[package]]
648 | name = "nbconvert"
649 | version = "6.1.0"
650 | description = "Converting Jupyter Notebooks"
651 | category = "main"
652 | optional = false
653 | python-versions = ">=3.7"
654 |
655 | [package.dependencies]
656 | bleach = "*"
657 | defusedxml = "*"
658 | entrypoints = ">=0.2.2"
659 | jinja2 = ">=2.4"
660 | jupyter-core = "*"
661 | jupyterlab-pygments = "*"
662 | mistune = ">=0.8.1,<2"
663 | nbclient = ">=0.5.0,<0.6.0"
664 | nbformat = ">=4.4"
665 | pandocfilters = ">=1.4.1"
666 | pygments = ">=2.4.1"
667 | testpath = "*"
668 | traitlets = ">=5.0"
669 |
670 | [package.extras]
671 | all = ["pytest", "pytest-cov", "pytest-dependency", "ipykernel", "ipywidgets (>=7)", "pyppeteer (==0.2.2)", "tornado (>=4.0)", "sphinx (>=1.5.1)", "sphinx-rtd-theme", "nbsphinx (>=0.2.12)", "ipython"]
672 | docs = ["sphinx (>=1.5.1)", "sphinx-rtd-theme", "nbsphinx (>=0.2.12)", "ipython"]
673 | serve = ["tornado (>=4.0)"]
674 | test = ["pytest", "pytest-cov", "pytest-dependency", "ipykernel", "ipywidgets (>=7)", "pyppeteer (==0.2.2)"]
675 | webpdf = ["pyppeteer (==0.2.2)"]
676 |
677 | [[package]]
678 | name = "nbformat"
679 | version = "5.1.3"
680 | description = "The Jupyter Notebook format"
681 | category = "main"
682 | optional = false
683 | python-versions = ">=3.5"
684 |
685 | [package.dependencies]
686 | ipython-genutils = "*"
687 | jsonschema = ">=2.4,<2.5.0 || >2.5.0"
688 | jupyter-core = "*"
689 | traitlets = ">=4.1"
690 |
691 | [package.extras]
692 | fast = ["fastjsonschema"]
693 | test = ["check-manifest", "fastjsonschema", "testpath", "pytest", "pytest-cov"]
694 |
695 | [[package]]
696 | name = "nest-asyncio"
697 | version = "1.5.1"
698 | description = "Patch asyncio to allow nested event loops"
699 | category = "main"
700 | optional = false
701 | python-versions = ">=3.5"
702 |
703 | [[package]]
704 | name = "nose"
705 | version = "1.3.7"
706 | description = "nose extends unittest to make testing easier"
707 | category = "main"
708 | optional = false
709 | python-versions = "*"
710 |
711 | [[package]]
712 | name = "notebook"
713 | version = "6.4.0"
714 | description = "A web-based notebook environment for interactive computing"
715 | category = "main"
716 | optional = false
717 | python-versions = ">=3.6"
718 |
719 | [package.dependencies]
720 | argon2-cffi = "*"
721 | ipykernel = "*"
722 | ipython-genutils = "*"
723 | jinja2 = "*"
724 | jupyter-client = ">=5.3.4"
725 | jupyter-core = ">=4.6.1"
726 | nbconvert = "*"
727 | nbformat = "*"
728 | prometheus-client = "*"
729 | pyzmq = ">=17"
730 | Send2Trash = ">=1.5.0"
731 | terminado = ">=0.8.3"
732 | tornado = ">=6.1"
733 | traitlets = ">=4.2.1"
734 |
735 | [package.extras]
736 | docs = ["sphinx", "nbsphinx", "sphinxcontrib-github-alt", "sphinx-rtd-theme", "myst-parser"]
737 | json-logging = ["json-logging"]
738 | test = ["pytest", "coverage", "requests", "nbval", "selenium", "pytest-cov", "requests-unixsocket"]
739 |
740 | [[package]]
741 | name = "numpy"
742 | version = "1.21.0"
743 | description = "NumPy is the fundamental package for array computing with Python."
744 | category = "main"
745 | optional = false
746 | python-versions = ">=3.7"
747 |
748 | [[package]]
749 | name = "packaging"
750 | version = "20.9"
751 | description = "Core utilities for Python packages"
752 | category = "main"
753 | optional = false
754 | python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*"
755 |
756 | [package.dependencies]
757 | pyparsing = ">=2.0.2"
758 |
759 | [[package]]
760 | name = "pandas"
761 | version = "1.1.5"
762 | description = "Powerful data structures for data analysis, time series, and statistics"
763 | category = "main"
764 | optional = false
765 | python-versions = ">=3.6.1"
766 |
767 | [package.dependencies]
768 | numpy = ">=1.15.4"
769 | python-dateutil = ">=2.7.3"
770 | pytz = ">=2017.2"
771 |
772 | [package.extras]
773 | test = ["pytest (>=4.0.2)", "pytest-xdist", "hypothesis (>=3.58)"]
774 |
775 | [[package]]
776 | name = "pandocfilters"
777 | version = "1.4.3"
778 | description = "Utilities for writing pandoc filters in python"
779 | category = "main"
780 | optional = false
781 | python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*"
782 |
783 | [[package]]
784 | name = "parso"
785 | version = "0.8.2"
786 | description = "A Python Parser"
787 | category = "main"
788 | optional = false
789 | python-versions = ">=3.6"
790 |
791 | [package.extras]
792 | qa = ["flake8 (==3.8.3)", "mypy (==0.782)"]
793 | testing = ["docopt", "pytest (<6.0.0)"]
794 |
795 | [[package]]
796 | name = "pexpect"
797 | version = "4.8.0"
798 | description = "Pexpect allows easy control of interactive console applications."
799 | category = "main"
800 | optional = false
801 | python-versions = "*"
802 |
803 | [package.dependencies]
804 | ptyprocess = ">=0.5"
805 |
806 | [[package]]
807 | name = "pickleshare"
808 | version = "0.7.5"
809 | description = "Tiny 'shelve'-like database with concurrency support"
810 | category = "main"
811 | optional = false
812 | python-versions = "*"
813 |
814 | [[package]]
815 | name = "pillow"
816 | version = "8.2.0"
817 | description = "Python Imaging Library (Fork)"
818 | category = "main"
819 | optional = false
820 | python-versions = ">=3.6"
821 |
822 | [[package]]
823 | name = "pluggy"
824 | version = "0.13.1"
825 | description = "plugin and hook calling mechanisms for python"
826 | category = "dev"
827 | optional = false
828 | python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*"
829 |
830 | [package.dependencies]
831 | importlib-metadata = {version = ">=0.12", markers = "python_version < \"3.8\""}
832 |
833 | [package.extras]
834 | dev = ["pre-commit", "tox"]
835 |
836 | [[package]]
837 | name = "prometheus-client"
838 | version = "0.11.0"
839 | description = "Python client for the Prometheus monitoring system."
840 | category = "main"
841 | optional = false
842 | python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*"
843 |
844 | [package.extras]
845 | twisted = ["twisted"]
846 |
847 | [[package]]
848 | name = "prompt-toolkit"
849 | version = "3.0.19"
850 | description = "Library for building powerful interactive command lines in Python"
851 | category = "main"
852 | optional = false
853 | python-versions = ">=3.6.1"
854 |
855 | [package.dependencies]
856 | wcwidth = "*"
857 |
858 | [[package]]
859 | name = "protobuf"
860 | version = "3.19.4"
861 | description = "Protocol Buffers"
862 | category = "main"
863 | optional = false
864 | python-versions = ">=3.5"
865 |
866 | [[package]]
867 | name = "ptyprocess"
868 | version = "0.7.0"
869 | description = "Run a subprocess in a pseudo terminal"
870 | category = "main"
871 | optional = false
872 | python-versions = "*"
873 |
874 | [[package]]
875 | name = "py"
876 | version = "1.10.0"
877 | description = "library with cross-python path, ini-parsing, io, code, log facilities"
878 | category = "main"
879 | optional = false
880 | python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*"
881 |
882 | [[package]]
883 | name = "pyarrow"
884 | version = "7.0.0"
885 | description = "Python library for Apache Arrow"
886 | category = "main"
887 | optional = false
888 | python-versions = ">=3.7"
889 |
890 | [package.dependencies]
891 | numpy = ">=1.16.6"
892 |
893 | [[package]]
894 | name = "pycodestyle"
895 | version = "2.7.0"
896 | description = "Python style guide checker"
897 | category = "main"
898 | optional = false
899 | python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*"
900 |
901 | [[package]]
902 | name = "pycparser"
903 | version = "2.20"
904 | description = "C parser in Python"
905 | category = "main"
906 | optional = false
907 | python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*"
908 |
909 | [[package]]
910 | name = "pydeck"
911 | version = "0.7.1"
912 | description = "Widget for deck.gl maps"
913 | category = "main"
914 | optional = false
915 | python-versions = ">=3.7"
916 |
917 | [package.dependencies]
918 | ipykernel = {version = ">=5.1.2", markers = "python_version >= \"3.4\""}
919 | ipywidgets = ">=7.0.0"
920 | jinja2 = ">=2.10.1"
921 | numpy = ">=1.16.4"
922 | traitlets = ">=4.3.2"
923 |
924 | [package.extras]
925 | testing = ["pytest"]
926 |
927 | [[package]]
928 | name = "pygments"
929 | version = "2.9.0"
930 | description = "Pygments is a syntax highlighting package written in Python."
931 | category = "main"
932 | optional = false
933 | python-versions = ">=3.5"
934 |
935 | [[package]]
936 | name = "pympler"
937 | version = "1.0.1"
938 | description = "A development tool to measure, monitor and analyze the memory behavior of Python objects."
939 | category = "main"
940 | optional = false
941 | python-versions = ">=3.6"
942 |
943 | [[package]]
944 | name = "pyparsing"
945 | version = "2.4.7"
946 | description = "Python parsing module"
947 | category = "main"
948 | optional = false
949 | python-versions = ">=2.6, !=3.0.*, !=3.1.*, !=3.2.*"
950 |
951 | [[package]]
952 | name = "pyrsistent"
953 | version = "0.17.3"
954 | description = "Persistent/Functional/Immutable data structures"
955 | category = "main"
956 | optional = false
957 | python-versions = ">=3.5"
958 |
959 | [[package]]
960 | name = "pytest"
961 | version = "5.4.3"
962 | description = "pytest: simple powerful testing with Python"
963 | category = "dev"
964 | optional = false
965 | python-versions = ">=3.5"
966 |
967 | [package.dependencies]
968 | atomicwrites = {version = ">=1.0", markers = "sys_platform == \"win32\""}
969 | attrs = ">=17.4.0"
970 | colorama = {version = "*", markers = "sys_platform == \"win32\""}
971 | importlib-metadata = {version = ">=0.12", markers = "python_version < \"3.8\""}
972 | more-itertools = ">=4.0.0"
973 | packaging = "*"
974 | pluggy = ">=0.12,<1.0"
975 | py = ">=1.5.0"
976 | wcwidth = "*"
977 |
978 | [package.extras]
979 | checkqa-mypy = ["mypy (==v0.761)"]
980 | testing = ["argcomplete", "hypothesis (>=3.56)", "mock", "nose", "requests", "xmlschema"]
981 |
982 | [[package]]
983 | name = "python-dateutil"
984 | version = "2.8.1"
985 | description = "Extensions to the standard Python datetime module"
986 | category = "main"
987 | optional = false
988 | python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,>=2.7"
989 |
990 | [package.dependencies]
991 | six = ">=1.5"
992 |
993 | [[package]]
994 | name = "pytz"
995 | version = "2021.3"
996 | description = "World timezone definitions, modern and historical"
997 | category = "main"
998 | optional = false
999 | python-versions = "*"
1000 |
1001 | [[package]]
1002 | name = "pytz-deprecation-shim"
1003 | version = "0.1.0.post0"
1004 | description = "Shims to make deprecation of pytz easier"
1005 | category = "main"
1006 | optional = false
1007 | python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,>=2.7"
1008 |
1009 | [package.dependencies]
1010 | "backports.zoneinfo" = {version = "*", markers = "python_version >= \"3.6\" and python_version < \"3.9\""}
1011 | tzdata = {version = "*", markers = "python_version >= \"3.6\""}
1012 |
1013 | [[package]]
1014 | name = "pywin32"
1015 | version = "301"
1016 | description = "Python for Window Extensions"
1017 | category = "main"
1018 | optional = false
1019 | python-versions = "*"
1020 |
1021 | [[package]]
1022 | name = "pywinpty"
1023 | version = "1.1.3"
1024 | description = "Pseudo terminal support for Windows from Python."
1025 | category = "main"
1026 | optional = false
1027 | python-versions = ">=3.6"
1028 |
1029 | [[package]]
1030 | name = "pyzmq"
1031 | version = "22.1.0"
1032 | description = "Python bindings for 0MQ"
1033 | category = "main"
1034 | optional = false
1035 | python-versions = ">=3.6"
1036 |
1037 | [package.dependencies]
1038 | cffi = {version = "*", markers = "implementation_name == \"pypy\""}
1039 | py = {version = "*", markers = "implementation_name == \"pypy\""}
1040 |
1041 | [[package]]
1042 | name = "qtconsole"
1043 | version = "5.1.0"
1044 | description = "Jupyter Qt console"
1045 | category = "main"
1046 | optional = false
1047 | python-versions = ">= 3.6"
1048 |
1049 | [package.dependencies]
1050 | ipykernel = ">=4.1"
1051 | ipython-genutils = "*"
1052 | jupyter-client = ">=4.1"
1053 | jupyter-core = "*"
1054 | pygments = "*"
1055 | pyzmq = ">=17.1"
1056 | qtpy = "*"
1057 | traitlets = "*"
1058 |
1059 | [package.extras]
1060 | doc = ["Sphinx (>=1.3)"]
1061 | test = ["flaky", "pytest", "pytest-qt"]
1062 |
1063 | [[package]]
1064 | name = "qtpy"
1065 | version = "1.9.0"
1066 | description = "Provides an abstraction layer on top of the various Qt bindings (PyQt5, PyQt4 and PySide) and additional custom QWidgets."
1067 | category = "main"
1068 | optional = false
1069 | python-versions = "*"
1070 |
1071 | [[package]]
1072 | name = "requests"
1073 | version = "2.25.1"
1074 | description = "Python HTTP for Humans."
1075 | category = "main"
1076 | optional = false
1077 | python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*"
1078 |
1079 | [package.dependencies]
1080 | certifi = ">=2017.4.17"
1081 | chardet = ">=3.0.2,<5"
1082 | idna = ">=2.5,<3"
1083 | urllib3 = ">=1.21.1,<1.27"
1084 |
1085 | [package.extras]
1086 | security = ["pyOpenSSL (>=0.14)", "cryptography (>=1.3.4)"]
1087 | socks = ["PySocks (>=1.5.6,!=1.5.7)", "win-inet-pton"]
1088 |
1089 | [[package]]
1090 | name = "scipy"
1091 | version = "1.6.1"
1092 | description = "SciPy: Scientific Library for Python"
1093 | category = "main"
1094 | optional = false
1095 | python-versions = ">=3.7"
1096 |
1097 | [package.dependencies]
1098 | numpy = ">=1.16.5"
1099 |
1100 | [[package]]
1101 | name = "send2trash"
1102 | version = "1.7.1"
1103 | description = "Send file to trash natively under Mac OS X, Windows and Linux."
1104 | category = "main"
1105 | optional = false
1106 | python-versions = "*"
1107 |
1108 | [package.extras]
1109 | win32 = ["pywin32"]
1110 |
1111 | [[package]]
1112 | name = "six"
1113 | version = "1.16.0"
1114 | description = "Python 2 and 3 compatibility utilities"
1115 | category = "main"
1116 | optional = false
1117 | python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*"
1118 |
1119 | [[package]]
1120 | name = "smmap"
1121 | version = "5.0.0"
1122 | description = "A pure Python implementation of a sliding window memory map manager"
1123 | category = "main"
1124 | optional = false
1125 | python-versions = ">=3.6"
1126 |
1127 | [[package]]
1128 | name = "streamlit"
1129 | version = "1.5.1"
1130 | description = "The fastest way to build data apps in Python"
1131 | category = "main"
1132 | optional = false
1133 | python-versions = ">=3.6"
1134 |
1135 | [package.dependencies]
1136 | altair = ">=3.2.0"
1137 | astor = "*"
1138 | attrs = "*"
1139 | base58 = "*"
1140 | blinker = "*"
1141 | cachetools = ">=4.0"
1142 | click = ">=7.0"
1143 | gitpython = "!=3.1.19"
1144 | numpy = "*"
1145 | packaging = "*"
1146 | pandas = ">=0.21.0"
1147 | pillow = ">=6.2.0"
1148 | protobuf = ">=3.6.0,<3.11 || >3.11"
1149 | pyarrow = "*"
1150 | pydeck = ">=0.1.dev5"
1151 | pympler = ">=0.9"
1152 | python-dateutil = "*"
1153 | requests = "*"
1154 | toml = "*"
1155 | tornado = ">=5.0"
1156 | typing-extensions = {version = "*", markers = "python_version < \"3.8\""}
1157 | tzlocal = "*"
1158 | validators = "*"
1159 | watchdog = {version = "*", markers = "platform_system != \"Darwin\""}
1160 |
1161 | [[package]]
1162 | name = "tensorflow-probability"
1163 | version = "0.13.0"
1164 | description = "Probabilistic modeling and statistical inference in TensorFlow"
1165 | category = "main"
1166 | optional = false
1167 | python-versions = "*"
1168 |
1169 | [package.dependencies]
1170 | cloudpickle = ">=1.3"
1171 | decorator = "*"
1172 | dm-tree = "*"
1173 | gast = ">=0.3.2"
1174 | numpy = ">=1.13.3"
1175 | six = ">=1.10.0"
1176 |
1177 | [package.extras]
1178 | jax = ["jax", "jaxlib"]
1179 | tfds = ["tensorflow-datasets (>=2.2.0)"]
1180 |
1181 | [[package]]
1182 | name = "terminado"
1183 | version = "0.10.1"
1184 | description = "Tornado websocket backend for the Xterm.js Javascript terminal emulator library."
1185 | category = "main"
1186 | optional = false
1187 | python-versions = ">=3.6"
1188 |
1189 | [package.dependencies]
1190 | ptyprocess = {version = "*", markers = "os_name != \"nt\""}
1191 | pywinpty = {version = ">=1.1.0", markers = "os_name == \"nt\""}
1192 | tornado = ">=4"
1193 |
1194 | [package.extras]
1195 | test = ["pytest"]
1196 |
1197 | [[package]]
1198 | name = "testpath"
1199 | version = "0.5.0"
1200 | description = "Test utilities for code working with files and commands"
1201 | category = "main"
1202 | optional = false
1203 | python-versions = ">= 3.5"
1204 |
1205 | [package.extras]
1206 | test = ["pytest", "pathlib2"]
1207 |
1208 | [[package]]
1209 | name = "toml"
1210 | version = "0.10.2"
1211 | description = "Python Library for Tom's Obvious, Minimal Language"
1212 | category = "main"
1213 | optional = false
1214 | python-versions = ">=2.6, !=3.0.*, !=3.1.*, !=3.2.*"
1215 |
1216 | [[package]]
1217 | name = "toolz"
1218 | version = "0.11.2"
1219 | description = "List processing tools and functional utilities"
1220 | category = "main"
1221 | optional = false
1222 | python-versions = ">=3.5"
1223 |
1224 | [[package]]
1225 | name = "torch"
1226 | version = "1.9.0"
1227 | description = "Tensors and Dynamic neural networks in Python with strong GPU acceleration"
1228 | category = "main"
1229 | optional = false
1230 | python-versions = ">=3.6.2"
1231 |
1232 | [package.dependencies]
1233 | typing-extensions = "*"
1234 |
1235 | [[package]]
1236 | name = "torchvision"
1237 | version = "0.10.0"
1238 | description = "image and video datasets and models for torch deep learning"
1239 | category = "main"
1240 | optional = false
1241 | python-versions = "*"
1242 |
1243 | [package.dependencies]
1244 | numpy = "*"
1245 | pillow = ">=5.3.0"
1246 | torch = "1.9.0"
1247 |
1248 | [package.extras]
1249 | scipy = ["scipy"]
1250 |
1251 | [[package]]
1252 | name = "tornado"
1253 | version = "6.1"
1254 | description = "Tornado is a Python web framework and asynchronous networking library, originally developed at FriendFeed."
1255 | category = "main"
1256 | optional = false
1257 | python-versions = ">= 3.5"
1258 |
1259 | [[package]]
1260 | name = "traitlets"
1261 | version = "5.0.5"
1262 | description = "Traitlets Python configuration system"
1263 | category = "main"
1264 | optional = false
1265 | python-versions = ">=3.7"
1266 |
1267 | [package.dependencies]
1268 | ipython-genutils = "*"
1269 |
1270 | [package.extras]
1271 | test = ["pytest"]
1272 |
1273 | [[package]]
1274 | name = "typing-extensions"
1275 | version = "3.10.0.0"
1276 | description = "Backported and Experimental Type Hints for Python 3.5+"
1277 | category = "main"
1278 | optional = false
1279 | python-versions = "*"
1280 |
1281 | [[package]]
1282 | name = "tzdata"
1283 | version = "2021.5"
1284 | description = "Provider of IANA time zone data"
1285 | category = "main"
1286 | optional = false
1287 | python-versions = ">=2"
1288 |
1289 | [[package]]
1290 | name = "tzlocal"
1291 | version = "4.1"
1292 | description = "tzinfo object for the local timezone"
1293 | category = "main"
1294 | optional = false
1295 | python-versions = ">=3.6"
1296 |
1297 | [package.dependencies]
1298 | "backports.zoneinfo" = {version = "*", markers = "python_version < \"3.9\""}
1299 | pytz-deprecation-shim = "*"
1300 | tzdata = {version = "*", markers = "platform_system == \"Windows\""}
1301 |
1302 | [package.extras]
1303 | devenv = ["black", "pyroma", "pytest-cov", "zest.releaser"]
1304 | test = ["pytest-mock (>=3.3)", "pytest (>=4.3)"]
1305 |
1306 | [[package]]
1307 | name = "urllib3"
1308 | version = "1.26.6"
1309 | description = "HTTP library with thread-safe connection pooling, file post, and more."
1310 | category = "main"
1311 | optional = false
1312 | python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*, <4"
1313 |
1314 | [package.extras]
1315 | brotli = ["brotlipy (>=0.6.0)"]
1316 | secure = ["pyOpenSSL (>=0.14)", "cryptography (>=1.3.4)", "idna (>=2.0.0)", "certifi", "ipaddress"]
1317 | socks = ["PySocks (>=1.5.6,!=1.5.7,<2.0)"]
1318 |
1319 | [[package]]
1320 | name = "validators"
1321 | version = "0.18.2"
1322 | description = "Python Data Validation for Humans™."
1323 | category = "main"
1324 | optional = false
1325 | python-versions = ">=3.4"
1326 |
1327 | [package.dependencies]
1328 | decorator = ">=3.4.0"
1329 | six = ">=1.4.0"
1330 |
1331 | [package.extras]
1332 | test = ["pytest (>=2.2.3)", "flake8 (>=2.4.0)", "isort (>=4.2.2)"]
1333 |
1334 | [[package]]
1335 | name = "watchdog"
1336 | version = "2.1.6"
1337 | description = "Filesystem events monitoring"
1338 | category = "main"
1339 | optional = false
1340 | python-versions = ">=3.6"
1341 |
1342 | [package.extras]
1343 | watchmedo = ["PyYAML (>=3.10)"]
1344 |
1345 | [[package]]
1346 | name = "wcwidth"
1347 | version = "0.2.5"
1348 | description = "Measures the displayed width of unicode strings in a terminal"
1349 | category = "main"
1350 | optional = false
1351 | python-versions = "*"
1352 |
1353 | [[package]]
1354 | name = "webencodings"
1355 | version = "0.5.1"
1356 | description = "Character encoding aliases for legacy web content"
1357 | category = "main"
1358 | optional = false
1359 | python-versions = "*"
1360 |
1361 | [[package]]
1362 | name = "widgetsnbextension"
1363 | version = "3.5.1"
1364 | description = "IPython HTML widgets for Jupyter"
1365 | category = "main"
1366 | optional = false
1367 | python-versions = "*"
1368 |
1369 | [package.dependencies]
1370 | notebook = ">=4.4.1"
1371 |
1372 | [[package]]
1373 | name = "zipp"
1374 | version = "3.4.1"
1375 | description = "Backport of pathlib-compatible object wrapper for zip files"
1376 | category = "main"
1377 | optional = false
1378 | python-versions = ">=3.6"
1379 |
1380 | [package.extras]
1381 | docs = ["sphinx", "jaraco.packaging (>=8.2)", "rst.linker (>=1.9)"]
1382 | testing = ["pytest (>=4.6)", "pytest-checkdocs (>=1.2.3)", "pytest-flake8", "pytest-cov", "pytest-enabler", "jaraco.itertools", "func-timeout", "pytest-black (>=0.3.7)", "pytest-mypy"]
1383 |
1384 | [metadata]
1385 | lock-version = "1.1"
1386 | python-versions = "^3.7"
1387 | content-hash = "f8477cbda9f0a2d8b5da4781c7cc6f6861cd56f8875ef6be5a2e3792a8df316c"
1388 |
1389 | [metadata.files]
1390 | absl-py = [
1391 | {file = "absl-py-0.13.0.tar.gz", hash = "sha256:6953272383486044699fd0e9f00aad167a27e08ce19aae66c6c4b10e7e767793"},
1392 | {file = "absl_py-0.13.0-py3-none-any.whl", hash = "sha256:62bd4e248ddb19d81aec8f9446b407ff37c8175c2ba88266a7afa9b4ce4a333b"},
1393 | ]
1394 | altair = [
1395 | {file = "altair-4.2.0-py3-none-any.whl", hash = "sha256:0c724848ae53410c13fa28be2b3b9a9dcb7b5caa1a70f7f217bd663bb419935a"},
1396 | {file = "altair-4.2.0.tar.gz", hash = "sha256:d87d9372e63b48cd96b2a6415f0cf9457f50162ab79dc7a31cd7e024dd840026"},
1397 | ]
1398 | appnope = [
1399 | {file = "appnope-0.1.2-py2.py3-none-any.whl", hash = "sha256:93aa393e9d6c54c5cd570ccadd8edad61ea0c4b9ea7a01409020c9aa019eb442"},
1400 | {file = "appnope-0.1.2.tar.gz", hash = "sha256:dd83cd4b5b460958838f6eb3000c660b1f9caf2a5b1de4264e941512f603258a"},
1401 | ]
1402 | argon2-cffi = [
1403 | {file = "argon2-cffi-20.1.0.tar.gz", hash = "sha256:d8029b2d3e4b4cea770e9e5a0104dd8fa185c1724a0f01528ae4826a6d25f97d"},
1404 | {file = "argon2_cffi-20.1.0-cp27-cp27m-macosx_10_6_intel.whl", hash = "sha256:6ea92c980586931a816d61e4faf6c192b4abce89aa767ff6581e6ddc985ed003"},
1405 | {file = "argon2_cffi-20.1.0-cp27-cp27m-manylinux1_x86_64.whl", hash = "sha256:05a8ac07c7026542377e38389638a8a1e9b78f1cd8439cd7493b39f08dd75fbf"},
1406 | {file = "argon2_cffi-20.1.0-cp27-cp27m-win32.whl", hash = "sha256:0bf066bc049332489bb2d75f69216416329d9dc65deee127152caeb16e5ce7d5"},
1407 | {file = "argon2_cffi-20.1.0-cp27-cp27m-win_amd64.whl", hash = "sha256:57358570592c46c420300ec94f2ff3b32cbccd10d38bdc12dc6979c4a8484fbc"},
1408 | {file = "argon2_cffi-20.1.0-cp27-cp27mu-manylinux1_x86_64.whl", hash = "sha256:7d455c802727710e9dfa69b74ccaab04568386ca17b0ad36350b622cd34606fe"},
1409 | {file = "argon2_cffi-20.1.0-cp35-abi3-manylinux1_x86_64.whl", hash = "sha256:b160416adc0f012fb1f12588a5e6954889510f82f698e23ed4f4fa57f12a0647"},
1410 | {file = "argon2_cffi-20.1.0-cp35-cp35m-win32.whl", hash = "sha256:9bee3212ba4f560af397b6d7146848c32a800652301843df06b9e8f68f0f7361"},
1411 | {file = "argon2_cffi-20.1.0-cp35-cp35m-win_amd64.whl", hash = "sha256:392c3c2ef91d12da510cfb6f9bae52512a4552573a9e27600bdb800e05905d2b"},
1412 | {file = "argon2_cffi-20.1.0-cp36-cp36m-win32.whl", hash = "sha256:ba7209b608945b889457f949cc04c8e762bed4fe3fec88ae9a6b7765ae82e496"},
1413 | {file = "argon2_cffi-20.1.0-cp36-cp36m-win_amd64.whl", hash = "sha256:da7f0445b71db6d3a72462e04f36544b0de871289b0bc8a7cc87c0f5ec7079fa"},
1414 | {file = "argon2_cffi-20.1.0-cp37-abi3-macosx_10_6_intel.whl", hash = "sha256:cc0e028b209a5483b6846053d5fd7165f460a1f14774d79e632e75e7ae64b82b"},
1415 | {file = "argon2_cffi-20.1.0-cp37-cp37m-win32.whl", hash = "sha256:18dee20e25e4be86680b178b35ccfc5d495ebd5792cd00781548d50880fee5c5"},
1416 | {file = "argon2_cffi-20.1.0-cp37-cp37m-win_amd64.whl", hash = "sha256:6678bb047373f52bcff02db8afab0d2a77d83bde61cfecea7c5c62e2335cb203"},
1417 | {file = "argon2_cffi-20.1.0-cp38-cp38-win32.whl", hash = "sha256:77e909cc756ef81d6abb60524d259d959bab384832f0c651ed7dcb6e5ccdbb78"},
1418 | {file = "argon2_cffi-20.1.0-cp38-cp38-win_amd64.whl", hash = "sha256:9dfd5197852530294ecb5795c97a823839258dfd5eb9420233c7cfedec2058f2"},
1419 | ]
1420 | astor = [
1421 | {file = "astor-0.8.1-py2.py3-none-any.whl", hash = "sha256:070a54e890cefb5b3739d19f30f5a5ec840ffc9c50ffa7d23cc9fc1a38ebbfc5"},
1422 | {file = "astor-0.8.1.tar.gz", hash = "sha256:6a6effda93f4e1ce9f618779b2dd1d9d84f1e32812c23a29b3fff6fd7f63fa5e"},
1423 | ]
1424 | async-generator = [
1425 | {file = "async_generator-1.10-py3-none-any.whl", hash = "sha256:01c7bf666359b4967d2cda0000cc2e4af16a0ae098cbffcb8472fb9e8ad6585b"},
1426 | {file = "async_generator-1.10.tar.gz", hash = "sha256:6ebb3d106c12920aaae42ccb6f787ef5eefdcdd166ea3d628fa8476abe712144"},
1427 | ]
1428 | atomicwrites = [
1429 | {file = "atomicwrites-1.4.0-py2.py3-none-any.whl", hash = "sha256:6d1784dea7c0c8d4a5172b6c620f40b6e4cbfdf96d783691f2e1302a7b88e197"},
1430 | {file = "atomicwrites-1.4.0.tar.gz", hash = "sha256:ae70396ad1a434f9c7046fd2dd196fc04b12f9e91ffb859164193be8b6168a7a"},
1431 | ]
1432 | attrs = [
1433 | {file = "attrs-21.2.0-py2.py3-none-any.whl", hash = "sha256:149e90d6d8ac20db7a955ad60cf0e6881a3f20d37096140088356da6c716b0b1"},
1434 | {file = "attrs-21.2.0.tar.gz", hash = "sha256:ef6aaac3ca6cd92904cdd0d83f629a15f18053ec84e6432106f7a4d04ae4f5fb"},
1435 | ]
1436 | backcall = [
1437 | {file = "backcall-0.2.0-py2.py3-none-any.whl", hash = "sha256:fbbce6a29f263178a1f7915c1940bde0ec2b2a967566fe1c65c1dfb7422bd255"},
1438 | {file = "backcall-0.2.0.tar.gz", hash = "sha256:5cbdbf27be5e7cfadb448baf0aa95508f91f2bbc6c6437cd9cd06e2a4c215e1e"},
1439 | ]
1440 | "backports.zoneinfo" = [
1441 | {file = "backports.zoneinfo-0.2.1-cp36-cp36m-macosx_10_14_x86_64.whl", hash = "sha256:da6013fd84a690242c310d77ddb8441a559e9cb3d3d59ebac9aca1a57b2e18bc"},
1442 | {file = "backports.zoneinfo-0.2.1-cp36-cp36m-manylinux1_i686.whl", hash = "sha256:89a48c0d158a3cc3f654da4c2de1ceba85263fafb861b98b59040a5086259722"},
1443 | {file = "backports.zoneinfo-0.2.1-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:1c5742112073a563c81f786e77514969acb58649bcdf6cdf0b4ed31a348d4546"},
1444 | {file = "backports.zoneinfo-0.2.1-cp36-cp36m-win32.whl", hash = "sha256:e8236383a20872c0cdf5a62b554b27538db7fa1bbec52429d8d106effbaeca08"},
1445 | {file = "backports.zoneinfo-0.2.1-cp36-cp36m-win_amd64.whl", hash = "sha256:8439c030a11780786a2002261569bdf362264f605dfa4d65090b64b05c9f79a7"},
1446 | {file = "backports.zoneinfo-0.2.1-cp37-cp37m-macosx_10_14_x86_64.whl", hash = "sha256:f04e857b59d9d1ccc39ce2da1021d196e47234873820cbeaad210724b1ee28ac"},
1447 | {file = "backports.zoneinfo-0.2.1-cp37-cp37m-manylinux1_i686.whl", hash = "sha256:17746bd546106fa389c51dbea67c8b7c8f0d14b5526a579ca6ccf5ed72c526cf"},
1448 | {file = "backports.zoneinfo-0.2.1-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:5c144945a7752ca544b4b78c8c41544cdfaf9786f25fe5ffb10e838e19a27570"},
1449 | {file = "backports.zoneinfo-0.2.1-cp37-cp37m-win32.whl", hash = "sha256:e55b384612d93be96506932a786bbcde5a2db7a9e6a4bb4bffe8b733f5b9036b"},
1450 | {file = "backports.zoneinfo-0.2.1-cp37-cp37m-win_amd64.whl", hash = "sha256:a76b38c52400b762e48131494ba26be363491ac4f9a04c1b7e92483d169f6582"},
1451 | {file = "backports.zoneinfo-0.2.1-cp38-cp38-macosx_10_14_x86_64.whl", hash = "sha256:8961c0f32cd0336fb8e8ead11a1f8cd99ec07145ec2931122faaac1c8f7fd987"},
1452 | {file = "backports.zoneinfo-0.2.1-cp38-cp38-manylinux1_i686.whl", hash = "sha256:e81b76cace8eda1fca50e345242ba977f9be6ae3945af8d46326d776b4cf78d1"},
1453 | {file = "backports.zoneinfo-0.2.1-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:7b0a64cda4145548fed9efc10322770f929b944ce5cee6c0dfe0c87bf4c0c8c9"},
1454 | {file = "backports.zoneinfo-0.2.1-cp38-cp38-win32.whl", hash = "sha256:1b13e654a55cd45672cb54ed12148cd33628f672548f373963b0bff67b217328"},
1455 | {file = "backports.zoneinfo-0.2.1-cp38-cp38-win_amd64.whl", hash = "sha256:4a0f800587060bf8880f954dbef70de6c11bbe59c673c3d818921f042f9954a6"},
1456 | {file = "backports.zoneinfo-0.2.1.tar.gz", hash = "sha256:fadbfe37f74051d024037f223b8e001611eac868b5c5b06144ef4d8b799862f2"},
1457 | ]
1458 | base58 = [
1459 | {file = "base58-2.1.1-py3-none-any.whl", hash = "sha256:11a36f4d3ce51dfc1043f3218591ac4eb1ceb172919cebe05b52a5bcc8d245c2"},
1460 | {file = "base58-2.1.1.tar.gz", hash = "sha256:c5d0cb3f5b6e81e8e35da5754388ddcc6d0d14b6c6a132cb93d69ed580a7278c"},
1461 | ]
1462 | bleach = [
1463 | {file = "bleach-3.3.0-py2.py3-none-any.whl", hash = "sha256:6123ddc1052673e52bab52cdc955bcb57a015264a1c57d37bea2f6b817af0125"},
1464 | {file = "bleach-3.3.0.tar.gz", hash = "sha256:98b3170739e5e83dd9dc19633f074727ad848cbedb6026708c8ac2d3b697a433"},
1465 | ]
1466 | blinker = [
1467 | {file = "blinker-1.4.tar.gz", hash = "sha256:471aee25f3992bd325afa3772f1063dbdbbca947a041b8b89466dc00d606f8b6"},
1468 | ]
1469 | cachetools = [
1470 | {file = "cachetools-5.0.0-py3-none-any.whl", hash = "sha256:8fecd4203a38af17928be7b90689d8083603073622229ca7077b72d8e5a976e4"},
1471 | {file = "cachetools-5.0.0.tar.gz", hash = "sha256:486471dfa8799eb7ec503a8059e263db000cdda20075ce5e48903087f79d5fd6"},
1472 | ]
1473 | certifi = [
1474 | {file = "certifi-2021.5.30-py2.py3-none-any.whl", hash = "sha256:50b1e4f8446b06f41be7dd6338db18e0990601dce795c2b1686458aa7e8fa7d8"},
1475 | {file = "certifi-2021.5.30.tar.gz", hash = "sha256:2bbf76fd432960138b3ef6dda3dde0544f27cbf8546c458e60baf371917ba9ee"},
1476 | ]
1477 | cffi = [
1478 | {file = "cffi-1.14.5-cp27-cp27m-macosx_10_9_x86_64.whl", hash = "sha256:bb89f306e5da99f4d922728ddcd6f7fcebb3241fc40edebcb7284d7514741991"},
1479 | {file = "cffi-1.14.5-cp27-cp27m-manylinux1_i686.whl", hash = "sha256:34eff4b97f3d982fb93e2831e6750127d1355a923ebaeeb565407b3d2f8d41a1"},
1480 | {file = "cffi-1.14.5-cp27-cp27m-manylinux1_x86_64.whl", hash = "sha256:99cd03ae7988a93dd00bcd9d0b75e1f6c426063d6f03d2f90b89e29b25b82dfa"},
1481 | {file = "cffi-1.14.5-cp27-cp27m-win32.whl", hash = "sha256:65fa59693c62cf06e45ddbb822165394a288edce9e276647f0046e1ec26920f3"},
1482 | {file = "cffi-1.14.5-cp27-cp27m-win_amd64.whl", hash = "sha256:51182f8927c5af975fece87b1b369f722c570fe169f9880764b1ee3bca8347b5"},
1483 | {file = "cffi-1.14.5-cp27-cp27mu-manylinux1_i686.whl", hash = "sha256:43e0b9d9e2c9e5d152946b9c5fe062c151614b262fda2e7b201204de0b99e482"},
1484 | {file = "cffi-1.14.5-cp27-cp27mu-manylinux1_x86_64.whl", hash = "sha256:cbde590d4faaa07c72bf979734738f328d239913ba3e043b1e98fe9a39f8b2b6"},
1485 | {file = "cffi-1.14.5-cp35-cp35m-macosx_10_9_x86_64.whl", hash = "sha256:5de7970188bb46b7bf9858eb6890aad302577a5f6f75091fd7cdd3ef13ef3045"},
1486 | {file = "cffi-1.14.5-cp35-cp35m-manylinux1_i686.whl", hash = "sha256:a465da611f6fa124963b91bf432d960a555563efe4ed1cc403ba5077b15370aa"},
1487 | {file = "cffi-1.14.5-cp35-cp35m-manylinux1_x86_64.whl", hash = "sha256:d42b11d692e11b6634f7613ad8df5d6d5f8875f5d48939520d351007b3c13406"},
1488 | {file = "cffi-1.14.5-cp35-cp35m-win32.whl", hash = "sha256:72d8d3ef52c208ee1c7b2e341f7d71c6fd3157138abf1a95166e6165dd5d4369"},
1489 | {file = "cffi-1.14.5-cp35-cp35m-win_amd64.whl", hash = "sha256:29314480e958fd8aab22e4a58b355b629c59bf5f2ac2492b61e3dc06d8c7a315"},
1490 | {file = "cffi-1.14.5-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:3d3dd4c9e559eb172ecf00a2a7517e97d1e96de2a5e610bd9b68cea3925b4892"},
1491 | {file = "cffi-1.14.5-cp36-cp36m-manylinux1_i686.whl", hash = "sha256:48e1c69bbacfc3d932221851b39d49e81567a4d4aac3b21258d9c24578280058"},
1492 | {file = "cffi-1.14.5-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:69e395c24fc60aad6bb4fa7e583698ea6cc684648e1ffb7fe85e3c1ca131a7d5"},
1493 | {file = "cffi-1.14.5-cp36-cp36m-manylinux2014_aarch64.whl", hash = "sha256:9e93e79c2551ff263400e1e4be085a1210e12073a31c2011dbbda14bda0c6132"},
1494 | {file = "cffi-1.14.5-cp36-cp36m-win32.whl", hash = "sha256:58e3f59d583d413809d60779492342801d6e82fefb89c86a38e040c16883be53"},
1495 | {file = "cffi-1.14.5-cp36-cp36m-win_amd64.whl", hash = "sha256:005a36f41773e148deac64b08f233873a4d0c18b053d37da83f6af4d9087b813"},
1496 | {file = "cffi-1.14.5-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:2894f2df484ff56d717bead0a5c2abb6b9d2bf26d6960c4604d5c48bbc30ee73"},
1497 | {file = "cffi-1.14.5-cp37-cp37m-manylinux1_i686.whl", hash = "sha256:0857f0ae312d855239a55c81ef453ee8fd24136eaba8e87a2eceba644c0d4c06"},
1498 | {file = "cffi-1.14.5-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:cd2868886d547469123fadc46eac7ea5253ea7fcb139f12e1dfc2bbd406427d1"},
1499 | {file = "cffi-1.14.5-cp37-cp37m-manylinux2014_aarch64.whl", hash = "sha256:35f27e6eb43380fa080dccf676dece30bef72e4a67617ffda586641cd4508d49"},
1500 | {file = "cffi-1.14.5-cp37-cp37m-win32.whl", hash = "sha256:9ff227395193126d82e60319a673a037d5de84633f11279e336f9c0f189ecc62"},
1501 | {file = "cffi-1.14.5-cp37-cp37m-win_amd64.whl", hash = "sha256:9cf8022fb8d07a97c178b02327b284521c7708d7c71a9c9c355c178ac4bbd3d4"},
1502 | {file = "cffi-1.14.5-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:8b198cec6c72df5289c05b05b8b0969819783f9418e0409865dac47288d2a053"},
1503 | {file = "cffi-1.14.5-cp38-cp38-manylinux1_i686.whl", hash = "sha256:ad17025d226ee5beec591b52800c11680fca3df50b8b29fe51d882576e039ee0"},
1504 | {file = "cffi-1.14.5-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:6c97d7350133666fbb5cf4abdc1178c812cb205dc6f41d174a7b0f18fb93337e"},
1505 | {file = "cffi-1.14.5-cp38-cp38-manylinux2014_aarch64.whl", hash = "sha256:8ae6299f6c68de06f136f1f9e69458eae58f1dacf10af5c17353eae03aa0d827"},
1506 | {file = "cffi-1.14.5-cp38-cp38-win32.whl", hash = "sha256:b85eb46a81787c50650f2392b9b4ef23e1f126313b9e0e9013b35c15e4288e2e"},
1507 | {file = "cffi-1.14.5-cp38-cp38-win_amd64.whl", hash = "sha256:1f436816fc868b098b0d63b8920de7d208c90a67212546d02f84fe78a9c26396"},
1508 | {file = "cffi-1.14.5-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:1071534bbbf8cbb31b498d5d9db0f274f2f7a865adca4ae429e147ba40f73dea"},
1509 | {file = "cffi-1.14.5-cp39-cp39-manylinux1_i686.whl", hash = "sha256:9de2e279153a443c656f2defd67769e6d1e4163952b3c622dcea5b08a6405322"},
1510 | {file = "cffi-1.14.5-cp39-cp39-manylinux1_x86_64.whl", hash = "sha256:6e4714cc64f474e4d6e37cfff31a814b509a35cb17de4fb1999907575684479c"},
1511 | {file = "cffi-1.14.5-cp39-cp39-manylinux2014_aarch64.whl", hash = "sha256:158d0d15119b4b7ff6b926536763dc0714313aa59e320ddf787502c70c4d4bee"},
1512 | {file = "cffi-1.14.5-cp39-cp39-win32.whl", hash = "sha256:afb29c1ba2e5a3736f1c301d9d0abe3ec8b86957d04ddfa9d7a6a42b9367e396"},
1513 | {file = "cffi-1.14.5-cp39-cp39-win_amd64.whl", hash = "sha256:f2d45f97ab6bb54753eab54fffe75aaf3de4ff2341c9daee1987ee1837636f1d"},
1514 | {file = "cffi-1.14.5.tar.gz", hash = "sha256:fd78e5fee591709f32ef6edb9a015b4aa1a5022598e36227500c8f4e02328d9c"},
1515 | ]
1516 | chardet = [
1517 | {file = "chardet-4.0.0-py2.py3-none-any.whl", hash = "sha256:f864054d66fd9118f2e67044ac8981a54775ec5b67aed0441892edb553d21da5"},
1518 | {file = "chardet-4.0.0.tar.gz", hash = "sha256:0d6f53a15db4120f2b08c94f11e7d93d2c911ee118b6b30a04ec3ee8310179fa"},
1519 | ]
1520 | cleverhans = [
1521 | {file = "cleverhans-3.1.0-py3-none-any.whl", hash = "sha256:37a0a8b60995875ee78726fdfdfa8b9228c494681495eed1751b6604eb53ed3f"},
1522 | ]
1523 | click = [
1524 | {file = "click-8.0.4-py3-none-any.whl", hash = "sha256:6a7a62563bbfabfda3a38f3023a1db4a35978c0abd76f6c9605ecd6554d6d9b1"},
1525 | {file = "click-8.0.4.tar.gz", hash = "sha256:8458d7b1287c5fb128c90e23381cf99dcde74beaf6c7ff6384ce84d6fe090adb"},
1526 | ]
1527 | cloudpickle = [
1528 | {file = "cloudpickle-1.6.0-py3-none-any.whl", hash = "sha256:3a32d0eb0bc6f4d0c57fbc4f3e3780f7a81e6fee0fa935072884d58ae8e1cc7c"},
1529 | {file = "cloudpickle-1.6.0.tar.gz", hash = "sha256:9bc994f9e9447593bd0a45371f0e7ac7333710fcf64a4eb9834bf149f4ef2f32"},
1530 | ]
1531 | colorama = [
1532 | {file = "colorama-0.4.4-py2.py3-none-any.whl", hash = "sha256:9f47eda37229f68eee03b24b9748937c7dc3868f906e8ba69fbcbdd3bc5dc3e2"},
1533 | ]
1534 | cycler = [
1535 | {file = "cycler-0.10.0-py2.py3-none-any.whl", hash = "sha256:1d8a5ae1ff6c5cf9b93e8811e581232ad8920aeec647c37316ceac982b08cb2d"},
1536 | {file = "cycler-0.10.0.tar.gz", hash = "sha256:cd7b2d1018258d7247a71425e9f26463dfb444d411c39569972f4ce586b0c9d8"},
1537 | ]
1538 | decorator = [
1539 | {file = "decorator-5.0.9-py3-none-any.whl", hash = "sha256:6e5c199c16f7a9f0e3a61a4a54b3d27e7dad0dbdde92b944426cb20914376323"},
1540 | {file = "decorator-5.0.9.tar.gz", hash = "sha256:72ecfba4320a893c53f9706bebb2d55c270c1e51a28789361aa93e4a21319ed5"},
1541 | ]
1542 | defusedxml = [
1543 | {file = "defusedxml-0.7.1-py2.py3-none-any.whl", hash = "sha256:a352e7e428770286cc899e2542b6cdaedb2b4953ff269a210103ec58f6198a61"},
1544 | {file = "defusedxml-0.7.1.tar.gz", hash = "sha256:1bb3032db185915b62d7c6209c5a8792be6a32ab2fedacc84e01b52c51aa3e69"},
1545 | ]
1546 | dm-tree = [
1547 | {file = "dm-tree-0.1.6.tar.gz", hash = "sha256:6776404b23b4522c01012ffb314632aba092c9541577004ab153321e87da439a"},
1548 | {file = "dm_tree-0.1.6-cp36-cp36m-macosx_10_14_x86_64.whl", hash = "sha256:a8814a5c838f79e9db22a51369c74f4d92e7f1485ec55d7f665ae4d98478cb4f"},
1549 | {file = "dm_tree-0.1.6-cp36-cp36m-manylinux2014_x86_64.whl", hash = "sha256:e28ba91d3d97230b831716db401ce116ae5c7dcd025161ac16ecb8bd5c870a85"},
1550 | {file = "dm_tree-0.1.6-cp36-cp36m-manylinux_2_24_x86_64.whl", hash = "sha256:603392f1a7818a4f43a7033c2061ae7c2085a4a728171b0bbca76bd107fcdfb0"},
1551 | {file = "dm_tree-0.1.6-cp36-cp36m-win_amd64.whl", hash = "sha256:2c91e472aab5c5e083c12d0a9396bbd7695031348721f709a9c6f2449e53dab6"},
1552 | {file = "dm_tree-0.1.6-cp37-cp37m-macosx_10_14_x86_64.whl", hash = "sha256:889eae86e0d2d4b8da8eb2edc7186b45a5f92e00c8dd77f2a5c8422f03db18f4"},
1553 | {file = "dm_tree-0.1.6-cp37-cp37m-manylinux2014_x86_64.whl", hash = "sha256:2fa9c6e56cbd22cdffec42dc8b20464872b07c4535d8effc537fe0d31930b084"},
1554 | {file = "dm_tree-0.1.6-cp37-cp37m-manylinux_2_24_x86_64.whl", hash = "sha256:c4e8d868fc9a75cbdb67e78069b33e62a4c69bc182c1d2adc29ab08e283912d8"},
1555 | {file = "dm_tree-0.1.6-cp37-cp37m-win_amd64.whl", hash = "sha256:6d5f64d89f657b11f429e13b1378c8cfbe4baef50e7ab31f3689bfe0cf4a2508"},
1556 | {file = "dm_tree-0.1.6-cp38-cp38-macosx_10_14_x86_64.whl", hash = "sha256:8d59c5098456667b28c607110537c86c25cbd0ee455f21d033c60ef2d7f48d81"},
1557 | {file = "dm_tree-0.1.6-cp38-cp38-manylinux2014_x86_64.whl", hash = "sha256:f3bec40e658fe7546c3a56849c743ac9a498e620b3236e82e171801938a56679"},
1558 | {file = "dm_tree-0.1.6-cp38-cp38-manylinux_2_24_x86_64.whl", hash = "sha256:e87d06478356a2d92c3940dedebcd92a14ad37fba10ebb1839c8140693b83c0a"},
1559 | {file = "dm_tree-0.1.6-cp38-cp38-win_amd64.whl", hash = "sha256:02ffa673f20b1756dcf085ef2c354bc59416d843b384c7b71c421f873ffc36c0"},
1560 | {file = "dm_tree-0.1.6-cp39-cp39-macosx_10_14_x86_64.whl", hash = "sha256:affc7a6d29442a143c60efb2f03bcb95424d4fe6168f3d31de892c1e601fa0e6"},
1561 | {file = "dm_tree-0.1.6-cp39-cp39-manylinux2014_x86_64.whl", hash = "sha256:bd347c74254ba320d57b0e102558c1189e3b4ae1bae952f9aef156b5914567c8"},
1562 | {file = "dm_tree-0.1.6-cp39-cp39-manylinux_2_24_x86_64.whl", hash = "sha256:8425454192e954692d9a1e0f7b374b3b7030916b17b6055951dc17d58b6fe1b8"},
1563 | {file = "dm_tree-0.1.6-cp39-cp39-win_amd64.whl", hash = "sha256:5269183f80f1ae37543a2a30a8f78e4b0460d5da74fb5ac42dc8a476ef8d707e"},
1564 | ]
1565 | easydict = [
1566 | {file = "easydict-1.9.tar.gz", hash = "sha256:3f3f0dab07c299f0f4df032db1f388d985bb57fa4c5be30acd25c5f9a516883b"},
1567 | ]
1568 | entrypoints = [
1569 | {file = "entrypoints-0.3-py2.py3-none-any.whl", hash = "sha256:589f874b313739ad35be6e0cd7efde2a4e9b6fea91edcc34e58ecbb8dbe56d19"},
1570 | {file = "entrypoints-0.3.tar.gz", hash = "sha256:c70dd71abe5a8c85e55e12c19bd91ccfeec11a6e99044204511f9ed547d48451"},
1571 | ]
1572 | gast = [
1573 | {file = "gast-0.4.0-py3-none-any.whl", hash = "sha256:b7adcdd5adbebf1adf17378da5ba3f543684dbec47b1cda1f3997e573cd542c4"},
1574 | {file = "gast-0.4.0.tar.gz", hash = "sha256:40feb7b8b8434785585ab224d1568b857edb18297e5a3047f1ba012bc83b42c1"},
1575 | ]
1576 | gitdb = [
1577 | {file = "gitdb-4.0.9-py3-none-any.whl", hash = "sha256:8033ad4e853066ba6ca92050b9df2f89301b8fc8bf7e9324d412a63f8bf1a8fd"},
1578 | {file = "gitdb-4.0.9.tar.gz", hash = "sha256:bac2fd45c0a1c9cf619e63a90d62bdc63892ef92387424b855792a6cabe789aa"},
1579 | ]
1580 | gitpython = [
1581 | {file = "GitPython-3.1.27-py3-none-any.whl", hash = "sha256:5b68b000463593e05ff2b261acff0ff0972df8ab1b70d3cdbd41b546c8b8fc3d"},
1582 | {file = "GitPython-3.1.27.tar.gz", hash = "sha256:1c885ce809e8ba2d88a29befeb385fcea06338d3640712b59ca623c220bb5704"},
1583 | ]
1584 | idna = [
1585 | {file = "idna-2.10-py2.py3-none-any.whl", hash = "sha256:b97d804b1e9b523befed77c48dacec60e6dcb0b5391d57af6a65a312a90648c0"},
1586 | {file = "idna-2.10.tar.gz", hash = "sha256:b307872f855b18632ce0c21c5e45be78c0ea7ae4c15c828c20788b26921eb3f6"},
1587 | ]
1588 | importlib-metadata = [
1589 | {file = "importlib_metadata-4.5.0-py3-none-any.whl", hash = "sha256:833b26fb89d5de469b24a390e9df088d4e52e4ba33b01dc5e0e4f41b81a16c00"},
1590 | {file = "importlib_metadata-4.5.0.tar.gz", hash = "sha256:b142cc1dd1342f31ff04bb7d022492b09920cb64fed867cd3ea6f80fe3ebd139"},
1591 | ]
1592 | ipykernel = [
1593 | {file = "ipykernel-5.5.5-py3-none-any.whl", hash = "sha256:29eee66548ee7c2edb7941de60c0ccf0a7a8dd957341db0a49c5e8e6a0fcb712"},
1594 | {file = "ipykernel-5.5.5.tar.gz", hash = "sha256:e976751336b51082a89fc2099fb7f96ef20f535837c398df6eab1283c2070884"},
1595 | ]
1596 | ipython = [
1597 | {file = "ipython-7.25.0-py3-none-any.whl", hash = "sha256:aa21412f2b04ad1a652e30564fff6b4de04726ce875eab222c8430edc6db383a"},
1598 | {file = "ipython-7.25.0.tar.gz", hash = "sha256:54bbd1fe3882457aaf28ae060a5ccdef97f212a741754e420028d4ec5c2291dc"},
1599 | ]
1600 | ipython-genutils = [
1601 | {file = "ipython_genutils-0.2.0-py2.py3-none-any.whl", hash = "sha256:72dd37233799e619666c9f639a9da83c34013a73e8bbc79a7a6348d93c61fab8"},
1602 | {file = "ipython_genutils-0.2.0.tar.gz", hash = "sha256:eb2e116e75ecef9d4d228fdc66af54269afa26ab4463042e33785b887c628ba8"},
1603 | ]
1604 | ipywidgets = [
1605 | {file = "ipywidgets-7.6.3-py2.py3-none-any.whl", hash = "sha256:e6513cfdaf5878de30f32d57f6dc2474da395a2a2991b94d487406c0ab7f55ca"},
1606 | {file = "ipywidgets-7.6.3.tar.gz", hash = "sha256:9f1a43e620530f9e570e4a493677d25f08310118d315b00e25a18f12913c41f0"},
1607 | ]
1608 | jedi = [
1609 | {file = "jedi-0.18.0-py2.py3-none-any.whl", hash = "sha256:18456d83f65f400ab0c2d3319e48520420ef43b23a086fdc05dff34132f0fb93"},
1610 | {file = "jedi-0.18.0.tar.gz", hash = "sha256:92550a404bad8afed881a137ec9a461fed49eca661414be45059329614ed0707"},
1611 | ]
1612 | jinja2 = [
1613 | {file = "Jinja2-3.0.1-py3-none-any.whl", hash = "sha256:1f06f2da51e7b56b8f238affdd6b4e2c61e39598a378cc49345bc1bd42a978a4"},
1614 | {file = "Jinja2-3.0.1.tar.gz", hash = "sha256:703f484b47a6af502e743c9122595cc812b0271f661722403114f71a79d0f5a4"},
1615 | ]
1616 | joblib = [
1617 | {file = "joblib-1.0.1-py3-none-any.whl", hash = "sha256:feeb1ec69c4d45129954f1b7034954241eedfd6ba39b5e9e4b6883be3332d5e5"},
1618 | {file = "joblib-1.0.1.tar.gz", hash = "sha256:9c17567692206d2f3fb9ecf5e991084254fe631665c450b443761c4186a613f7"},
1619 | ]
1620 | jsonschema = [
1621 | {file = "jsonschema-3.2.0-py2.py3-none-any.whl", hash = "sha256:4e5b3cf8216f577bee9ce139cbe72eca3ea4f292ec60928ff24758ce626cd163"},
1622 | {file = "jsonschema-3.2.0.tar.gz", hash = "sha256:c8a85b28d377cc7737e46e2d9f2b4f44ee3c0e1deac6bf46ddefc7187d30797a"},
1623 | ]
1624 | jupyter = [
1625 | {file = "jupyter-1.0.0-py2.py3-none-any.whl", hash = "sha256:5b290f93b98ffbc21c0c7e749f054b3267782166d72fa5e3ed1ed4eaf34a2b78"},
1626 | {file = "jupyter-1.0.0.tar.gz", hash = "sha256:d9dc4b3318f310e34c82951ea5d6683f67bed7def4b259fafbfe4f1beb1d8e5f"},
1627 | {file = "jupyter-1.0.0.zip", hash = "sha256:3e1f86076bbb7c8c207829390305a2b1fe836d471ed54be66a3b8c41e7f46cc7"},
1628 | ]
1629 | jupyter-client = [
1630 | {file = "jupyter_client-6.2.0-py3-none-any.whl", hash = "sha256:9715152067e3f7ea3b56f341c9a0f9715c8c7cc316ee0eb13c3c84f5ca0065f5"},
1631 | {file = "jupyter_client-6.2.0.tar.gz", hash = "sha256:e2ab61d79fbf8b56734a4c2499f19830fbd7f6fefb3e87868ef0545cb3c17eb9"},
1632 | ]
1633 | jupyter-console = [
1634 | {file = "jupyter_console-6.4.0-py3-none-any.whl", hash = "sha256:7799c4ea951e0e96ba8260575423cb323ea5a03fcf5503560fa3e15748869e27"},
1635 | {file = "jupyter_console-6.4.0.tar.gz", hash = "sha256:242248e1685039cd8bff2c2ecb7ce6c1546eb50ee3b08519729e6e881aec19c7"},
1636 | ]
1637 | jupyter-core = [
1638 | {file = "jupyter_core-4.7.1-py3-none-any.whl", hash = "sha256:8c6c0cac5c1b563622ad49321d5ec47017bd18b94facb381c6973a0486395f8e"},
1639 | {file = "jupyter_core-4.7.1.tar.gz", hash = "sha256:79025cb3225efcd36847d0840f3fc672c0abd7afd0de83ba8a1d3837619122b4"},
1640 | ]
1641 | jupyterlab-pygments = [
1642 | {file = "jupyterlab_pygments-0.1.2-py2.py3-none-any.whl", hash = "sha256:abfb880fd1561987efaefcb2d2ac75145d2a5d0139b1876d5be806e32f630008"},
1643 | {file = "jupyterlab_pygments-0.1.2.tar.gz", hash = "sha256:cfcda0873626150932f438eccf0f8bf22bfa92345b814890ab360d666b254146"},
1644 | ]
1645 | jupyterlab-widgets = [
1646 | {file = "jupyterlab_widgets-1.0.0-py3-none-any.whl", hash = "sha256:caeaf3e6103180e654e7d8d2b81b7d645e59e432487c1d35a41d6d3ee56b3fef"},
1647 | {file = "jupyterlab_widgets-1.0.0.tar.gz", hash = "sha256:5c1a29a84d3069208cb506b10609175b249b6486d6b1cbae8fcde2a11584fb78"},
1648 | ]
1649 | kiwisolver = [
1650 | {file = "kiwisolver-1.3.1-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:fd34fbbfbc40628200730bc1febe30631347103fc8d3d4fa012c21ab9c11eca9"},
1651 | {file = "kiwisolver-1.3.1-cp36-cp36m-manylinux1_i686.whl", hash = "sha256:d3155d828dec1d43283bd24d3d3e0d9c7c350cdfcc0bd06c0ad1209c1bbc36d0"},
1652 | {file = "kiwisolver-1.3.1-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:5a7a7dbff17e66fac9142ae2ecafb719393aaee6a3768c9de2fd425c63b53e21"},
1653 | {file = "kiwisolver-1.3.1-cp36-cp36m-manylinux2014_aarch64.whl", hash = "sha256:f8d6f8db88049a699817fd9178782867bf22283e3813064302ac59f61d95be05"},
1654 | {file = "kiwisolver-1.3.1-cp36-cp36m-manylinux2014_ppc64le.whl", hash = "sha256:5f6ccd3dd0b9739edcf407514016108e2280769c73a85b9e59aa390046dbf08b"},
1655 | {file = "kiwisolver-1.3.1-cp36-cp36m-win32.whl", hash = "sha256:225e2e18f271e0ed8157d7f4518ffbf99b9450fca398d561eb5c4a87d0986dd9"},
1656 | {file = "kiwisolver-1.3.1-cp36-cp36m-win_amd64.whl", hash = "sha256:cf8b574c7b9aa060c62116d4181f3a1a4e821b2ec5cbfe3775809474113748d4"},
1657 | {file = "kiwisolver-1.3.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:232c9e11fd7ac3a470d65cd67e4359eee155ec57e822e5220322d7b2ac84fbf0"},
1658 | {file = "kiwisolver-1.3.1-cp37-cp37m-manylinux1_i686.whl", hash = "sha256:b38694dcdac990a743aa654037ff1188c7a9801ac3ccc548d3341014bc5ca278"},
1659 | {file = "kiwisolver-1.3.1-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:ca3820eb7f7faf7f0aa88de0e54681bddcb46e485beb844fcecbcd1c8bd01689"},
1660 | {file = "kiwisolver-1.3.1-cp37-cp37m-manylinux2014_aarch64.whl", hash = "sha256:c8fd0f1ae9d92b42854b2979024d7597685ce4ada367172ed7c09edf2cef9cb8"},
1661 | {file = "kiwisolver-1.3.1-cp37-cp37m-manylinux2014_ppc64le.whl", hash = "sha256:1e1bc12fb773a7b2ffdeb8380609f4f8064777877b2225dec3da711b421fda31"},
1662 | {file = "kiwisolver-1.3.1-cp37-cp37m-win32.whl", hash = "sha256:72c99e39d005b793fb7d3d4e660aed6b6281b502e8c1eaf8ee8346023c8e03bc"},
1663 | {file = "kiwisolver-1.3.1-cp37-cp37m-win_amd64.whl", hash = "sha256:8be8d84b7d4f2ba4ffff3665bcd0211318aa632395a1a41553250484a871d454"},
1664 | {file = "kiwisolver-1.3.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:31dfd2ac56edc0ff9ac295193eeaea1c0c923c0355bf948fbd99ed6018010b72"},
1665 | {file = "kiwisolver-1.3.1-cp38-cp38-manylinux1_i686.whl", hash = "sha256:563c649cfdef27d081c84e72a03b48ea9408c16657500c312575ae9d9f7bc1c3"},
1666 | {file = "kiwisolver-1.3.1-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:78751b33595f7f9511952e7e60ce858c6d64db2e062afb325985ddbd34b5c131"},
1667 | {file = "kiwisolver-1.3.1-cp38-cp38-manylinux2014_aarch64.whl", hash = "sha256:a357fd4f15ee49b4a98b44ec23a34a95f1e00292a139d6015c11f55774ef10de"},
1668 | {file = "kiwisolver-1.3.1-cp38-cp38-manylinux2014_ppc64le.whl", hash = "sha256:5989db3b3b34b76c09253deeaf7fbc2707616f130e166996606c284395da3f18"},
1669 | {file = "kiwisolver-1.3.1-cp38-cp38-win32.whl", hash = "sha256:c08e95114951dc2090c4a630c2385bef681cacf12636fb0241accdc6b303fd81"},
1670 | {file = "kiwisolver-1.3.1-cp38-cp38-win_amd64.whl", hash = "sha256:44a62e24d9b01ba94ae7a4a6c3fb215dc4af1dde817e7498d901e229aaf50e4e"},
1671 | {file = "kiwisolver-1.3.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:50af681a36b2a1dee1d3c169ade9fdc59207d3c31e522519181e12f1b3ba7000"},
1672 | {file = "kiwisolver-1.3.1-cp39-cp39-manylinux1_i686.whl", hash = "sha256:a53d27d0c2a0ebd07e395e56a1fbdf75ffedc4a05943daf472af163413ce9598"},
1673 | {file = "kiwisolver-1.3.1-cp39-cp39-manylinux1_x86_64.whl", hash = "sha256:834ee27348c4aefc20b479335fd422a2c69db55f7d9ab61721ac8cd83eb78882"},
1674 | {file = "kiwisolver-1.3.1-cp39-cp39-manylinux2014_aarch64.whl", hash = "sha256:5c3e6455341008a054cccee8c5d24481bcfe1acdbc9add30aa95798e95c65621"},
1675 | {file = "kiwisolver-1.3.1-cp39-cp39-manylinux2014_ppc64le.whl", hash = "sha256:acef3d59d47dd85ecf909c359d0fd2c81ed33bdff70216d3956b463e12c38a54"},
1676 | {file = "kiwisolver-1.3.1-cp39-cp39-win32.whl", hash = "sha256:c5518d51a0735b1e6cee1fdce66359f8d2b59c3ca85dc2b0813a8aa86818a030"},
1677 | {file = "kiwisolver-1.3.1-cp39-cp39-win_amd64.whl", hash = "sha256:b9edd0110a77fc321ab090aaa1cfcaba1d8499850a12848b81be2222eab648f6"},
1678 | {file = "kiwisolver-1.3.1-pp36-pypy36_pp73-macosx_10_9_x86_64.whl", hash = "sha256:0cd53f403202159b44528498de18f9285b04482bab2a6fc3f5dd8dbb9352e30d"},
1679 | {file = "kiwisolver-1.3.1-pp36-pypy36_pp73-manylinux2010_x86_64.whl", hash = "sha256:33449715e0101e4d34f64990352bce4095c8bf13bed1b390773fc0a7295967b3"},
1680 | {file = "kiwisolver-1.3.1-pp36-pypy36_pp73-win32.whl", hash = "sha256:401a2e9afa8588589775fe34fc22d918ae839aaaf0c0e96441c0fdbce6d8ebe6"},
1681 | {file = "kiwisolver-1.3.1.tar.gz", hash = "sha256:950a199911a8d94683a6b10321f9345d5a3a8433ec58b217ace979e18f16e248"},
1682 | ]
1683 | markupsafe = [
1684 | {file = "MarkupSafe-2.0.1-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:f9081981fe268bd86831e5c75f7de206ef275defcb82bc70740ae6dc507aee51"},
1685 | {file = "MarkupSafe-2.0.1-cp36-cp36m-manylinux1_i686.whl", hash = "sha256:0955295dd5eec6cb6cc2fe1698f4c6d84af2e92de33fbcac4111913cd100a6ff"},
1686 | {file = "MarkupSafe-2.0.1-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:0446679737af14f45767963a1a9ef7620189912317d095f2d9ffa183a4d25d2b"},
1687 | {file = "MarkupSafe-2.0.1-cp36-cp36m-manylinux2010_i686.whl", hash = "sha256:f826e31d18b516f653fe296d967d700fddad5901ae07c622bb3705955e1faa94"},
1688 | {file = "MarkupSafe-2.0.1-cp36-cp36m-manylinux2010_x86_64.whl", hash = "sha256:fa130dd50c57d53368c9d59395cb5526eda596d3ffe36666cd81a44d56e48872"},
1689 | {file = "MarkupSafe-2.0.1-cp36-cp36m-manylinux2014_aarch64.whl", hash = "sha256:905fec760bd2fa1388bb5b489ee8ee5f7291d692638ea5f67982d968366bef9f"},
1690 | {file = "MarkupSafe-2.0.1-cp36-cp36m-win32.whl", hash = "sha256:6c4ca60fa24e85fe25b912b01e62cb969d69a23a5d5867682dd3e80b5b02581d"},
1691 | {file = "MarkupSafe-2.0.1-cp36-cp36m-win_amd64.whl", hash = "sha256:b2f4bf27480f5e5e8ce285a8c8fd176c0b03e93dcc6646477d4630e83440c6a9"},
1692 | {file = "MarkupSafe-2.0.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:0717a7390a68be14b8c793ba258e075c6f4ca819f15edfc2a3a027c823718567"},
1693 | {file = "MarkupSafe-2.0.1-cp37-cp37m-manylinux1_i686.whl", hash = "sha256:6557b31b5e2c9ddf0de32a691f2312a32f77cd7681d8af66c2692efdbef84c18"},
1694 | {file = "MarkupSafe-2.0.1-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:49e3ceeabbfb9d66c3aef5af3a60cc43b85c33df25ce03d0031a608b0a8b2e3f"},
1695 | {file = "MarkupSafe-2.0.1-cp37-cp37m-manylinux2010_i686.whl", hash = "sha256:d7f9850398e85aba693bb640262d3611788b1f29a79f0c93c565694658f4071f"},
1696 | {file = "MarkupSafe-2.0.1-cp37-cp37m-manylinux2010_x86_64.whl", hash = "sha256:6a7fae0dd14cf60ad5ff42baa2e95727c3d81ded453457771d02b7d2b3f9c0c2"},
1697 | {file = "MarkupSafe-2.0.1-cp37-cp37m-manylinux2014_aarch64.whl", hash = "sha256:b7f2d075102dc8c794cbde1947378051c4e5180d52d276987b8d28a3bd58c17d"},
1698 | {file = "MarkupSafe-2.0.1-cp37-cp37m-win32.whl", hash = "sha256:a30e67a65b53ea0a5e62fe23682cfe22712e01f453b95233b25502f7c61cb415"},
1699 | {file = "MarkupSafe-2.0.1-cp37-cp37m-win_amd64.whl", hash = "sha256:611d1ad9a4288cf3e3c16014564df047fe08410e628f89805e475368bd304914"},
1700 | {file = "MarkupSafe-2.0.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:be98f628055368795d818ebf93da628541e10b75b41c559fdf36d104c5787066"},
1701 | {file = "MarkupSafe-2.0.1-cp38-cp38-manylinux1_i686.whl", hash = "sha256:1d609f577dc6e1aa17d746f8bd3c31aa4d258f4070d61b2aa5c4166c1539de35"},
1702 | {file = "MarkupSafe-2.0.1-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:7d91275b0245b1da4d4cfa07e0faedd5b0812efc15b702576d103293e252af1b"},
1703 | {file = "MarkupSafe-2.0.1-cp38-cp38-manylinux2010_i686.whl", hash = "sha256:01a9b8ea66f1658938f65b93a85ebe8bc016e6769611be228d797c9d998dd298"},
1704 | {file = "MarkupSafe-2.0.1-cp38-cp38-manylinux2010_x86_64.whl", hash = "sha256:47ab1e7b91c098ab893b828deafa1203de86d0bc6ab587b160f78fe6c4011f75"},
1705 | {file = "MarkupSafe-2.0.1-cp38-cp38-manylinux2014_aarch64.whl", hash = "sha256:97383d78eb34da7e1fa37dd273c20ad4320929af65d156e35a5e2d89566d9dfb"},
1706 | {file = "MarkupSafe-2.0.1-cp38-cp38-win32.whl", hash = "sha256:023cb26ec21ece8dc3907c0e8320058b2e0cb3c55cf9564da612bc325bed5e64"},
1707 | {file = "MarkupSafe-2.0.1-cp38-cp38-win_amd64.whl", hash = "sha256:984d76483eb32f1bcb536dc27e4ad56bba4baa70be32fa87152832cdd9db0833"},
1708 | {file = "MarkupSafe-2.0.1-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:2ef54abee730b502252bcdf31b10dacb0a416229b72c18b19e24a4509f273d26"},
1709 | {file = "MarkupSafe-2.0.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:3c112550557578c26af18a1ccc9e090bfe03832ae994343cfdacd287db6a6ae7"},
1710 | {file = "MarkupSafe-2.0.1-cp39-cp39-manylinux1_i686.whl", hash = "sha256:53edb4da6925ad13c07b6d26c2a852bd81e364f95301c66e930ab2aef5b5ddd8"},
1711 | {file = "MarkupSafe-2.0.1-cp39-cp39-manylinux1_x86_64.whl", hash = "sha256:f5653a225f31e113b152e56f154ccbe59eeb1c7487b39b9d9f9cdb58e6c79dc5"},
1712 | {file = "MarkupSafe-2.0.1-cp39-cp39-manylinux2010_i686.whl", hash = "sha256:4efca8f86c54b22348a5467704e3fec767b2db12fc39c6d963168ab1d3fc9135"},
1713 | {file = "MarkupSafe-2.0.1-cp39-cp39-manylinux2010_x86_64.whl", hash = "sha256:ab3ef638ace319fa26553db0624c4699e31a28bb2a835c5faca8f8acf6a5a902"},
1714 | {file = "MarkupSafe-2.0.1-cp39-cp39-manylinux2014_aarch64.whl", hash = "sha256:f8ba0e8349a38d3001fae7eadded3f6606f0da5d748ee53cc1dab1d6527b9509"},
1715 | {file = "MarkupSafe-2.0.1-cp39-cp39-win32.whl", hash = "sha256:10f82115e21dc0dfec9ab5c0223652f7197feb168c940f3ef61563fc2d6beb74"},
1716 | {file = "MarkupSafe-2.0.1-cp39-cp39-win_amd64.whl", hash = "sha256:693ce3f9e70a6cf7d2fb9e6c9d8b204b6b39897a2c4a1aa65728d5ac97dcc1d8"},
1717 | {file = "MarkupSafe-2.0.1.tar.gz", hash = "sha256:594c67807fb16238b30c44bdf74f36c02cdf22d1c8cda91ef8a0ed8dabf5620a"},
1718 | ]
1719 | matplotlib = [
1720 | {file = "matplotlib-3.4.2-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:c541ee5a3287efe066bbe358320853cf4916bc14c00c38f8f3d8d75275a405a9"},
1721 | {file = "matplotlib-3.4.2-cp37-cp37m-manylinux1_i686.whl", hash = "sha256:3a5c18dbd2c7c366da26a4ad1462fe3e03a577b39e3b503bbcf482b9cdac093c"},
1722 | {file = "matplotlib-3.4.2-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:a9d8cb5329df13e0cdaa14b3b43f47b5e593ec637f13f14db75bb16e46178b05"},
1723 | {file = "matplotlib-3.4.2-cp37-cp37m-manylinux2014_aarch64.whl", hash = "sha256:7ad19f3fb6145b9eb41c08e7cbb9f8e10b91291396bee21e9ce761bb78df63ec"},
1724 | {file = "matplotlib-3.4.2-cp37-cp37m-win32.whl", hash = "sha256:7a58f3d8fe8fac3be522c79d921c9b86e090a59637cb88e3bc51298d7a2c862a"},
1725 | {file = "matplotlib-3.4.2-cp37-cp37m-win_amd64.whl", hash = "sha256:6382bc6e2d7e481bcd977eb131c31dee96e0fb4f9177d15ec6fb976d3b9ace1a"},
1726 | {file = "matplotlib-3.4.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:6a6a44f27aabe720ec4fd485061e8a35784c2b9ffa6363ad546316dfc9cea04e"},
1727 | {file = "matplotlib-3.4.2-cp38-cp38-manylinux1_i686.whl", hash = "sha256:1c1779f7ab7d8bdb7d4c605e6ffaa0614b3e80f1e3c8ccf7b9269a22dbc5986b"},
1728 | {file = "matplotlib-3.4.2-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:5826f56055b9b1c80fef82e326097e34dc4af8c7249226b7dd63095a686177d1"},
1729 | {file = "matplotlib-3.4.2-cp38-cp38-manylinux2014_aarch64.whl", hash = "sha256:0bea5ec5c28d49020e5d7923c2725b837e60bc8be99d3164af410eb4b4c827da"},
1730 | {file = "matplotlib-3.4.2-cp38-cp38-win32.whl", hash = "sha256:6475d0209024a77f869163ec3657c47fed35d9b6ed8bccba8aa0f0099fbbdaa8"},
1731 | {file = "matplotlib-3.4.2-cp38-cp38-win_amd64.whl", hash = "sha256:21b31057bbc5e75b08e70a43cefc4c0b2c2f1b1a850f4a0f7af044eb4163086c"},
1732 | {file = "matplotlib-3.4.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:b26535b9de85326e6958cdef720ecd10bcf74a3f4371bf9a7e5b2e659c17e153"},
1733 | {file = "matplotlib-3.4.2-cp39-cp39-manylinux1_i686.whl", hash = "sha256:32fa638cc10886885d1ca3d409d4473d6a22f7ceecd11322150961a70fab66dd"},
1734 | {file = "matplotlib-3.4.2-cp39-cp39-manylinux1_x86_64.whl", hash = "sha256:956c8849b134b4a343598305a3ca1bdd3094f01f5efc8afccdebeffe6b315247"},
1735 | {file = "matplotlib-3.4.2-cp39-cp39-manylinux2014_aarch64.whl", hash = "sha256:85f191bb03cb1a7b04b5c2cca4792bef94df06ef473bc49e2818105671766fee"},
1736 | {file = "matplotlib-3.4.2-cp39-cp39-win32.whl", hash = "sha256:b1d5a2cedf5de05567c441b3a8c2651fbde56df08b82640e7f06c8cd91e201f6"},
1737 | {file = "matplotlib-3.4.2-cp39-cp39-win_amd64.whl", hash = "sha256:df815378a754a7edd4559f8c51fc7064f779a74013644a7f5ac7a0c31f875866"},
1738 | {file = "matplotlib-3.4.2.tar.gz", hash = "sha256:d8d994cefdff9aaba45166eb3de4f5211adb4accac85cbf97137e98f26ea0219"},
1739 | ]
1740 | matplotlib-inline = [
1741 | {file = "matplotlib-inline-0.1.2.tar.gz", hash = "sha256:f41d5ff73c9f5385775d5c0bc13b424535c8402fe70ea8210f93e11f3683993e"},
1742 | {file = "matplotlib_inline-0.1.2-py3-none-any.whl", hash = "sha256:5cf1176f554abb4fa98cb362aa2b55c500147e4bdbb07e3fda359143e1da0811"},
1743 | ]
1744 | mistune = [
1745 | {file = "mistune-0.8.4-py2.py3-none-any.whl", hash = "sha256:88a1051873018da288eee8538d476dffe1262495144b33ecb586c4ab266bb8d4"},
1746 | {file = "mistune-0.8.4.tar.gz", hash = "sha256:59a3429db53c50b5c6bcc8a07f8848cb00d7dc8bdb431a4ab41920d201d4756e"},
1747 | ]
1748 | mnist = [
1749 | {file = "mnist-0.2.2-py2.py3-none-any.whl", hash = "sha256:80e2b07992e5cc61e6247751ce8926f6d15ab3ebde1508d9bbc8891a766c7b91"},
1750 | {file = "mnist-0.2.2.tar.gz", hash = "sha256:24934fade9fbbd8adc98713ba805282e7e579224e888169bb5c8ab777efa7b54"},
1751 | ]
1752 | more-itertools = [
1753 | {file = "more-itertools-8.8.0.tar.gz", hash = "sha256:83f0308e05477c68f56ea3a888172c78ed5d5b3c282addb67508e7ba6c8f813a"},
1754 | {file = "more_itertools-8.8.0-py3-none-any.whl", hash = "sha256:2cf89ec599962f2ddc4d568a05defc40e0a587fbc10d5989713638864c36be4d"},
1755 | ]
1756 | nbclient = [
1757 | {file = "nbclient-0.5.3-py3-none-any.whl", hash = "sha256:e79437364a2376892b3f46bedbf9b444e5396cfb1bc366a472c37b48e9551500"},
1758 | {file = "nbclient-0.5.3.tar.gz", hash = "sha256:db17271330c68c8c88d46d72349e24c147bb6f34ec82d8481a8f025c4d26589c"},
1759 | ]
1760 | nbconvert = [
1761 | {file = "nbconvert-6.1.0-py3-none-any.whl", hash = "sha256:37cd92ff2ae6a268e62075ff8b16129e0be4939c4dfcee53dc77cc8a7e06c684"},
1762 | {file = "nbconvert-6.1.0.tar.gz", hash = "sha256:d22a8ff202644d31db254d24d52c3a96c82156623fcd7c7f987bba2612303ec9"},
1763 | ]
1764 | nbformat = [
1765 | {file = "nbformat-5.1.3-py3-none-any.whl", hash = "sha256:eb8447edd7127d043361bc17f2f5a807626bc8e878c7709a1c647abda28a9171"},
1766 | {file = "nbformat-5.1.3.tar.gz", hash = "sha256:b516788ad70771c6250977c1374fcca6edebe6126fd2adb5a69aa5c2356fd1c8"},
1767 | ]
1768 | nest-asyncio = [
1769 | {file = "nest_asyncio-1.5.1-py3-none-any.whl", hash = "sha256:76d6e972265063fe92a90b9cc4fb82616e07d586b346ed9d2c89a4187acea39c"},
1770 | {file = "nest_asyncio-1.5.1.tar.gz", hash = "sha256:afc5a1c515210a23c461932765691ad39e8eba6551c055ac8d5546e69250d0aa"},
1771 | ]
1772 | nose = [
1773 | {file = "nose-1.3.7-py2-none-any.whl", hash = "sha256:dadcddc0aefbf99eea214e0f1232b94f2fa9bd98fa8353711dacb112bfcbbb2a"},
1774 | {file = "nose-1.3.7-py3-none-any.whl", hash = "sha256:9ff7c6cc443f8c51994b34a667bbcf45afd6d945be7477b52e97516fd17c53ac"},
1775 | {file = "nose-1.3.7.tar.gz", hash = "sha256:f1bffef9cbc82628f6e7d7b40d7e255aefaa1adb6a1b1d26c69a8b79e6208a98"},
1776 | ]
1777 | notebook = [
1778 | {file = "notebook-6.4.0-py3-none-any.whl", hash = "sha256:f7f0a71a999c7967d9418272ae4c3378a220bd28330fbfb49860e46cf8a5838a"},
1779 | {file = "notebook-6.4.0.tar.gz", hash = "sha256:9c4625e2a2aa49d6eae4ce20cbc3d8976db19267e32d2a304880e0c10bf8aef9"},
1780 | ]
1781 | numpy = [
1782 | {file = "numpy-1.21.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:d5caa946a9f55511e76446e170bdad1d12d6b54e17a2afe7b189112ed4412bb8"},
1783 | {file = "numpy-1.21.0-cp37-cp37m-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:ac4fd578322842dbda8d968e3962e9f22e862b6ec6e3378e7415625915e2da4d"},
1784 | {file = "numpy-1.21.0-cp37-cp37m-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:598fe100b2948465cf3ed64b1a326424b5e4be2670552066e17dfaa67246011d"},
1785 | {file = "numpy-1.21.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7c55407f739f0bfcec67d0df49103f9333edc870061358ac8a8c9e37ea02fcd2"},
1786 | {file = "numpy-1.21.0-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:75579acbadbf74e3afd1153da6177f846212ea2a0cc77de53523ae02c9256513"},
1787 | {file = "numpy-1.21.0-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:cc367c86eb87e5b7c9592935620f22d13b090c609f1b27e49600cd033b529f54"},
1788 | {file = "numpy-1.21.0-cp37-cp37m-win32.whl", hash = "sha256:d89b0dc7f005090e32bb4f9bf796e1dcca6b52243caf1803fdd2b748d8561f63"},
1789 | {file = "numpy-1.21.0-cp37-cp37m-win_amd64.whl", hash = "sha256:eda2829af498946c59d8585a9fd74da3f810866e05f8df03a86f70079c7531dd"},
1790 | {file = "numpy-1.21.0-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:1a784e8ff7ea2a32e393cc53eb0003eca1597c7ca628227e34ce34eb11645a0e"},
1791 | {file = "numpy-1.21.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:bba474a87496d96e61461f7306fba2ebba127bed7836212c360f144d1e72ac54"},
1792 | {file = "numpy-1.21.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:fd0a359c1c17f00cb37de2969984a74320970e0ceef4808c32e00773b06649d9"},
1793 | {file = "numpy-1.21.0-cp38-cp38-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:e4d5a86a5257843a18fb1220c5f1c199532bc5d24e849ed4b0289fb59fbd4d8f"},
1794 | {file = "numpy-1.21.0-cp38-cp38-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:620732f42259eb2c4642761bd324462a01cdd13dd111740ce3d344992dd8492f"},
1795 | {file = "numpy-1.21.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b9205711e5440954f861ceeea8f1b415d7dd15214add2e878b4d1cf2bcb1a914"},
1796 | {file = "numpy-1.21.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:ad09f55cc95ed8d80d8ab2052f78cc21cb231764de73e229140d81ff49d8145e"},
1797 | {file = "numpy-1.21.0-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:a1f2fb2da242568af0271455b89aee0f71e4e032086ee2b4c5098945d0e11cf6"},
1798 | {file = "numpy-1.21.0-cp38-cp38-win32.whl", hash = "sha256:e58ddb53a7b4959932f5582ac455ff90dcb05fac3f8dcc8079498d43afbbde6c"},
1799 | {file = "numpy-1.21.0-cp38-cp38-win_amd64.whl", hash = "sha256:d2910d0a075caed95de1a605df00ee03b599de5419d0b95d55342e9a33ad1fb3"},
1800 | {file = "numpy-1.21.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:a290989cd671cd0605e9c91a70e6df660f73ae87484218e8285c6522d29f6e38"},
1801 | {file = "numpy-1.21.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:3537b967b350ad17633b35c2f4b1a1bbd258c018910b518c30b48c8e41272717"},
1802 | {file = "numpy-1.21.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:ccc6c650f8700ce1e3a77668bb7c43e45c20ac06ae00d22bdf6760b38958c883"},
1803 | {file = "numpy-1.21.0-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:709884863def34d72b183d074d8ba5cfe042bc3ff8898f1ffad0209161caaa99"},
1804 | {file = "numpy-1.21.0-cp39-cp39-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:bebab3eaf0641bba26039fb0b2c5bf9b99407924b53b1ea86e03c32c64ef5aef"},
1805 | {file = "numpy-1.21.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cf680682ad0a3bef56dae200dbcbac2d57294a73e5b0f9864955e7dd7c2c2491"},
1806 | {file = "numpy-1.21.0-cp39-cp39-win32.whl", hash = "sha256:d95d16204cd51ff1a1c8d5f9958ce90ae190be81d348b514f9be39f878b8044a"},
1807 | {file = "numpy-1.21.0-cp39-cp39-win_amd64.whl", hash = "sha256:2ba579dde0563f47021dcd652253103d6fd66165b18011dce1a0609215b2791e"},
1808 | {file = "numpy-1.21.0-pp37-pypy37_pp73-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:3c40e6b860220ed862e8097b8f81c9af6d7405b723f4a7af24a267b46f90e461"},
1809 | {file = "numpy-1.21.0.zip", hash = "sha256:e80fe25cba41c124d04c662f33f6364909b985f2eb5998aaa5ae4b9587242cce"},
1810 | ]
1811 | packaging = [
1812 | {file = "packaging-20.9-py2.py3-none-any.whl", hash = "sha256:67714da7f7bc052e064859c05c595155bd1ee9f69f76557e21f051443c20947a"},
1813 | {file = "packaging-20.9.tar.gz", hash = "sha256:5b327ac1320dc863dca72f4514ecc086f31186744b84a230374cc1fd776feae5"},
1814 | ]
1815 | pandas = [
1816 | {file = "pandas-1.1.5-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:bf23a3b54d128b50f4f9d4675b3c1857a688cc6731a32f931837d72effb2698d"},
1817 | {file = "pandas-1.1.5-cp36-cp36m-manylinux1_i686.whl", hash = "sha256:5a780260afc88268a9d3ac3511d8f494fdcf637eece62fb9eb656a63d53eb7ca"},
1818 | {file = "pandas-1.1.5-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:b61080750d19a0122469ab59b087380721d6b72a4e7d962e4d7e63e0c4504814"},
1819 | {file = "pandas-1.1.5-cp36-cp36m-manylinux2014_aarch64.whl", hash = "sha256:0de3ddb414d30798cbf56e642d82cac30a80223ad6fe484d66c0ce01a84d6f2f"},
1820 | {file = "pandas-1.1.5-cp36-cp36m-win32.whl", hash = "sha256:70865f96bb38fec46f7ebd66d4b5cfd0aa6b842073f298d621385ae3898d28b5"},
1821 | {file = "pandas-1.1.5-cp36-cp36m-win_amd64.whl", hash = "sha256:19a2148a1d02791352e9fa637899a78e371a3516ac6da5c4edc718f60cbae648"},
1822 | {file = "pandas-1.1.5-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:26fa92d3ac743a149a31b21d6f4337b0594b6302ea5575b37af9ca9611e8981a"},
1823 | {file = "pandas-1.1.5-cp37-cp37m-manylinux1_i686.whl", hash = "sha256:c16d59c15d946111d2716856dd5479221c9e4f2f5c7bc2d617f39d870031e086"},
1824 | {file = "pandas-1.1.5-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:3be7a7a0ca71a2640e81d9276f526bca63505850add10206d0da2e8a0a325dae"},
1825 | {file = "pandas-1.1.5-cp37-cp37m-manylinux2014_aarch64.whl", hash = "sha256:573fba5b05bf2c69271a32e52399c8de599e4a15ab7cec47d3b9c904125ab788"},
1826 | {file = "pandas-1.1.5-cp37-cp37m-win32.whl", hash = "sha256:21b5a2b033380adbdd36b3116faaf9a4663e375325831dac1b519a44f9e439bb"},
1827 | {file = "pandas-1.1.5-cp37-cp37m-win_amd64.whl", hash = "sha256:24c7f8d4aee71bfa6401faeba367dd654f696a77151a8a28bc2013f7ced4af98"},
1828 | {file = "pandas-1.1.5-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:2860a97cbb25444ffc0088b457da0a79dc79f9c601238a3e0644312fcc14bf11"},
1829 | {file = "pandas-1.1.5-cp38-cp38-manylinux1_i686.whl", hash = "sha256:5008374ebb990dad9ed48b0f5d0038124c73748f5384cc8c46904dace27082d9"},
1830 | {file = "pandas-1.1.5-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:2c2f7c670ea4e60318e4b7e474d56447cf0c7d83b3c2a5405a0dbb2600b9c48e"},
1831 | {file = "pandas-1.1.5-cp38-cp38-manylinux2014_aarch64.whl", hash = "sha256:0a643bae4283a37732ddfcecab3f62dd082996021b980f580903f4e8e01b3c5b"},
1832 | {file = "pandas-1.1.5-cp38-cp38-win32.whl", hash = "sha256:5447ea7af4005b0daf695a316a423b96374c9c73ffbd4533209c5ddc369e644b"},
1833 | {file = "pandas-1.1.5-cp38-cp38-win_amd64.whl", hash = "sha256:4c62e94d5d49db116bef1bd5c2486723a292d79409fc9abd51adf9e05329101d"},
1834 | {file = "pandas-1.1.5-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:731568be71fba1e13cae212c362f3d2ca8932e83cb1b85e3f1b4dd77d019254a"},
1835 | {file = "pandas-1.1.5-cp39-cp39-manylinux1_i686.whl", hash = "sha256:c61c043aafb69329d0f961b19faa30b1dab709dd34c9388143fc55680059e55a"},
1836 | {file = "pandas-1.1.5-cp39-cp39-manylinux1_x86_64.whl", hash = "sha256:2b1c6cd28a0dfda75c7b5957363333f01d370936e4c6276b7b8e696dd500582a"},
1837 | {file = "pandas-1.1.5-cp39-cp39-win32.whl", hash = "sha256:c94ff2780a1fd89f190390130d6d36173ca59fcfb3fe0ff596f9a56518191ccb"},
1838 | {file = "pandas-1.1.5-cp39-cp39-win_amd64.whl", hash = "sha256:edda9bacc3843dfbeebaf7a701763e68e741b08fccb889c003b0a52f0ee95782"},
1839 | {file = "pandas-1.1.5.tar.gz", hash = "sha256:f10fc41ee3c75a474d3bdf68d396f10782d013d7f67db99c0efbfd0acb99701b"},
1840 | ]
1841 | pandocfilters = [
1842 | {file = "pandocfilters-1.4.3.tar.gz", hash = "sha256:bc63fbb50534b4b1f8ebe1860889289e8af94a23bff7445259592df25a3906eb"},
1843 | ]
1844 | parso = [
1845 | {file = "parso-0.8.2-py2.py3-none-any.whl", hash = "sha256:a8c4922db71e4fdb90e0d0bc6e50f9b273d3397925e5e60a717e719201778d22"},
1846 | {file = "parso-0.8.2.tar.gz", hash = "sha256:12b83492c6239ce32ff5eed6d3639d6a536170723c6f3f1506869f1ace413398"},
1847 | ]
1848 | pexpect = [
1849 | {file = "pexpect-4.8.0-py2.py3-none-any.whl", hash = "sha256:0b48a55dcb3c05f3329815901ea4fc1537514d6ba867a152b581d69ae3710937"},
1850 | {file = "pexpect-4.8.0.tar.gz", hash = "sha256:fc65a43959d153d0114afe13997d439c22823a27cefceb5ff35c2178c6784c0c"},
1851 | ]
1852 | pickleshare = [
1853 | {file = "pickleshare-0.7.5-py2.py3-none-any.whl", hash = "sha256:9649af414d74d4df115d5d718f82acb59c9d418196b7b4290ed47a12ce62df56"},
1854 | {file = "pickleshare-0.7.5.tar.gz", hash = "sha256:87683d47965c1da65cdacaf31c8441d12b8044cdec9aca500cd78fc2c683afca"},
1855 | ]
1856 | pillow = [
1857 | {file = "Pillow-8.2.0-cp36-cp36m-macosx_10_10_x86_64.whl", hash = "sha256:dc38f57d8f20f06dd7c3161c59ca2c86893632623f33a42d592f097b00f720a9"},
1858 | {file = "Pillow-8.2.0-cp36-cp36m-manylinux1_i686.whl", hash = "sha256:a013cbe25d20c2e0c4e85a9daf438f85121a4d0344ddc76e33fd7e3965d9af4b"},
1859 | {file = "Pillow-8.2.0-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:8bb1e155a74e1bfbacd84555ea62fa21c58e0b4e7e6b20e4447b8d07990ac78b"},
1860 | {file = "Pillow-8.2.0-cp36-cp36m-manylinux2014_aarch64.whl", hash = "sha256:c5236606e8570542ed424849f7852a0ff0bce2c4c8d0ba05cc202a5a9c97dee9"},
1861 | {file = "Pillow-8.2.0-cp36-cp36m-win32.whl", hash = "sha256:12e5e7471f9b637762453da74e390e56cc43e486a88289995c1f4c1dc0bfe727"},
1862 | {file = "Pillow-8.2.0-cp36-cp36m-win_amd64.whl", hash = "sha256:5afe6b237a0b81bd54b53f835a153770802f164c5570bab5e005aad693dab87f"},
1863 | {file = "Pillow-8.2.0-cp37-cp37m-macosx_10_10_x86_64.whl", hash = "sha256:cb7a09e173903541fa888ba010c345893cd9fc1b5891aaf060f6ca77b6a3722d"},
1864 | {file = "Pillow-8.2.0-cp37-cp37m-manylinux1_i686.whl", hash = "sha256:0d19d70ee7c2ba97631bae1e7d4725cdb2ecf238178096e8c82ee481e189168a"},
1865 | {file = "Pillow-8.2.0-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:083781abd261bdabf090ad07bb69f8f5599943ddb539d64497ed021b2a67e5a9"},
1866 | {file = "Pillow-8.2.0-cp37-cp37m-manylinux2014_aarch64.whl", hash = "sha256:c6b39294464b03457f9064e98c124e09008b35a62e3189d3513e5148611c9388"},
1867 | {file = "Pillow-8.2.0-cp37-cp37m-win32.whl", hash = "sha256:01425106e4e8cee195a411f729cff2a7d61813b0b11737c12bd5991f5f14bcd5"},
1868 | {file = "Pillow-8.2.0-cp37-cp37m-win_amd64.whl", hash = "sha256:3b570f84a6161cf8865c4e08adf629441f56e32f180f7aa4ccbd2e0a5a02cba2"},
1869 | {file = "Pillow-8.2.0-cp38-cp38-macosx_10_10_x86_64.whl", hash = "sha256:031a6c88c77d08aab84fecc05c3cde8414cd6f8406f4d2b16fed1e97634cc8a4"},
1870 | {file = "Pillow-8.2.0-cp38-cp38-manylinux1_i686.whl", hash = "sha256:66cc56579fd91f517290ab02c51e3a80f581aba45fd924fcdee01fa06e635812"},
1871 | {file = "Pillow-8.2.0-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:6c32cc3145928c4305d142ebec682419a6c0a8ce9e33db900027ddca1ec39178"},
1872 | {file = "Pillow-8.2.0-cp38-cp38-manylinux2014_aarch64.whl", hash = "sha256:624b977355cde8b065f6d51b98497d6cd5fbdd4f36405f7a8790e3376125e2bb"},
1873 | {file = "Pillow-8.2.0-cp38-cp38-win32.whl", hash = "sha256:5cbf3e3b1014dddc45496e8cf38b9f099c95a326275885199f427825c6522232"},
1874 | {file = "Pillow-8.2.0-cp38-cp38-win_amd64.whl", hash = "sha256:463822e2f0d81459e113372a168f2ff59723e78528f91f0bd25680ac185cf797"},
1875 | {file = "Pillow-8.2.0-cp39-cp39-macosx_10_10_x86_64.whl", hash = "sha256:95d5ef984eff897850f3a83883363da64aae1000e79cb3c321915468e8c6add5"},
1876 | {file = "Pillow-8.2.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:b91c36492a4bbb1ee855b7d16fe51379e5f96b85692dc8210831fbb24c43e484"},
1877 | {file = "Pillow-8.2.0-cp39-cp39-manylinux1_i686.whl", hash = "sha256:d68cb92c408261f806b15923834203f024110a2e2872ecb0bd2a110f89d3c602"},
1878 | {file = "Pillow-8.2.0-cp39-cp39-manylinux1_x86_64.whl", hash = "sha256:f217c3954ce5fd88303fc0c317af55d5e0204106d86dea17eb8205700d47dec2"},
1879 | {file = "Pillow-8.2.0-cp39-cp39-manylinux2014_aarch64.whl", hash = "sha256:5b70110acb39f3aff6b74cf09bb4169b167e2660dabc304c1e25b6555fa781ef"},
1880 | {file = "Pillow-8.2.0-cp39-cp39-win32.whl", hash = "sha256:a7d5e9fad90eff8f6f6106d3b98b553a88b6f976e51fce287192a5d2d5363713"},
1881 | {file = "Pillow-8.2.0-cp39-cp39-win_amd64.whl", hash = "sha256:238c197fc275b475e87c1453b05b467d2d02c2915fdfdd4af126145ff2e4610c"},
1882 | {file = "Pillow-8.2.0-pp36-pypy36_pp73-macosx_10_10_x86_64.whl", hash = "sha256:0e04d61f0064b545b989126197930807c86bcbd4534d39168f4aa5fda39bb8f9"},
1883 | {file = "Pillow-8.2.0-pp36-pypy36_pp73-manylinux2010_i686.whl", hash = "sha256:63728564c1410d99e6d1ae8e3b810fe012bc440952168af0a2877e8ff5ab96b9"},
1884 | {file = "Pillow-8.2.0-pp36-pypy36_pp73-manylinux2010_x86_64.whl", hash = "sha256:c03c07ed32c5324939b19e36ae5f75c660c81461e312a41aea30acdd46f93a7c"},
1885 | {file = "Pillow-8.2.0-pp37-pypy37_pp73-macosx_10_10_x86_64.whl", hash = "sha256:4d98abdd6b1e3bf1a1cbb14c3895226816e666749ac040c4e2554231068c639b"},
1886 | {file = "Pillow-8.2.0-pp37-pypy37_pp73-manylinux2010_i686.whl", hash = "sha256:aac00e4bc94d1b7813fe882c28990c1bc2f9d0e1aa765a5f2b516e8a6a16a9e4"},
1887 | {file = "Pillow-8.2.0-pp37-pypy37_pp73-manylinux2010_x86_64.whl", hash = "sha256:22fd0f42ad15dfdde6c581347eaa4adb9a6fc4b865f90b23378aa7914895e120"},
1888 | {file = "Pillow-8.2.0-pp37-pypy37_pp73-win32.whl", hash = "sha256:e98eca29a05913e82177b3ba3d198b1728e164869c613d76d0de4bde6768a50e"},
1889 | {file = "Pillow-8.2.0.tar.gz", hash = "sha256:a787ab10d7bb5494e5f76536ac460741788f1fbce851068d73a87ca7c35fc3e1"},
1890 | ]
1891 | pluggy = [
1892 | {file = "pluggy-0.13.1-py2.py3-none-any.whl", hash = "sha256:966c145cd83c96502c3c3868f50408687b38434af77734af1e9ca461a4081d2d"},
1893 | {file = "pluggy-0.13.1.tar.gz", hash = "sha256:15b2acde666561e1298d71b523007ed7364de07029219b604cf808bfa1c765b0"},
1894 | ]
1895 | prometheus-client = [
1896 | {file = "prometheus_client-0.11.0-py2.py3-none-any.whl", hash = "sha256:b014bc76815eb1399da8ce5fc84b7717a3e63652b0c0f8804092c9363acab1b2"},
1897 | {file = "prometheus_client-0.11.0.tar.gz", hash = "sha256:3a8baade6cb80bcfe43297e33e7623f3118d660d41387593758e2fb1ea173a86"},
1898 | ]
1899 | prompt-toolkit = [
1900 | {file = "prompt_toolkit-3.0.19-py3-none-any.whl", hash = "sha256:7089d8d2938043508aa9420ec18ce0922885304cddae87fb96eebca942299f88"},
1901 | {file = "prompt_toolkit-3.0.19.tar.gz", hash = "sha256:08360ee3a3148bdb5163621709ee322ec34fc4375099afa4bbf751e9b7b7fa4f"},
1902 | ]
1903 | protobuf = [
1904 | {file = "protobuf-3.19.4-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:f51d5a9f137f7a2cec2d326a74b6e3fc79d635d69ffe1b036d39fc7d75430d37"},
1905 | {file = "protobuf-3.19.4-cp310-cp310-manylinux2014_aarch64.whl", hash = "sha256:09297b7972da685ce269ec52af761743714996b4381c085205914c41fcab59fb"},
1906 | {file = "protobuf-3.19.4-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:072fbc78d705d3edc7ccac58a62c4c8e0cec856987da7df8aca86e647be4e35c"},
1907 | {file = "protobuf-3.19.4-cp310-cp310-win32.whl", hash = "sha256:7bb03bc2873a2842e5ebb4801f5c7ff1bfbdf426f85d0172f7644fcda0671ae0"},
1908 | {file = "protobuf-3.19.4-cp310-cp310-win_amd64.whl", hash = "sha256:f358aa33e03b7a84e0d91270a4d4d8f5df6921abe99a377828839e8ed0c04e07"},
1909 | {file = "protobuf-3.19.4-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:1c91ef4110fdd2c590effb5dca8fdbdcb3bf563eece99287019c4204f53d81a4"},
1910 | {file = "protobuf-3.19.4-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c438268eebb8cf039552897d78f402d734a404f1360592fef55297285f7f953f"},
1911 | {file = "protobuf-3.19.4-cp36-cp36m-win32.whl", hash = "sha256:835a9c949dc193953c319603b2961c5c8f4327957fe23d914ca80d982665e8ee"},
1912 | {file = "protobuf-3.19.4-cp36-cp36m-win_amd64.whl", hash = "sha256:4276cdec4447bd5015453e41bdc0c0c1234eda08420b7c9a18b8d647add51e4b"},
1913 | {file = "protobuf-3.19.4-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:6cbc312be5e71869d9d5ea25147cdf652a6781cf4d906497ca7690b7b9b5df13"},
1914 | {file = "protobuf-3.19.4-cp37-cp37m-manylinux2014_aarch64.whl", hash = "sha256:54a1473077f3b616779ce31f477351a45b4fef8c9fd7892d6d87e287a38df368"},
1915 | {file = "protobuf-3.19.4-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:435bb78b37fc386f9275a7035fe4fb1364484e38980d0dd91bc834a02c5ec909"},
1916 | {file = "protobuf-3.19.4-cp37-cp37m-win32.whl", hash = "sha256:16f519de1313f1b7139ad70772e7db515b1420d208cb16c6d7858ea989fc64a9"},
1917 | {file = "protobuf-3.19.4-cp37-cp37m-win_amd64.whl", hash = "sha256:cdc076c03381f5c1d9bb1abdcc5503d9ca8b53cf0a9d31a9f6754ec9e6c8af0f"},
1918 | {file = "protobuf-3.19.4-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:69da7d39e39942bd52848438462674c463e23963a1fdaa84d88df7fbd7e749b2"},
1919 | {file = "protobuf-3.19.4-cp38-cp38-manylinux2014_aarch64.whl", hash = "sha256:48ed3877fa43e22bcacc852ca76d4775741f9709dd9575881a373bd3e85e54b2"},
1920 | {file = "protobuf-3.19.4-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bd95d1dfb9c4f4563e6093a9aa19d9c186bf98fa54da5252531cc0d3a07977e7"},
1921 | {file = "protobuf-3.19.4-cp38-cp38-win32.whl", hash = "sha256:b38057450a0c566cbd04890a40edf916db890f2818e8682221611d78dc32ae26"},
1922 | {file = "protobuf-3.19.4-cp38-cp38-win_amd64.whl", hash = "sha256:7ca7da9c339ca8890d66958f5462beabd611eca6c958691a8fe6eccbd1eb0c6e"},
1923 | {file = "protobuf-3.19.4-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:36cecbabbda242915529b8ff364f2263cd4de7c46bbe361418b5ed859677ba58"},
1924 | {file = "protobuf-3.19.4-cp39-cp39-manylinux2014_aarch64.whl", hash = "sha256:c1068287025f8ea025103e37d62ffd63fec8e9e636246b89c341aeda8a67c934"},
1925 | {file = "protobuf-3.19.4-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:96bd766831596d6014ca88d86dc8fe0fb2e428c0b02432fd9db3943202bf8c5e"},
1926 | {file = "protobuf-3.19.4-cp39-cp39-win32.whl", hash = "sha256:84123274d982b9e248a143dadd1b9815049f4477dc783bf84efe6250eb4b836a"},
1927 | {file = "protobuf-3.19.4-cp39-cp39-win_amd64.whl", hash = "sha256:3112b58aac3bac9c8be2b60a9daf6b558ca3f7681c130dcdd788ade7c9ffbdca"},
1928 | {file = "protobuf-3.19.4-py2.py3-none-any.whl", hash = "sha256:8961c3a78ebfcd000920c9060a262f082f29838682b1f7201889300c1fbe0616"},
1929 | {file = "protobuf-3.19.4.tar.gz", hash = "sha256:9df0c10adf3e83015ced42a9a7bd64e13d06c4cf45c340d2c63020ea04499d0a"},
1930 | ]
1931 | ptyprocess = [
1932 | {file = "ptyprocess-0.7.0-py2.py3-none-any.whl", hash = "sha256:4b41f3967fce3af57cc7e94b888626c18bf37a083e3651ca8feeb66d492fef35"},
1933 | {file = "ptyprocess-0.7.0.tar.gz", hash = "sha256:5c5d0a3b48ceee0b48485e0c26037c0acd7d29765ca3fbb5cb3831d347423220"},
1934 | ]
1935 | py = [
1936 | {file = "py-1.10.0-py2.py3-none-any.whl", hash = "sha256:3b80836aa6d1feeaa108e046da6423ab8f6ceda6468545ae8d02d9d58d18818a"},
1937 | {file = "py-1.10.0.tar.gz", hash = "sha256:21b81bda15b66ef5e1a777a21c4dcd9c20ad3efd0b3f817e7a809035269e1bd3"},
1938 | ]
1939 | pyarrow = [
1940 | {file = "pyarrow-7.0.0-cp310-cp310-macosx_10_13_universal2.whl", hash = "sha256:0f15213f380539c9640cb2413dc677b55e70f04c9e98cfc2e1d8b36c770e1036"},
1941 | {file = "pyarrow-7.0.0-cp310-cp310-macosx_10_13_x86_64.whl", hash = "sha256:29c4e3b3be0b94d07ff4921a5e410fc690a3a066a850a302fc504de5fc638495"},
1942 | {file = "pyarrow-7.0.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:8a9bfc8a016bcb8f9a8536d2fa14a890b340bc7a236275cd60fd4fb8b93ff405"},
1943 | {file = "pyarrow-7.0.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:49d431ed644a3e8f53ae2bbf4b514743570b495b5829548db51610534b6eeee7"},
1944 | {file = "pyarrow-7.0.0-cp310-cp310-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:aa6442a321c1e49480b3d436f7d631c895048a16df572cf71c23c6b53c45ed66"},
1945 | {file = "pyarrow-7.0.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f6b01a23cb401750092c6f7c4dcae67cd8fd6b99ae710e26f654f23508f25f25"},
1946 | {file = "pyarrow-7.0.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0f10928745c6ff66e121552731409803bed86c66ac79c64c90438b053b5242c5"},
1947 | {file = "pyarrow-7.0.0-cp310-cp310-win_amd64.whl", hash = "sha256:759090caa1474cafb5e68c93a9bd6cb45d8bb8e4f2cad2f1a0cc9439bae8ae88"},
1948 | {file = "pyarrow-7.0.0-cp37-cp37m-macosx_10_13_x86_64.whl", hash = "sha256:e3fe34bcfc28d9c4a747adc3926d2307a04c5c50b89155946739515ccfe5eab0"},
1949 | {file = "pyarrow-7.0.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:040dce5345603e4e621bcf4f3b21f18d557852e7b15307e559bb14c8951c8714"},
1950 | {file = "pyarrow-7.0.0-cp37-cp37m-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:ed4b647c3345ae3463d341a9d28d0260cd302fb92ecf4e2e3e0f1656d6e0e55c"},
1951 | {file = "pyarrow-7.0.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e7fecd5d5604f47e003f50887a42aee06cb8b7bf8e8bf7dc543a22331d9ba832"},
1952 | {file = "pyarrow-7.0.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1f2d00b892fe865e43346acb78761ba268f8bb1cbdba588816590abcb780ee3d"},
1953 | {file = "pyarrow-7.0.0-cp37-cp37m-win_amd64.whl", hash = "sha256:f439f7d77201681fd31391d189aa6b1322d27c9311a8f2fce7d23972471b02b6"},
1954 | {file = "pyarrow-7.0.0-cp38-cp38-macosx_10_13_x86_64.whl", hash = "sha256:3e06b0e29ce1e32f219c670c6b31c33d25a5b8e29c7828f873373aab78bf30a5"},
1955 | {file = "pyarrow-7.0.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:13dc05bcf79dbc1bd2de1b05d26eb64824b85883d019d81ca3c2eca9b68b5a44"},
1956 | {file = "pyarrow-7.0.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:06183a7ff2b0c030ec0413fc4dc98abad8cf336c78c280a0b7f4bcbebb78d125"},
1957 | {file = "pyarrow-7.0.0-cp38-cp38-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:702c5a9f960b56d03569eaaca2c1a05e8728f05ea1a2138ef64234aa53cd5884"},
1958 | {file = "pyarrow-7.0.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c7313038203df77ec4092d6363dbc0945071caa72635f365f2b1ae0dd7469865"},
1959 | {file = "pyarrow-7.0.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e87d1f7dc7a0b2ecaeb0c7a883a85710f5b5626d4134454f905571c04bc73d5a"},
1960 | {file = "pyarrow-7.0.0-cp38-cp38-win_amd64.whl", hash = "sha256:ba69488ae25c7fde1a2ae9ea29daf04d676de8960ffd6f82e1e13ca945bb5861"},
1961 | {file = "pyarrow-7.0.0-cp39-cp39-macosx_10_13_universal2.whl", hash = "sha256:11a591f11d2697c751261c9d57e6e5b0d38fdc7f0cc57f4fd6edc657da7737df"},
1962 | {file = "pyarrow-7.0.0-cp39-cp39-macosx_10_13_x86_64.whl", hash = "sha256:6183c700877852dc0f8a76d4c0c2ffd803ba459e2b4a452e355c2d58d48cf39f"},
1963 | {file = "pyarrow-7.0.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:d1748154714b543e6ae8452a68d4af85caf5298296a7e5d4d00f1b3021838ac6"},
1964 | {file = "pyarrow-7.0.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:fcc8f934c7847a88f13ec35feecffb61fe63bb7a3078bd98dd353762e969ce60"},
1965 | {file = "pyarrow-7.0.0-cp39-cp39-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:759f59ac77b84878dbd54d06cf6df74ff781b8e7cf9313eeffbb5ec97b94385c"},
1966 | {file = "pyarrow-7.0.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3d3e3f93ac2993df9c5e1922eab7bdea047b9da918a74e52145399bc1f0099a3"},
1967 | {file = "pyarrow-7.0.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:306120af554e7e137895254a3b4741fad682875a5f6403509cd276de3fe5b844"},
1968 | {file = "pyarrow-7.0.0-cp39-cp39-win_amd64.whl", hash = "sha256:087769dac6e567d58d59b94c4f866b3356c00d3db5b261387ece47e7324c2150"},
1969 | {file = "pyarrow-7.0.0.tar.gz", hash = "sha256:da656cad3c23a2ebb6a307ab01d35fce22f7850059cffafcb90d12590f8f4f38"},
1970 | ]
1971 | pycodestyle = [
1972 | {file = "pycodestyle-2.7.0-py2.py3-none-any.whl", hash = "sha256:514f76d918fcc0b55c6680472f0a37970994e07bbb80725808c17089be302068"},
1973 | {file = "pycodestyle-2.7.0.tar.gz", hash = "sha256:c389c1d06bf7904078ca03399a4816f974a1d590090fecea0c63ec26ebaf1cef"},
1974 | ]
1975 | pycparser = [
1976 | {file = "pycparser-2.20-py2.py3-none-any.whl", hash = "sha256:7582ad22678f0fcd81102833f60ef8d0e57288b6b5fb00323d101be910e35705"},
1977 | {file = "pycparser-2.20.tar.gz", hash = "sha256:2d475327684562c3a96cc71adf7dc8c4f0565175cf86b6d7a404ff4c771f15f0"},
1978 | ]
1979 | pydeck = [
1980 | {file = "pydeck-0.7.1-py2.py3-none-any.whl", hash = "sha256:7fc49b00840608068b930f9269169c7c9f3198b8b4635c934ba6d887c4e54503"},
1981 | {file = "pydeck-0.7.1.tar.gz", hash = "sha256:907601c99f7510e16d27d7cb62bfa145216d166a2b5c9c50cfe2b65b032ebd2e"},
1982 | ]
1983 | pygments = [
1984 | {file = "Pygments-2.9.0-py3-none-any.whl", hash = "sha256:d66e804411278594d764fc69ec36ec13d9ae9147193a1740cd34d272ca383b8e"},
1985 | {file = "Pygments-2.9.0.tar.gz", hash = "sha256:a18f47b506a429f6f4b9df81bb02beab9ca21d0a5fee38ed15aef65f0545519f"},
1986 | ]
1987 | pympler = [
1988 | {file = "Pympler-1.0.1-py3-none-any.whl", hash = "sha256:d260dda9ae781e1eab6ea15bacb84015849833ba5555f141d2d9b7b7473b307d"},
1989 | {file = "Pympler-1.0.1.tar.gz", hash = "sha256:993f1a3599ca3f4fcd7160c7545ad06310c9e12f70174ae7ae8d4e25f6c5d3fa"},
1990 | ]
1991 | pyparsing = [
1992 | {file = "pyparsing-2.4.7-py2.py3-none-any.whl", hash = "sha256:ef9d7589ef3c200abe66653d3f1ab1033c3c419ae9b9bdb1240a85b024efc88b"},
1993 | {file = "pyparsing-2.4.7.tar.gz", hash = "sha256:c203ec8783bf771a155b207279b9bccb8dea02d8f0c9e5f8ead507bc3246ecc1"},
1994 | ]
1995 | pyrsistent = [
1996 | {file = "pyrsistent-0.17.3.tar.gz", hash = "sha256:2e636185d9eb976a18a8a8e96efce62f2905fea90041958d8cc2a189756ebf3e"},
1997 | ]
1998 | pytest = [
1999 | {file = "pytest-5.4.3-py3-none-any.whl", hash = "sha256:5c0db86b698e8f170ba4582a492248919255fcd4c79b1ee64ace34301fb589a1"},
2000 | {file = "pytest-5.4.3.tar.gz", hash = "sha256:7979331bfcba207414f5e1263b5a0f8f521d0f457318836a7355531ed1a4c7d8"},
2001 | ]
2002 | python-dateutil = [
2003 | {file = "python-dateutil-2.8.1.tar.gz", hash = "sha256:73ebfe9dbf22e832286dafa60473e4cd239f8592f699aa5adaf10050e6e1823c"},
2004 | {file = "python_dateutil-2.8.1-py2.py3-none-any.whl", hash = "sha256:75bb3f31ea686f1197762692a9ee6a7550b59fc6ca3a1f4b5d7e32fb98e2da2a"},
2005 | ]
2006 | pytz = [
2007 | {file = "pytz-2021.3-py2.py3-none-any.whl", hash = "sha256:3672058bc3453457b622aab7a1c3bfd5ab0bdae451512f6cf25f64ed37f5b87c"},
2008 | {file = "pytz-2021.3.tar.gz", hash = "sha256:acad2d8b20a1af07d4e4c9d2e9285c5ed9104354062f275f3fcd88dcef4f1326"},
2009 | ]
2010 | pytz-deprecation-shim = [
2011 | {file = "pytz_deprecation_shim-0.1.0.post0-py2.py3-none-any.whl", hash = "sha256:8314c9692a636c8eb3bda879b9f119e350e93223ae83e70e80c31675a0fdc1a6"},
2012 | {file = "pytz_deprecation_shim-0.1.0.post0.tar.gz", hash = "sha256:af097bae1b616dde5c5744441e2ddc69e74dfdcb0c263129610d85b87445a59d"},
2013 | ]
2014 | pywin32 = [
2015 | {file = "pywin32-301-cp35-cp35m-win32.whl", hash = "sha256:93367c96e3a76dfe5003d8291ae16454ca7d84bb24d721e0b74a07610b7be4a7"},
2016 | {file = "pywin32-301-cp35-cp35m-win_amd64.whl", hash = "sha256:9635df6998a70282bd36e7ac2a5cef9ead1627b0a63b17c731312c7a0daebb72"},
2017 | {file = "pywin32-301-cp36-cp36m-win32.whl", hash = "sha256:c866f04a182a8cb9b7855de065113bbd2e40524f570db73ef1ee99ff0a5cc2f0"},
2018 | {file = "pywin32-301-cp36-cp36m-win_amd64.whl", hash = "sha256:dafa18e95bf2a92f298fe9c582b0e205aca45c55f989937c52c454ce65b93c78"},
2019 | {file = "pywin32-301-cp37-cp37m-win32.whl", hash = "sha256:98f62a3f60aa64894a290fb7494bfa0bfa0a199e9e052e1ac293b2ad3cd2818b"},
2020 | {file = "pywin32-301-cp37-cp37m-win_amd64.whl", hash = "sha256:fb3b4933e0382ba49305cc6cd3fb18525df7fd96aa434de19ce0878133bf8e4a"},
2021 | {file = "pywin32-301-cp38-cp38-win32.whl", hash = "sha256:88981dd3cfb07432625b180f49bf4e179fb8cbb5704cd512e38dd63636af7a17"},
2022 | {file = "pywin32-301-cp38-cp38-win_amd64.whl", hash = "sha256:8c9d33968aa7fcddf44e47750e18f3d034c3e443a707688a008a2e52bbef7e96"},
2023 | {file = "pywin32-301-cp39-cp39-win32.whl", hash = "sha256:595d397df65f1b2e0beaca63a883ae6d8b6df1cdea85c16ae85f6d2e648133fe"},
2024 | {file = "pywin32-301-cp39-cp39-win_amd64.whl", hash = "sha256:87604a4087434cd814ad8973bd47d6524bd1fa9e971ce428e76b62a5e0860fdf"},
2025 | ]
2026 | pywinpty = [
2027 | {file = "pywinpty-1.1.3-cp36-none-win_amd64.whl", hash = "sha256:81dc6f16d917b756e06fc58943e9750d59dbefc0ffd2086871d3fa5f33824446"},
2028 | {file = "pywinpty-1.1.3-cp37-none-win_amd64.whl", hash = "sha256:54557887e712ea3215ab0d9f089ed55a6cc8d826cd5d1e340d75300654c9663f"},
2029 | {file = "pywinpty-1.1.3-cp38-none-win_amd64.whl", hash = "sha256:f5e25197397f1fef0362caf3eb89f25441827a1e48bf15827c27021592fd2160"},
2030 | {file = "pywinpty-1.1.3-cp39-none-win_amd64.whl", hash = "sha256:b767276224f86b7560eb9173ba7956758cafcdfab97bb33837d42d2a0f1dbf67"},
2031 | {file = "pywinpty-1.1.3.tar.gz", hash = "sha256:3a1d57b338390333812a5eed31c93c7d8ba82b131078063703e731946d90c9f2"},
2032 | ]
2033 | pyzmq = [
2034 | {file = "pyzmq-22.1.0-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:4e9b9a2f6944acdaf57316436c1acdcb30b8df76726bcf570ad9342bc5001654"},
2035 | {file = "pyzmq-22.1.0-cp36-cp36m-manylinux1_i686.whl", hash = "sha256:24fb5bb641f0b2aa25fc3832f4b6fc62430f14a7d328229fe994b2bcdc07c93a"},
2036 | {file = "pyzmq-22.1.0-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:c4674004ed64685a38bee222cd75afa769424ec603f9329f0dd4777138337f48"},
2037 | {file = "pyzmq-22.1.0-cp36-cp36m-manylinux2014_aarch64.whl", hash = "sha256:461ed80d741692d9457ab820b1cc057ba9c37c394e67b647b639f623c8b321f6"},
2038 | {file = "pyzmq-22.1.0-cp36-cp36m-win32.whl", hash = "sha256:de5806be66c9108e4dcdaced084e8ceae14100aa559e2d57b4f0cceb98c462de"},
2039 | {file = "pyzmq-22.1.0-cp36-cp36m-win_amd64.whl", hash = "sha256:a1c77796f395804d6002ff56a6a8168c1f98579896897ad7e35665a9b4a9eec5"},
2040 | {file = "pyzmq-22.1.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:c6a81c9e6754465d09a87e3acd74d9bb1f0039b2d785c6899622f0afdb41d760"},
2041 | {file = "pyzmq-22.1.0-cp37-cp37m-manylinux1_i686.whl", hash = "sha256:0f0f27eaab9ba7b92d73d71c51d1a04464a1da6097a252d007922103253d2313"},
2042 | {file = "pyzmq-22.1.0-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:4b8fb1b3174b56fd020e4b10232b1764e52cf7f3babcfb460c5253bdc48adad0"},
2043 | {file = "pyzmq-22.1.0-cp37-cp37m-manylinux2014_aarch64.whl", hash = "sha256:c8fff75af4c7af92dce9f81fa2a83ed009c3e1f33ee8b5222db2ef80b94e242e"},
2044 | {file = "pyzmq-22.1.0-cp37-cp37m-win32.whl", hash = "sha256:cb9f9fe1305ef69b65794655fd89b2209b11bff3e837de981820a8aa051ef914"},
2045 | {file = "pyzmq-22.1.0-cp37-cp37m-win_amd64.whl", hash = "sha256:bf80b2cec42d96117248b99d3c86e263a00469c840a778e6cb52d916f4fdf82c"},
2046 | {file = "pyzmq-22.1.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:0ea7f4237991b0f745a4432c63e888450840bf8cb6c48b93fb7d62864f455529"},
2047 | {file = "pyzmq-22.1.0-cp38-cp38-manylinux2010_i686.whl", hash = "sha256:12ffcf33db6ba7c0e5aaf901e65517f5e2b719367b80bcbfad692f546a297c7a"},
2048 | {file = "pyzmq-22.1.0-cp38-cp38-manylinux2010_x86_64.whl", hash = "sha256:d3ecfee2ee8d91ab2e08d2d8e89302c729b244e302bbc39c5b5dde42306ff003"},
2049 | {file = "pyzmq-22.1.0-cp38-cp38-manylinux2014_aarch64.whl", hash = "sha256:68e2c4505992ab5b89f976f89a9135742b18d60068f761bef994a6805f1cae0c"},
2050 | {file = "pyzmq-22.1.0-cp38-cp38-win32.whl", hash = "sha256:285514956c08c7830da9d94e01f5414661a987831bd9f95e4d89cc8aaae8da10"},
2051 | {file = "pyzmq-22.1.0-cp38-cp38-win_amd64.whl", hash = "sha256:d5e5be93e1714a59a535bbbc086b9e4fd2448c7547c5288548f6fd86353cad9e"},
2052 | {file = "pyzmq-22.1.0-cp39-cp39-macosx_10_15_universal2.whl", hash = "sha256:b2f707b52e09098a7770503e39294ca6e22ae5138ffa1dd36248b6436d23d78e"},
2053 | {file = "pyzmq-22.1.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:18dd2ca4540c476558099891c129e6f94109971d110b549db2a9775c817cedbd"},
2054 | {file = "pyzmq-22.1.0-cp39-cp39-manylinux2010_i686.whl", hash = "sha256:c6d0c32532a0519997e1ded767e184ebb8543bdb351f8eff8570bd461e874efc"},
2055 | {file = "pyzmq-22.1.0-cp39-cp39-manylinux2010_x86_64.whl", hash = "sha256:9ee48413a2d3cd867fd836737b4c89c24cea1150a37f4856d82d20293fa7519f"},
2056 | {file = "pyzmq-22.1.0-cp39-cp39-manylinux2014_aarch64.whl", hash = "sha256:4c4fe69c7dc0d13d4ae180ad650bb900854367f3349d3c16f0569f6c6447f698"},
2057 | {file = "pyzmq-22.1.0-cp39-cp39-win32.whl", hash = "sha256:fc712a90401bcbf3fa25747f189d6dcfccbecc32712701cad25c6355589dac57"},
2058 | {file = "pyzmq-22.1.0-cp39-cp39-win_amd64.whl", hash = "sha256:68be16107f41563b9f67d93dff1c9f5587e0f76aa8fd91dc04c83d813bcdab1f"},
2059 | {file = "pyzmq-22.1.0-pp36-pypy36_pp73-macosx_10_9_x86_64.whl", hash = "sha256:734ea6565c71fc2d03d5b8c7d0d7519c96bb5567e0396da1b563c24a4ac66f0c"},
2060 | {file = "pyzmq-22.1.0-pp36-pypy36_pp73-manylinux2010_x86_64.whl", hash = "sha256:1389b615917d4196962a9b469e947ba862a8ec6f5094a47da5e7a8d404bc07a4"},
2061 | {file = "pyzmq-22.1.0-pp36-pypy36_pp73-win32.whl", hash = "sha256:41049cff5265e9cd75606aa2c90a76b9c80b98d8fe70ee08cf4af3cedb113358"},
2062 | {file = "pyzmq-22.1.0-pp37-pypy37_pp73-macosx_10_9_x86_64.whl", hash = "sha256:f49755684a963731479ff3035d45a8185545b4c9f662d368bd349c419839886d"},
2063 | {file = "pyzmq-22.1.0-pp37-pypy37_pp73-manylinux2010_x86_64.whl", hash = "sha256:6355f81947e1fe6e7bb9e123aeb3067264391d3ebe8402709f824ef8673fa6f3"},
2064 | {file = "pyzmq-22.1.0-pp37-pypy37_pp73-win32.whl", hash = "sha256:089b974ec04d663b8685ac90e86bfe0e4da9d911ff3cf52cb765ff22408b102d"},
2065 | {file = "pyzmq-22.1.0.tar.gz", hash = "sha256:7040d6dd85ea65703904d023d7f57fab793d7ffee9ba9e14f3b897f34ff2415d"},
2066 | ]
2067 | qtconsole = [
2068 | {file = "qtconsole-5.1.0-py3-none-any.whl", hash = "sha256:3a2adecc43ff201a08972fb2179df22e7b3a08d71b9ed680f46ad1bfd4fb9132"},
2069 | {file = "qtconsole-5.1.0.tar.gz", hash = "sha256:12c734494901658787339dea9bbd82f3dc0d5e394071377a1c77b4a0954d7d8b"},
2070 | ]
2071 | qtpy = [
2072 | {file = "QtPy-1.9.0-py2.py3-none-any.whl", hash = "sha256:fa0b8363b363e89b2a6f49eddc162a04c0699ae95e109a6be3bb145a913190ea"},
2073 | {file = "QtPy-1.9.0.tar.gz", hash = "sha256:2db72c44b55d0fe1407be8fba35c838ad0d6d3bb81f23007886dc1fc0f459c8d"},
2074 | ]
2075 | requests = [
2076 | {file = "requests-2.25.1-py2.py3-none-any.whl", hash = "sha256:c210084e36a42ae6b9219e00e48287def368a26d03a048ddad7bfee44f75871e"},
2077 | {file = "requests-2.25.1.tar.gz", hash = "sha256:27973dd4a904a4f13b263a19c866c13b92a39ed1c964655f025f3f8d3d75b804"},
2078 | ]
2079 | scipy = [
2080 | {file = "scipy-1.6.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:a15a1f3fc0abff33e792d6049161b7795909b40b97c6cc2934ed54384017ab76"},
2081 | {file = "scipy-1.6.1-cp37-cp37m-manylinux1_i686.whl", hash = "sha256:e79570979ccdc3d165456dd62041d9556fb9733b86b4b6d818af7a0afc15f092"},
2082 | {file = "scipy-1.6.1-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:a423533c55fec61456dedee7b6ee7dce0bb6bfa395424ea374d25afa262be261"},
2083 | {file = "scipy-1.6.1-cp37-cp37m-manylinux2014_aarch64.whl", hash = "sha256:33d6b7df40d197bdd3049d64e8e680227151673465e5d85723b3b8f6b15a6ced"},
2084 | {file = "scipy-1.6.1-cp37-cp37m-win32.whl", hash = "sha256:6725e3fbb47da428794f243864f2297462e9ee448297c93ed1dcbc44335feb78"},
2085 | {file = "scipy-1.6.1-cp37-cp37m-win_amd64.whl", hash = "sha256:5fa9c6530b1661f1370bcd332a1e62ca7881785cc0f80c0d559b636567fab63c"},
2086 | {file = "scipy-1.6.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:bd50daf727f7c195e26f27467c85ce653d41df4358a25b32434a50d8870fc519"},
2087 | {file = "scipy-1.6.1-cp38-cp38-manylinux1_i686.whl", hash = "sha256:f46dd15335e8a320b0fb4685f58b7471702234cba8bb3442b69a3e1dc329c345"},
2088 | {file = "scipy-1.6.1-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:0e5b0ccf63155d90da576edd2768b66fb276446c371b73841e3503be1d63fb5d"},
2089 | {file = "scipy-1.6.1-cp38-cp38-manylinux2014_aarch64.whl", hash = "sha256:2481efbb3740977e3c831edfd0bd9867be26387cacf24eb5e366a6a374d3d00d"},
2090 | {file = "scipy-1.6.1-cp38-cp38-win32.whl", hash = "sha256:68cb4c424112cd4be886b4d979c5497fba190714085f46b8ae67a5e4416c32b4"},
2091 | {file = "scipy-1.6.1-cp38-cp38-win_amd64.whl", hash = "sha256:5f331eeed0297232d2e6eea51b54e8278ed8bb10b099f69c44e2558c090d06bf"},
2092 | {file = "scipy-1.6.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:0c8a51d33556bf70367452d4d601d1742c0e806cd0194785914daf19775f0e67"},
2093 | {file = "scipy-1.6.1-cp39-cp39-manylinux1_i686.whl", hash = "sha256:83bf7c16245c15bc58ee76c5418e46ea1811edcc2e2b03041b804e46084ab627"},
2094 | {file = "scipy-1.6.1-cp39-cp39-manylinux1_x86_64.whl", hash = "sha256:794e768cc5f779736593046c9714e0f3a5940bc6dcc1dba885ad64cbfb28e9f0"},
2095 | {file = "scipy-1.6.1-cp39-cp39-manylinux2014_aarch64.whl", hash = "sha256:5da5471aed911fe7e52b86bf9ea32fb55ae93e2f0fac66c32e58897cfb02fa07"},
2096 | {file = "scipy-1.6.1-cp39-cp39-win32.whl", hash = "sha256:8e403a337749ed40af60e537cc4d4c03febddcc56cd26e774c9b1b600a70d3e4"},
2097 | {file = "scipy-1.6.1-cp39-cp39-win_amd64.whl", hash = "sha256:a5193a098ae9f29af283dcf0041f762601faf2e595c0db1da929875b7570353f"},
2098 | {file = "scipy-1.6.1.tar.gz", hash = "sha256:c4fceb864890b6168e79b0e714c585dbe2fd4222768ee90bc1aa0f8218691b11"},
2099 | ]
2100 | send2trash = [
2101 | {file = "Send2Trash-1.7.1-py3-none-any.whl", hash = "sha256:c20fee8c09378231b3907df9c215ec9766a84ee20053d99fbad854fe8bd42159"},
2102 | {file = "Send2Trash-1.7.1.tar.gz", hash = "sha256:17730aa0a33ab82ed6ca76be3bb25f0433d0014f1ccf63c979bab13a5b9db2b2"},
2103 | ]
2104 | six = [
2105 | {file = "six-1.16.0-py2.py3-none-any.whl", hash = "sha256:8abb2f1d86890a2dfb989f9a77cfcfd3e47c2a354b01111771326f8aa26e0254"},
2106 | {file = "six-1.16.0.tar.gz", hash = "sha256:1e61c37477a1626458e36f7b1d82aa5c9b094fa4802892072e49de9c60c4c926"},
2107 | ]
2108 | smmap = [
2109 | {file = "smmap-5.0.0-py3-none-any.whl", hash = "sha256:2aba19d6a040e78d8b09de5c57e96207b09ed71d8e55ce0959eeee6c8e190d94"},
2110 | {file = "smmap-5.0.0.tar.gz", hash = "sha256:c840e62059cd3be204b0c9c9f74be2c09d5648eddd4580d9314c3ecde0b30936"},
2111 | ]
2112 | streamlit = [
2113 | {file = "streamlit-1.5.1-py2.py3-none-any.whl", hash = "sha256:65eb527816cf93532dcec2aaaac8e48b304b830b1147beaef41d5e50db85334e"},
2114 | {file = "streamlit-1.5.1.tar.gz", hash = "sha256:94f6dc49a607a2fa909ee286d2120769b69af1899573bc56568301eee0b3b76a"},
2115 | ]
2116 | tensorflow-probability = [
2117 | {file = "tensorflow_probability-0.13.0-py2.py3-none-any.whl", hash = "sha256:308c05998731d0de077a81f4537bef34523cab406fdae09e3e11854d45a075bb"},
2118 | ]
2119 | terminado = [
2120 | {file = "terminado-0.10.1-py3-none-any.whl", hash = "sha256:c89ace5bffd0e7268bdcf22526830eb787fd146ff9d78691a0528386f92b9ae3"},
2121 | {file = "terminado-0.10.1.tar.gz", hash = "sha256:89d5dac2f4e2b39758a0ff9a3b643707c95a020a6df36e70583b88297cd59cbe"},
2122 | ]
2123 | testpath = [
2124 | {file = "testpath-0.5.0-py3-none-any.whl", hash = "sha256:8044f9a0bab6567fc644a3593164e872543bb44225b0e24846e2c89237937589"},
2125 | {file = "testpath-0.5.0.tar.gz", hash = "sha256:1acf7a0bcd3004ae8357409fc33751e16d37ccc650921da1094a86581ad1e417"},
2126 | ]
2127 | toml = [
2128 | {file = "toml-0.10.2-py2.py3-none-any.whl", hash = "sha256:806143ae5bfb6a3c6e736a764057db0e6a0e05e338b5630894a5f779cabb4f9b"},
2129 | {file = "toml-0.10.2.tar.gz", hash = "sha256:b3bda1d108d5dd99f4a20d24d9c348e91c4db7ab1b749200bded2f839ccbe68f"},
2130 | ]
2131 | toolz = [
2132 | {file = "toolz-0.11.2-py3-none-any.whl", hash = "sha256:a5700ce83414c64514d82d60bcda8aabfde092d1c1a8663f9200c07fdcc6da8f"},
2133 | {file = "toolz-0.11.2.tar.gz", hash = "sha256:6b312d5e15138552f1bda8a4e66c30e236c831b612b2bf0005f8a1df10a4bc33"},
2134 | ]
2135 | torch = [
2136 | {file = "torch-1.9.0-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:3a2d070cf28860d285d4ab156f3954c0c1d12f4c037aa312a7c029227c0d106b"},
2137 | {file = "torch-1.9.0-cp36-cp36m-manylinux2014_aarch64.whl", hash = "sha256:b296e65e25081af147af936f1e3a1f17f583a9afacfa5309742678ffef728ace"},
2138 | {file = "torch-1.9.0-cp36-cp36m-win_amd64.whl", hash = "sha256:117098d4924b260a24a47c6b3fe37f2ae41f04a2ea2eff9f553ae9210b12fa54"},
2139 | {file = "torch-1.9.0-cp36-none-macosx_10_9_x86_64.whl", hash = "sha256:d6103b9a634993bd967337a1149f9d8b23922f42a3660676239399e15c1b4515"},
2140 | {file = "torch-1.9.0-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:0164673908e6b291ace592d382eba3e258b3bad009b8078cad8f3b9e00d8f23e"},
2141 | {file = "torch-1.9.0-cp37-cp37m-manylinux2014_aarch64.whl", hash = "sha256:52548b45efff772fe3810fe91daf34f981ac0ca1a7227f6226fd5693f53b5b88"},
2142 | {file = "torch-1.9.0-cp37-cp37m-win_amd64.whl", hash = "sha256:62c0a7e433681d0861494d1ede96d2485e4dbb3ea8fd867e8419addebf5de1af"},
2143 | {file = "torch-1.9.0-cp37-none-macosx_10_9_x86_64.whl", hash = "sha256:d88333091fd1627894bbf0d6dcef58a90e36bdf0d90a5d4675b5e07e72075511"},
2144 | {file = "torch-1.9.0-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:1d8139dcc864f48dc316376384f50e47a459284ad1cb84449242f4964e25aaec"},
2145 | {file = "torch-1.9.0-cp38-cp38-manylinux2014_aarch64.whl", hash = "sha256:0aa4cca3f16fab40cb8dae6a49d0eccdc8f4ead9d1a6428cd9ba12befe082b2a"},
2146 | {file = "torch-1.9.0-cp38-cp38-win_amd64.whl", hash = "sha256:646de1bef85d6c7590e98f8ea52e47acdcf58330982e4f5d73f5ca28dea2d552"},
2147 | {file = "torch-1.9.0-cp38-none-macosx_10_9_x86_64.whl", hash = "sha256:e596f0105f748cf09d4763152d8157aaf58d5231232eaf2c5673d4562ba86ad3"},
2148 | {file = "torch-1.9.0-cp38-none-macosx_11_0_arm64.whl", hash = "sha256:ecc7193fff7741ced3db1f760666c8454d6664956288c54d1b49613b987a42f4"},
2149 | {file = "torch-1.9.0-cp39-cp39-manylinux1_x86_64.whl", hash = "sha256:95eeec3a6c42fd35aca552777b7d9979ed489760423de97c0118a45e849a61f4"},
2150 | {file = "torch-1.9.0-cp39-cp39-manylinux2014_aarch64.whl", hash = "sha256:8a2b2012b3c7d6019e189496688fa77de7029a220840b406d8302d1c8021a11c"},
2151 | {file = "torch-1.9.0-cp39-cp39-win_amd64.whl", hash = "sha256:7e2b14fe5b3a8266cbe2f6740c0195497507974ced7bc21e99971561913a0c28"},
2152 | {file = "torch-1.9.0-cp39-none-macosx_10_9_x86_64.whl", hash = "sha256:0a9e74b5057463ce4e55d9332a5670993fc9e1299c52e1740e505eda106fb355"},
2153 | {file = "torch-1.9.0-cp39-none-macosx_11_0_arm64.whl", hash = "sha256:569ead6ae6bb0e636df0fc8af660ef03260e630dc5f2f4cf3198027e7b6bb481"},
2154 | ]
2155 | torchvision = [
2156 | {file = "torchvision-0.10.0-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:f26c5ba220445ee8e892033234485c9276304874e87ec9d5146779167be3148d"},
2157 | {file = "torchvision-0.10.0-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:d5c80cf058c0ecb010a97dc71225f5274e45c596bfad7505e0d000abcccb7063"},
2158 | {file = "torchvision-0.10.0-cp36-cp36m-manylinux2014_aarch64.whl", hash = "sha256:6d69bf15a6e885e3b8c674a524bc6b53016879cb8b0fd8537327edd2d243cab1"},
2159 | {file = "torchvision-0.10.0-cp36-cp36m-win_amd64.whl", hash = "sha256:6b917d4762deaaa4c0cdd106403ea8384a1fdf93de424097bd71f3ebfdc76b41"},
2160 | {file = "torchvision-0.10.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:a405d968e7e94c0744870eef31c977635e2123b0b46becc1461a28b7c27d3c0c"},
2161 | {file = "torchvision-0.10.0-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:9597da592f76d22d9e80a4a072294e093f8c3a06c404f3ff237f359b9225e097"},
2162 | {file = "torchvision-0.10.0-cp37-cp37m-manylinux2014_aarch64.whl", hash = "sha256:ce2aae5567522f2a877c6334796721af07c164e94ff75876821fadb3310cfe7e"},
2163 | {file = "torchvision-0.10.0-cp37-cp37m-win_amd64.whl", hash = "sha256:576d7b070f25cbfc78a710960fd8fa6d3961d640db05f7ace69d9a3e5bbf754a"},
2164 | {file = "torchvision-0.10.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:ad24107b2ed0ccc372af92822f1f8f5530907b6fb7520a08195cf0bb07446923"},
2165 | {file = "torchvision-0.10.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:bb04708354fb6d639f6e47d8066b0d546fbe0a3a68685cf8d413a6370c8f63ad"},
2166 | {file = "torchvision-0.10.0-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:aa709fa63896f93e03a03976230a51050fcd5f1b45cf663f62d91b7eaaf8ac09"},
2167 | {file = "torchvision-0.10.0-cp38-cp38-manylinux2014_aarch64.whl", hash = "sha256:4796e1fb2995c6e495c5ea4e2b0fe0e4be44bd9416ef4a1349c1a406675cbdee"},
2168 | {file = "torchvision-0.10.0-cp38-cp38-win_amd64.whl", hash = "sha256:487bbfd89575a52cd18bca8a33e24c373570e060f801265051c3a0aafc769720"},
2169 | {file = "torchvision-0.10.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:f68291559a4cf1245c95efc5e47ebe158819aceec4e1f585d2fe133cd2c9d8e8"},
2170 | {file = "torchvision-0.10.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:ae9606cc248de9b3a077710529b11c57315d2914c8ee3099fbd93a62f56a1661"},
2171 | {file = "torchvision-0.10.0-cp39-cp39-manylinux1_x86_64.whl", hash = "sha256:20a57ce42fa20c26d800c65d5b88dbaaa115a01f4f5623d41abfb182b854f199"},
2172 | {file = "torchvision-0.10.0-cp39-cp39-manylinux2014_aarch64.whl", hash = "sha256:a30466893a5b97073c992859f3645e3e1f41daf2c1b4db6cb2ac8ec7d0e1f6bc"},
2173 | {file = "torchvision-0.10.0-cp39-cp39-win_amd64.whl", hash = "sha256:da65af25b51caf43327ecb3ccf550eedfd62d1f73511db44370b4b9522569b8d"},
2174 | ]
2175 | tornado = [
2176 | {file = "tornado-6.1-cp35-cp35m-macosx_10_9_x86_64.whl", hash = "sha256:d371e811d6b156d82aa5f9a4e08b58debf97c302a35714f6f45e35139c332e32"},
2177 | {file = "tornado-6.1-cp35-cp35m-manylinux1_i686.whl", hash = "sha256:0d321a39c36e5f2c4ff12b4ed58d41390460f798422c4504e09eb5678e09998c"},
2178 | {file = "tornado-6.1-cp35-cp35m-manylinux1_x86_64.whl", hash = "sha256:9de9e5188a782be6b1ce866e8a51bc76a0fbaa0e16613823fc38e4fc2556ad05"},
2179 | {file = "tornado-6.1-cp35-cp35m-manylinux2010_i686.whl", hash = "sha256:61b32d06ae8a036a6607805e6720ef00a3c98207038444ba7fd3d169cd998910"},
2180 | {file = "tornado-6.1-cp35-cp35m-manylinux2010_x86_64.whl", hash = "sha256:3e63498f680547ed24d2c71e6497f24bca791aca2fe116dbc2bd0ac7f191691b"},
2181 | {file = "tornado-6.1-cp35-cp35m-manylinux2014_aarch64.whl", hash = "sha256:6c77c9937962577a6a76917845d06af6ab9197702a42e1346d8ae2e76b5e3675"},
2182 | {file = "tornado-6.1-cp35-cp35m-win32.whl", hash = "sha256:6286efab1ed6e74b7028327365cf7346b1d777d63ab30e21a0f4d5b275fc17d5"},
2183 | {file = "tornado-6.1-cp35-cp35m-win_amd64.whl", hash = "sha256:fa2ba70284fa42c2a5ecb35e322e68823288a4251f9ba9cc77be04ae15eada68"},
2184 | {file = "tornado-6.1-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:0a00ff4561e2929a2c37ce706cb8233b7907e0cdc22eab98888aca5dd3775feb"},
2185 | {file = "tornado-6.1-cp36-cp36m-manylinux1_i686.whl", hash = "sha256:748290bf9112b581c525e6e6d3820621ff020ed95af6f17fedef416b27ed564c"},
2186 | {file = "tornado-6.1-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:e385b637ac3acaae8022e7e47dfa7b83d3620e432e3ecb9a3f7f58f150e50921"},
2187 | {file = "tornado-6.1-cp36-cp36m-manylinux2010_i686.whl", hash = "sha256:25ad220258349a12ae87ede08a7b04aca51237721f63b1808d39bdb4b2164558"},
2188 | {file = "tornado-6.1-cp36-cp36m-manylinux2010_x86_64.whl", hash = "sha256:65d98939f1a2e74b58839f8c4dab3b6b3c1ce84972ae712be02845e65391ac7c"},
2189 | {file = "tornado-6.1-cp36-cp36m-manylinux2014_aarch64.whl", hash = "sha256:e519d64089b0876c7b467274468709dadf11e41d65f63bba207e04217f47c085"},
2190 | {file = "tornado-6.1-cp36-cp36m-win32.whl", hash = "sha256:b87936fd2c317b6ee08a5741ea06b9d11a6074ef4cc42e031bc6403f82a32575"},
2191 | {file = "tornado-6.1-cp36-cp36m-win_amd64.whl", hash = "sha256:cc0ee35043162abbf717b7df924597ade8e5395e7b66d18270116f8745ceb795"},
2192 | {file = "tornado-6.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:7250a3fa399f08ec9cb3f7b1b987955d17e044f1ade821b32e5f435130250d7f"},
2193 | {file = "tornado-6.1-cp37-cp37m-manylinux1_i686.whl", hash = "sha256:ed3ad863b1b40cd1d4bd21e7498329ccaece75db5a5bf58cd3c9f130843e7102"},
2194 | {file = "tornado-6.1-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:dcef026f608f678c118779cd6591c8af6e9b4155c44e0d1bc0c87c036fb8c8c4"},
2195 | {file = "tornado-6.1-cp37-cp37m-manylinux2010_i686.whl", hash = "sha256:70dec29e8ac485dbf57481baee40781c63e381bebea080991893cd297742b8fd"},
2196 | {file = "tornado-6.1-cp37-cp37m-manylinux2010_x86_64.whl", hash = "sha256:d3f7594930c423fd9f5d1a76bee85a2c36fd8b4b16921cae7e965f22575e9c01"},
2197 | {file = "tornado-6.1-cp37-cp37m-manylinux2014_aarch64.whl", hash = "sha256:3447475585bae2e77ecb832fc0300c3695516a47d46cefa0528181a34c5b9d3d"},
2198 | {file = "tornado-6.1-cp37-cp37m-win32.whl", hash = "sha256:e7229e60ac41a1202444497ddde70a48d33909e484f96eb0da9baf8dc68541df"},
2199 | {file = "tornado-6.1-cp37-cp37m-win_amd64.whl", hash = "sha256:cb5ec8eead331e3bb4ce8066cf06d2dfef1bfb1b2a73082dfe8a161301b76e37"},
2200 | {file = "tornado-6.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:20241b3cb4f425e971cb0a8e4ffc9b0a861530ae3c52f2b0434e6c1b57e9fd95"},
2201 | {file = "tornado-6.1-cp38-cp38-manylinux1_i686.whl", hash = "sha256:c77da1263aa361938476f04c4b6c8916001b90b2c2fdd92d8d535e1af48fba5a"},
2202 | {file = "tornado-6.1-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:fba85b6cd9c39be262fcd23865652920832b61583de2a2ca907dbd8e8a8c81e5"},
2203 | {file = "tornado-6.1-cp38-cp38-manylinux2010_i686.whl", hash = "sha256:1e8225a1070cd8eec59a996c43229fe8f95689cb16e552d130b9793cb570a288"},
2204 | {file = "tornado-6.1-cp38-cp38-manylinux2010_x86_64.whl", hash = "sha256:d14d30e7f46a0476efb0deb5b61343b1526f73ebb5ed84f23dc794bdb88f9d9f"},
2205 | {file = "tornado-6.1-cp38-cp38-manylinux2014_aarch64.whl", hash = "sha256:8f959b26f2634a091bb42241c3ed8d3cedb506e7c27b8dd5c7b9f745318ddbb6"},
2206 | {file = "tornado-6.1-cp38-cp38-win32.whl", hash = "sha256:34ca2dac9e4d7afb0bed4677512e36a52f09caa6fded70b4e3e1c89dbd92c326"},
2207 | {file = "tornado-6.1-cp38-cp38-win_amd64.whl", hash = "sha256:6196a5c39286cc37c024cd78834fb9345e464525d8991c21e908cc046d1cc02c"},
2208 | {file = "tornado-6.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:f0ba29bafd8e7e22920567ce0d232c26d4d47c8b5cf4ed7b562b5db39fa199c5"},
2209 | {file = "tornado-6.1-cp39-cp39-manylinux1_i686.whl", hash = "sha256:33892118b165401f291070100d6d09359ca74addda679b60390b09f8ef325ffe"},
2210 | {file = "tornado-6.1-cp39-cp39-manylinux1_x86_64.whl", hash = "sha256:7da13da6f985aab7f6f28debab00c67ff9cbacd588e8477034c0652ac141feea"},
2211 | {file = "tornado-6.1-cp39-cp39-manylinux2010_i686.whl", hash = "sha256:e0791ac58d91ac58f694d8d2957884df8e4e2f6687cdf367ef7eb7497f79eaa2"},
2212 | {file = "tornado-6.1-cp39-cp39-manylinux2010_x86_64.whl", hash = "sha256:66324e4e1beede9ac79e60f88de548da58b1f8ab4b2f1354d8375774f997e6c0"},
2213 | {file = "tornado-6.1-cp39-cp39-manylinux2014_aarch64.whl", hash = "sha256:a48900ecea1cbb71b8c71c620dee15b62f85f7c14189bdeee54966fbd9a0c5bd"},
2214 | {file = "tornado-6.1-cp39-cp39-win32.whl", hash = "sha256:d3d20ea5782ba63ed13bc2b8c291a053c8d807a8fa927d941bd718468f7b950c"},
2215 | {file = "tornado-6.1-cp39-cp39-win_amd64.whl", hash = "sha256:548430be2740e327b3fe0201abe471f314741efcb0067ec4f2d7dcfb4825f3e4"},
2216 | {file = "tornado-6.1.tar.gz", hash = "sha256:33c6e81d7bd55b468d2e793517c909b139960b6c790a60b7991b9b6b76fb9791"},
2217 | ]
2218 | traitlets = [
2219 | {file = "traitlets-5.0.5-py3-none-any.whl", hash = "sha256:69ff3f9d5351f31a7ad80443c2674b7099df13cc41fc5fa6e2f6d3b0330b0426"},
2220 | {file = "traitlets-5.0.5.tar.gz", hash = "sha256:178f4ce988f69189f7e523337a3e11d91c786ded9360174a3d9ca83e79bc5396"},
2221 | ]
2222 | typing-extensions = [
2223 | {file = "typing_extensions-3.10.0.0-py2-none-any.whl", hash = "sha256:0ac0f89795dd19de6b97debb0c6af1c70987fd80a2d62d1958f7e56fcc31b497"},
2224 | {file = "typing_extensions-3.10.0.0-py3-none-any.whl", hash = "sha256:779383f6086d90c99ae41cf0ff39aac8a7937a9283ce0a414e5dd782f4c94a84"},
2225 | {file = "typing_extensions-3.10.0.0.tar.gz", hash = "sha256:50b6f157849174217d0656f99dc82fe932884fb250826c18350e159ec6cdf342"},
2226 | ]
2227 | tzdata = [
2228 | {file = "tzdata-2021.5-py2.py3-none-any.whl", hash = "sha256:3eee491e22ebfe1e5cfcc97a4137cd70f092ce59144d81f8924a844de05ba8f5"},
2229 | {file = "tzdata-2021.5.tar.gz", hash = "sha256:68dbe41afd01b867894bbdfd54fa03f468cfa4f0086bfb4adcd8de8f24f3ee21"},
2230 | ]
2231 | tzlocal = [
2232 | {file = "tzlocal-4.1-py3-none-any.whl", hash = "sha256:28ba8d9fcb6c9a782d6e0078b4f6627af1ea26aeaa32b4eab5324abc7df4149f"},
2233 | {file = "tzlocal-4.1.tar.gz", hash = "sha256:0f28015ac68a5c067210400a9197fc5d36ba9bc3f8eaf1da3cbd59acdfed9e09"},
2234 | ]
2235 | urllib3 = [
2236 | {file = "urllib3-1.26.6-py2.py3-none-any.whl", hash = "sha256:39fb8672126159acb139a7718dd10806104dec1e2f0f6c88aab05d17df10c8d4"},
2237 | {file = "urllib3-1.26.6.tar.gz", hash = "sha256:f57b4c16c62fa2760b7e3d97c35b255512fb6b59a259730f36ba32ce9f8e342f"},
2238 | ]
2239 | validators = [
2240 | {file = "validators-0.18.2-py3-none-any.whl", hash = "sha256:0143dcca8a386498edaf5780cbd5960da1a4c85e0719f3ee5c9b41249c4fefbd"},
2241 | {file = "validators-0.18.2.tar.gz", hash = "sha256:37cd9a9213278538ad09b5b9f9134266e7c226ab1fede1d500e29e0a8fbb9ea6"},
2242 | ]
2243 | watchdog = [
2244 | {file = "watchdog-2.1.6-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:9693f35162dc6208d10b10ddf0458cc09ad70c30ba689d9206e02cd836ce28a3"},
2245 | {file = "watchdog-2.1.6-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:aba5c812f8ee8a3ff3be51887ca2d55fb8e268439ed44110d3846e4229eb0e8b"},
2246 | {file = "watchdog-2.1.6-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:4ae38bf8ba6f39d5b83f78661273216e7db5b00f08be7592062cb1fc8b8ba542"},
2247 | {file = "watchdog-2.1.6-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:ad6f1796e37db2223d2a3f302f586f74c72c630b48a9872c1e7ae8e92e0ab669"},
2248 | {file = "watchdog-2.1.6-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:922a69fa533cb0c793b483becaaa0845f655151e7256ec73630a1b2e9ebcb660"},
2249 | {file = "watchdog-2.1.6-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:b2fcf9402fde2672545b139694284dc3b665fd1be660d73eca6805197ef776a3"},
2250 | {file = "watchdog-2.1.6-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:3386b367e950a11b0568062b70cc026c6f645428a698d33d39e013aaeda4cc04"},
2251 | {file = "watchdog-2.1.6-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:8f1c00aa35f504197561060ca4c21d3cc079ba29cf6dd2fe61024c70160c990b"},
2252 | {file = "watchdog-2.1.6-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:b52b88021b9541a60531142b0a451baca08d28b74a723d0c99b13c8c8d48d604"},
2253 | {file = "watchdog-2.1.6-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:8047da932432aa32c515ec1447ea79ce578d0559362ca3605f8e9568f844e3c6"},
2254 | {file = "watchdog-2.1.6-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:e92c2d33858c8f560671b448205a268096e17870dcf60a9bb3ac7bfbafb7f5f9"},
2255 | {file = "watchdog-2.1.6-pp37-pypy37_pp73-macosx_10_9_x86_64.whl", hash = "sha256:b7d336912853d7b77f9b2c24eeed6a5065d0a0cc0d3b6a5a45ad6d1d05fb8cd8"},
2256 | {file = "watchdog-2.1.6-py3-none-manylinux2014_aarch64.whl", hash = "sha256:cca7741c0fcc765568350cb139e92b7f9f3c9a08c4f32591d18ab0a6ac9e71b6"},
2257 | {file = "watchdog-2.1.6-py3-none-manylinux2014_armv7l.whl", hash = "sha256:25fb5240b195d17de949588628fdf93032ebf163524ef08933db0ea1f99bd685"},
2258 | {file = "watchdog-2.1.6-py3-none-manylinux2014_i686.whl", hash = "sha256:be9be735f827820a06340dff2ddea1fb7234561fa5e6300a62fe7f54d40546a0"},
2259 | {file = "watchdog-2.1.6-py3-none-manylinux2014_ppc64.whl", hash = "sha256:d0d19fb2441947b58fbf91336638c2b9f4cc98e05e1045404d7a4cb7cddc7a65"},
2260 | {file = "watchdog-2.1.6-py3-none-manylinux2014_ppc64le.whl", hash = "sha256:3becdb380d8916c873ad512f1701f8a92ce79ec6978ffde92919fd18d41da7fb"},
2261 | {file = "watchdog-2.1.6-py3-none-manylinux2014_s390x.whl", hash = "sha256:ae67501c95606072aafa865b6ed47343ac6484472a2f95490ba151f6347acfc2"},
2262 | {file = "watchdog-2.1.6-py3-none-manylinux2014_x86_64.whl", hash = "sha256:e0f30db709c939cabf64a6dc5babb276e6d823fd84464ab916f9b9ba5623ca15"},
2263 | {file = "watchdog-2.1.6-py3-none-win32.whl", hash = "sha256:e02794ac791662a5eafc6ffeaf9bcc149035a0e48eb0a9d40a8feb4622605a3d"},
2264 | {file = "watchdog-2.1.6-py3-none-win_amd64.whl", hash = "sha256:bd9ba4f332cf57b2c1f698be0728c020399ef3040577cde2939f2e045b39c1e5"},
2265 | {file = "watchdog-2.1.6-py3-none-win_ia64.whl", hash = "sha256:a0f1c7edf116a12f7245be06120b1852275f9506a7d90227648b250755a03923"},
2266 | {file = "watchdog-2.1.6.tar.gz", hash = "sha256:a36e75df6c767cbf46f61a91c70b3ba71811dfa0aca4a324d9407a06a8b7a2e7"},
2267 | ]
2268 | wcwidth = [
2269 | {file = "wcwidth-0.2.5-py2.py3-none-any.whl", hash = "sha256:beb4802a9cebb9144e99086eff703a642a13d6a0052920003a230f3294bbe784"},
2270 | {file = "wcwidth-0.2.5.tar.gz", hash = "sha256:c4d647b99872929fdb7bdcaa4fbe7f01413ed3d98077df798530e5b04f116c83"},
2271 | ]
2272 | webencodings = [
2273 | {file = "webencodings-0.5.1-py2.py3-none-any.whl", hash = "sha256:a0af1213f3c2226497a97e2b3aa01a7e4bee4f403f95be16fc9acd2947514a78"},
2274 | {file = "webencodings-0.5.1.tar.gz", hash = "sha256:b36a1c245f2d304965eb4e0a82848379241dc04b865afcc4aab16748587e1923"},
2275 | ]
2276 | widgetsnbextension = [
2277 | {file = "widgetsnbextension-3.5.1-py2.py3-none-any.whl", hash = "sha256:bd314f8ceb488571a5ffea6cc5b9fc6cba0adaf88a9d2386b93a489751938bcd"},
2278 | {file = "widgetsnbextension-3.5.1.tar.gz", hash = "sha256:079f87d87270bce047512400efd70238820751a11d2d8cb137a5a5bdbaf255c7"},
2279 | ]
2280 | zipp = [
2281 | {file = "zipp-3.4.1-py3-none-any.whl", hash = "sha256:51cb66cc54621609dd593d1787f286ee42a5c0adbb4b29abea5a63edc3e03098"},
2282 | {file = "zipp-3.4.1.tar.gz", hash = "sha256:3607921face881ba3e026887d8150cca609d517579abe052ac81fc5aeffdbd76"},
2283 | ]
2284 |
--------------------------------------------------------------------------------
/pyproject.toml:
--------------------------------------------------------------------------------
1 | [tool.poetry]
2 | name = "src"
3 | version = "0.1.0"
4 | description = ""
5 | authors = ["Pau "]
6 |
7 | [tool.poetry.dependencies]
8 | python = "^3.7"
9 | torch = "^1.9.0"
10 | cleverhans = "^3.1.0"
11 | torchvision = "^0.10.0"
12 | absl-py = "^0.13.0"
13 | easydict = "^1.9"
14 | jupyter = "^1.0.0"
15 | requests = "^2.25.1"
16 | streamlit = "^1.5.1"
17 |
18 | [tool.poetry.dev-dependencies]
19 | pytest = "^5.2"
20 |
21 | [build-system]
22 | requires = ["poetry>=0.12"]
23 | build-backend = "poetry.masonry.api"
24 |
--------------------------------------------------------------------------------
/src/__init__.py:
--------------------------------------------------------------------------------
1 | __version__ = '0.1.0'
2 |
--------------------------------------------------------------------------------
/src/fgsm.py:
--------------------------------------------------------------------------------
1 | from typing import Tuple, List, Optional
2 |
3 | import torch
4 | from torch.autograd import Variable
5 | import torch.nn as nn
6 |
7 | from src.model import inverse_preprocess
8 |
9 |
10 | def fast_gradient_sign(
11 | model: nn.Module,
12 | x: torch.Tensor,
13 | eps: float,
14 | output_type: Optional[str] = 'tensor'
15 | ) -> Tuple[torch.Tensor, torch.Tensor]:
16 | """"""
17 | assert output_type in {'tensor', 'rgb'}, 'Invalid output_type!'
18 |
19 | # tensor to variable so we can compute gradients with respect to it.
20 | img_variable = Variable(x, requires_grad=True)
21 |
22 | # forward pass on the original image
23 | output = model.forward(img_variable)
24 |
25 | # predicted class
26 | y_true = torch.max(output.data, 1)[1][0].item()
27 | target = Variable(torch.LongTensor([y_true]), requires_grad=False)
28 |
29 | # loss
30 | loss_fn = torch.nn.CrossEntropyLoss()
31 | loss = loss_fn(output, target)
32 |
33 | # compute gradient wrt each variable (requires_grad=True)
34 | # which you can later access with "var.grad.data"
35 | loss.backward(retain_graph=True)
36 |
37 | # sign of the gradient wrt input image
38 | x_grad = torch.sign(img_variable.grad.data)
39 |
40 | # FGSM
41 | x_adversarial = img_variable.data + eps * x_grad
42 |
43 | if output_type == 'tensor':
44 | return x_adversarial, x_grad
45 | else:
46 | return inverse_preprocess(x_adversarial), inverse_preprocess(x_grad)
47 |
48 | def iterative_fast_gradient_sign(
49 | model: nn.Module,
50 | x_: torch.Tensor,
51 | epsilon,
52 | n_steps: int,
53 | alpha: float
54 | # ) -> List[Tuple[torch.Tensor, torch.Tensor]]:
55 | ) -> Tuple[torch.Tensor, torch.Tensor]:
56 | """"""
57 | x = x_.clone().detach()
58 |
59 | for step in range(n_steps):
60 |
61 | # one step using basic FGSM
62 | x_adv, grad = fast_gradient_sign(model, x, alpha)
63 |
64 | # total perturbation
65 | total_grad = x_adv - x_
66 |
67 | # force total perturbation to be lower than epsilon in
68 | # absolute value
69 | total_grad = torch.clamp(total_grad, -epsilon, epsilon)
70 |
71 | # add total perturbation to the original image
72 | x_adv = x_ + total_grad
73 |
74 | print('Step ', step + 1)
75 | # visualize(x, x_adv, grad, eps)
76 |
77 | x = x_adv
78 |
79 | return x_adv, total_grad
80 |
81 |
82 | def iterative_fast_gradient_sign_(
83 | model: nn.Module,
84 | x_: torch.Tensor,
85 | epsilon,
86 | n_steps: int,
87 | alpha: float
88 | # ) -> List[Tuple[torch.Tensor, torch.Tensor]]:
89 | ) -> Tuple[torch.Tensor, torch.Tensor]:
90 | """"""
91 | x = x_.clone().detach()
92 |
93 | for step in range(n_steps):
94 |
95 | # one step using basic FGSM
96 | x_adv, grad = fast_gradient_sign(model, x, alpha)
97 |
98 | # total perturbation
99 | total_grad = x_adv - x_
100 |
101 | # force total perturbation to be lower than epsilon in
102 | # absolute value
103 | total_grad = torch.clamp(total_grad, -epsilon, epsilon)
104 |
105 | # add total perturbation to the original image
106 | x_adv = x_ + total_grad
107 |
108 | x = x_adv
109 |
110 | yield inverse_preprocess(x_adv), inverse_preprocess(grad)
111 |
--------------------------------------------------------------------------------
/src/imagenet_class_labels.py:
--------------------------------------------------------------------------------
1 | id2label = {
2 | 0: 'tench',
3 | 1: 'goldfish',
4 | 2: 'great white shark',
5 | 3: 'tiger shark',
6 | 4: 'hammerhead',
7 | 5: 'electric ray',
8 | 6: 'stingray',
9 | 7: 'cock',
10 | 8: 'hen',
11 | 9: 'ostrich',
12 | 10: 'brambling',
13 | 11: 'goldfinch',
14 | 12: 'house finch',
15 | 13: 'junco',
16 | 14: 'indigo bunting',
17 | 15: 'robin',
18 | 16: 'bulbul',
19 | 17: 'jay',
20 | 18: 'magpie',
21 | 19: 'chickadee',
22 | 20: 'water ouzel',
23 | 21: 'kite',
24 | 22: 'bald eagle',
25 | 23: 'vulture',
26 | 24: 'great grey owl',
27 | 25: 'European fire salamander',
28 | 26: 'common newt',
29 | 27: 'eft',
30 | 28: 'spotted salamander',
31 | 29: 'axolotl',
32 | 30: 'bullfrog',
33 | 31: 'tree frog',
34 | 32: 'tailed frog',
35 | 33: 'loggerhead',
36 | 34: 'leatherback turtle',
37 | 35: 'mud turtle',
38 | 36: 'terrapin',
39 | 37: 'box turtle',
40 | 38: 'banded gecko',
41 | 39: 'common iguana',
42 | 40: 'American chameleon',
43 | 41: 'whiptail',
44 | 42: 'agama',
45 | 43: 'frilled lizard',
46 | 44: 'alligator lizard',
47 | 45: 'Gila monster',
48 | 46: 'green lizard',
49 | 47: 'African chameleon',
50 | 48: 'Komodo dragon',
51 | 49: 'African crocodile',
52 | 50: 'American alligator',
53 | 51: 'triceratops',
54 | 52: 'thunder snake',
55 | 53: 'ringneck snake',
56 | 54: 'hognose snake',
57 | 55: 'green snake',
58 | 56: 'king snake',
59 | 57: 'garter snake',
60 | 58: 'water snake',
61 | 59: 'vine snake',
62 | 60: 'night snake',
63 | 61: 'boa constrictor',
64 | 62: 'rock python',
65 | 63: 'Indian cobra',
66 | 64: 'green mamba',
67 | 65: 'sea snake',
68 | 66: 'horned viper',
69 | 67: 'diamondback',
70 | 68: 'sidewinder',
71 | 69: 'trilobite',
72 | 70: 'harvestman',
73 | 71: 'scorpion',
74 | 72: 'black and gold garden spider',
75 | 73: 'barn spider',
76 | 74: 'garden spider',
77 | 75: 'black widow',
78 | 76: 'tarantula',
79 | 77: 'wolf spider',
80 | 78: 'tick',
81 | 79: 'centipede',
82 | 80: 'black grouse',
83 | 81: 'ptarmigan',
84 | 82: 'ruffed grouse',
85 | 83: 'prairie chicken',
86 | 84: 'peacock',
87 | 85: 'quail',
88 | 86: 'partridge',
89 | 87: 'African grey',
90 | 88: 'macaw',
91 | 89: 'sulphur-crested cockatoo',
92 | 90: 'lorikeet',
93 | 91: 'coucal',
94 | 92: 'bee eater',
95 | 93: 'hornbill',
96 | 94: 'hummingbird',
97 | 95: 'jacamar',
98 | 96: 'toucan',
99 | 97: 'drake',
100 | 98: 'red-breasted merganser',
101 | 99: 'goose',
102 | 100: 'black swan',
103 | 101: 'tusker',
104 | 102: 'echidna',
105 | 103: 'platypus',
106 | 104: 'wallaby',
107 | 105: 'koala',
108 | 106: 'wombat',
109 | 107: 'jellyfish',
110 | 108: 'sea anemone',
111 | 109: 'brain coral',
112 | 110: 'flatworm',
113 | 111: 'nematode',
114 | 112: 'conch',
115 | 113: 'snail',
116 | 114: 'slug',
117 | 115: 'sea slug',
118 | 116: 'chiton',
119 | 117: 'chambered nautilus',
120 | 118: 'Dungeness crab',
121 | 119: 'rock crab',
122 | 120: 'fiddler crab',
123 | 121: 'king crab',
124 | 122: 'American lobster',
125 | 123: 'spiny lobster',
126 | 124: 'crayfish',
127 | 125: 'hermit crab',
128 | 126: 'isopod',
129 | 127: 'white stork',
130 | 128: 'black stork',
131 | 129: 'spoonbill',
132 | 130: 'flamingo',
133 | 131: 'little blue heron',
134 | 132: 'American egret',
135 | 133: 'bittern',
136 | 134: 'crane',
137 | 135: 'limpkin',
138 | 136: 'European gallinule',
139 | 137: 'American coot',
140 | 138: 'bustard',
141 | 139: 'ruddy turnstone',
142 | 140: 'red-backed sandpiper',
143 | 141: 'redshank',
144 | 142: 'dowitcher',
145 | 143: 'oystercatcher',
146 | 144: 'pelican',
147 | 145: 'king penguin',
148 | 146: 'albatross',
149 | 147: 'grey whale',
150 | 148: 'killer whale',
151 | 149: 'dugong',
152 | 150: 'sea lion',
153 | 151: 'Chihuahua',
154 | 152: 'Japanese spaniel',
155 | 153: 'Maltese dog',
156 | 154: 'Pekinese',
157 | 155: 'Shih-Tzu',
158 | 156: 'Blenheim spaniel',
159 | 157: 'papillon',
160 | 158: 'toy terrier',
161 | 159: 'Rhodesian ridgeback',
162 | 160: 'Afghan hound',
163 | 161: 'basset',
164 | 162: 'beagle',
165 | 163: 'bloodhound',
166 | 164: 'bluetick',
167 | 165: 'black-and-tan coonhound',
168 | 166: 'Walker hound',
169 | 167: 'English foxhound',
170 | 168: 'redbone',
171 | 169: 'borzoi',
172 | 170: 'Irish wolfhound',
173 | 171: 'Italian greyhound',
174 | 172: 'whippet',
175 | 173: 'Ibizan hound',
176 | 174: 'Norwegian elkhound',
177 | 175: 'otterhound',
178 | 176: 'Saluki',
179 | 177: 'Scottish deerhound',
180 | 178: 'Weimaraner',
181 | 179: 'Staffordshire bullterrier',
182 | 180: 'American Staffordshire terrier',
183 | 181: 'Bedlington terrier',
184 | 182: 'Border terrier',
185 | 183: 'Kerry blue terrier',
186 | 184: 'Irish terrier',
187 | 185: 'Norfolk terrier',
188 | 186: 'Norwich terrier',
189 | 187: 'Yorkshire terrier',
190 | 188: 'wire-haired fox terrier',
191 | 189: 'Lakeland terrier',
192 | 190: 'Sealyham terrier',
193 | 191: 'Airedale',
194 | 192: 'cairn',
195 | 193: 'Australian terrier',
196 | 194: 'Dandie Dinmont',
197 | 195: 'Boston bull',
198 | 196: 'miniature schnauzer',
199 | 197: 'giant schnauzer',
200 | 198: 'standard schnauzer',
201 | 199: 'Scotch terrier',
202 | 200: 'Tibetan terrier',
203 | 201: 'silky terrier',
204 | 202: 'soft-coated wheaten terrier',
205 | 203: 'West Highland white terrier',
206 | 204: 'Lhasa',
207 | 205: 'flat-coated retriever',
208 | 206: 'curly-coated retriever',
209 | 207: 'golden retriever',
210 | 208: 'Labrador retriever',
211 | 209: 'Chesapeake Bay retriever',
212 | 210: 'German short-haired pointer',
213 | 211: 'vizsla',
214 | 212: 'English setter',
215 | 213: 'Irish setter',
216 | 214: 'Gordon setter',
217 | 215: 'Brittany spaniel',
218 | 216: 'clumber',
219 | 217: 'English springer',
220 | 218: 'Welsh springer spaniel',
221 | 219: 'cocker spaniel',
222 | 220: 'Sussex spaniel',
223 | 221: 'Irish water spaniel',
224 | 222: 'kuvasz',
225 | 223: 'schipperke',
226 | 224: 'groenendael',
227 | 225: 'malinois',
228 | 226: 'briard',
229 | 227: 'kelpie',
230 | 228: 'komondor',
231 | 229: 'Old English sheepdog',
232 | 230: 'Shetland sheepdog',
233 | 231: 'collie',
234 | 232: 'Border collie',
235 | 233: 'Bouvier des Flandres',
236 | 234: 'Rottweiler',
237 | 235: 'German shepherd',
238 | 236: 'Doberman',
239 | 237: 'miniature pinscher',
240 | 238: 'Greater Swiss Mountain dog',
241 | 239: 'Bernese mountain dog',
242 | 240: 'Appenzeller',
243 | 241: 'EntleBucher',
244 | 242: 'boxer',
245 | 243: 'bull mastiff',
246 | 244: 'Tibetan mastiff',
247 | 245: 'French bulldog',
248 | 246: 'Great Dane',
249 | 247: 'Saint Bernard',
250 | 248: 'Eskimo dog',
251 | 249: 'malamute',
252 | 250: 'Siberian husky',
253 | 251: 'dalmatian',
254 | 252: 'affenpinscher',
255 | 253: 'basenji',
256 | 254: 'pug',
257 | 255: 'Leonberg',
258 | 256: 'Newfoundland',
259 | 257: 'Great Pyrenees',
260 | 258: 'Samoyed',
261 | 259: 'Pomeranian',
262 | 260: 'chow',
263 | 261: 'keeshond',
264 | 262: 'Brabancon griffon',
265 | 263: 'Pembroke',
266 | 264: 'Cardigan',
267 | 265: 'toy poodle',
268 | 266: 'miniature poodle',
269 | 267: 'standard poodle',
270 | 268: 'Mexican hairless',
271 | 269: 'timber wolf',
272 | 270: 'white wolf',
273 | 271: 'red wolf',
274 | 272: 'coyote',
275 | 273: 'dingo',
276 | 274: 'dhole',
277 | 275: 'African hunting dog',
278 | 276: 'hyena',
279 | 277: 'red fox',
280 | 278: 'kit fox',
281 | 279: 'Arctic fox',
282 | 280: 'grey fox',
283 | 281: 'tabby',
284 | 282: 'tiger cat',
285 | 283: 'Persian cat',
286 | 284: 'Siamese cat',
287 | 285: 'Egyptian cat',
288 | 286: 'cougar',
289 | 287: 'lynx',
290 | 288: 'leopard',
291 | 289: 'snow leopard',
292 | 290: 'jaguar',
293 | 291: 'lion',
294 | 292: 'tiger',
295 | 293: 'cheetah',
296 | 294: 'brown bear',
297 | 295: 'American black bear',
298 | 296: 'ice bear',
299 | 297: 'sloth bear',
300 | 298: 'mongoose',
301 | 299: 'meerkat',
302 | 300: 'tiger beetle',
303 | 301: 'ladybug',
304 | 302: 'ground beetle',
305 | 303: 'long-horned beetle',
306 | 304: 'leaf beetle',
307 | 305: 'dung beetle',
308 | 306: 'rhinoceros beetle',
309 | 307: 'weevil',
310 | 308: 'fly',
311 | 309: 'bee',
312 | 310: 'ant',
313 | 311: 'grasshopper',
314 | 312: 'cricket',
315 | 313: 'walking stick',
316 | 314: 'cockroach',
317 | 315: 'mantis',
318 | 316: 'cicada',
319 | 317: 'leafhopper',
320 | 318: 'lacewing',
321 | 319: 'dragonfly',
322 | 320: 'damselfly',
323 | 321: 'admiral',
324 | 322: 'ringlet',
325 | 323: 'monarch',
326 | 324: 'cabbage butterfly',
327 | 325: 'sulphur butterfly',
328 | 326: 'lycaenid',
329 | 327: 'starfish',
330 | 328: 'sea urchin',
331 | 329: 'sea cucumber',
332 | 330: 'wood rabbit',
333 | 331: 'hare',
334 | 332: 'Angora',
335 | 333: 'hamster',
336 | 334: 'porcupine',
337 | 335: 'fox squirrel',
338 | 336: 'marmot',
339 | 337: 'beaver',
340 | 338: 'guinea pig',
341 | 339: 'sorrel',
342 | 340: 'zebra',
343 | 341: 'hog',
344 | 342: 'wild boar',
345 | 343: 'warthog',
346 | 344: 'hippopotamus',
347 | 345: 'ox',
348 | 346: 'water buffalo',
349 | 347: 'bison',
350 | 348: 'ram',
351 | 349: 'bighorn',
352 | 350: 'ibex',
353 | 351: 'hartebeest',
354 | 352: 'impala',
355 | 353: 'gazelle',
356 | 354: 'Arabian camel',
357 | 355: 'llama',
358 | 356: 'weasel',
359 | 357: 'mink',
360 | 358: 'polecat',
361 | 359: 'black-footed ferret',
362 | 360: 'otter',
363 | 361: 'skunk',
364 | 362: 'badger',
365 | 363: 'armadillo',
366 | 364: 'three-toed sloth',
367 | 365: 'orangutan',
368 | 366: 'gorilla',
369 | 367: 'chimpanzee',
370 | 368: 'gibbon',
371 | 369: 'siamang',
372 | 370: 'guenon',
373 | 371: 'patas',
374 | 372: 'baboon',
375 | 373: 'macaque',
376 | 374: 'langur',
377 | 375: 'colobus',
378 | 376: 'proboscis monkey',
379 | 377: 'marmoset',
380 | 378: 'capuchin',
381 | 379: 'howler monkey',
382 | 380: 'titi',
383 | 381: 'spider monkey',
384 | 382: 'squirrel monkey',
385 | 383: 'Madagascar cat',
386 | 384: 'indri',
387 | 385: 'Indian elephant',
388 | 386: 'African elephant',
389 | 387: 'lesser panda',
390 | 388: 'giant panda',
391 | 389: 'barracouta',
392 | 390: 'eel',
393 | 391: 'coho',
394 | 392: 'rock beauty',
395 | 393: 'anemone fish',
396 | 394: 'sturgeon',
397 | 395: 'gar',
398 | 396: 'lionfish',
399 | 397: 'puffer',
400 | 398: 'abacus',
401 | 399: 'abaya',
402 | 400: 'academic gown',
403 | 401: 'accordion',
404 | 402: 'acoustic guitar',
405 | 403: 'aircraft carrier',
406 | 404: 'airliner',
407 | 405: 'airship',
408 | 406: 'altar',
409 | 407: 'ambulance',
410 | 408: 'amphibian',
411 | 409: 'analog clock',
412 | 410: 'apiary',
413 | 411: 'apron',
414 | 412: 'ashcan',
415 | 413: 'assault rifle',
416 | 414: 'backpack',
417 | 415: 'bakery',
418 | 416: 'balance beam',
419 | 417: 'balloon',
420 | 418: 'ballpoint',
421 | 419: 'Band Aid',
422 | 420: 'banjo',
423 | 421: 'bannister',
424 | 422: 'barbell',
425 | 423: 'barber chair',
426 | 424: 'barbershop',
427 | 425: 'barn',
428 | 426: 'barometer',
429 | 427: 'barrel',
430 | 428: 'barrow',
431 | 429: 'baseball',
432 | 430: 'basketball',
433 | 431: 'bassinet',
434 | 432: 'bassoon',
435 | 433: 'bathing cap',
436 | 434: 'bath towel',
437 | 435: 'bathtub',
438 | 436: 'beach wagon',
439 | 437: 'beacon',
440 | 438: 'beaker',
441 | 439: 'bearskin',
442 | 440: 'beer bottle',
443 | 441: 'beer glass',
444 | 442: 'bell cote',
445 | 443: 'bib',
446 | 444: 'bicycle-built-for-two',
447 | 445: 'bikini',
448 | 446: 'binder',
449 | 447: 'binoculars',
450 | 448: 'birdhouse',
451 | 449: 'boathouse',
452 | 450: 'bobsled',
453 | 451: 'bolo tie',
454 | 452: 'bonnet',
455 | 453: 'bookcase',
456 | 454: 'bookshop',
457 | 455: 'bottlecap',
458 | 456: 'bow',
459 | 457: 'bow tie',
460 | 458: 'brass',
461 | 459: 'brassiere',
462 | 460: 'breakwater',
463 | 461: 'breastplate',
464 | 462: 'broom',
465 | 463: 'bucket',
466 | 464: 'buckle',
467 | 465: 'bulletproof vest',
468 | 466: 'bullet train',
469 | 467: 'butcher shop',
470 | 468: 'cab',
471 | 469: 'caldron',
472 | 470: 'candle',
473 | 471: 'cannon',
474 | 472: 'canoe',
475 | 473: 'can opener',
476 | 474: 'cardigan',
477 | 475: 'car mirror',
478 | 476: 'carousel',
479 | 477: "carpenter's kit",
480 | 478: 'carton',
481 | 479: 'car wheel',
482 | 480: 'cash machine',
483 | 481: 'cassette',
484 | 482: 'cassette player',
485 | 483: 'castle',
486 | 484: 'catamaran',
487 | 485: 'CD player',
488 | 486: 'cello',
489 | 487: 'cellular telephone',
490 | 488: 'chain',
491 | 489: 'chainlink fence',
492 | 490: 'chain mail',
493 | 491: 'chain saw',
494 | 492: 'chest',
495 | 493: 'chiffonier',
496 | 494: 'chime',
497 | 495: 'china cabinet',
498 | 496: 'Christmas stocking',
499 | 497: 'church',
500 | 498: 'cinema',
501 | 499: 'cleaver',
502 | 500: 'cliff dwelling',
503 | 501: 'cloak',
504 | 502: 'clog',
505 | 503: 'cocktail shaker',
506 | 504: 'coffee mug',
507 | 505: 'coffeepot',
508 | 506: 'coil',
509 | 507: 'combination lock',
510 | 508: 'computer keyboard',
511 | 509: 'confectionery',
512 | 510: 'container ship',
513 | 511: 'convertible',
514 | 512: 'corkscrew',
515 | 513: 'cornet',
516 | 514: 'cowboy boot',
517 | 515: 'cowboy hat',
518 | 516: 'cradle',
519 | 517: 'crane',
520 | 518: 'crash helmet',
521 | 519: 'crate',
522 | 520: 'crib',
523 | 521: 'Crock Pot',
524 | 522: 'croquet ball',
525 | 523: 'crutch',
526 | 524: 'cuirass',
527 | 525: 'dam',
528 | 526: 'desk',
529 | 527: 'desktop computer',
530 | 528: 'dial telephone',
531 | 529: 'diaper',
532 | 530: 'digital clock',
533 | 531: 'digital watch',
534 | 532: 'dining table',
535 | 533: 'dishrag',
536 | 534: 'dishwasher',
537 | 535: 'disk brake',
538 | 536: 'dock',
539 | 537: 'dogsled',
540 | 538: 'dome',
541 | 539: 'doormat',
542 | 540: 'drilling platform',
543 | 541: 'drum',
544 | 542: 'drumstick',
545 | 543: 'dumbbell',
546 | 544: 'Dutch oven',
547 | 545: 'electric fan',
548 | 546: 'electric guitar',
549 | 547: 'electric locomotive',
550 | 548: 'entertainment center',
551 | 549: 'envelope',
552 | 550: 'espresso maker',
553 | 551: 'face powder',
554 | 552: 'feather boa',
555 | 553: 'file',
556 | 554: 'fireboat',
557 | 555: 'fire engine',
558 | 556: 'fire screen',
559 | 557: 'flagpole',
560 | 558: 'flute',
561 | 559: 'folding chair',
562 | 560: 'football helmet',
563 | 561: 'forklift',
564 | 562: 'fountain',
565 | 563: 'fountain pen',
566 | 564: 'four-poster',
567 | 565: 'freight car',
568 | 566: 'French horn',
569 | 567: 'frying pan',
570 | 568: 'fur coat',
571 | 569: 'garbage truck',
572 | 570: 'gasmask',
573 | 571: 'gas pump',
574 | 572: 'goblet',
575 | 573: 'go-kart',
576 | 574: 'golf ball',
577 | 575: 'golfcart',
578 | 576: 'gondola',
579 | 577: 'gong',
580 | 578: 'gown',
581 | 579: 'grand piano',
582 | 580: 'greenhouse',
583 | 581: 'grille',
584 | 582: 'grocery store',
585 | 583: 'guillotine',
586 | 584: 'hair slide',
587 | 585: 'hair spray',
588 | 586: 'half track',
589 | 587: 'hammer',
590 | 588: 'hamper',
591 | 589: 'hand blower',
592 | 590: 'hand-held computer',
593 | 591: 'handkerchief',
594 | 592: 'hard disc',
595 | 593: 'harmonica',
596 | 594: 'harp',
597 | 595: 'harvester',
598 | 596: 'hatchet',
599 | 597: 'holster',
600 | 598: 'home theater',
601 | 599: 'honeycomb',
602 | 600: 'hook',
603 | 601: 'hoopskirt',
604 | 602: 'horizontal bar',
605 | 603: 'horse cart',
606 | 604: 'hourglass',
607 | 605: 'iPod',
608 | 606: 'iron',
609 | 607: "jack-o'-lantern",
610 | 608: 'jean',
611 | 609: 'jeep',
612 | 610: 'jersey',
613 | 611: 'jigsaw puzzle',
614 | 612: 'jinrikisha',
615 | 613: 'joystick',
616 | 614: 'kimono',
617 | 615: 'knee pad',
618 | 616: 'knot',
619 | 617: 'lab coat',
620 | 618: 'ladle',
621 | 619: 'lampshade',
622 | 620: 'laptop',
623 | 621: 'lawn mower',
624 | 622: 'lens cap',
625 | 623: 'letter opener',
626 | 624: 'library',
627 | 625: 'lifeboat',
628 | 626: 'lighter',
629 | 627: 'limousine',
630 | 628: 'liner',
631 | 629: 'lipstick',
632 | 630: 'Loafer',
633 | 631: 'lotion',
634 | 632: 'loudspeaker',
635 | 633: 'loupe',
636 | 634: 'lumbermill',
637 | 635: 'magnetic compass',
638 | 636: 'mailbag',
639 | 637: 'mailbox',
640 | 638: 'maillot',
641 | 639: 'maillot',
642 | 640: 'manhole cover',
643 | 641: 'maraca',
644 | 642: 'marimba',
645 | 643: 'mask',
646 | 644: 'matchstick',
647 | 645: 'maypole',
648 | 646: 'maze',
649 | 647: 'measuring cup',
650 | 648: 'medicine chest',
651 | 649: 'megalith',
652 | 650: 'microphone',
653 | 651: 'microwave',
654 | 652: 'military uniform',
655 | 653: 'milk can',
656 | 654: 'minibus',
657 | 655: 'miniskirt',
658 | 656: 'minivan',
659 | 657: 'missile',
660 | 658: 'mitten',
661 | 659: 'mixing bowl',
662 | 660: 'mobile home',
663 | 661: 'Model T',
664 | 662: 'modem',
665 | 663: 'monastery',
666 | 664: 'monitor',
667 | 665: 'moped',
668 | 666: 'mortar',
669 | 667: 'mortarboard',
670 | 668: 'mosque',
671 | 669: 'mosquito net',
672 | 670: 'motor scooter',
673 | 671: 'mountain bike',
674 | 672: 'mountain tent',
675 | 673: 'mouse',
676 | 674: 'mousetrap',
677 | 675: 'moving van',
678 | 676: 'muzzle',
679 | 677: 'nail',
680 | 678: 'neck brace',
681 | 679: 'necklace',
682 | 680: 'nipple',
683 | 681: 'notebook',
684 | 682: 'obelisk',
685 | 683: 'oboe',
686 | 684: 'ocarina',
687 | 685: 'odometer',
688 | 686: 'oil filter',
689 | 687: 'organ',
690 | 688: 'oscilloscope',
691 | 689: 'overskirt',
692 | 690: 'oxcart',
693 | 691: 'oxygen mask',
694 | 692: 'packet',
695 | 693: 'paddle',
696 | 694: 'paddlewheel',
697 | 695: 'padlock',
698 | 696: 'paintbrush',
699 | 697: 'pajama',
700 | 698: 'palace',
701 | 699: 'panpipe',
702 | 700: 'paper towel',
703 | 701: 'parachute',
704 | 702: 'parallel bars',
705 | 703: 'park bench',
706 | 704: 'parking meter',
707 | 705: 'passenger car',
708 | 706: 'patio',
709 | 707: 'pay-phone',
710 | 708: 'pedestal',
711 | 709: 'pencil box',
712 | 710: 'pencil sharpener',
713 | 711: 'perfume',
714 | 712: 'Petri dish',
715 | 713: 'photocopier',
716 | 714: 'pick',
717 | 715: 'pickelhaube',
718 | 716: 'picket fence',
719 | 717: 'pickup',
720 | 718: 'pier',
721 | 719: 'piggy bank',
722 | 720: 'pill bottle',
723 | 721: 'pillow',
724 | 722: 'ping-pong ball',
725 | 723: 'pinwheel',
726 | 724: 'pirate',
727 | 725: 'pitcher',
728 | 726: 'plane',
729 | 727: 'planetarium',
730 | 728: 'plastic bag',
731 | 729: 'plate rack',
732 | 730: 'plow',
733 | 731: 'plunger',
734 | 732: 'Polaroid camera',
735 | 733: 'pole',
736 | 734: 'police van',
737 | 735: 'poncho',
738 | 736: 'pool table',
739 | 737: 'pop bottle',
740 | 738: 'pot',
741 | 739: "potter's wheel",
742 | 740: 'power drill',
743 | 741: 'prayer rug',
744 | 742: 'printer',
745 | 743: 'prison',
746 | 744: 'projectile',
747 | 745: 'projector',
748 | 746: 'puck',
749 | 747: 'punching bag',
750 | 748: 'purse',
751 | 749: 'quill',
752 | 750: 'quilt',
753 | 751: 'racer',
754 | 752: 'racket',
755 | 753: 'radiator',
756 | 754: 'radio',
757 | 755: 'radio telescope',
758 | 756: 'rain barrel',
759 | 757: 'recreational vehicle',
760 | 758: 'reel',
761 | 759: 'reflex camera',
762 | 760: 'refrigerator',
763 | 761: 'remote control',
764 | 762: 'restaurant',
765 | 763: 'revolver',
766 | 764: 'rifle',
767 | 765: 'rocking chair',
768 | 766: 'rotisserie',
769 | 767: 'rubber eraser',
770 | 768: 'rugby ball',
771 | 769: 'rule',
772 | 770: 'running shoe',
773 | 771: 'safe',
774 | 772: 'safety pin',
775 | 773: 'saltshaker',
776 | 774: 'sandal',
777 | 775: 'sarong',
778 | 776: 'sax',
779 | 777: 'scabbard',
780 | 778: 'scale',
781 | 779: 'school bus',
782 | 780: 'schooner',
783 | 781: 'scoreboard',
784 | 782: 'screen',
785 | 783: 'screw',
786 | 784: 'screwdriver',
787 | 785: 'seat belt',
788 | 786: 'sewing machine',
789 | 787: 'shield',
790 | 788: 'shoe shop',
791 | 789: 'shoji',
792 | 790: 'shopping basket',
793 | 791: 'shopping cart',
794 | 792: 'shovel',
795 | 793: 'shower cap',
796 | 794: 'shower curtain',
797 | 795: 'ski',
798 | 796: 'ski mask',
799 | 797: 'sleeping bag',
800 | 798: 'slide rule',
801 | 799: 'sliding door',
802 | 800: 'slot',
803 | 801: 'snorkel',
804 | 802: 'snowmobile',
805 | 803: 'snowplow',
806 | 804: 'soap dispenser',
807 | 805: 'soccer ball',
808 | 806: 'sock',
809 | 807: 'solar dish',
810 | 808: 'sombrero',
811 | 809: 'soup bowl',
812 | 810: 'space bar',
813 | 811: 'space heater',
814 | 812: 'space shuttle',
815 | 813: 'spatula',
816 | 814: 'speedboat',
817 | 815: 'spider web',
818 | 816: 'spindle',
819 | 817: 'sports car',
820 | 818: 'spotlight',
821 | 819: 'stage',
822 | 820: 'steam locomotive',
823 | 821: 'steel arch bridge',
824 | 822: 'steel drum',
825 | 823: 'stethoscope',
826 | 824: 'stole',
827 | 825: 'stone wall',
828 | 826: 'stopwatch',
829 | 827: 'stove',
830 | 828: 'strainer',
831 | 829: 'streetcar',
832 | 830: 'stretcher',
833 | 831: 'studio couch',
834 | 832: 'stupa',
835 | 833: 'submarine',
836 | 834: 'suit',
837 | 835: 'sundial',
838 | 836: 'sunglass',
839 | 837: 'sunglasses',
840 | 838: 'sunscreen',
841 | 839: 'suspension bridge',
842 | 840: 'swab',
843 | 841: 'sweatshirt',
844 | 842: 'swimming trunks',
845 | 843: 'swing',
846 | 844: 'switch',
847 | 845: 'syringe',
848 | 846: 'table lamp',
849 | 847: 'tank',
850 | 848: 'tape player',
851 | 849: 'teapot',
852 | 850: 'teddy',
853 | 851: 'television',
854 | 852: 'tennis ball',
855 | 853: 'thatch',
856 | 854: 'theater curtain',
857 | 855: 'thimble',
858 | 856: 'thresher',
859 | 857: 'throne',
860 | 858: 'tile roof',
861 | 859: 'toaster',
862 | 860: 'tobacco shop',
863 | 861: 'toilet seat',
864 | 862: 'torch',
865 | 863: 'totem pole',
866 | 864: 'tow truck',
867 | 865: 'toyshop',
868 | 866: 'tractor',
869 | 867: 'trailer truck',
870 | 868: 'tray',
871 | 869: 'trench coat',
872 | 870: 'tricycle',
873 | 871: 'trimaran',
874 | 872: 'tripod',
875 | 873: 'triumphal arch',
876 | 874: 'trolleybus',
877 | 875: 'trombone',
878 | 876: 'tub',
879 | 877: 'turnstile',
880 | 878: 'typewriter keyboard',
881 | 879: 'umbrella',
882 | 880: 'unicycle',
883 | 881: 'upright',
884 | 882: 'vacuum',
885 | 883: 'vase',
886 | 884: 'vault',
887 | 885: 'velvet',
888 | 886: 'vending machine',
889 | 887: 'vestment',
890 | 888: 'viaduct',
891 | 889: 'violin',
892 | 890: 'volleyball',
893 | 891: 'waffle iron',
894 | 892: 'wall clock',
895 | 893: 'wallet',
896 | 894: 'wardrobe',
897 | 895: 'warplane',
898 | 896: 'washbasin',
899 | 897: 'washer',
900 | 898: 'water bottle',
901 | 899: 'water jug',
902 | 900: 'water tower',
903 | 901: 'whiskey jug',
904 | 902: 'whistle',
905 | 903: 'wig',
906 | 904: 'window screen',
907 | 905: 'window shade',
908 | 906: 'Windsor tie',
909 | 907: 'wine bottle',
910 | 908: 'wing',
911 | 909: 'wok',
912 | 910: 'wooden spoon',
913 | 911: 'wool',
914 | 912: 'worm fence',
915 | 913: 'wreck',
916 | 914: 'yawl',
917 | 915: 'yurt',
918 | 916: 'web site',
919 | 917: 'comic book',
920 | 918: 'crossword puzzle',
921 | 919: 'street sign',
922 | 920: 'traffic light',
923 | 921: 'book jacket',
924 | 922: 'menu',
925 | 923: 'plate',
926 | 924: 'guacamole',
927 | 925: 'consomme',
928 | 926: 'hot pot',
929 | 927: 'trifle',
930 | 928: 'ice cream',
931 | 929: 'ice lolly',
932 | 930: 'French loaf',
933 | 931: 'bagel',
934 | 932: 'pretzel',
935 | 933: 'cheeseburger',
936 | 934: 'hotdog',
937 | 935: 'mashed potato',
938 | 936: 'head cabbage',
939 | 937: 'broccoli',
940 | 938: 'cauliflower',
941 | 939: 'zucchini',
942 | 940: 'spaghetti squash',
943 | 941: 'acorn squash',
944 | 942: 'butternut squash',
945 | 943: 'cucumber',
946 | 944: 'artichoke',
947 | 945: 'bell pepper',
948 | 946: 'cardoon',
949 | 947: 'mushroom',
950 | 948: 'Granny Smith',
951 | 949: 'strawberry',
952 | 950: 'orange',
953 | 951: 'lemon',
954 | 952: 'fig',
955 | 953: 'pineapple',
956 | 954: 'banana',
957 | 955: 'jackfruit',
958 | 956: 'custard apple',
959 | 957: 'pomegranate',
960 | 958: 'hay',
961 | 959: 'carbonara',
962 | 960: 'chocolate sauce',
963 | 961: 'dough',
964 | 962: 'meat loaf',
965 | 963: 'pizza',
966 | 964: 'potpie',
967 | 965: 'burrito',
968 | 966: 'red wine',
969 | 967: 'espresso',
970 | 968: 'cup',
971 | 969: 'eggnog',
972 | 970: 'alp',
973 | 971: 'bubble',
974 | 972: 'cliff',
975 | 973: 'coral reef',
976 | 974: 'geyser',
977 | 975: 'lakeside',
978 | 976: 'promontory',
979 | 977: 'sandbar',
980 | 978: 'seashore',
981 | 979: 'valley',
982 | 980: 'volcano',
983 | 981: 'ballplayer',
984 | 982: 'groom',
985 | 983: 'scuba diver',
986 | 984: 'rapeseed',
987 | 985: 'daisy',
988 | 986: "yellow lady's slipper",
989 | 987: 'corn',
990 | 988: 'acorn',
991 | 989: 'hip',
992 | 990: 'buckeye',
993 | 991: 'coral fungus',
994 | 992: 'agaric',
995 | 993: 'gyromitra',
996 | 994: 'stinkhorn',
997 | 995: 'earthstar',
998 | 996: 'hen-of-the-woods',
999 | 997: 'bolete',
1000 | 998: 'ear',
1001 | 999: 'toilet tissue'
1002 | }
--------------------------------------------------------------------------------
/src/model.py:
--------------------------------------------------------------------------------
1 | from typing import Dict
2 |
3 | import torch
4 | from torch import Tensor
5 | from torchvision import transforms
6 | from torchvision.models import inception_v3
7 | import torch.nn as nn
8 | import torch.nn.functional as F
9 |
10 | from src.imagenet_class_labels import id2label
11 |
12 |
13 | def load_model() -> nn.Module:
14 | model = inception_v3(pretrained=True)
15 | model.eval()
16 | n_params = sum(p.numel() for p in model.parameters())
17 | print(f'{n_params:,} parameters') # 27,161,264 parameters
18 | return model
19 |
20 | def predict(model: nn.Module, image) -> Dict:
21 |
22 | # resize and normalize input pixel ranges
23 | img = preprocess(image)
24 |
25 | output = model.forward(img)
26 | class_idx = torch.max(output.data, 1)[1][0].item()
27 | label = id2label[class_idx]
28 | output_probs = F.softmax(output, dim=1)
29 | confidence = round(torch.max(output_probs.data, 1)[0][0].item(), 4)
30 |
31 | return {
32 | 'id': class_idx,
33 | 'label': label,
34 | 'confidence': confidence,
35 | }
36 |
37 |
38 | def preprocess(img) -> Tensor:
39 | """
40 | Inception V3 model from pytorch expects input images with pixel values between -1 and 1
41 | and dimensions 299 x 299
42 | """
43 | mean = [0.485, 0.456, 0.406]
44 | std = [0.229, 0.224, 0.225]
45 |
46 | preprocess_fn = transforms.Compose([
47 | transforms.Resize((299,299)),
48 | transforms.ToTensor(),
49 | transforms.Normalize(mean, std)
50 | ])
51 | image_tensor = preprocess_fn(img)
52 |
53 | # add batch dimension: C x H x W ==> B x C x H x W
54 | image_tensor = image_tensor.unsqueeze(0)
55 |
56 | return image_tensor
57 |
58 | def inverse_preprocess(x: Tensor):
59 | """"""
60 | t = x.squeeze(0)
61 |
62 | mean = [0.485, 0.456, 0.406]
63 | std = [0.229, 0.224, 0.225]
64 | t = t.mul(torch.FloatTensor(std).view(3,1,1)).add(torch.FloatTensor(mean).view(3,1,1)) #.numpy()
65 |
66 | im = transforms.ToPILImage()(t) #.convert("RGB") #.Resize((299, 299))
67 |
68 | return im
69 |
--------------------------------------------------------------------------------
/src/streamlit_app.py:
--------------------------------------------------------------------------------
1 | import io
2 |
3 | import requests
4 | import streamlit as st
5 | # import pandas as pd
6 | # import numpy as np
7 | from PIL import Image
8 |
9 | from src.model import preprocess, inverse_preprocess, load_model, predict
10 | from src.fgsm import fast_gradient_sign, iterative_fast_gradient_sign_
11 |
12 | st.title('Adversarial example generator')
13 |
14 | doc_markdown = """
15 | ## What are adversarial examples? 💡
16 |
17 | 👉🏽 Do you think it is impossible to fool the vision system of a self-driving Tesla car?
18 |
19 | 👉🏽 Or that machine learning models used in malware detection software are too good to be evaded by hackers?
20 |
21 | 👉🏽 Or that face recognition systems in airports are bulletproof?
22 |
23 | Like any of us machine learning enthusiasts, you might fall into the trap of thinking that deep models used out there are perfect.
24 |
25 | ### Well, you are WRONG.
26 |
27 | There are easy ways to build **adversarial examples** that can fool any deep learning model and create security issues.
28 |
29 | With this app you can create your own adversarial examples, using the **Iterative Fast Gradient Sign Method**, and fool [`Inception-v3`](https://en.wikipedia.org/wiki/Inceptionv3)
30 |
31 |
32 | """
33 |
34 | # The model
35 | @st.cache
36 | def load_model_():
37 | return load_model()
38 |
39 | model = load_model_()
40 |
41 | st.sidebar.title('Iterative FGSM parameters')
42 | st.markdown(doc_markdown)
43 |
44 | # Input image
45 | example_url = 'https://github.com/Paulescu/adversarial-machine-learning/blob/main/images/dog.jpg?raw=true'
46 | # url = st.sidebar.text_input('Introduce URL of the initial image 👇🏼', example_url)
47 | st.markdown('## Original image')
48 | url = st.text_input('Introduce URL of the initial image 👇🏼', example_url)
49 |
50 | IMAGE_WIDTH = 350
51 |
52 | @st.cache
53 | def fetch_image(url):
54 | response = requests.get(url)
55 | x = Image.open(io.BytesIO(response.content))
56 | x = inverse_preprocess(preprocess(x))
57 | return x
58 | img = fetch_image(url)
59 |
60 | prediction = predict(model, img)
61 | caption = f'{prediction["label"]} \n {prediction["confidence"]:.0%}'
62 | st.image(img, caption=caption, width=IMAGE_WIDTH*2)
63 |
64 | # Selector parameters
65 | epsilon = st.sidebar.slider('Step size', min_value=0.0, max_value=0.25, step=0.01, value=0.09, format="%.3f")
66 | alpha = st.sidebar.slider('Max perturbation', min_value=0.00, max_value=0.250, step=0.001, value=0.025, format="%.3f")
67 | n_steps = st.sidebar.number_input('Number of steps', step=1, min_value=1, max_value=50, value=9)
68 |
69 | # image_width = 299
70 | st.markdown('## FGSM steps')
71 | image_width = int(IMAGE_WIDTH * 2 / 3)
72 | iterator = iterative_fast_gradient_sign_(model, preprocess(img), epsilon, n_steps=n_steps, alpha=alpha)
73 | counter = 1
74 | for x_adv, grad in iterator:
75 |
76 | st.markdown(f'## Step {counter}')
77 |
78 | # get model predictions
79 | prediction_adv = predict(model, x_adv)
80 |
81 | # print them
82 | caption_adv = f'= {prediction_adv["label"]} \n {prediction_adv["confidence"]:.0%}'
83 | st.image([x_adv, grad, x_adv], width=image_width, caption=['', f'* {epsilon}', caption_adv], output_format='JPEG')
84 |
85 | counter += 1
86 |
87 | # x_adv, grad = fast_gradient_sign(model, preprocess(img), epsilon, output_type='rgb')
88 | # prediction_adv = predict(model, x_adv)
89 | # for i in range(0, 3):
90 | # caption_adv = f'= {prediction_adv["label"]} \n {prediction_adv["confidence"]:.0%}'
91 | # st.image([grad, x_adv], width=image_width, caption=[f'* {epsilon}', caption_adv], output_format='JPEG')
92 |
93 |
--------------------------------------------------------------------------------
/src/viz.py:
--------------------------------------------------------------------------------
1 | # from pdb import set_trace as stop
2 |
3 | import numpy as np
4 | import matplotlib.pyplot as plt
5 |
6 |
7 | def plot(x, x_adv, x_grad, epsilon, x_label, x_prob, x_adv_label, x_adv_prob):
8 | """"""
9 |
10 | # figure, ax = plt.subplots(1,3, figsize=(18,8))
11 | figure, ax = plt.subplots(1,3, figsize=(12,8))
12 | ax[0].imshow(x)
13 | ax[0].set_title('Original', fontsize=16)
14 |
15 | ax[1].imshow(x_grad)
16 | ax[1].set_title('Perturbation', fontsize=16)
17 | ax[1].set_yticklabels([])
18 | ax[1].set_xticklabels([])
19 | ax[1].set_xticks([])
20 | ax[1].set_yticks([])
21 |
22 | ax[2].imshow(x_adv)
23 | ax[2].set_title('New', fontsize=16)
24 |
25 | ax[0].axis('off')
26 | ax[2].axis('off')
27 |
28 | ax[0].text(1.1,0.5, "+{}*".format(round(epsilon,3)), size=15, ha="center",
29 | transform=ax[0].transAxes)
30 |
31 | ax[0].text(0.5,-0.13, "Prediction: {}\n Probability: {:.0%}".format(x_label, x_prob), size=12, ha="center",
32 | transform=ax[0].transAxes)
33 |
34 | ax[1].text(1.1,0.5, " = ", size=15, ha="center", transform=ax[1].transAxes)
35 |
36 | ax[2].text(0.5,-0.13, "Prediction: {}\n Probability: {:.0%}".format(x_adv_label, x_adv_prob), size=12, ha="center",
37 | transform=ax[2].transAxes)
38 |
39 |
40 | plt.show()
41 |
42 |
43 | def plot_single(x):
44 | """"""
45 | # figure, ax = plt.subplots(1,3, figsize=(18,8))
46 | figure, ax = plt.subplots(1,3, figsize=(12,8))
47 | ax[0].imshow(x)
48 | ax[0].set_title('Clean Example', fontsize=16)
49 |
50 | plt.show()
51 |
52 |
53 | def visualize_OLD(x, x_adv, x_grad, epsilon):
54 | """"""
55 | # get predicted label and confidence of x
56 | x_predictions = get_predictions(x)
57 | x_label = x_predictions.label
58 | x_prob = x_predictions.confidence
59 |
60 | # get predicted label and confidence of x_adv
61 | x_adv_predictions = get_predictions(x_adv)
62 | x_adv_label = x_adv_predictions.label
63 | x_adv_prob = x_adv_predictions.confidence
64 |
65 | # transform x into its raw form for visualization
66 | x = x.squeeze(0) # remove batch dimension: B x C x H x W ==> C x H x W
67 | x = inverse_preprocess(x)
68 | x = np.transpose( x , (1,2,0)) # C x H x W ==> H x W x C
69 | x = np.clip(x, 0, 1)
70 |
71 | # transform x_adv into its raw form for visualization
72 | x_adv = x_adv.squeeze(0)
73 | x_adv = inverse_preprocess(x_adv)
74 | x_adv = np.transpose( x_adv , (1,2,0)) # C X H X W ==> H X W X C
75 | x_adv = np.clip(x_adv, 0, 1)
76 |
77 | # transform grad into its raw form for visualization
78 | x_grad = x_grad.squeeze(0).numpy()
79 | x_grad = np.transpose(x_grad, (1,2,0))
80 | x_grad = np.clip(x_grad, 0, 1)
81 |
82 | # ----------------
83 | # start plotting
84 | # ----------------
85 | figure, ax = plt.subplots(1,3, figsize=(18,8))
86 | ax[0].imshow(x)
87 | ax[0].set_title('Clean Example', fontsize=20)
88 |
89 | ax[1].imshow(x_grad)
90 | ax[1].set_title('Perturbation', fontsize=20)
91 | ax[1].set_yticklabels([])
92 | ax[1].set_xticklabels([])
93 | ax[1].set_xticks([])
94 | ax[1].set_yticks([])
95 |
96 |
97 | ax[2].imshow(x_adv)
98 | ax[2].set_title('Adversarial Example', fontsize=20)
99 |
100 | ax[0].axis('off')
101 | ax[2].axis('off')
102 |
103 | ax[0].text(1.1,0.5, "+{}*".format(round(epsilon,3)), size=15, ha="center",
104 | transform=ax[0].transAxes)
105 |
106 | ax[0].text(0.5,-0.13, "Prediction: {}\n Probability: {}".format(x_label, x_prob), size=15, ha="center",
107 | transform=ax[0].transAxes)
108 |
109 | ax[1].text(1.1,0.5, " = ", size=15, ha="center", transform=ax[1].transAxes)
110 |
111 | ax[2].text(0.5,-0.13, "Prediction: {}\n Probability: {}".format(x_adv_label, x_adv_prob), size=15, ha="center",
112 | transform=ax[2].transAxes)
113 |
114 |
115 | plt.show()
--------------------------------------------------------------------------------