├── app ├── runtime.txt ├── Procfile ├── requirements.txt ├── setup.sh └── app.py ├── .gitignore ├── naked ├── funcs │ ├── __init__.py │ └── sklearn │ │ ├── feature_extraction │ │ ├── __init__.py │ │ └── text.py │ │ ├── __init__.py │ │ ├── preprocessing.py │ │ └── linear_model.py ├── test_naked.py └── __init__.py ├── pytest.ini ├── pyproject.toml ├── .github └── workflows │ └── app.yml ├── LICENSE ├── README.md └── poetry.lock /app/runtime.txt: -------------------------------------------------------------------------------- 1 | python-3.8.8 2 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | *.ipynb 2 | *.pyc 3 | dist/ 4 | -------------------------------------------------------------------------------- /naked/funcs/__init__.py: -------------------------------------------------------------------------------- 1 | from . import sklearn 2 | -------------------------------------------------------------------------------- /app/Procfile: -------------------------------------------------------------------------------- 1 | web: sh setup.sh && streamlit run app.py 2 | -------------------------------------------------------------------------------- /naked/funcs/sklearn/feature_extraction/__init__.py: -------------------------------------------------------------------------------- 1 | from . import text 2 | -------------------------------------------------------------------------------- /app/requirements.txt: -------------------------------------------------------------------------------- 1 | git+https://github.com/MaxHalford/naked 2 | streamlit 3 | -------------------------------------------------------------------------------- /pytest.ini: -------------------------------------------------------------------------------- 1 | [pytest] 2 | addopts = 3 | --doctest-modules 4 | --doctest-glob=README.md 5 | -------------------------------------------------------------------------------- /naked/funcs/sklearn/__init__.py: -------------------------------------------------------------------------------- 1 | from . import feature_extraction 2 | from . import linear_model 3 | from . import preprocessing 4 | -------------------------------------------------------------------------------- /app/setup.sh: -------------------------------------------------------------------------------- 1 | mkdir -p ~/.streamlit/ 2 | 3 | echo "\ 4 | [general]\n\ 5 | email = \"maxhalford25@gmail.com\"\n\ 6 | " > ~/.streamlit/credentials.toml 7 | 8 | echo "\ 9 | [server]\n\ 10 | headless = true\n\ 11 | enableCORS = false\n\ 12 | port = $PORT\n\ 13 | " > ~/.streamlit/config.toml 14 | -------------------------------------------------------------------------------- /pyproject.toml: -------------------------------------------------------------------------------- 1 | [tool.poetry] 2 | name = "naked" 3 | version = "0.1.0" 4 | description = "Strip a model and only keep what matters for predicting." 5 | authors = ["MaxHalford "] 6 | license = "MIT" 7 | 8 | [tool.poetry.dependencies] 9 | python = "^3.8" 10 | scikit-learn = "^0.24.1" 11 | 12 | [tool.poetry.dev-dependencies] 13 | pytest = "^6.2.2" 14 | streamlit = "^0.78.0" 15 | 16 | [build-system] 17 | requires = ["poetry-core>=1.0.0"] 18 | build-backend = "poetry.core.masonry.api" 19 | -------------------------------------------------------------------------------- /.github/workflows/app.yml: -------------------------------------------------------------------------------- 1 | name: App 2 | 3 | on: 4 | push: 5 | branches: 6 | - main 7 | 8 | jobs: 9 | build: 10 | runs-on: ubuntu-latest 11 | steps: 12 | - uses: actions/checkout@v2 13 | - uses: akhileshns/heroku-deploy@v3.6.8 14 | with: 15 | heroku_api_key: ${{ secrets.HEROKU_API_KEY }} 16 | heroku_app_name: naked-app 17 | heroku_email: maxhalford25@gmail.com 18 | buildpack: heroku/python 19 | appdir: app 20 | healthcheck: https://naked-app.herokuapp.com/ 21 | delay: 10 22 | -------------------------------------------------------------------------------- /naked/funcs/sklearn/preprocessing.py: -------------------------------------------------------------------------------- 1 | def normalizer(x, norm): 2 | if norm == 'l2': 3 | norm_val = sum(xi ** 2 for xi in x) ** .5 4 | elif norm == 'l1': 5 | norm_val = sum(abs(xi) for xi in x) 6 | elif norm == 'max': 7 | norm_val = max(abs(xi) for xi in x) 8 | 9 | return [xi / norm_val for xi in x] 10 | 11 | 12 | def standard_scaler(x, mean_, var_, with_mean, with_std): 13 | 14 | def scale(x, m, v): 15 | if with_mean: 16 | x -= m 17 | if with_std: 18 | x /= v ** .5 19 | return x 20 | 21 | return [scale(xi, m, v) for xi, m, v in zip(x, mean_, var_)] 22 | -------------------------------------------------------------------------------- /naked/funcs/sklearn/linear_model.py: -------------------------------------------------------------------------------- 1 | def linear_regression(x, coef_, intercept_): 2 | return intercept_ + sum(xi * wi for xi, wi in enumerate(coef_)) 3 | 4 | 5 | def logistic_regression(x, coef_, intercept_): 6 | import math 7 | 8 | logits = [ 9 | b + sum(xi * wi for xi, wi in zip(x, w)) 10 | for w, b in zip(coef_, intercept_) 11 | ] 12 | 13 | # Sigmoid activation for binary classification 14 | if len(logits) == 1: 15 | p_true = 1 / (1 + math.exp(-logits[0])) 16 | return [1 - p_true, p_true] 17 | 18 | # Softmax activation for multi-class classification 19 | z_max = max(logits) 20 | exp = [math.exp(z - z_max) for z in logits] 21 | exp_sum = sum(exp) 22 | return [e / exp_sum for e in exp] 23 | -------------------------------------------------------------------------------- /naked/funcs/sklearn/feature_extraction/text.py: -------------------------------------------------------------------------------- 1 | def tfidf_vectorizer(x, lowercase, norm, vocabulary_, idf_): 2 | 3 | import re 4 | 5 | if lowercase: 6 | x = x.lower() 7 | 8 | # Tokenize 9 | x = re.findall(r"(?u)\b\w\w+\b", x) 10 | x = [xi for xi in x if len(xi) > 1] 11 | 12 | # Count term frequencies 13 | from collections import Counter 14 | tf = Counter(x) 15 | total = sum(tf.values()) 16 | 17 | # Compute the TF-IDF of each tokenized term 18 | tfidf = [0] * len(vocabulary_) 19 | for term, freq in tf.items(): 20 | try: 21 | index = vocabulary_[term] 22 | except KeyError: 23 | continue 24 | tfidf[index] = freq * idf_[index] / total 25 | 26 | # Apply normalization 27 | if norm == 'l2': 28 | norm_val = sum(xi ** 2 for xi in tfidf) ** .5 29 | 30 | return [v / norm_val for v in tfidf] 31 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2021 Max Halford 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /app/app.py: -------------------------------------------------------------------------------- 1 | import importlib 2 | import pickle 3 | 4 | import naked 5 | from naked import mapping 6 | import streamlit as st 7 | 8 | """ 9 | # Convert a machine learning estimator to pure Python code 10 | 11 | This is a tool that renders a pure Python representation of a 12 | [pickled](https://docs.python.org/3/library/pickle.html) estimator. The output is just a bunch of 13 | Python functions that don't require any dependencies whatsoever. This makes it really trivial to 14 | put a machine learning model into production: you just have to copy/paste the code into your 15 | application. The code generation is done with [`naked`](https://github.com/MaxHalford/naked). 16 | 17 | The following estimators are supported: 18 | """ 19 | 20 | listing = "" 21 | 22 | for name, estimators in mapping.items(): 23 | lib = importlib.import_module(name) 24 | listing += f'* {name} {lib.__version__}\n' 25 | for estimator in estimators: 26 | listing += f' * {estimator}\n' 27 | 28 | st.markdown(listing) 29 | 30 | uploaded_file = st.file_uploader("Choose a pickled model") 31 | 32 | if uploaded_file: 33 | model = pickle.loads(uploaded_file.getvalue()) 34 | st.code(naked.strip(model)) 35 | -------------------------------------------------------------------------------- /naked/test_naked.py: -------------------------------------------------------------------------------- 1 | import math 2 | 3 | import numpy as np 4 | import pytest 5 | from sklearn import datasets 6 | from sklearn.linear_model import LinearRegression, LogisticRegression 7 | from sklearn.pipeline import make_pipeline 8 | from sklearn.preprocessing import StandardScaler 9 | 10 | import naked 11 | 12 | 13 | @pytest.mark.parametrize("model", [ 14 | LinearRegression() 15 | ]) 16 | @pytest.mark.parametrize("dataset", [ 17 | datasets.make_regression(), 18 | datasets.load_boston(return_X_y=True), 19 | datasets.load_diabetes(return_X_y=True) 20 | ]) 21 | def test_reg(model, dataset): 22 | 23 | X, y = dataset 24 | model.fit(X, y) 25 | func = naked.strip(model) 26 | 27 | for x, yp in zip(X, model.predict(X)): 28 | assert math.isclose(func(x), yp) 29 | 30 | 31 | @pytest.mark.parametrize("model", [ 32 | make_pipeline(StandardScaler(), LogisticRegression()) 33 | ]) 34 | @pytest.mark.parametrize("dataset", [ 35 | # Binary 36 | datasets.make_classification(), 37 | datasets.load_breast_cancer(return_X_y=True), 38 | # Multi-class 39 | datasets.load_wine(return_X_y=True) 40 | ]) 41 | def test_clf(model, dataset): 42 | 43 | X, y = dataset 44 | model.fit(X, y) 45 | func = naked.strip(model) 46 | 47 | for x, yp in zip(X, model.predict_proba(X)): 48 | assert np.allclose(func(x), yp) 49 | -------------------------------------------------------------------------------- /naked/__init__.py: -------------------------------------------------------------------------------- 1 | import inspect 2 | import re 3 | import types 4 | 5 | import numpy as np 6 | from sklearn.pipeline import Pipeline 7 | from sklearn.utils.validation import check_is_fitted 8 | 9 | from . import funcs 10 | 11 | 12 | __all__ = ['strip', 'AVAILABLE_MODELS'] 13 | 14 | class Func: 15 | 16 | def __init__(self, name, code): 17 | self.name = name 18 | self.code = code 19 | code = compile(code, "", "exec") 20 | self.func = types.FunctionType(code.co_consts[0], globals(), name) 21 | 22 | def __call__(self, x): 23 | return self.func(x) 24 | 25 | def __repr__(self): 26 | return self.code.replace('\n\n\n', '\n\n') 27 | 28 | class FuncPipeline: 29 | 30 | def __init__(self, funcs): 31 | self.funcs = funcs 32 | 33 | def __call__(self, x): 34 | for func in self.funcs: 35 | x = func(x) 36 | return x 37 | 38 | def __repr__(self): 39 | code = '\n\n'.join(repr(func) for func in self.funcs) 40 | 41 | code += '\n\n' 42 | code += 'def pipeline(x):\n' 43 | for func in self.funcs: 44 | code += f' x = {func.name}(x)\n' 45 | code += ' return x' 46 | 47 | return code 48 | 49 | 50 | mapping = { 51 | 'sklearn': { 52 | 'LinearRegression': funcs.sklearn.linear_model.linear_regression, 53 | 'LogisticRegression': funcs.sklearn.linear_model.logistic_regression, 54 | 'Normalizer': funcs.sklearn.preprocessing.normalizer, 55 | 'StandardScaler': funcs.sklearn.preprocessing.standard_scaler, 56 | 'TfidfVectorizer': funcs.sklearn.feature_extraction.text.tfidf_vectorizer 57 | } 58 | } 59 | 60 | 61 | AVAILABLE = '\n'.join( 62 | mod + '\n' + '\n'.join(f' {m}' for m in sorted(mapping[mod])) 63 | for mod in mapping 64 | ) 65 | 66 | 67 | def handle_input_names(x): 68 | return [x[name] for name in names] 69 | 70 | 71 | def make_handle_input_names(names: str) -> Func: 72 | code = inspect.getsource(handle_input_names) 73 | loc = code.splitlines() 74 | return Func('handle_input_names', loc[0] + f'\n names = {names}\n' + loc[1]) 75 | 76 | 77 | def handle_output_names(x): 78 | return dict(zip(names, x)) 79 | 80 | 81 | def make_handle_output_names(names: str) -> Func: 82 | code = inspect.getsource(handle_output_names) 83 | loc = code.splitlines() 84 | return Func('handle_output_names', loc[0] + f'\n names = {names}\n' + loc[1]) 85 | 86 | 87 | def _strip(model): 88 | 89 | # Check if the model is supported 90 | mod = model.__class__.__module__.split('.')[0] 91 | try: 92 | func = mapping[mod][model.__class__.__name__] 93 | except KeyError: 94 | raise KeyError(f"I don't know how to unstrip {model.__class__.__name__} from {mod}.") 95 | 96 | # The model needs to have called fit 97 | check_is_fitted(model) 98 | 99 | # Now we just have to edit the function's source code by inserting the parameters 100 | code = inspect.getsource(func) 101 | code = re.sub(r'\(.+\)', '(x)', code, count=1) 102 | 103 | params_code = '' 104 | 105 | for param_name in inspect.signature(func).parameters: 106 | if param_name == 'x': 107 | continue 108 | 109 | param_val = getattr(model, param_name) 110 | if isinstance(param_val, np.ndarray): 111 | param_val = param_val.tolist() 112 | if isinstance(param_val, str): 113 | param_val = f"'{param_val}'" 114 | 115 | params_code += f' {param_name} = {param_val}\n' 116 | 117 | # Insert the parameter specification code 118 | loc = code.splitlines() 119 | code = loc[0] + '\n\n' + params_code + '\n' + '\n'.join(loc[1:]) 120 | 121 | return Func(func.__name__, code) 122 | 123 | 124 | def strip(model, input_names=None, output_names=None): 125 | 126 | if isinstance(model, Pipeline): 127 | func = FuncPipeline([_strip(step) for _, step in model.steps]) 128 | else: 129 | func = _strip(model) 130 | 131 | # If input names are specified, then we'll assume that the input x is a dictionary and not a 132 | # list. We'll be able to handle by first mapping the dictionary values to a list in the 133 | # specified order. 134 | if input_names is not None: 135 | handle_input_names = make_handle_input_names(input_names) 136 | if isinstance(func, FuncPipeline): 137 | func.funcs.insert(0, handle_input_names) 138 | else: 139 | func = FuncPipeline([handle_input_names, func]) 140 | 141 | # If output names are specified, then we'll produce a dictionary instead of a list. 142 | if output_names is not None: 143 | handle_output_names = make_handle_output_names(output_names) 144 | if isinstance(func, FuncPipeline): 145 | func.funcs.append(handle_output_names) 146 | else: 147 | func = FuncPipeline([func, handle_output_names]) 148 | 149 | return func 150 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 |

naked

2 | 3 | `naked` is a Python tool which allows you to strip a model and only keep what matters for making predictions. The result is a pure Python function with no third-party dependencies that you can simply copy/paste wherever you wish. 4 | 5 | This is simpler than deploying an API endpoint or loading a serialized model. The jury is still out on whether this is sane or not. Of course I'm not the first one to have done this, for instance see [sklearn-porter](https://github.com/nok/sklearn-porter) and [pure-predict](https://github.com/Ibotta/pure-predict). Note if you don't mind installing depencencies on your inference machine, then tools such as [scikit-learn-intelex](https://github.com/intel/scikit-learn-intelex) might do the job for you. It's also worth mentioning [xgb2sql](https://github.com/Chryzanthemum/xgb2sql), which converts an XGBoost model to a SQL query. 6 | 7 | Note that you can use `naked` via this [web interface](https://naked-app.herokuapp.com/). 8 | 9 | - [Installation](#installation) 10 | - [Examples](#examples) 11 | - [`sklearn.linear_model.LinearRegression`](#sklearnlinear_modellinearregression) 12 | - [`sklearn.pipeline.Pipeline`](#sklearnpipelinepipeline) 13 | - [FAQ](#faq) 14 | - [What models are supported?](#what-models-are-supported) 15 | - [Will this work for all library versions?](#will-this-work-for-all-library-versions) 16 | - [How can I trust this is correct?](#how-can-i-trust-this-is-correct) 17 | - [How should I handle feature names?](#how-should-i-handle-feature-names) 18 | - [What about output names?](#what-about-output-names) 19 | - [Development workflow](#development-workflow) 20 | - [Things to do](#things-to-do) 21 | - [License](#license) 22 | 23 | ## Installation 24 | 25 | ```sh 26 | pip install git+https://github.com/MaxHalford/naked 27 | ``` 28 | 29 | ## Examples 30 | 31 | ### `sklearn.linear_model.LinearRegression` 32 | 33 | First, we fit a model. 34 | 35 | ```py 36 | import numpy as np 37 | from sklearn.linear_model import LinearRegression 38 | 39 | X = np.array([[1, 1], [1, 2], [2, 2], [2, 3]]) 40 | y = np.dot(X, np.array([1, 2])) + 3 41 | lin_reg = LinearRegression().fit(X, y) 42 | lin_reg.fit(X, y) 43 | ``` 44 | 45 | Then, we strip it. 46 | 47 | ```py 48 | import naked 49 | 50 | print(naked.strip(lin_reg)) 51 | ``` 52 | 53 | Which produces the following output. 54 | 55 | ```py 56 | def linear_regression(x): 57 | 58 | coef_ = [1.0000000000000002, 1.9999999999999991] 59 | intercept_ = 3.0000000000000018 60 | 61 | return intercept_ + sum(xi * wi for xi, wi in enumerate(coef_)) 62 | ``` 63 | 64 | ### `sklearn.pipeline.Pipeline` 65 | 66 | ```py 67 | import naked 68 | from sklearn import linear_model 69 | from sklearn import feature_extraction 70 | from sklearn import pipeline 71 | from sklearn import preprocessing 72 | 73 | model = pipeline.make_pipeline( 74 | feature_extraction.text.TfidfVectorizer(), 75 | preprocessing.Normalizer(), 76 | linear_model.LogisticRegression(solver='liblinear') 77 | ) 78 | 79 | docs = ['Sad', 'Angry', 'Happy', 'Joyful'] 80 | is_positive = [False, False, True, True] 81 | 82 | model.fit(docs, is_positive) 83 | 84 | print(naked.strip(model)) 85 | ``` 86 | 87 | This produces the following output. 88 | 89 | ```py 90 | def tfidf_vectorizer(x): 91 | 92 | lowercase = True 93 | norm = 'l2' 94 | vocabulary_ = {'sad': 3, 'angry': 0, 'happy': 1, 'joyful': 2} 95 | idf_ = [1.916290731874155, 1.916290731874155, 1.916290731874155, 1.916290731874155] 96 | 97 | import re 98 | 99 | if lowercase: 100 | x = x.lower() 101 | 102 | # Tokenize 103 | x = re.findall(r"(?u)\b\w\w+\b", x) 104 | x = [xi for xi in x if len(xi) > 1] 105 | 106 | # Count term frequencies 107 | from collections import Counter 108 | tf = Counter(x) 109 | total = sum(tf.values()) 110 | 111 | # Compute the TF-IDF of each tokenized term 112 | tfidf = [0] * len(vocabulary_) 113 | for term, freq in tf.items(): 114 | try: 115 | index = vocabulary_[term] 116 | except KeyError: 117 | continue 118 | tfidf[index] = freq * idf_[index] / total 119 | 120 | # Apply normalization 121 | if norm == 'l2': 122 | norm_val = sum(xi ** 2 for xi in tfidf) ** .5 123 | 124 | return [v / norm_val for v in tfidf] 125 | 126 | def normalizer(x): 127 | 128 | norm = 'l2' 129 | 130 | if norm == 'l2': 131 | norm_val = sum(xi ** 2 for xi in x) ** .5 132 | elif norm == 'l1': 133 | norm_val = sum(abs(xi) for xi in x) 134 | elif norm == 'max': 135 | norm_val = max(abs(xi) for xi in x) 136 | 137 | return [xi / norm_val for xi in x] 138 | 139 | def logistic_regression(x): 140 | 141 | coef_ = [[-0.40105811611957726, 0.40105811611957726, 0.40105811611957726, -0.40105811611957726]] 142 | intercept_ = [0.0] 143 | 144 | import math 145 | 146 | logits = [ 147 | b + sum(xi * wi for xi, wi in zip(x, w)) 148 | for w, b in zip(coef_, intercept_) 149 | ] 150 | 151 | # Sigmoid activation for binary classification 152 | if len(logits) == 1: 153 | p_true = 1 / (1 + math.exp(-logits[0])) 154 | return [1 - p_true, p_true] 155 | 156 | # Softmax activation for multi-class classification 157 | z_max = max(logits) 158 | exp = [math.exp(z - z_max) for z in logits] 159 | exp_sum = sum(exp) 160 | return [e / exp_sum for e in exp] 161 | 162 | def pipeline(x): 163 | x = tfidf_vectorizer(x) 164 | x = normalizer(x) 165 | x = logistic_regression(x) 166 | return x 167 | ``` 168 | 169 | ## FAQ 170 | 171 | ### What models are supported? 172 | 173 | ```py 174 | >>> import naked 175 | >>> print(naked.AVAILABLE) 176 | sklearn 177 | LinearRegression 178 | LogisticRegression 179 | Normalizer 180 | StandardScaler 181 | TfidfVectorizer 182 | 183 | ``` 184 | 185 | ### Will this work for all library versions? 186 | 187 | Not by design. A release of `naked` is intended to support a library above a particular version. If we notice that `naked` doesn't work for a newer version of a given library, then a new version of `naked` should be released to handle said library version. You may refer to the [`pyproject.toml`](pyproject.toml) file to view library support. 188 | 189 | ### How can I trust this is correct? 190 | 191 | This package is really easy to unit test. One simply has to compare the outputs of the model with its "naked" version and check that the outputs are identical. Check out the [`test_naked.py`](naked/test_naked.py) file if you're curious. 192 | 193 | ### How should I handle feature names? 194 | 195 | Let's take the example of a multi-class logistic regression trained on the wine dataset. 196 | 197 | ```py 198 | from sklearn import datasets 199 | from sklearn import linear_model 200 | from sklearn import pipeline 201 | from sklearn import preprocessing 202 | 203 | dataset = datasets.load_wine() 204 | X = dataset.data 205 | y = dataset.target 206 | model = pipeline.make_pipeline( 207 | preprocessing.StandardScaler(), 208 | linear_model.LogisticRegression() 209 | ) 210 | model.fit(X, y) 211 | ``` 212 | 213 | By default, the `strip` function produces a function that takes as input a list of feature values. Instead, let's say we want to evaluate the function on a dictionary of features, thus associating each feature value with a name. 214 | 215 | ```py 216 | x = dict(zip(dataset.feature_names, X[0])) 217 | print(x) 218 | ``` 219 | 220 | ```py 221 | {'alcohol': 14.23, 222 | 'malic_acid': 1.71, 223 | 'ash': 2.43, 224 | 'alcalinity_of_ash': 15.6, 225 | 'magnesium': 127.0, 226 | 'total_phenols': 2.8, 227 | 'flavanoids': 3.06, 228 | 'nonflavanoid_phenols': 0.28, 229 | 'proanthocyanins': 2.29, 230 | 'color_intensity': 5.64, 231 | 'hue': 1.04, 232 | 'od280/od315_of_diluted_wines': 3.92, 233 | 'proline': 1065.0} 234 | ``` 235 | 236 | Passing the feature names to the `strip` function will add a function that maps the features to a list. 237 | 238 | ```py 239 | naked.strip(model, input_names=dataset.feature_names) 240 | ``` 241 | 242 | ```py 243 | def handle_input_names(x): 244 | names = ['alcohol', 'malic_acid', 'ash', 'alcalinity_of_ash', 'magnesium', 'total_phenols', 'flavanoids', 'nonflavanoid_phenols', 'proanthocyanins', 'color_intensity', 'hue', 'od280/od315_of_diluted_wines', 'proline'] 245 | return [x[name] for name in names] 246 | 247 | def standard_scaler(x): 248 | 249 | mean_ = [13.000617977528083, 2.336348314606741, 2.3665168539325854, 19.49494382022472, 99.74157303370787, 2.295112359550562, 2.0292696629213474, 0.36185393258426973, 1.5908988764044953, 5.058089882022473, 0.9574494382022468, 2.6116853932584254, 746.8932584269663] 250 | var_ = [0.6553597304633259, 1.241004080924126, 0.07484180027774268, 11.090030614821362, 202.84332786264366, 0.3894890323191514, 0.9921135115515715, 0.015401619113748266, 0.32575424820098453, 5.344255847629093, 0.05195144969069561, 0.5012544628203511, 98609.60096578706] 251 | with_mean = True 252 | with_std = True 253 | 254 | def scale(x, m, v): 255 | if with_mean: 256 | x -= m 257 | if with_std: 258 | x /= v ** .5 259 | return x 260 | 261 | return [scale(xi, m, v) for xi, m, v in zip(x, mean_, var_)] 262 | 263 | def logistic_regression(x): 264 | 265 | coef_ = [[0.8101347947338147, 0.20382073148760085, 0.47221241678911957, -0.8447843882542064, 0.04952904623674445, 0.21372479616642068, 0.6478750705319883, -0.19982499112990385, 0.13833867563545404, 0.17160966151451867, 0.13090887117218597, 0.7259506896985365, 1.07895948707047], [-1.0103233753629153, -0.44045952703036084, -0.8480739967718842, 0.5835732316278703, -0.09770602368275362, 0.027527982220605866, 0.35399157401383297, 0.21278279386396404, 0.2633610495737497, -1.0412707677956505, 0.6825215991118386, 0.05287634940648419, -1.1407929345327175], [0.20018858062910203, 0.23663879554275832, 0.37586157998276365, 0.26121115662633365, 0.048176977446007865, -0.2412527783870254, -1.0018666445458222, -0.012957802734061021, -0.40169972520920566, 0.8696611062811332, -0.8134304702840255, -0.7788270391050198, 0.061833447462247046]] 266 | intercept_ = [0.41229358315867787, 0.7048164121833935, -1.1171099953420585] 267 | 268 | import math 269 | 270 | logits = [ 271 | b + sum(xi * wi for xi, wi in zip(x, w)) 272 | for w, b in zip(coef_, intercept_) 273 | ] 274 | 275 | # Sigmoid activation for binary classification 276 | if len(logits) == 1: 277 | p_true = 1 / (1 + math.exp(-logits[0])) 278 | return [1 - p_true, p_true] 279 | 280 | # Softmax activation for multi-class classification 281 | z_max = max(logits) 282 | exp = [math.exp(z - z_max) for z in logits] 283 | exp_sum = sum(exp) 284 | return [e / exp_sum for e in exp] 285 | 286 | def pipeline(x): 287 | x = handle_input_names(x) 288 | x = standard_scaler(x) 289 | x = logistic_regression(x) 290 | return x 291 | ``` 292 | 293 | ### What about output names? 294 | 295 | You can also specify the `output_names` parameter to associate each output value with a name. Of course, this doesn't work for cases where a single value is produced, such as single-target regression. 296 | 297 | 298 | ```py 299 | naked.strip(model, input_names=dataset.feature_names, output_names=dataset.target_names) 300 | ``` 301 | 302 | ```py 303 | def handle_input_names(x): 304 | names = ['alcohol', 'malic_acid', 'ash', 'alcalinity_of_ash', 'magnesium', 'total_phenols', 'flavanoids', 'nonflavanoid_phenols', 'proanthocyanins', 'color_intensity', 'hue', 'od280/od315_of_diluted_wines', 'proline'] 305 | return [x[name] for name in names] 306 | 307 | def standard_scaler(x): 308 | 309 | mean_ = [13.000617977528083, 2.336348314606741, 2.3665168539325854, 19.49494382022472, 99.74157303370787, 2.295112359550562, 2.0292696629213474, 0.36185393258426973, 1.5908988764044953, 5.058089882022473, 0.9574494382022468, 2.6116853932584254, 746.8932584269663] 310 | var_ = [0.6553597304633259, 1.241004080924126, 0.07484180027774268, 11.090030614821362, 202.84332786264366, 0.3894890323191514, 0.9921135115515715, 0.015401619113748266, 0.32575424820098453, 5.344255847629093, 0.05195144969069561, 0.5012544628203511, 98609.60096578706] 311 | with_mean = True 312 | with_std = True 313 | 314 | def scale(x, m, v): 315 | if with_mean: 316 | x -= m 317 | if with_std: 318 | x /= v ** .5 319 | return x 320 | 321 | return [scale(xi, m, v) for xi, m, v in zip(x, mean_, var_)] 322 | 323 | def logistic_regression(x): 324 | 325 | coef_ = [[0.8101347947338147, 0.20382073148760085, 0.47221241678911957, -0.8447843882542064, 0.04952904623674445, 0.21372479616642068, 0.6478750705319883, -0.19982499112990385, 0.13833867563545404, 0.17160966151451867, 0.13090887117218597, 0.7259506896985365, 1.07895948707047], [-1.0103233753629153, -0.44045952703036084, -0.8480739967718842, 0.5835732316278703, -0.09770602368275362, 0.027527982220605866, 0.35399157401383297, 0.21278279386396404, 0.2633610495737497, -1.0412707677956505, 0.6825215991118386, 0.05287634940648419, -1.1407929345327175], [0.20018858062910203, 0.23663879554275832, 0.37586157998276365, 0.26121115662633365, 0.048176977446007865, -0.2412527783870254, -1.0018666445458222, -0.012957802734061021, -0.40169972520920566, 0.8696611062811332, -0.8134304702840255, -0.7788270391050198, 0.061833447462247046]] 326 | intercept_ = [0.41229358315867787, 0.7048164121833935, -1.1171099953420585] 327 | 328 | import math 329 | 330 | logits = [ 331 | b + sum(xi * wi for xi, wi in zip(x, w)) 332 | for w, b in zip(coef_, intercept_) 333 | ] 334 | 335 | # Sigmoid activation for binary classification 336 | if len(logits) == 1: 337 | p_true = 1 / (1 + math.exp(-logits[0])) 338 | return [1 - p_true, p_true] 339 | 340 | # Softmax activation for multi-class classification 341 | z_max = max(logits) 342 | exp = [math.exp(z - z_max) for z in logits] 343 | exp_sum = sum(exp) 344 | return [e / exp_sum for e in exp] 345 | 346 | def handle_output_names(x): 347 | names = ['class_0' 'class_1' 'class_2'] 348 | return dict(zip(names, x)) 349 | 350 | def pipeline(x): 351 | x = handle_input_names(x) 352 | x = standard_scaler(x) 353 | x = logistic_regression(x) 354 | x = handle_output_names(x) 355 | return x 356 | ``` 357 | 358 | As you can see, by specifying `input_names` as well as `output_names`, we obtain a pipeline of functions which takes as input a dictionary and produces a dictionary. 359 | ## Development workflow 360 | 361 | ```sh 362 | git clone https://github.com/MaxHalford/naked 363 | cd naked 364 | poetry install 365 | poetry shell 366 | pytest 367 | ``` 368 | 369 | You may test the web interface locally by running streamlit: 370 | 371 | ```sh 372 | streamlit run app/app.py 373 | ``` 374 | 375 | ## Things to do 376 | 377 | - Implement more models. For instance it should quite straightforward to support LightGBM. 378 | - Remove useless branching conditions. Parameters are currently handled via `if` statements. Ideally it would be nice to remove the `if` statements and only keep the code that will actually run. This should be doable by using the `ast` module. 379 | ## License 380 | 381 | MIT 382 | -------------------------------------------------------------------------------- /poetry.lock: -------------------------------------------------------------------------------- 1 | [[package]] 2 | name = "altair" 3 | version = "4.1.0" 4 | description = "Altair: A declarative statistical visualization library for Python." 5 | category = "dev" 6 | optional = false 7 | python-versions = ">=3.6" 8 | 9 | [package.dependencies] 10 | entrypoints = "*" 11 | jinja2 = "*" 12 | jsonschema = "*" 13 | numpy = "*" 14 | pandas = ">=0.18" 15 | toolz = "*" 16 | 17 | [package.extras] 18 | dev = ["black", "docutils", "ipython", "flake8", "pytest", "sphinx", "m2r", "vega-datasets", "recommonmark"] 19 | 20 | [[package]] 21 | name = "appnope" 22 | version = "0.1.2" 23 | description = "Disable App Nap on macOS >= 10.9" 24 | category = "dev" 25 | optional = false 26 | python-versions = "*" 27 | 28 | [[package]] 29 | name = "argon2-cffi" 30 | version = "20.1.0" 31 | description = "The secure Argon2 password hashing algorithm." 32 | category = "dev" 33 | optional = false 34 | python-versions = "*" 35 | 36 | [package.dependencies] 37 | cffi = ">=1.0.0" 38 | six = "*" 39 | 40 | [package.extras] 41 | dev = ["coverage[toml] (>=5.0.2)", "hypothesis", "pytest", "sphinx", "wheel", "pre-commit"] 42 | docs = ["sphinx"] 43 | tests = ["coverage[toml] (>=5.0.2)", "hypothesis", "pytest"] 44 | 45 | [[package]] 46 | name = "astor" 47 | version = "0.8.1" 48 | description = "Read/rewrite/write Python ASTs" 49 | category = "dev" 50 | optional = false 51 | python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,>=2.7" 52 | 53 | [[package]] 54 | name = "async-generator" 55 | version = "1.10" 56 | description = "Async generators and context managers for Python 3.5+" 57 | category = "dev" 58 | optional = false 59 | python-versions = ">=3.5" 60 | 61 | [[package]] 62 | name = "atomicwrites" 63 | version = "1.4.0" 64 | description = "Atomic file writes." 65 | category = "dev" 66 | optional = false 67 | python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" 68 | 69 | [[package]] 70 | name = "attrs" 71 | version = "20.3.0" 72 | description = "Classes Without Boilerplate" 73 | category = "dev" 74 | optional = false 75 | python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" 76 | 77 | [package.extras] 78 | dev = ["coverage[toml] (>=5.0.2)", "hypothesis", "pympler", "pytest (>=4.3.0)", "six", "zope.interface", "furo", "sphinx", "pre-commit"] 79 | docs = ["furo", "sphinx", "zope.interface"] 80 | tests = ["coverage[toml] (>=5.0.2)", "hypothesis", "pympler", "pytest (>=4.3.0)", "six", "zope.interface"] 81 | tests_no_zope = ["coverage[toml] (>=5.0.2)", "hypothesis", "pympler", "pytest (>=4.3.0)", "six"] 82 | 83 | [[package]] 84 | name = "backcall" 85 | version = "0.2.0" 86 | description = "Specifications for callback functions passed in to an API" 87 | category = "dev" 88 | optional = false 89 | python-versions = "*" 90 | 91 | [[package]] 92 | name = "base58" 93 | version = "2.1.0" 94 | description = "Base58 and Base58Check implementation." 95 | category = "dev" 96 | optional = false 97 | python-versions = ">=3.5" 98 | 99 | [package.extras] 100 | tests = ["pytest (>=4.6)", "pytest-flake8", "pytest-cov", "PyHamcrest (>=2.0.2)", "coveralls", "pytest-benchmark"] 101 | 102 | [[package]] 103 | name = "bleach" 104 | version = "3.3.0" 105 | description = "An easy safelist-based HTML-sanitizing tool." 106 | category = "dev" 107 | optional = false 108 | python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" 109 | 110 | [package.dependencies] 111 | packaging = "*" 112 | six = ">=1.9.0" 113 | webencodings = "*" 114 | 115 | [[package]] 116 | name = "blinker" 117 | version = "1.4" 118 | description = "Fast, simple object-to-object and broadcast signaling" 119 | category = "dev" 120 | optional = false 121 | python-versions = "*" 122 | 123 | [[package]] 124 | name = "cachetools" 125 | version = "4.2.1" 126 | description = "Extensible memoizing collections and decorators" 127 | category = "dev" 128 | optional = false 129 | python-versions = "~=3.5" 130 | 131 | [[package]] 132 | name = "certifi" 133 | version = "2020.12.5" 134 | description = "Python package for providing Mozilla's CA Bundle." 135 | category = "dev" 136 | optional = false 137 | python-versions = "*" 138 | 139 | [[package]] 140 | name = "cffi" 141 | version = "1.14.5" 142 | description = "Foreign Function Interface for Python calling C code." 143 | category = "dev" 144 | optional = false 145 | python-versions = "*" 146 | 147 | [package.dependencies] 148 | pycparser = "*" 149 | 150 | [[package]] 151 | name = "chardet" 152 | version = "4.0.0" 153 | description = "Universal encoding detector for Python 2 and 3" 154 | category = "dev" 155 | optional = false 156 | python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" 157 | 158 | [[package]] 159 | name = "click" 160 | version = "7.1.2" 161 | description = "Composable command line interface toolkit" 162 | category = "dev" 163 | optional = false 164 | python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" 165 | 166 | [[package]] 167 | name = "colorama" 168 | version = "0.4.4" 169 | description = "Cross-platform colored terminal text." 170 | category = "dev" 171 | optional = false 172 | python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" 173 | 174 | [[package]] 175 | name = "decorator" 176 | version = "4.4.2" 177 | description = "Decorators for Humans" 178 | category = "dev" 179 | optional = false 180 | python-versions = ">=2.6, !=3.0.*, !=3.1.*" 181 | 182 | [[package]] 183 | name = "defusedxml" 184 | version = "0.7.0" 185 | description = "XML bomb protection for Python stdlib modules" 186 | category = "dev" 187 | optional = false 188 | python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" 189 | 190 | [[package]] 191 | name = "entrypoints" 192 | version = "0.3" 193 | description = "Discover and load entry points from installed packages." 194 | category = "dev" 195 | optional = false 196 | python-versions = ">=2.7" 197 | 198 | [[package]] 199 | name = "gitdb" 200 | version = "4.0.5" 201 | description = "Git Object Database" 202 | category = "dev" 203 | optional = false 204 | python-versions = ">=3.4" 205 | 206 | [package.dependencies] 207 | smmap = ">=3.0.1,<4" 208 | 209 | [[package]] 210 | name = "gitpython" 211 | version = "3.1.14" 212 | description = "Python Git Library" 213 | category = "dev" 214 | optional = false 215 | python-versions = ">=3.4" 216 | 217 | [package.dependencies] 218 | gitdb = ">=4.0.1,<5" 219 | 220 | [[package]] 221 | name = "idna" 222 | version = "2.10" 223 | description = "Internationalized Domain Names in Applications (IDNA)" 224 | category = "dev" 225 | optional = false 226 | python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" 227 | 228 | [[package]] 229 | name = "iniconfig" 230 | version = "1.1.1" 231 | description = "iniconfig: brain-dead simple config-ini parsing" 232 | category = "dev" 233 | optional = false 234 | python-versions = "*" 235 | 236 | [[package]] 237 | name = "ipykernel" 238 | version = "5.5.0" 239 | description = "IPython Kernel for Jupyter" 240 | category = "dev" 241 | optional = false 242 | python-versions = ">=3.5" 243 | 244 | [package.dependencies] 245 | appnope = {version = "*", markers = "platform_system == \"Darwin\""} 246 | ipython = ">=5.0.0" 247 | jupyter-client = "*" 248 | tornado = ">=4.2" 249 | traitlets = ">=4.1.0" 250 | 251 | [package.extras] 252 | test = ["pytest (!=5.3.4)", "pytest-cov", "flaky", "nose", "jedi (<=0.17.2)"] 253 | 254 | [[package]] 255 | name = "ipython" 256 | version = "7.21.0" 257 | description = "IPython: Productive Interactive Computing" 258 | category = "dev" 259 | optional = false 260 | python-versions = ">=3.7" 261 | 262 | [package.dependencies] 263 | appnope = {version = "*", markers = "sys_platform == \"darwin\""} 264 | backcall = "*" 265 | colorama = {version = "*", markers = "sys_platform == \"win32\""} 266 | decorator = "*" 267 | jedi = ">=0.16" 268 | pexpect = {version = ">4.3", markers = "sys_platform != \"win32\""} 269 | pickleshare = "*" 270 | prompt-toolkit = ">=2.0.0,<3.0.0 || >3.0.0,<3.0.1 || >3.0.1,<3.1.0" 271 | pygments = "*" 272 | traitlets = ">=4.2" 273 | 274 | [package.extras] 275 | all = ["Sphinx (>=1.3)", "ipykernel", "ipyparallel", "ipywidgets", "nbconvert", "nbformat", "nose (>=0.10.1)", "notebook", "numpy (>=1.14)", "pygments", "qtconsole", "requests", "testpath"] 276 | doc = ["Sphinx (>=1.3)"] 277 | kernel = ["ipykernel"] 278 | nbconvert = ["nbconvert"] 279 | nbformat = ["nbformat"] 280 | notebook = ["notebook", "ipywidgets"] 281 | parallel = ["ipyparallel"] 282 | qtconsole = ["qtconsole"] 283 | test = ["nose (>=0.10.1)", "requests", "testpath", "pygments", "nbformat", "ipykernel", "numpy (>=1.14)"] 284 | 285 | [[package]] 286 | name = "ipython-genutils" 287 | version = "0.2.0" 288 | description = "Vestigial utilities from IPython" 289 | category = "dev" 290 | optional = false 291 | python-versions = "*" 292 | 293 | [[package]] 294 | name = "ipywidgets" 295 | version = "7.6.3" 296 | description = "IPython HTML widgets for Jupyter" 297 | category = "dev" 298 | optional = false 299 | python-versions = "*" 300 | 301 | [package.dependencies] 302 | ipykernel = ">=4.5.1" 303 | ipython = {version = ">=4.0.0", markers = "python_version >= \"3.3\""} 304 | jupyterlab-widgets = {version = ">=1.0.0", markers = "python_version >= \"3.6\""} 305 | nbformat = ">=4.2.0" 306 | traitlets = ">=4.3.1" 307 | widgetsnbextension = ">=3.5.0,<3.6.0" 308 | 309 | [package.extras] 310 | test = ["pytest (>=3.6.0)", "pytest-cov", "mock"] 311 | 312 | [[package]] 313 | name = "jedi" 314 | version = "0.18.0" 315 | description = "An autocompletion tool for Python that can be used for text editors." 316 | category = "dev" 317 | optional = false 318 | python-versions = ">=3.6" 319 | 320 | [package.dependencies] 321 | parso = ">=0.8.0,<0.9.0" 322 | 323 | [package.extras] 324 | qa = ["flake8 (==3.8.3)", "mypy (==0.782)"] 325 | testing = ["Django (<3.1)", "colorama", "docopt", "pytest (<6.0.0)"] 326 | 327 | [[package]] 328 | name = "jinja2" 329 | version = "2.11.3" 330 | description = "A very fast and expressive template engine." 331 | category = "dev" 332 | optional = false 333 | python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" 334 | 335 | [package.dependencies] 336 | MarkupSafe = ">=0.23" 337 | 338 | [package.extras] 339 | i18n = ["Babel (>=0.8)"] 340 | 341 | [[package]] 342 | name = "joblib" 343 | version = "1.0.1" 344 | description = "Lightweight pipelining with Python functions" 345 | category = "main" 346 | optional = false 347 | python-versions = ">=3.6" 348 | 349 | [[package]] 350 | name = "jsonschema" 351 | version = "3.2.0" 352 | description = "An implementation of JSON Schema validation for Python" 353 | category = "dev" 354 | optional = false 355 | python-versions = "*" 356 | 357 | [package.dependencies] 358 | attrs = ">=17.4.0" 359 | pyrsistent = ">=0.14.0" 360 | six = ">=1.11.0" 361 | 362 | [package.extras] 363 | format = ["idna", "jsonpointer (>1.13)", "rfc3987", "strict-rfc3339", "webcolors"] 364 | format_nongpl = ["idna", "jsonpointer (>1.13)", "webcolors", "rfc3986-validator (>0.1.0)", "rfc3339-validator"] 365 | 366 | [[package]] 367 | name = "jupyter-client" 368 | version = "6.1.11" 369 | description = "Jupyter protocol implementation and client libraries" 370 | category = "dev" 371 | optional = false 372 | python-versions = ">=3.5" 373 | 374 | [package.dependencies] 375 | jupyter-core = ">=4.6.0" 376 | python-dateutil = ">=2.1" 377 | pyzmq = ">=13" 378 | tornado = ">=4.1" 379 | traitlets = "*" 380 | 381 | [package.extras] 382 | doc = ["sphinx (>=1.3.6)", "sphinx-rtd-theme", "sphinxcontrib-github-alt"] 383 | test = ["jedi (<=0.17.2)", "ipykernel", "ipython", "mock", "pytest", "pytest-asyncio", "async-generator", "pytest-timeout"] 384 | 385 | [[package]] 386 | name = "jupyter-core" 387 | version = "4.7.1" 388 | description = "Jupyter core package. A base package on which Jupyter projects rely." 389 | category = "dev" 390 | optional = false 391 | python-versions = ">=3.6" 392 | 393 | [package.dependencies] 394 | pywin32 = {version = ">=1.0", markers = "sys_platform == \"win32\""} 395 | traitlets = "*" 396 | 397 | [[package]] 398 | name = "jupyterlab-pygments" 399 | version = "0.1.2" 400 | description = "Pygments theme using JupyterLab CSS variables" 401 | category = "dev" 402 | optional = false 403 | python-versions = "*" 404 | 405 | [package.dependencies] 406 | pygments = ">=2.4.1,<3" 407 | 408 | [[package]] 409 | name = "jupyterlab-widgets" 410 | version = "1.0.0" 411 | description = "A JupyterLab extension." 412 | category = "dev" 413 | optional = false 414 | python-versions = ">=3.6" 415 | 416 | [[package]] 417 | name = "markupsafe" 418 | version = "1.1.1" 419 | description = "Safely add untrusted strings to HTML/XML markup." 420 | category = "dev" 421 | optional = false 422 | python-versions = ">=2.7,!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*" 423 | 424 | [[package]] 425 | name = "mistune" 426 | version = "0.8.4" 427 | description = "The fastest markdown parser in pure Python" 428 | category = "dev" 429 | optional = false 430 | python-versions = "*" 431 | 432 | [[package]] 433 | name = "nbclient" 434 | version = "0.5.3" 435 | description = "A client library for executing notebooks. Formerly nbconvert's ExecutePreprocessor." 436 | category = "dev" 437 | optional = false 438 | python-versions = ">=3.6.1" 439 | 440 | [package.dependencies] 441 | async-generator = "*" 442 | jupyter-client = ">=6.1.5" 443 | nbformat = ">=5.0" 444 | nest-asyncio = "*" 445 | traitlets = ">=4.2" 446 | 447 | [package.extras] 448 | 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"] 449 | sphinx = ["Sphinx (>=1.7)", "sphinx-book-theme", "mock", "moto", "myst-parser"] 450 | 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"] 451 | 452 | [[package]] 453 | name = "nbconvert" 454 | version = "6.0.7" 455 | description = "Converting Jupyter Notebooks" 456 | category = "dev" 457 | optional = false 458 | python-versions = ">=3.6" 459 | 460 | [package.dependencies] 461 | bleach = "*" 462 | defusedxml = "*" 463 | entrypoints = ">=0.2.2" 464 | jinja2 = ">=2.4" 465 | jupyter-core = "*" 466 | jupyterlab-pygments = "*" 467 | mistune = ">=0.8.1,<2" 468 | nbclient = ">=0.5.0,<0.6.0" 469 | nbformat = ">=4.4" 470 | pandocfilters = ">=1.4.1" 471 | pygments = ">=2.4.1" 472 | testpath = "*" 473 | traitlets = ">=4.2" 474 | 475 | [package.extras] 476 | 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"] 477 | docs = ["sphinx (>=1.5.1)", "sphinx-rtd-theme", "nbsphinx (>=0.2.12)", "ipython"] 478 | serve = ["tornado (>=4.0)"] 479 | test = ["pytest", "pytest-cov", "pytest-dependency", "ipykernel", "ipywidgets (>=7)", "pyppeteer (==0.2.2)"] 480 | webpdf = ["pyppeteer (==0.2.2)"] 481 | 482 | [[package]] 483 | name = "nbformat" 484 | version = "5.1.2" 485 | description = "The Jupyter Notebook format" 486 | category = "dev" 487 | optional = false 488 | python-versions = ">=3.5" 489 | 490 | [package.dependencies] 491 | ipython-genutils = "*" 492 | jsonschema = ">=2.4,<2.5.0 || >2.5.0" 493 | jupyter-core = "*" 494 | traitlets = ">=4.1" 495 | 496 | [package.extras] 497 | fast = ["fastjsonschema"] 498 | test = ["check-manifest", "fastjsonschema", "testpath", "pytest", "pytest-cov"] 499 | 500 | [[package]] 501 | name = "nest-asyncio" 502 | version = "1.5.1" 503 | description = "Patch asyncio to allow nested event loops" 504 | category = "dev" 505 | optional = false 506 | python-versions = ">=3.5" 507 | 508 | [[package]] 509 | name = "notebook" 510 | version = "6.2.0" 511 | description = "A web-based notebook environment for interactive computing" 512 | category = "dev" 513 | optional = false 514 | python-versions = ">=3.5" 515 | 516 | [package.dependencies] 517 | argon2-cffi = "*" 518 | ipykernel = "*" 519 | ipython-genutils = "*" 520 | jinja2 = "*" 521 | jupyter-client = ">=5.3.4" 522 | jupyter-core = ">=4.6.1" 523 | nbconvert = "*" 524 | nbformat = "*" 525 | prometheus-client = "*" 526 | pyzmq = ">=17" 527 | Send2Trash = ">=1.5.0" 528 | terminado = ">=0.8.3" 529 | tornado = ">=6.1" 530 | traitlets = ">=4.2.1" 531 | 532 | [package.extras] 533 | docs = ["sphinx", "nbsphinx", "sphinxcontrib-github-alt", "sphinx-rtd-theme"] 534 | json-logging = ["json-logging"] 535 | test = ["pytest", "coverage", "requests", "nbval", "selenium", "pytest-cov", "requests-unixsocket"] 536 | 537 | [[package]] 538 | name = "numpy" 539 | version = "1.20.1" 540 | description = "NumPy is the fundamental package for array computing with Python." 541 | category = "main" 542 | optional = false 543 | python-versions = ">=3.7" 544 | 545 | [[package]] 546 | name = "packaging" 547 | version = "20.9" 548 | description = "Core utilities for Python packages" 549 | category = "dev" 550 | optional = false 551 | python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" 552 | 553 | [package.dependencies] 554 | pyparsing = ">=2.0.2" 555 | 556 | [[package]] 557 | name = "pandas" 558 | version = "1.2.3" 559 | description = "Powerful data structures for data analysis, time series, and statistics" 560 | category = "dev" 561 | optional = false 562 | python-versions = ">=3.7.1" 563 | 564 | [package.dependencies] 565 | numpy = ">=1.16.5" 566 | python-dateutil = ">=2.7.3" 567 | pytz = ">=2017.3" 568 | 569 | [package.extras] 570 | test = ["pytest (>=5.0.1)", "pytest-xdist", "hypothesis (>=3.58)"] 571 | 572 | [[package]] 573 | name = "pandocfilters" 574 | version = "1.4.3" 575 | description = "Utilities for writing pandoc filters in python" 576 | category = "dev" 577 | optional = false 578 | python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" 579 | 580 | [[package]] 581 | name = "parso" 582 | version = "0.8.1" 583 | description = "A Python Parser" 584 | category = "dev" 585 | optional = false 586 | python-versions = ">=3.6" 587 | 588 | [package.extras] 589 | qa = ["flake8 (==3.8.3)", "mypy (==0.782)"] 590 | testing = ["docopt", "pytest (<6.0.0)"] 591 | 592 | [[package]] 593 | name = "pexpect" 594 | version = "4.8.0" 595 | description = "Pexpect allows easy control of interactive console applications." 596 | category = "dev" 597 | optional = false 598 | python-versions = "*" 599 | 600 | [package.dependencies] 601 | ptyprocess = ">=0.5" 602 | 603 | [[package]] 604 | name = "pickleshare" 605 | version = "0.7.5" 606 | description = "Tiny 'shelve'-like database with concurrency support" 607 | category = "dev" 608 | optional = false 609 | python-versions = "*" 610 | 611 | [[package]] 612 | name = "pillow" 613 | version = "8.1.1" 614 | description = "Python Imaging Library (Fork)" 615 | category = "dev" 616 | optional = false 617 | python-versions = ">=3.6" 618 | 619 | [[package]] 620 | name = "pluggy" 621 | version = "0.13.1" 622 | description = "plugin and hook calling mechanisms for python" 623 | category = "dev" 624 | optional = false 625 | python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" 626 | 627 | [package.extras] 628 | dev = ["pre-commit", "tox"] 629 | 630 | [[package]] 631 | name = "prometheus-client" 632 | version = "0.9.0" 633 | description = "Python client for the Prometheus monitoring system." 634 | category = "dev" 635 | optional = false 636 | python-versions = "*" 637 | 638 | [package.extras] 639 | twisted = ["twisted"] 640 | 641 | [[package]] 642 | name = "prompt-toolkit" 643 | version = "3.0.16" 644 | description = "Library for building powerful interactive command lines in Python" 645 | category = "dev" 646 | optional = false 647 | python-versions = ">=3.6.1" 648 | 649 | [package.dependencies] 650 | wcwidth = "*" 651 | 652 | [[package]] 653 | name = "protobuf" 654 | version = "3.15.5" 655 | description = "Protocol Buffers" 656 | category = "dev" 657 | optional = false 658 | python-versions = "*" 659 | 660 | [package.dependencies] 661 | six = ">=1.9" 662 | 663 | [[package]] 664 | name = "ptyprocess" 665 | version = "0.7.0" 666 | description = "Run a subprocess in a pseudo terminal" 667 | category = "dev" 668 | optional = false 669 | python-versions = "*" 670 | 671 | [[package]] 672 | name = "py" 673 | version = "1.10.0" 674 | description = "library with cross-python path, ini-parsing, io, code, log facilities" 675 | category = "dev" 676 | optional = false 677 | python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" 678 | 679 | [[package]] 680 | name = "pyarrow" 681 | version = "3.0.0" 682 | description = "Python library for Apache Arrow" 683 | category = "dev" 684 | optional = false 685 | python-versions = ">=3.6" 686 | 687 | [package.dependencies] 688 | numpy = ">=1.16.6" 689 | 690 | [[package]] 691 | name = "pycparser" 692 | version = "2.20" 693 | description = "C parser in Python" 694 | category = "dev" 695 | optional = false 696 | python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" 697 | 698 | [[package]] 699 | name = "pydeck" 700 | version = "0.6.1" 701 | description = "Widget for deck.gl maps" 702 | category = "dev" 703 | optional = false 704 | python-versions = "*" 705 | 706 | [package.dependencies] 707 | ipykernel = {version = ">=5.1.2", markers = "python_version >= \"3.4\""} 708 | ipywidgets = ">=7.0.0" 709 | jinja2 = ">=2.10.1" 710 | numpy = ">=1.16.4" 711 | traitlets = ">=4.3.2" 712 | 713 | [package.extras] 714 | testing = ["pytest"] 715 | 716 | [[package]] 717 | name = "pygments" 718 | version = "2.8.0" 719 | description = "Pygments is a syntax highlighting package written in Python." 720 | category = "dev" 721 | optional = false 722 | python-versions = ">=3.5" 723 | 724 | [[package]] 725 | name = "pyparsing" 726 | version = "2.4.7" 727 | description = "Python parsing module" 728 | category = "dev" 729 | optional = false 730 | python-versions = ">=2.6, !=3.0.*, !=3.1.*, !=3.2.*" 731 | 732 | [[package]] 733 | name = "pyrsistent" 734 | version = "0.17.3" 735 | description = "Persistent/Functional/Immutable data structures" 736 | category = "dev" 737 | optional = false 738 | python-versions = ">=3.5" 739 | 740 | [[package]] 741 | name = "pytest" 742 | version = "6.2.2" 743 | description = "pytest: simple powerful testing with Python" 744 | category = "dev" 745 | optional = false 746 | python-versions = ">=3.6" 747 | 748 | [package.dependencies] 749 | atomicwrites = {version = ">=1.0", markers = "sys_platform == \"win32\""} 750 | attrs = ">=19.2.0" 751 | colorama = {version = "*", markers = "sys_platform == \"win32\""} 752 | iniconfig = "*" 753 | packaging = "*" 754 | pluggy = ">=0.12,<1.0.0a1" 755 | py = ">=1.8.2" 756 | toml = "*" 757 | 758 | [package.extras] 759 | testing = ["argcomplete", "hypothesis (>=3.56)", "mock", "nose", "requests", "xmlschema"] 760 | 761 | [[package]] 762 | name = "python-dateutil" 763 | version = "2.8.1" 764 | description = "Extensions to the standard Python datetime module" 765 | category = "dev" 766 | optional = false 767 | python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,>=2.7" 768 | 769 | [package.dependencies] 770 | six = ">=1.5" 771 | 772 | [[package]] 773 | name = "pytz" 774 | version = "2021.1" 775 | description = "World timezone definitions, modern and historical" 776 | category = "dev" 777 | optional = false 778 | python-versions = "*" 779 | 780 | [[package]] 781 | name = "pywin32" 782 | version = "300" 783 | description = "Python for Window Extensions" 784 | category = "dev" 785 | optional = false 786 | python-versions = "*" 787 | 788 | [[package]] 789 | name = "pywinpty" 790 | version = "0.5.7" 791 | description = "Python bindings for the winpty library" 792 | category = "dev" 793 | optional = false 794 | python-versions = "*" 795 | 796 | [[package]] 797 | name = "pyzmq" 798 | version = "22.0.3" 799 | description = "Python bindings for 0MQ" 800 | category = "dev" 801 | optional = false 802 | python-versions = ">=3.6" 803 | 804 | [package.dependencies] 805 | cffi = {version = "*", markers = "implementation_name == \"pypy\""} 806 | py = {version = "*", markers = "implementation_name == \"pypy\""} 807 | 808 | [[package]] 809 | name = "requests" 810 | version = "2.25.1" 811 | description = "Python HTTP for Humans." 812 | category = "dev" 813 | optional = false 814 | python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" 815 | 816 | [package.dependencies] 817 | certifi = ">=2017.4.17" 818 | chardet = ">=3.0.2,<5" 819 | idna = ">=2.5,<3" 820 | urllib3 = ">=1.21.1,<1.27" 821 | 822 | [package.extras] 823 | security = ["pyOpenSSL (>=0.14)", "cryptography (>=1.3.4)"] 824 | socks = ["PySocks (>=1.5.6,!=1.5.7)", "win-inet-pton"] 825 | 826 | [[package]] 827 | name = "scikit-learn" 828 | version = "0.24.1" 829 | description = "A set of python modules for machine learning and data mining" 830 | category = "main" 831 | optional = false 832 | python-versions = ">=3.6" 833 | 834 | [package.dependencies] 835 | joblib = ">=0.11" 836 | numpy = ">=1.13.3" 837 | scipy = ">=0.19.1" 838 | threadpoolctl = ">=2.0.0" 839 | 840 | [package.extras] 841 | benchmark = ["matplotlib (>=2.1.1)", "pandas (>=0.25.0)", "memory-profiler (>=0.57.0)"] 842 | docs = ["matplotlib (>=2.1.1)", "scikit-image (>=0.13)", "pandas (>=0.25.0)", "seaborn (>=0.9.0)", "memory-profiler (>=0.57.0)", "sphinx (>=3.2.0)", "sphinx-gallery (>=0.7.0)", "numpydoc (>=1.0.0)", "Pillow (>=7.1.2)", "sphinx-prompt (>=1.3.0)"] 843 | examples = ["matplotlib (>=2.1.1)", "scikit-image (>=0.13)", "pandas (>=0.25.0)", "seaborn (>=0.9.0)"] 844 | tests = ["matplotlib (>=2.1.1)", "scikit-image (>=0.13)", "pandas (>=0.25.0)", "pytest (>=5.0.1)", "pytest-cov (>=2.9.0)", "flake8 (>=3.8.2)", "mypy (>=0.770)", "pyamg (>=4.0.0)"] 845 | 846 | [[package]] 847 | name = "scipy" 848 | version = "1.6.1" 849 | description = "SciPy: Scientific Library for Python" 850 | category = "main" 851 | optional = false 852 | python-versions = ">=3.7" 853 | 854 | [package.dependencies] 855 | numpy = ">=1.16.5" 856 | 857 | [[package]] 858 | name = "send2trash" 859 | version = "1.5.0" 860 | description = "Send file to trash natively under Mac OS X, Windows and Linux." 861 | category = "dev" 862 | optional = false 863 | python-versions = "*" 864 | 865 | [[package]] 866 | name = "six" 867 | version = "1.15.0" 868 | description = "Python 2 and 3 compatibility utilities" 869 | category = "dev" 870 | optional = false 871 | python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*" 872 | 873 | [[package]] 874 | name = "smmap" 875 | version = "3.0.5" 876 | description = "A pure Python implementation of a sliding window memory map manager" 877 | category = "dev" 878 | optional = false 879 | python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" 880 | 881 | [[package]] 882 | name = "streamlit" 883 | version = "0.78.0" 884 | description = "The fastest way to build data apps in Python" 885 | category = "dev" 886 | optional = false 887 | python-versions = ">=3.6" 888 | 889 | [package.dependencies] 890 | altair = ">=3.2.0" 891 | astor = "*" 892 | base58 = "*" 893 | blinker = "*" 894 | cachetools = ">=4.0" 895 | click = ">=7.0" 896 | gitpython = "*" 897 | numpy = "*" 898 | packaging = "*" 899 | pandas = ">=0.21.0" 900 | pillow = ">=6.2.0" 901 | protobuf = ">=3.6.0,<3.11 || >3.11" 902 | pyarrow = {version = "*", markers = "python_version < \"3.9\""} 903 | pydeck = ">=0.1.dev5" 904 | python-dateutil = "*" 905 | requests = "*" 906 | toml = "*" 907 | tornado = ">=5.0" 908 | tzlocal = "*" 909 | validators = "*" 910 | watchdog = {version = "*", markers = "platform_system != \"Darwin\""} 911 | 912 | [[package]] 913 | name = "terminado" 914 | version = "0.9.2" 915 | description = "Tornado websocket backend for the Xterm.js Javascript terminal emulator library." 916 | category = "dev" 917 | optional = false 918 | python-versions = ">=3.6" 919 | 920 | [package.dependencies] 921 | ptyprocess = {version = "*", markers = "os_name != \"nt\""} 922 | pywinpty = {version = ">=0.5", markers = "os_name == \"nt\""} 923 | tornado = ">=4" 924 | 925 | [[package]] 926 | name = "testpath" 927 | version = "0.4.4" 928 | description = "Test utilities for code working with files and commands" 929 | category = "dev" 930 | optional = false 931 | python-versions = "*" 932 | 933 | [package.extras] 934 | test = ["pathlib2"] 935 | 936 | [[package]] 937 | name = "threadpoolctl" 938 | version = "2.1.0" 939 | description = "threadpoolctl" 940 | category = "main" 941 | optional = false 942 | python-versions = ">=3.5" 943 | 944 | [[package]] 945 | name = "toml" 946 | version = "0.10.2" 947 | description = "Python Library for Tom's Obvious, Minimal Language" 948 | category = "dev" 949 | optional = false 950 | python-versions = ">=2.6, !=3.0.*, !=3.1.*, !=3.2.*" 951 | 952 | [[package]] 953 | name = "toolz" 954 | version = "0.11.1" 955 | description = "List processing tools and functional utilities" 956 | category = "dev" 957 | optional = false 958 | python-versions = ">=3.5" 959 | 960 | [[package]] 961 | name = "tornado" 962 | version = "6.1" 963 | description = "Tornado is a Python web framework and asynchronous networking library, originally developed at FriendFeed." 964 | category = "dev" 965 | optional = false 966 | python-versions = ">= 3.5" 967 | 968 | [[package]] 969 | name = "traitlets" 970 | version = "5.0.5" 971 | description = "Traitlets Python configuration system" 972 | category = "dev" 973 | optional = false 974 | python-versions = ">=3.7" 975 | 976 | [package.dependencies] 977 | ipython-genutils = "*" 978 | 979 | [package.extras] 980 | test = ["pytest"] 981 | 982 | [[package]] 983 | name = "tzlocal" 984 | version = "2.1" 985 | description = "tzinfo object for the local timezone" 986 | category = "dev" 987 | optional = false 988 | python-versions = "*" 989 | 990 | [package.dependencies] 991 | pytz = "*" 992 | 993 | [[package]] 994 | name = "urllib3" 995 | version = "1.26.3" 996 | description = "HTTP library with thread-safe connection pooling, file post, and more." 997 | category = "dev" 998 | optional = false 999 | python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*, <4" 1000 | 1001 | [package.extras] 1002 | brotli = ["brotlipy (>=0.6.0)"] 1003 | secure = ["pyOpenSSL (>=0.14)", "cryptography (>=1.3.4)", "idna (>=2.0.0)", "certifi", "ipaddress"] 1004 | socks = ["PySocks (>=1.5.6,!=1.5.7,<2.0)"] 1005 | 1006 | [[package]] 1007 | name = "validators" 1008 | version = "0.18.2" 1009 | description = "Python Data Validation for Humans™." 1010 | category = "dev" 1011 | optional = false 1012 | python-versions = ">=3.4" 1013 | 1014 | [package.dependencies] 1015 | decorator = ">=3.4.0" 1016 | six = ">=1.4.0" 1017 | 1018 | [package.extras] 1019 | test = ["pytest (>=2.2.3)", "flake8 (>=2.4.0)", "isort (>=4.2.2)"] 1020 | 1021 | [[package]] 1022 | name = "watchdog" 1023 | version = "2.0.2" 1024 | description = "Filesystem events monitoring" 1025 | category = "dev" 1026 | optional = false 1027 | python-versions = ">=3.6" 1028 | 1029 | [package.extras] 1030 | watchmedo = ["PyYAML (>=3.10)", "argh (>=0.24.1)"] 1031 | 1032 | [[package]] 1033 | name = "wcwidth" 1034 | version = "0.2.5" 1035 | description = "Measures the displayed width of unicode strings in a terminal" 1036 | category = "dev" 1037 | optional = false 1038 | python-versions = "*" 1039 | 1040 | [[package]] 1041 | name = "webencodings" 1042 | version = "0.5.1" 1043 | description = "Character encoding aliases for legacy web content" 1044 | category = "dev" 1045 | optional = false 1046 | python-versions = "*" 1047 | 1048 | [[package]] 1049 | name = "widgetsnbextension" 1050 | version = "3.5.1" 1051 | description = "IPython HTML widgets for Jupyter" 1052 | category = "dev" 1053 | optional = false 1054 | python-versions = "*" 1055 | 1056 | [package.dependencies] 1057 | notebook = ">=4.4.1" 1058 | 1059 | [metadata] 1060 | lock-version = "1.1" 1061 | python-versions = "^3.8" 1062 | content-hash = "a6919631643de42a616b490509f02d3b39f5b687dd68b79c7c2e8c7e71bafe43" 1063 | 1064 | [metadata.files] 1065 | altair = [ 1066 | {file = "altair-4.1.0-py3-none-any.whl", hash = "sha256:7748841a1bea8354173d1140bef6d3b58bea21d201f562528e9599ea384feb7f"}, 1067 | {file = "altair-4.1.0.tar.gz", hash = "sha256:3edd30d4f4bb0a37278b72578e7e60bc72045a8e6704179e2f4738e35bc12931"}, 1068 | ] 1069 | appnope = [ 1070 | {file = "appnope-0.1.2-py2.py3-none-any.whl", hash = "sha256:93aa393e9d6c54c5cd570ccadd8edad61ea0c4b9ea7a01409020c9aa019eb442"}, 1071 | {file = "appnope-0.1.2.tar.gz", hash = "sha256:dd83cd4b5b460958838f6eb3000c660b1f9caf2a5b1de4264e941512f603258a"}, 1072 | ] 1073 | argon2-cffi = [ 1074 | {file = "argon2-cffi-20.1.0.tar.gz", hash = "sha256:d8029b2d3e4b4cea770e9e5a0104dd8fa185c1724a0f01528ae4826a6d25f97d"}, 1075 | {file = "argon2_cffi-20.1.0-cp27-cp27m-macosx_10_6_intel.whl", hash = "sha256:6ea92c980586931a816d61e4faf6c192b4abce89aa767ff6581e6ddc985ed003"}, 1076 | {file = "argon2_cffi-20.1.0-cp27-cp27m-manylinux1_x86_64.whl", hash = "sha256:05a8ac07c7026542377e38389638a8a1e9b78f1cd8439cd7493b39f08dd75fbf"}, 1077 | {file = "argon2_cffi-20.1.0-cp27-cp27m-win32.whl", hash = "sha256:0bf066bc049332489bb2d75f69216416329d9dc65deee127152caeb16e5ce7d5"}, 1078 | {file = "argon2_cffi-20.1.0-cp27-cp27m-win_amd64.whl", hash = "sha256:57358570592c46c420300ec94f2ff3b32cbccd10d38bdc12dc6979c4a8484fbc"}, 1079 | {file = "argon2_cffi-20.1.0-cp27-cp27mu-manylinux1_x86_64.whl", hash = "sha256:7d455c802727710e9dfa69b74ccaab04568386ca17b0ad36350b622cd34606fe"}, 1080 | {file = "argon2_cffi-20.1.0-cp35-abi3-manylinux1_x86_64.whl", hash = "sha256:b160416adc0f012fb1f12588a5e6954889510f82f698e23ed4f4fa57f12a0647"}, 1081 | {file = "argon2_cffi-20.1.0-cp35-cp35m-win32.whl", hash = "sha256:9bee3212ba4f560af397b6d7146848c32a800652301843df06b9e8f68f0f7361"}, 1082 | {file = "argon2_cffi-20.1.0-cp35-cp35m-win_amd64.whl", hash = "sha256:392c3c2ef91d12da510cfb6f9bae52512a4552573a9e27600bdb800e05905d2b"}, 1083 | {file = "argon2_cffi-20.1.0-cp36-cp36m-win32.whl", hash = "sha256:ba7209b608945b889457f949cc04c8e762bed4fe3fec88ae9a6b7765ae82e496"}, 1084 | {file = "argon2_cffi-20.1.0-cp36-cp36m-win_amd64.whl", hash = "sha256:da7f0445b71db6d3a72462e04f36544b0de871289b0bc8a7cc87c0f5ec7079fa"}, 1085 | {file = "argon2_cffi-20.1.0-cp37-abi3-macosx_10_6_intel.whl", hash = "sha256:cc0e028b209a5483b6846053d5fd7165f460a1f14774d79e632e75e7ae64b82b"}, 1086 | {file = "argon2_cffi-20.1.0-cp37-cp37m-win32.whl", hash = "sha256:18dee20e25e4be86680b178b35ccfc5d495ebd5792cd00781548d50880fee5c5"}, 1087 | {file = "argon2_cffi-20.1.0-cp37-cp37m-win_amd64.whl", hash = "sha256:6678bb047373f52bcff02db8afab0d2a77d83bde61cfecea7c5c62e2335cb203"}, 1088 | {file = "argon2_cffi-20.1.0-cp38-cp38-win32.whl", hash = "sha256:77e909cc756ef81d6abb60524d259d959bab384832f0c651ed7dcb6e5ccdbb78"}, 1089 | {file = "argon2_cffi-20.1.0-cp38-cp38-win_amd64.whl", hash = "sha256:9dfd5197852530294ecb5795c97a823839258dfd5eb9420233c7cfedec2058f2"}, 1090 | {file = "argon2_cffi-20.1.0-cp39-cp39-win32.whl", hash = "sha256:e2db6e85c057c16d0bd3b4d2b04f270a7467c147381e8fd73cbbe5bc719832be"}, 1091 | {file = "argon2_cffi-20.1.0-cp39-cp39-win_amd64.whl", hash = "sha256:8a84934bd818e14a17943de8099d41160da4a336bcc699bb4c394bbb9b94bd32"}, 1092 | ] 1093 | astor = [ 1094 | {file = "astor-0.8.1-py2.py3-none-any.whl", hash = "sha256:070a54e890cefb5b3739d19f30f5a5ec840ffc9c50ffa7d23cc9fc1a38ebbfc5"}, 1095 | {file = "astor-0.8.1.tar.gz", hash = "sha256:6a6effda93f4e1ce9f618779b2dd1d9d84f1e32812c23a29b3fff6fd7f63fa5e"}, 1096 | ] 1097 | async-generator = [ 1098 | {file = "async_generator-1.10-py3-none-any.whl", hash = "sha256:01c7bf666359b4967d2cda0000cc2e4af16a0ae098cbffcb8472fb9e8ad6585b"}, 1099 | {file = "async_generator-1.10.tar.gz", hash = "sha256:6ebb3d106c12920aaae42ccb6f787ef5eefdcdd166ea3d628fa8476abe712144"}, 1100 | ] 1101 | atomicwrites = [ 1102 | {file = "atomicwrites-1.4.0-py2.py3-none-any.whl", hash = "sha256:6d1784dea7c0c8d4a5172b6c620f40b6e4cbfdf96d783691f2e1302a7b88e197"}, 1103 | {file = "atomicwrites-1.4.0.tar.gz", hash = "sha256:ae70396ad1a434f9c7046fd2dd196fc04b12f9e91ffb859164193be8b6168a7a"}, 1104 | ] 1105 | attrs = [ 1106 | {file = "attrs-20.3.0-py2.py3-none-any.whl", hash = "sha256:31b2eced602aa8423c2aea9c76a724617ed67cf9513173fd3a4f03e3a929c7e6"}, 1107 | {file = "attrs-20.3.0.tar.gz", hash = "sha256:832aa3cde19744e49938b91fea06d69ecb9e649c93ba974535d08ad92164f700"}, 1108 | ] 1109 | backcall = [ 1110 | {file = "backcall-0.2.0-py2.py3-none-any.whl", hash = "sha256:fbbce6a29f263178a1f7915c1940bde0ec2b2a967566fe1c65c1dfb7422bd255"}, 1111 | {file = "backcall-0.2.0.tar.gz", hash = "sha256:5cbdbf27be5e7cfadb448baf0aa95508f91f2bbc6c6437cd9cd06e2a4c215e1e"}, 1112 | ] 1113 | base58 = [ 1114 | {file = "base58-2.1.0-py3-none-any.whl", hash = "sha256:8225891d501b68c843ffe30b86371f844a21c6ba00da76f52f9b998ba771fb48"}, 1115 | {file = "base58-2.1.0.tar.gz", hash = "sha256:171a547b4a3c61e1ae3807224a6f7aec75e364c4395e7562649d7335768001a2"}, 1116 | ] 1117 | bleach = [ 1118 | {file = "bleach-3.3.0-py2.py3-none-any.whl", hash = "sha256:6123ddc1052673e52bab52cdc955bcb57a015264a1c57d37bea2f6b817af0125"}, 1119 | {file = "bleach-3.3.0.tar.gz", hash = "sha256:98b3170739e5e83dd9dc19633f074727ad848cbedb6026708c8ac2d3b697a433"}, 1120 | ] 1121 | blinker = [ 1122 | {file = "blinker-1.4.tar.gz", hash = "sha256:471aee25f3992bd325afa3772f1063dbdbbca947a041b8b89466dc00d606f8b6"}, 1123 | ] 1124 | cachetools = [ 1125 | {file = "cachetools-4.2.1-py3-none-any.whl", hash = "sha256:1d9d5f567be80f7c07d765e21b814326d78c61eb0c3a637dffc0e5d1796cb2e2"}, 1126 | {file = "cachetools-4.2.1.tar.gz", hash = "sha256:f469e29e7aa4cff64d8de4aad95ce76de8ea1125a16c68e0d93f65c3c3dc92e9"}, 1127 | ] 1128 | certifi = [ 1129 | {file = "certifi-2020.12.5-py2.py3-none-any.whl", hash = "sha256:719a74fb9e33b9bd44cc7f3a8d94bc35e4049deebe19ba7d8e108280cfd59830"}, 1130 | {file = "certifi-2020.12.5.tar.gz", hash = "sha256:1a4995114262bffbc2413b159f2a1a480c969de6e6eb13ee966d470af86af59c"}, 1131 | ] 1132 | cffi = [ 1133 | {file = "cffi-1.14.5-cp27-cp27m-macosx_10_9_x86_64.whl", hash = "sha256:bb89f306e5da99f4d922728ddcd6f7fcebb3241fc40edebcb7284d7514741991"}, 1134 | {file = "cffi-1.14.5-cp27-cp27m-manylinux1_i686.whl", hash = "sha256:34eff4b97f3d982fb93e2831e6750127d1355a923ebaeeb565407b3d2f8d41a1"}, 1135 | {file = "cffi-1.14.5-cp27-cp27m-manylinux1_x86_64.whl", hash = "sha256:99cd03ae7988a93dd00bcd9d0b75e1f6c426063d6f03d2f90b89e29b25b82dfa"}, 1136 | {file = "cffi-1.14.5-cp27-cp27m-win32.whl", hash = "sha256:65fa59693c62cf06e45ddbb822165394a288edce9e276647f0046e1ec26920f3"}, 1137 | {file = "cffi-1.14.5-cp27-cp27m-win_amd64.whl", hash = "sha256:51182f8927c5af975fece87b1b369f722c570fe169f9880764b1ee3bca8347b5"}, 1138 | {file = "cffi-1.14.5-cp27-cp27mu-manylinux1_i686.whl", hash = "sha256:43e0b9d9e2c9e5d152946b9c5fe062c151614b262fda2e7b201204de0b99e482"}, 1139 | {file = "cffi-1.14.5-cp27-cp27mu-manylinux1_x86_64.whl", hash = "sha256:cbde590d4faaa07c72bf979734738f328d239913ba3e043b1e98fe9a39f8b2b6"}, 1140 | {file = "cffi-1.14.5-cp35-cp35m-macosx_10_9_x86_64.whl", hash = "sha256:5de7970188bb46b7bf9858eb6890aad302577a5f6f75091fd7cdd3ef13ef3045"}, 1141 | {file = "cffi-1.14.5-cp35-cp35m-manylinux1_i686.whl", hash = "sha256:a465da611f6fa124963b91bf432d960a555563efe4ed1cc403ba5077b15370aa"}, 1142 | {file = "cffi-1.14.5-cp35-cp35m-manylinux1_x86_64.whl", hash = "sha256:d42b11d692e11b6634f7613ad8df5d6d5f8875f5d48939520d351007b3c13406"}, 1143 | {file = "cffi-1.14.5-cp35-cp35m-win32.whl", hash = "sha256:72d8d3ef52c208ee1c7b2e341f7d71c6fd3157138abf1a95166e6165dd5d4369"}, 1144 | {file = "cffi-1.14.5-cp35-cp35m-win_amd64.whl", hash = "sha256:29314480e958fd8aab22e4a58b355b629c59bf5f2ac2492b61e3dc06d8c7a315"}, 1145 | {file = "cffi-1.14.5-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:3d3dd4c9e559eb172ecf00a2a7517e97d1e96de2a5e610bd9b68cea3925b4892"}, 1146 | {file = "cffi-1.14.5-cp36-cp36m-manylinux1_i686.whl", hash = "sha256:48e1c69bbacfc3d932221851b39d49e81567a4d4aac3b21258d9c24578280058"}, 1147 | {file = "cffi-1.14.5-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:69e395c24fc60aad6bb4fa7e583698ea6cc684648e1ffb7fe85e3c1ca131a7d5"}, 1148 | {file = "cffi-1.14.5-cp36-cp36m-manylinux2014_aarch64.whl", hash = "sha256:9e93e79c2551ff263400e1e4be085a1210e12073a31c2011dbbda14bda0c6132"}, 1149 | {file = "cffi-1.14.5-cp36-cp36m-win32.whl", hash = "sha256:58e3f59d583d413809d60779492342801d6e82fefb89c86a38e040c16883be53"}, 1150 | {file = "cffi-1.14.5-cp36-cp36m-win_amd64.whl", hash = "sha256:005a36f41773e148deac64b08f233873a4d0c18b053d37da83f6af4d9087b813"}, 1151 | {file = "cffi-1.14.5-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:2894f2df484ff56d717bead0a5c2abb6b9d2bf26d6960c4604d5c48bbc30ee73"}, 1152 | {file = "cffi-1.14.5-cp37-cp37m-manylinux1_i686.whl", hash = "sha256:0857f0ae312d855239a55c81ef453ee8fd24136eaba8e87a2eceba644c0d4c06"}, 1153 | {file = "cffi-1.14.5-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:cd2868886d547469123fadc46eac7ea5253ea7fcb139f12e1dfc2bbd406427d1"}, 1154 | {file = "cffi-1.14.5-cp37-cp37m-manylinux2014_aarch64.whl", hash = "sha256:35f27e6eb43380fa080dccf676dece30bef72e4a67617ffda586641cd4508d49"}, 1155 | {file = "cffi-1.14.5-cp37-cp37m-win32.whl", hash = "sha256:9ff227395193126d82e60319a673a037d5de84633f11279e336f9c0f189ecc62"}, 1156 | {file = "cffi-1.14.5-cp37-cp37m-win_amd64.whl", hash = "sha256:9cf8022fb8d07a97c178b02327b284521c7708d7c71a9c9c355c178ac4bbd3d4"}, 1157 | {file = "cffi-1.14.5-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:8b198cec6c72df5289c05b05b8b0969819783f9418e0409865dac47288d2a053"}, 1158 | {file = "cffi-1.14.5-cp38-cp38-manylinux1_i686.whl", hash = "sha256:ad17025d226ee5beec591b52800c11680fca3df50b8b29fe51d882576e039ee0"}, 1159 | {file = "cffi-1.14.5-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:6c97d7350133666fbb5cf4abdc1178c812cb205dc6f41d174a7b0f18fb93337e"}, 1160 | {file = "cffi-1.14.5-cp38-cp38-manylinux2014_aarch64.whl", hash = "sha256:8ae6299f6c68de06f136f1f9e69458eae58f1dacf10af5c17353eae03aa0d827"}, 1161 | {file = "cffi-1.14.5-cp38-cp38-win32.whl", hash = "sha256:b85eb46a81787c50650f2392b9b4ef23e1f126313b9e0e9013b35c15e4288e2e"}, 1162 | {file = "cffi-1.14.5-cp38-cp38-win_amd64.whl", hash = "sha256:1f436816fc868b098b0d63b8920de7d208c90a67212546d02f84fe78a9c26396"}, 1163 | {file = "cffi-1.14.5-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:1071534bbbf8cbb31b498d5d9db0f274f2f7a865adca4ae429e147ba40f73dea"}, 1164 | {file = "cffi-1.14.5-cp39-cp39-manylinux1_i686.whl", hash = "sha256:9de2e279153a443c656f2defd67769e6d1e4163952b3c622dcea5b08a6405322"}, 1165 | {file = "cffi-1.14.5-cp39-cp39-manylinux1_x86_64.whl", hash = "sha256:6e4714cc64f474e4d6e37cfff31a814b509a35cb17de4fb1999907575684479c"}, 1166 | {file = "cffi-1.14.5-cp39-cp39-manylinux2014_aarch64.whl", hash = "sha256:158d0d15119b4b7ff6b926536763dc0714313aa59e320ddf787502c70c4d4bee"}, 1167 | {file = "cffi-1.14.5-cp39-cp39-win32.whl", hash = "sha256:afb29c1ba2e5a3736f1c301d9d0abe3ec8b86957d04ddfa9d7a6a42b9367e396"}, 1168 | {file = "cffi-1.14.5-cp39-cp39-win_amd64.whl", hash = "sha256:f2d45f97ab6bb54753eab54fffe75aaf3de4ff2341c9daee1987ee1837636f1d"}, 1169 | {file = "cffi-1.14.5.tar.gz", hash = "sha256:fd78e5fee591709f32ef6edb9a015b4aa1a5022598e36227500c8f4e02328d9c"}, 1170 | ] 1171 | chardet = [ 1172 | {file = "chardet-4.0.0-py2.py3-none-any.whl", hash = "sha256:f864054d66fd9118f2e67044ac8981a54775ec5b67aed0441892edb553d21da5"}, 1173 | {file = "chardet-4.0.0.tar.gz", hash = "sha256:0d6f53a15db4120f2b08c94f11e7d93d2c911ee118b6b30a04ec3ee8310179fa"}, 1174 | ] 1175 | click = [ 1176 | {file = "click-7.1.2-py2.py3-none-any.whl", hash = "sha256:dacca89f4bfadd5de3d7489b7c8a566eee0d3676333fbb50030263894c38c0dc"}, 1177 | {file = "click-7.1.2.tar.gz", hash = "sha256:d2b5255c7c6349bc1bd1e59e08cd12acbbd63ce649f2588755783aa94dfb6b1a"}, 1178 | ] 1179 | colorama = [ 1180 | {file = "colorama-0.4.4-py2.py3-none-any.whl", hash = "sha256:9f47eda37229f68eee03b24b9748937c7dc3868f906e8ba69fbcbdd3bc5dc3e2"}, 1181 | {file = "colorama-0.4.4.tar.gz", hash = "sha256:5941b2b48a20143d2267e95b1c2a7603ce057ee39fd88e7329b0c292aa16869b"}, 1182 | ] 1183 | decorator = [ 1184 | {file = "decorator-4.4.2-py2.py3-none-any.whl", hash = "sha256:41fa54c2a0cc4ba648be4fd43cff00aedf5b9465c9bf18d64325bc225f08f760"}, 1185 | {file = "decorator-4.4.2.tar.gz", hash = "sha256:e3a62f0520172440ca0dcc823749319382e377f37f140a0b99ef45fecb84bfe7"}, 1186 | ] 1187 | defusedxml = [ 1188 | {file = "defusedxml-0.7.0-py2.py3-none-any.whl", hash = "sha256:a290cad10346ed366c8a0133d868eaf6585ec6afdd0c511286cdb11f5fc3d285"}, 1189 | {file = "defusedxml-0.7.0.tar.gz", hash = "sha256:86b15d9e3c639de79f4cb38aeffea3281f62aff78dde7d798e1352c63bfa6ea0"}, 1190 | ] 1191 | entrypoints = [ 1192 | {file = "entrypoints-0.3-py2.py3-none-any.whl", hash = "sha256:589f874b313739ad35be6e0cd7efde2a4e9b6fea91edcc34e58ecbb8dbe56d19"}, 1193 | {file = "entrypoints-0.3.tar.gz", hash = "sha256:c70dd71abe5a8c85e55e12c19bd91ccfeec11a6e99044204511f9ed547d48451"}, 1194 | ] 1195 | gitdb = [ 1196 | {file = "gitdb-4.0.5-py3-none-any.whl", hash = "sha256:91f36bfb1ab7949b3b40e23736db18231bf7593edada2ba5c3a174a7b23657ac"}, 1197 | {file = "gitdb-4.0.5.tar.gz", hash = "sha256:c9e1f2d0db7ddb9a704c2a0217be31214e91a4fe1dea1efad19ae42ba0c285c9"}, 1198 | ] 1199 | gitpython = [ 1200 | {file = "GitPython-3.1.14-py3-none-any.whl", hash = "sha256:3283ae2fba31c913d857e12e5ba5f9a7772bbc064ae2bb09efafa71b0dd4939b"}, 1201 | {file = "GitPython-3.1.14.tar.gz", hash = "sha256:be27633e7509e58391f10207cd32b2a6cf5b908f92d9cd30da2e514e1137af61"}, 1202 | ] 1203 | idna = [ 1204 | {file = "idna-2.10-py2.py3-none-any.whl", hash = "sha256:b97d804b1e9b523befed77c48dacec60e6dcb0b5391d57af6a65a312a90648c0"}, 1205 | {file = "idna-2.10.tar.gz", hash = "sha256:b307872f855b18632ce0c21c5e45be78c0ea7ae4c15c828c20788b26921eb3f6"}, 1206 | ] 1207 | iniconfig = [ 1208 | {file = "iniconfig-1.1.1-py2.py3-none-any.whl", hash = "sha256:011e24c64b7f47f6ebd835bb12a743f2fbe9a26d4cecaa7f53bc4f35ee9da8b3"}, 1209 | {file = "iniconfig-1.1.1.tar.gz", hash = "sha256:bc3af051d7d14b2ee5ef9969666def0cd1a000e121eaea580d4a313df4b37f32"}, 1210 | ] 1211 | ipykernel = [ 1212 | {file = "ipykernel-5.5.0-py3-none-any.whl", hash = "sha256:efd07253b54d84d26e0878d268c8c3a41582a18750da633c2febfd2ece0d467d"}, 1213 | {file = "ipykernel-5.5.0.tar.gz", hash = "sha256:98321abefdf0505fb3dc7601f60fc4087364d394bd8fad53107eb1adee9ff475"}, 1214 | ] 1215 | ipython = [ 1216 | {file = "ipython-7.21.0-py3-none-any.whl", hash = "sha256:34207ffb2f653bced2bc8e3756c1db86e7d93e44ed049daae9814fed66d408ec"}, 1217 | {file = "ipython-7.21.0.tar.gz", hash = "sha256:04323f72d5b85b606330b6d7e2dc8d2683ad46c3905e955aa96ecc7a99388e70"}, 1218 | ] 1219 | ipython-genutils = [ 1220 | {file = "ipython_genutils-0.2.0-py2.py3-none-any.whl", hash = "sha256:72dd37233799e619666c9f639a9da83c34013a73e8bbc79a7a6348d93c61fab8"}, 1221 | {file = "ipython_genutils-0.2.0.tar.gz", hash = "sha256:eb2e116e75ecef9d4d228fdc66af54269afa26ab4463042e33785b887c628ba8"}, 1222 | ] 1223 | ipywidgets = [ 1224 | {file = "ipywidgets-7.6.3-py2.py3-none-any.whl", hash = "sha256:e6513cfdaf5878de30f32d57f6dc2474da395a2a2991b94d487406c0ab7f55ca"}, 1225 | {file = "ipywidgets-7.6.3.tar.gz", hash = "sha256:9f1a43e620530f9e570e4a493677d25f08310118d315b00e25a18f12913c41f0"}, 1226 | ] 1227 | jedi = [ 1228 | {file = "jedi-0.18.0-py2.py3-none-any.whl", hash = "sha256:18456d83f65f400ab0c2d3319e48520420ef43b23a086fdc05dff34132f0fb93"}, 1229 | {file = "jedi-0.18.0.tar.gz", hash = "sha256:92550a404bad8afed881a137ec9a461fed49eca661414be45059329614ed0707"}, 1230 | ] 1231 | jinja2 = [ 1232 | {file = "Jinja2-2.11.3-py2.py3-none-any.whl", hash = "sha256:03e47ad063331dd6a3f04a43eddca8a966a26ba0c5b7207a9a9e4e08f1b29419"}, 1233 | {file = "Jinja2-2.11.3.tar.gz", hash = "sha256:a6d58433de0ae800347cab1fa3043cebbabe8baa9d29e668f1c768cb87a333c6"}, 1234 | ] 1235 | joblib = [ 1236 | {file = "joblib-1.0.1-py3-none-any.whl", hash = "sha256:feeb1ec69c4d45129954f1b7034954241eedfd6ba39b5e9e4b6883be3332d5e5"}, 1237 | {file = "joblib-1.0.1.tar.gz", hash = "sha256:9c17567692206d2f3fb9ecf5e991084254fe631665c450b443761c4186a613f7"}, 1238 | ] 1239 | jsonschema = [ 1240 | {file = "jsonschema-3.2.0-py2.py3-none-any.whl", hash = "sha256:4e5b3cf8216f577bee9ce139cbe72eca3ea4f292ec60928ff24758ce626cd163"}, 1241 | {file = "jsonschema-3.2.0.tar.gz", hash = "sha256:c8a85b28d377cc7737e46e2d9f2b4f44ee3c0e1deac6bf46ddefc7187d30797a"}, 1242 | ] 1243 | jupyter-client = [ 1244 | {file = "jupyter_client-6.1.11-py3-none-any.whl", hash = "sha256:5eaaa41df449167ebba5e1cf6ca9b31f7fd4f71625069836e2e4fee07fe3cb13"}, 1245 | {file = "jupyter_client-6.1.11.tar.gz", hash = "sha256:649ca3aca1e28f27d73ef15868a7c7f10d6e70f761514582accec3ca6bb13085"}, 1246 | ] 1247 | jupyter-core = [ 1248 | {file = "jupyter_core-4.7.1-py3-none-any.whl", hash = "sha256:8c6c0cac5c1b563622ad49321d5ec47017bd18b94facb381c6973a0486395f8e"}, 1249 | {file = "jupyter_core-4.7.1.tar.gz", hash = "sha256:79025cb3225efcd36847d0840f3fc672c0abd7afd0de83ba8a1d3837619122b4"}, 1250 | ] 1251 | jupyterlab-pygments = [ 1252 | {file = "jupyterlab_pygments-0.1.2-py2.py3-none-any.whl", hash = "sha256:abfb880fd1561987efaefcb2d2ac75145d2a5d0139b1876d5be806e32f630008"}, 1253 | {file = "jupyterlab_pygments-0.1.2.tar.gz", hash = "sha256:cfcda0873626150932f438eccf0f8bf22bfa92345b814890ab360d666b254146"}, 1254 | ] 1255 | jupyterlab-widgets = [ 1256 | {file = "jupyterlab_widgets-1.0.0-py3-none-any.whl", hash = "sha256:caeaf3e6103180e654e7d8d2b81b7d645e59e432487c1d35a41d6d3ee56b3fef"}, 1257 | {file = "jupyterlab_widgets-1.0.0.tar.gz", hash = "sha256:5c1a29a84d3069208cb506b10609175b249b6486d6b1cbae8fcde2a11584fb78"}, 1258 | ] 1259 | markupsafe = [ 1260 | {file = "MarkupSafe-1.1.1-cp27-cp27m-macosx_10_6_intel.whl", hash = "sha256:09027a7803a62ca78792ad89403b1b7a73a01c8cb65909cd876f7fcebd79b161"}, 1261 | {file = "MarkupSafe-1.1.1-cp27-cp27m-manylinux1_i686.whl", hash = "sha256:e249096428b3ae81b08327a63a485ad0878de3fb939049038579ac0ef61e17e7"}, 1262 | {file = "MarkupSafe-1.1.1-cp27-cp27m-manylinux1_x86_64.whl", hash = "sha256:500d4957e52ddc3351cabf489e79c91c17f6e0899158447047588650b5e69183"}, 1263 | {file = "MarkupSafe-1.1.1-cp27-cp27m-win32.whl", hash = "sha256:b2051432115498d3562c084a49bba65d97cf251f5a331c64a12ee7e04dacc51b"}, 1264 | {file = "MarkupSafe-1.1.1-cp27-cp27m-win_amd64.whl", hash = "sha256:98c7086708b163d425c67c7a91bad6e466bb99d797aa64f965e9d25c12111a5e"}, 1265 | {file = "MarkupSafe-1.1.1-cp27-cp27mu-manylinux1_i686.whl", hash = "sha256:cd5df75523866410809ca100dc9681e301e3c27567cf498077e8551b6d20e42f"}, 1266 | {file = "MarkupSafe-1.1.1-cp27-cp27mu-manylinux1_x86_64.whl", hash = "sha256:43a55c2930bbc139570ac2452adf3d70cdbb3cfe5912c71cdce1c2c6bbd9c5d1"}, 1267 | {file = "MarkupSafe-1.1.1-cp34-cp34m-macosx_10_6_intel.whl", hash = "sha256:1027c282dad077d0bae18be6794e6b6b8c91d58ed8a8d89a89d59693b9131db5"}, 1268 | {file = "MarkupSafe-1.1.1-cp34-cp34m-manylinux1_i686.whl", hash = "sha256:62fe6c95e3ec8a7fad637b7f3d372c15ec1caa01ab47926cfdf7a75b40e0eac1"}, 1269 | {file = "MarkupSafe-1.1.1-cp34-cp34m-manylinux1_x86_64.whl", hash = "sha256:88e5fcfb52ee7b911e8bb6d6aa2fd21fbecc674eadd44118a9cc3863f938e735"}, 1270 | {file = "MarkupSafe-1.1.1-cp34-cp34m-win32.whl", hash = "sha256:ade5e387d2ad0d7ebf59146cc00c8044acbd863725f887353a10df825fc8ae21"}, 1271 | {file = "MarkupSafe-1.1.1-cp34-cp34m-win_amd64.whl", hash = "sha256:09c4b7f37d6c648cb13f9230d847adf22f8171b1ccc4d5682398e77f40309235"}, 1272 | {file = "MarkupSafe-1.1.1-cp35-cp35m-macosx_10_6_intel.whl", hash = "sha256:79855e1c5b8da654cf486b830bd42c06e8780cea587384cf6545b7d9ac013a0b"}, 1273 | {file = "MarkupSafe-1.1.1-cp35-cp35m-manylinux1_i686.whl", hash = "sha256:c8716a48d94b06bb3b2524c2b77e055fb313aeb4ea620c8dd03a105574ba704f"}, 1274 | {file = "MarkupSafe-1.1.1-cp35-cp35m-manylinux1_x86_64.whl", hash = "sha256:7c1699dfe0cf8ff607dbdcc1e9b9af1755371f92a68f706051cc8c37d447c905"}, 1275 | {file = "MarkupSafe-1.1.1-cp35-cp35m-win32.whl", hash = "sha256:6dd73240d2af64df90aa7c4e7481e23825ea70af4b4922f8ede5b9e35f78a3b1"}, 1276 | {file = "MarkupSafe-1.1.1-cp35-cp35m-win_amd64.whl", hash = "sha256:9add70b36c5666a2ed02b43b335fe19002ee5235efd4b8a89bfcf9005bebac0d"}, 1277 | {file = "MarkupSafe-1.1.1-cp36-cp36m-macosx_10_6_intel.whl", hash = "sha256:24982cc2533820871eba85ba648cd53d8623687ff11cbb805be4ff7b4c971aff"}, 1278 | {file = "MarkupSafe-1.1.1-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:d53bc011414228441014aa71dbec320c66468c1030aae3a6e29778a3382d96e5"}, 1279 | {file = "MarkupSafe-1.1.1-cp36-cp36m-manylinux1_i686.whl", hash = "sha256:00bc623926325b26bb9605ae9eae8a215691f33cae5df11ca5424f06f2d1f473"}, 1280 | {file = "MarkupSafe-1.1.1-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:717ba8fe3ae9cc0006d7c451f0bb265ee07739daf76355d06366154ee68d221e"}, 1281 | {file = "MarkupSafe-1.1.1-cp36-cp36m-manylinux2010_i686.whl", hash = "sha256:3b8a6499709d29c2e2399569d96719a1b21dcd94410a586a18526b143ec8470f"}, 1282 | {file = "MarkupSafe-1.1.1-cp36-cp36m-manylinux2010_x86_64.whl", hash = "sha256:84dee80c15f1b560d55bcfe6d47b27d070b4681c699c572af2e3c7cc90a3b8e0"}, 1283 | {file = "MarkupSafe-1.1.1-cp36-cp36m-manylinux2014_aarch64.whl", hash = "sha256:b1dba4527182c95a0db8b6060cc98ac49b9e2f5e64320e2b56e47cb2831978c7"}, 1284 | {file = "MarkupSafe-1.1.1-cp36-cp36m-win32.whl", hash = "sha256:535f6fc4d397c1563d08b88e485c3496cf5784e927af890fb3c3aac7f933ec66"}, 1285 | {file = "MarkupSafe-1.1.1-cp36-cp36m-win_amd64.whl", hash = "sha256:b1282f8c00509d99fef04d8ba936b156d419be841854fe901d8ae224c59f0be5"}, 1286 | {file = "MarkupSafe-1.1.1-cp37-cp37m-macosx_10_6_intel.whl", hash = "sha256:8defac2f2ccd6805ebf65f5eeb132adcf2ab57aa11fdf4c0dd5169a004710e7d"}, 1287 | {file = "MarkupSafe-1.1.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:bf5aa3cbcfdf57fa2ee9cd1822c862ef23037f5c832ad09cfea57fa846dec193"}, 1288 | {file = "MarkupSafe-1.1.1-cp37-cp37m-manylinux1_i686.whl", hash = "sha256:46c99d2de99945ec5cb54f23c8cd5689f6d7177305ebff350a58ce5f8de1669e"}, 1289 | {file = "MarkupSafe-1.1.1-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:ba59edeaa2fc6114428f1637ffff42da1e311e29382d81b339c1817d37ec93c6"}, 1290 | {file = "MarkupSafe-1.1.1-cp37-cp37m-manylinux2010_i686.whl", hash = "sha256:6fffc775d90dcc9aed1b89219549b329a9250d918fd0b8fa8d93d154918422e1"}, 1291 | {file = "MarkupSafe-1.1.1-cp37-cp37m-manylinux2010_x86_64.whl", hash = "sha256:a6a744282b7718a2a62d2ed9d993cad6f5f585605ad352c11de459f4108df0a1"}, 1292 | {file = "MarkupSafe-1.1.1-cp37-cp37m-manylinux2014_aarch64.whl", hash = "sha256:195d7d2c4fbb0ee8139a6cf67194f3973a6b3042d742ebe0a9ed36d8b6f0c07f"}, 1293 | {file = "MarkupSafe-1.1.1-cp37-cp37m-win32.whl", hash = "sha256:b00c1de48212e4cc9603895652c5c410df699856a2853135b3967591e4beebc2"}, 1294 | {file = "MarkupSafe-1.1.1-cp37-cp37m-win_amd64.whl", hash = "sha256:9bf40443012702a1d2070043cb6291650a0841ece432556f784f004937f0f32c"}, 1295 | {file = "MarkupSafe-1.1.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:6788b695d50a51edb699cb55e35487e430fa21f1ed838122d722e0ff0ac5ba15"}, 1296 | {file = "MarkupSafe-1.1.1-cp38-cp38-manylinux1_i686.whl", hash = "sha256:cdb132fc825c38e1aeec2c8aa9338310d29d337bebbd7baa06889d09a60a1fa2"}, 1297 | {file = "MarkupSafe-1.1.1-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:13d3144e1e340870b25e7b10b98d779608c02016d5184cfb9927a9f10c689f42"}, 1298 | {file = "MarkupSafe-1.1.1-cp38-cp38-manylinux2010_i686.whl", hash = "sha256:acf08ac40292838b3cbbb06cfe9b2cb9ec78fce8baca31ddb87aaac2e2dc3bc2"}, 1299 | {file = "MarkupSafe-1.1.1-cp38-cp38-manylinux2010_x86_64.whl", hash = "sha256:d9be0ba6c527163cbed5e0857c451fcd092ce83947944d6c14bc95441203f032"}, 1300 | {file = "MarkupSafe-1.1.1-cp38-cp38-manylinux2014_aarch64.whl", hash = "sha256:caabedc8323f1e93231b52fc32bdcde6db817623d33e100708d9a68e1f53b26b"}, 1301 | {file = "MarkupSafe-1.1.1-cp38-cp38-win32.whl", hash = "sha256:596510de112c685489095da617b5bcbbac7dd6384aeebeda4df6025d0256a81b"}, 1302 | {file = "MarkupSafe-1.1.1-cp38-cp38-win_amd64.whl", hash = "sha256:e8313f01ba26fbbe36c7be1966a7b7424942f670f38e666995b88d012765b9be"}, 1303 | {file = "MarkupSafe-1.1.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:d73a845f227b0bfe8a7455ee623525ee656a9e2e749e4742706d80a6065d5e2c"}, 1304 | {file = "MarkupSafe-1.1.1-cp39-cp39-manylinux1_i686.whl", hash = "sha256:98bae9582248d6cf62321dcb52aaf5d9adf0bad3b40582925ef7c7f0ed85fceb"}, 1305 | {file = "MarkupSafe-1.1.1-cp39-cp39-manylinux1_x86_64.whl", hash = "sha256:2beec1e0de6924ea551859edb9e7679da6e4870d32cb766240ce17e0a0ba2014"}, 1306 | {file = "MarkupSafe-1.1.1-cp39-cp39-manylinux2010_i686.whl", hash = "sha256:7fed13866cf14bba33e7176717346713881f56d9d2bcebab207f7a036f41b850"}, 1307 | {file = "MarkupSafe-1.1.1-cp39-cp39-manylinux2010_x86_64.whl", hash = "sha256:6f1e273a344928347c1290119b493a1f0303c52f5a5eae5f16d74f48c15d4a85"}, 1308 | {file = "MarkupSafe-1.1.1-cp39-cp39-manylinux2014_aarch64.whl", hash = "sha256:feb7b34d6325451ef96bc0e36e1a6c0c1c64bc1fbec4b854f4529e51887b1621"}, 1309 | {file = "MarkupSafe-1.1.1-cp39-cp39-win32.whl", hash = "sha256:22c178a091fc6630d0d045bdb5992d2dfe14e3259760e713c490da5323866c39"}, 1310 | {file = "MarkupSafe-1.1.1-cp39-cp39-win_amd64.whl", hash = "sha256:b7d644ddb4dbd407d31ffb699f1d140bc35478da613b441c582aeb7c43838dd8"}, 1311 | {file = "MarkupSafe-1.1.1.tar.gz", hash = "sha256:29872e92839765e546828bb7754a68c418d927cd064fd4708fab9fe9c8bb116b"}, 1312 | ] 1313 | mistune = [ 1314 | {file = "mistune-0.8.4-py2.py3-none-any.whl", hash = "sha256:88a1051873018da288eee8538d476dffe1262495144b33ecb586c4ab266bb8d4"}, 1315 | {file = "mistune-0.8.4.tar.gz", hash = "sha256:59a3429db53c50b5c6bcc8a07f8848cb00d7dc8bdb431a4ab41920d201d4756e"}, 1316 | ] 1317 | nbclient = [ 1318 | {file = "nbclient-0.5.3-py3-none-any.whl", hash = "sha256:e79437364a2376892b3f46bedbf9b444e5396cfb1bc366a472c37b48e9551500"}, 1319 | {file = "nbclient-0.5.3.tar.gz", hash = "sha256:db17271330c68c8c88d46d72349e24c147bb6f34ec82d8481a8f025c4d26589c"}, 1320 | ] 1321 | nbconvert = [ 1322 | {file = "nbconvert-6.0.7-py3-none-any.whl", hash = "sha256:39e9f977920b203baea0be67eea59f7b37a761caa542abe80f5897ce3cf6311d"}, 1323 | {file = "nbconvert-6.0.7.tar.gz", hash = "sha256:cbbc13a86dfbd4d1b5dee106539de0795b4db156c894c2c5dc382062bbc29002"}, 1324 | ] 1325 | nbformat = [ 1326 | {file = "nbformat-5.1.2-py3-none-any.whl", hash = "sha256:3949fdc8f5fa0b1afca16fb307546e78494fa7a7bceff880df8168eafda0e7ac"}, 1327 | {file = "nbformat-5.1.2.tar.gz", hash = "sha256:1d223e64a18bfa7cdf2db2e9ba8a818312fc2a0701d2e910b58df66809385a56"}, 1328 | ] 1329 | nest-asyncio = [ 1330 | {file = "nest_asyncio-1.5.1-py3-none-any.whl", hash = "sha256:76d6e972265063fe92a90b9cc4fb82616e07d586b346ed9d2c89a4187acea39c"}, 1331 | {file = "nest_asyncio-1.5.1.tar.gz", hash = "sha256:afc5a1c515210a23c461932765691ad39e8eba6551c055ac8d5546e69250d0aa"}, 1332 | ] 1333 | notebook = [ 1334 | {file = "notebook-6.2.0-py3-none-any.whl", hash = "sha256:25ad93c982b623441b491e693ef400598d1a46cdf11b8c9c0b3be6c61ebbb6cd"}, 1335 | {file = "notebook-6.2.0.tar.gz", hash = "sha256:0464b28e18e7a06cec37e6177546c2322739be07962dd13bf712bcb88361f013"}, 1336 | ] 1337 | numpy = [ 1338 | {file = "numpy-1.20.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:ae61f02b84a0211abb56462a3b6cd1e7ec39d466d3160eb4e1da8bf6717cdbeb"}, 1339 | {file = "numpy-1.20.1-cp37-cp37m-manylinux1_i686.whl", hash = "sha256:65410c7f4398a0047eea5cca9b74009ea61178efd78d1be9847fac1d6716ec1e"}, 1340 | {file = "numpy-1.20.1-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:2d7e27442599104ee08f4faed56bb87c55f8b10a5494ac2ead5c98a4b289e61f"}, 1341 | {file = "numpy-1.20.1-cp37-cp37m-manylinux2010_i686.whl", hash = "sha256:4ed8e96dc146e12c1c5cdd6fb9fd0757f2ba66048bf94c5126b7efebd12d0090"}, 1342 | {file = "numpy-1.20.1-cp37-cp37m-manylinux2010_x86_64.whl", hash = "sha256:ecb5b74c702358cdc21268ff4c37f7466357871f53a30e6f84c686952bef16a9"}, 1343 | {file = "numpy-1.20.1-cp37-cp37m-manylinux2014_aarch64.whl", hash = "sha256:b9410c0b6fed4a22554f072a86c361e417f0258838957b78bd063bde2c7f841f"}, 1344 | {file = "numpy-1.20.1-cp37-cp37m-win32.whl", hash = "sha256:3d3087e24e354c18fb35c454026af3ed8997cfd4997765266897c68d724e4845"}, 1345 | {file = "numpy-1.20.1-cp37-cp37m-win_amd64.whl", hash = "sha256:89f937b13b8dd17b0099c7c2e22066883c86ca1575a975f754babc8fbf8d69a9"}, 1346 | {file = "numpy-1.20.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:a1d7995d1023335e67fb070b2fae6f5968f5be3802b15ad6d79d81ecaa014fe0"}, 1347 | {file = "numpy-1.20.1-cp38-cp38-manylinux1_i686.whl", hash = "sha256:60759ab15c94dd0e1ed88241fd4fa3312db4e91d2c8f5a2d4cf3863fad83d65b"}, 1348 | {file = "numpy-1.20.1-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:125a0e10ddd99a874fd357bfa1b636cd58deb78ba4a30b5ddb09f645c3512e04"}, 1349 | {file = "numpy-1.20.1-cp38-cp38-manylinux2010_i686.whl", hash = "sha256:c26287dfc888cf1e65181f39ea75e11f42ffc4f4529e5bd19add57ad458996e2"}, 1350 | {file = "numpy-1.20.1-cp38-cp38-manylinux2010_x86_64.whl", hash = "sha256:7199109fa46277be503393be9250b983f325880766f847885607d9b13848f257"}, 1351 | {file = "numpy-1.20.1-cp38-cp38-manylinux2014_aarch64.whl", hash = "sha256:72251e43ac426ff98ea802a931922c79b8d7596480300eb9f1b1e45e0543571e"}, 1352 | {file = "numpy-1.20.1-cp38-cp38-win32.whl", hash = "sha256:c91ec9569facd4757ade0888371eced2ecf49e7982ce5634cc2cf4e7331a4b14"}, 1353 | {file = "numpy-1.20.1-cp38-cp38-win_amd64.whl", hash = "sha256:13adf545732bb23a796914fe5f891a12bd74cf3d2986eed7b7eba2941eea1590"}, 1354 | {file = "numpy-1.20.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:104f5e90b143dbf298361a99ac1af4cf59131218a045ebf4ee5990b83cff5fab"}, 1355 | {file = "numpy-1.20.1-cp39-cp39-manylinux2010_i686.whl", hash = "sha256:89e5336f2bec0c726ac7e7cdae181b325a9c0ee24e604704ed830d241c5e47ff"}, 1356 | {file = "numpy-1.20.1-cp39-cp39-manylinux2010_x86_64.whl", hash = "sha256:032be656d89bbf786d743fee11d01ef318b0781281241997558fa7950028dd29"}, 1357 | {file = "numpy-1.20.1-cp39-cp39-manylinux2014_aarch64.whl", hash = "sha256:66b467adfcf628f66ea4ac6430ded0614f5cc06ba530d09571ea404789064adc"}, 1358 | {file = "numpy-1.20.1-cp39-cp39-win32.whl", hash = "sha256:12e4ba5c6420917571f1a5becc9338abbde71dd811ce40b37ba62dec7b39af6d"}, 1359 | {file = "numpy-1.20.1-cp39-cp39-win_amd64.whl", hash = "sha256:9c94cab5054bad82a70b2e77741271790304651d584e2cdfe2041488e753863b"}, 1360 | {file = "numpy-1.20.1-pp37-pypy37_pp73-manylinux2010_x86_64.whl", hash = "sha256:9eb551d122fadca7774b97db8a112b77231dcccda8e91a5bc99e79890797175e"}, 1361 | {file = "numpy-1.20.1.zip", hash = "sha256:3bc63486a870294683980d76ec1e3efc786295ae00128f9ea38e2c6e74d5a60a"}, 1362 | ] 1363 | packaging = [ 1364 | {file = "packaging-20.9-py2.py3-none-any.whl", hash = "sha256:67714da7f7bc052e064859c05c595155bd1ee9f69f76557e21f051443c20947a"}, 1365 | {file = "packaging-20.9.tar.gz", hash = "sha256:5b327ac1320dc863dca72f4514ecc086f31186744b84a230374cc1fd776feae5"}, 1366 | ] 1367 | pandas = [ 1368 | {file = "pandas-1.2.3-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:4d821b9b911fc1b7d428978d04ace33f0af32bb7549525c8a7b08444bce46b74"}, 1369 | {file = "pandas-1.2.3-cp37-cp37m-manylinux1_i686.whl", hash = "sha256:9f5829e64507ad10e2561b60baf285c470f3c4454b007c860e77849b88865ae7"}, 1370 | {file = "pandas-1.2.3-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:97b1954533b2a74c7e20d1342c4f01311d3203b48f2ebf651891e6a6eaf01104"}, 1371 | {file = "pandas-1.2.3-cp37-cp37m-win32.whl", hash = "sha256:5e3c8c60541396110586bcbe6eccdc335a38e7de8c217060edaf4722260b158f"}, 1372 | {file = "pandas-1.2.3-cp37-cp37m-win_amd64.whl", hash = "sha256:8a051e957c5206f722e83f295f95a2cf053e890f9a1fba0065780a8c2d045f5d"}, 1373 | {file = "pandas-1.2.3-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:a93e34f10f67d81de706ce00bf8bb3798403cabce4ccb2de10c61b5ae8786ab5"}, 1374 | {file = "pandas-1.2.3-cp38-cp38-manylinux1_i686.whl", hash = "sha256:46fc671c542a8392a4f4c13edc8527e3a10f6cb62912d856f82248feb747f06e"}, 1375 | {file = "pandas-1.2.3-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:43e00770552595c2250d8d712ec8b6e08ca73089ac823122344f023efa4abea3"}, 1376 | {file = "pandas-1.2.3-cp38-cp38-win32.whl", hash = "sha256:475b7772b6e18a93a43ea83517932deff33954a10d4fbae18d0c1aba4182310f"}, 1377 | {file = "pandas-1.2.3-cp38-cp38-win_amd64.whl", hash = "sha256:72ffcea00ae8ffcdbdefff800284311e155fbb5ed6758f1a6110fc1f8f8f0c1c"}, 1378 | {file = "pandas-1.2.3-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:621c044a1b5e535cf7dcb3ab39fca6f867095c3ef223a524f18f60c7fee028ea"}, 1379 | {file = "pandas-1.2.3-cp39-cp39-manylinux1_i686.whl", hash = "sha256:0f27fd1adfa256388dc34895ca5437eaf254832223812afd817a6f73127f969c"}, 1380 | {file = "pandas-1.2.3-cp39-cp39-manylinux1_x86_64.whl", hash = "sha256:dbb255975eb94143f2e6ec7dadda671d25147939047839cd6b8a4aff0379bb9b"}, 1381 | {file = "pandas-1.2.3-cp39-cp39-win32.whl", hash = "sha256:d59842a5aa89ca03c2099312163ffdd06f56486050e641a45d926a072f04d994"}, 1382 | {file = "pandas-1.2.3-cp39-cp39-win_amd64.whl", hash = "sha256:09761bf5f8c741d47d4b8b9073288de1be39bbfccc281d70b889ade12b2aad29"}, 1383 | {file = "pandas-1.2.3.tar.gz", hash = "sha256:df6f10b85aef7a5bb25259ad651ad1cc1d6bb09000595cab47e718cbac250b1d"}, 1384 | ] 1385 | pandocfilters = [ 1386 | {file = "pandocfilters-1.4.3.tar.gz", hash = "sha256:bc63fbb50534b4b1f8ebe1860889289e8af94a23bff7445259592df25a3906eb"}, 1387 | ] 1388 | parso = [ 1389 | {file = "parso-0.8.1-py2.py3-none-any.whl", hash = "sha256:15b00182f472319383252c18d5913b69269590616c947747bc50bf4ac768f410"}, 1390 | {file = "parso-0.8.1.tar.gz", hash = "sha256:8519430ad07087d4c997fda3a7918f7cfa27cb58972a8c89c2a0295a1c940e9e"}, 1391 | ] 1392 | pexpect = [ 1393 | {file = "pexpect-4.8.0-py2.py3-none-any.whl", hash = "sha256:0b48a55dcb3c05f3329815901ea4fc1537514d6ba867a152b581d69ae3710937"}, 1394 | {file = "pexpect-4.8.0.tar.gz", hash = "sha256:fc65a43959d153d0114afe13997d439c22823a27cefceb5ff35c2178c6784c0c"}, 1395 | ] 1396 | pickleshare = [ 1397 | {file = "pickleshare-0.7.5-py2.py3-none-any.whl", hash = "sha256:9649af414d74d4df115d5d718f82acb59c9d418196b7b4290ed47a12ce62df56"}, 1398 | {file = "pickleshare-0.7.5.tar.gz", hash = "sha256:87683d47965c1da65cdacaf31c8441d12b8044cdec9aca500cd78fc2c683afca"}, 1399 | ] 1400 | pillow = [ 1401 | {file = "Pillow-8.1.1-cp36-cp36m-macosx_10_10_x86_64.whl", hash = "sha256:14415e9e28410232370615dbde0cf0a00e526f522f665460344a5b96973a3086"}, 1402 | {file = "Pillow-8.1.1-cp36-cp36m-manylinux1_i686.whl", hash = "sha256:924fc33cb4acaf6267b8ca3b8f1922620d57a28470d5e4f49672cea9a841eb08"}, 1403 | {file = "Pillow-8.1.1-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:df534e64d4f3e84e8f1e1a37da3f541555d947c1c1c09b32178537f0f243f69d"}, 1404 | {file = "Pillow-8.1.1-cp36-cp36m-manylinux2014_aarch64.whl", hash = "sha256:4fe74636ee71c57a7f65d7b21a9f127d842b4fb75511e5d256ace258826eb352"}, 1405 | {file = "Pillow-8.1.1-cp36-cp36m-win32.whl", hash = "sha256:3e759bcc03d6f39bc751e56d86bc87252b9a21c689a27c5ed753717a87d53a5b"}, 1406 | {file = "Pillow-8.1.1-cp36-cp36m-win_amd64.whl", hash = "sha256:292f2aa1ae5c5c1451cb4b558addb88c257411d3fd71c6cf45562911baffc979"}, 1407 | {file = "Pillow-8.1.1-cp37-cp37m-macosx_10_10_x86_64.whl", hash = "sha256:8211cac9bf10461f9e33fe9a3af6c5131f3fdd0d10672afc2abb2c70cf95c5ca"}, 1408 | {file = "Pillow-8.1.1-cp37-cp37m-manylinux1_i686.whl", hash = "sha256:d30f30c044bdc0ab8f3924e1eeaac87e0ff8a27e87369c5cac4064b6ec78fd83"}, 1409 | {file = "Pillow-8.1.1-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:7094bbdecb95ebe53166e4c12cf5e28310c2b550b08c07c5dc15433898e2238e"}, 1410 | {file = "Pillow-8.1.1-cp37-cp37m-manylinux2014_aarch64.whl", hash = "sha256:1022f8f6dc3c5b0dcf928f1c49ba2ac73051f576af100d57776e2b65c1f76a8d"}, 1411 | {file = "Pillow-8.1.1-cp37-cp37m-win32.whl", hash = "sha256:a7d690b2c5f7e4a932374615fedceb1e305d2dd5363c1de15961725fe10e7d16"}, 1412 | {file = "Pillow-8.1.1-cp37-cp37m-win_amd64.whl", hash = "sha256:436b0a2dd9fe3f7aa6a444af6bdf53c1eb8f5ced9ea3ef104daa83f0ea18e7bc"}, 1413 | {file = "Pillow-8.1.1-cp38-cp38-macosx_10_10_x86_64.whl", hash = "sha256:c448d2b335e21951416a30cd48d35588d122a912d5fe9e41900afacecc7d21a1"}, 1414 | {file = "Pillow-8.1.1-cp38-cp38-manylinux1_i686.whl", hash = "sha256:bb18422ad00c1fecc731d06592e99c3be2c634da19e26942ba2f13d805005cf2"}, 1415 | {file = "Pillow-8.1.1-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:3ec87bd1248b23a2e4e19e774367fbe30fddc73913edc5f9b37470624f55dc1f"}, 1416 | {file = "Pillow-8.1.1-cp38-cp38-manylinux2014_aarch64.whl", hash = "sha256:99ce3333b40b7a4435e0a18baad468d44ab118a4b1da0af0a888893d03253f1d"}, 1417 | {file = "Pillow-8.1.1-cp38-cp38-win32.whl", hash = "sha256:2f0d7034d5faae9a8d1019d152ede924f653df2ce77d3bba4ce62cd21b5f94ae"}, 1418 | {file = "Pillow-8.1.1-cp38-cp38-win_amd64.whl", hash = "sha256:07872f1d8421db5a3fe770f7480835e5e90fddb58f36c216d4a2ac0d594de474"}, 1419 | {file = "Pillow-8.1.1-cp39-cp39-macosx_10_10_x86_64.whl", hash = "sha256:69da5b1d7102a61ce9b45deb2920a2012d52fd8f4201495ea9411d0071b0ec22"}, 1420 | {file = "Pillow-8.1.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:2a40d7d4b17db87f5b9a1efc0aff56000e1d0d5ece415090c102aafa0ccbe858"}, 1421 | {file = "Pillow-8.1.1-cp39-cp39-manylinux1_i686.whl", hash = "sha256:01bb0a34f1a6689b138c0089d670ae2e8f886d2666a9b2f2019031abdea673c4"}, 1422 | {file = "Pillow-8.1.1-cp39-cp39-manylinux1_x86_64.whl", hash = "sha256:43b3c859912e8bf754b3c5142df624794b18eb7ae07cfeddc917e1a9406a3ef2"}, 1423 | {file = "Pillow-8.1.1-cp39-cp39-manylinux2014_aarch64.whl", hash = "sha256:3b13d89d97b551e02549d1f0edf22bed6acfd6fd2e888cd1e9a953bf215f0e81"}, 1424 | {file = "Pillow-8.1.1-cp39-cp39-win32.whl", hash = "sha256:c143c409e7bc1db784471fe9d0bf95f37c4458e879ad84cfae640cb74ee11a26"}, 1425 | {file = "Pillow-8.1.1-cp39-cp39-win_amd64.whl", hash = "sha256:1c5e3c36f02c815766ae9dd91899b1c5b4652f2a37b7a51609f3bd467c0f11fb"}, 1426 | {file = "Pillow-8.1.1-pp36-pypy36_pp73-macosx_10_10_x86_64.whl", hash = "sha256:8cf77e458bd996dc85455f10fe443c0c946f5b13253773439bcbec08aa1aebc2"}, 1427 | {file = "Pillow-8.1.1-pp36-pypy36_pp73-manylinux2010_i686.whl", hash = "sha256:c10af40ee2f1a99e1ae755ab1f773916e8bca3364029a042cd9161c400416bd8"}, 1428 | {file = "Pillow-8.1.1-pp36-pypy36_pp73-manylinux2010_x86_64.whl", hash = "sha256:ff83dfeb04c98bb3e7948f876c17513a34e9a19fd92e292288649164924c1b39"}, 1429 | {file = "Pillow-8.1.1-pp37-pypy37_pp73-macosx_10_10_x86_64.whl", hash = "sha256:b9af590adc1e46898a1276527f3cfe2da8048ae43fbbf9b1bf9395f6c99d9b47"}, 1430 | {file = "Pillow-8.1.1-pp37-pypy37_pp73-manylinux2010_i686.whl", hash = "sha256:172acfaf00434a28dddfe592d83f2980e22e63c769ff4a448ddf7b7a38ffd165"}, 1431 | {file = "Pillow-8.1.1-pp37-pypy37_pp73-manylinux2010_x86_64.whl", hash = "sha256:33fdbd4f5608c852d97264f9d2e3b54e9e9959083d008145175b86100b275e5b"}, 1432 | {file = "Pillow-8.1.1-pp37-pypy37_pp73-win32.whl", hash = "sha256:59445af66b59cc39530b4f810776928d75e95f41e945f0c32a3de4aceb93c15d"}, 1433 | {file = "Pillow-8.1.1.tar.gz", hash = "sha256:f6fc18f9c9c7959bf58e6faf801d14fafb6d4717faaf6f79a68c8bb2a13dcf20"}, 1434 | ] 1435 | pluggy = [ 1436 | {file = "pluggy-0.13.1-py2.py3-none-any.whl", hash = "sha256:966c145cd83c96502c3c3868f50408687b38434af77734af1e9ca461a4081d2d"}, 1437 | {file = "pluggy-0.13.1.tar.gz", hash = "sha256:15b2acde666561e1298d71b523007ed7364de07029219b604cf808bfa1c765b0"}, 1438 | ] 1439 | prometheus-client = [ 1440 | {file = "prometheus_client-0.9.0-py2.py3-none-any.whl", hash = "sha256:b08c34c328e1bf5961f0b4352668e6c8f145b4a087e09b7296ef62cbe4693d35"}, 1441 | {file = "prometheus_client-0.9.0.tar.gz", hash = "sha256:9da7b32f02439d8c04f7777021c304ed51d9ec180604700c1ba72a4d44dceb03"}, 1442 | ] 1443 | prompt-toolkit = [ 1444 | {file = "prompt_toolkit-3.0.16-py3-none-any.whl", hash = "sha256:62c811e46bd09130fb11ab759012a4ae385ce4fb2073442d1898867a824183bd"}, 1445 | {file = "prompt_toolkit-3.0.16.tar.gz", hash = "sha256:0fa02fa80363844a4ab4b8d6891f62dd0645ba672723130423ca4037b80c1974"}, 1446 | ] 1447 | protobuf = [ 1448 | {file = "protobuf-3.15.5-cp27-cp27m-macosx_10_9_x86_64.whl", hash = "sha256:d26ed8dbdbe6b62cd24173c9ceb7588ae7831eec172ac002b095af091db01196"}, 1449 | {file = "protobuf-3.15.5-cp27-cp27mu-manylinux1_x86_64.whl", hash = "sha256:9133b39924485ae43c02fc8274e57e5aa1706ad0970de49c72cfb8c0854d5f89"}, 1450 | {file = "protobuf-3.15.5-cp35-cp35m-macosx_10_9_intel.whl", hash = "sha256:6bb44c15c98091e926a98362bff7fb24338bdf4001a6614834b8414c3b8593ee"}, 1451 | {file = "protobuf-3.15.5-cp35-cp35m-manylinux1_x86_64.whl", hash = "sha256:2d4cede5f2f2514df4a1eda1424a14d46daa5ea57963a1ea0fdab8d74ca2f9cd"}, 1452 | {file = "protobuf-3.15.5-cp35-cp35m-win32.whl", hash = "sha256:ab735b3a4342004afa60ff580ce2be0f2aa784f1f69ee7f08a23ef26d22d811d"}, 1453 | {file = "protobuf-3.15.5-cp35-cp35m-win_amd64.whl", hash = "sha256:a390e4bbb8232945fc8e4493c8b70949423a6dacee6f0353021b59c40b039e25"}, 1454 | {file = "protobuf-3.15.5-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:dc7191b2e3361fdf2979e78a120a3a40e9d811318f6b2629036f53d9cb041c09"}, 1455 | {file = "protobuf-3.15.5-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:762f6b9fb8025db34f762a860fd2b1473dfc84bcd0c3e4f396a695c83d733729"}, 1456 | {file = "protobuf-3.15.5-cp36-cp36m-win32.whl", hash = "sha256:d1aab4d0aed36f7873734a243b46786d407cfa1010fae886249db56a1493a057"}, 1457 | {file = "protobuf-3.15.5-cp36-cp36m-win_amd64.whl", hash = "sha256:119b4d308c87e833b6265b3922d5f5927e9d804605fcb1c1f771aa4d17e03591"}, 1458 | {file = "protobuf-3.15.5-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:c5b37b117ef89431149883d9b867c341a01f835142864722534885dcc1db6b1b"}, 1459 | {file = "protobuf-3.15.5-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:f75aa0483fec2e4208bd4be18da0e3d7161dc74c65b6d6108f5968a8fe53a8ce"}, 1460 | {file = "protobuf-3.15.5-cp37-cp37m-win32.whl", hash = "sha256:5d52d89e26adf0ba65193b6be39025c7766740ccc57fe9d10ddb709220b360d9"}, 1461 | {file = "protobuf-3.15.5-cp37-cp37m-win_amd64.whl", hash = "sha256:87b5bc2ff944810a918628fc1f45f766acab23e1fecb0634fcf86cda554b30c4"}, 1462 | {file = "protobuf-3.15.5-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:282385b8dd168b0f71f2ffca74c1fb39377f42217830ab492a0b64cbe14f86c1"}, 1463 | {file = "protobuf-3.15.5-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:9f4445f197f779cd5b37c9d5d4aeb0d1999c1df7d143a9bce21d03dac8dba205"}, 1464 | {file = "protobuf-3.15.5-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:ac7c7a2b271307787ccdc0a45278827f36f72aba5040eadefff129b869068797"}, 1465 | {file = "protobuf-3.15.5-cp39-cp39-manylinux1_x86_64.whl", hash = "sha256:8090b77f0791560b3c01263f6222006fe4c1d1d526539344afc4ecd9bd3e56f2"}, 1466 | {file = "protobuf-3.15.5-py2.py3-none-any.whl", hash = "sha256:dbb98adb4281684eb54ce1f003b574bbc5768b9f614d7faa2c56f30e18519ec7"}, 1467 | {file = "protobuf-3.15.5.tar.gz", hash = "sha256:be8a929c6178bb6cbe9e2c858be62fa08966a39ae758a8493a88f0ed1efb6097"}, 1468 | ] 1469 | ptyprocess = [ 1470 | {file = "ptyprocess-0.7.0-py2.py3-none-any.whl", hash = "sha256:4b41f3967fce3af57cc7e94b888626c18bf37a083e3651ca8feeb66d492fef35"}, 1471 | {file = "ptyprocess-0.7.0.tar.gz", hash = "sha256:5c5d0a3b48ceee0b48485e0c26037c0acd7d29765ca3fbb5cb3831d347423220"}, 1472 | ] 1473 | py = [ 1474 | {file = "py-1.10.0-py2.py3-none-any.whl", hash = "sha256:3b80836aa6d1feeaa108e046da6423ab8f6ceda6468545ae8d02d9d58d18818a"}, 1475 | {file = "py-1.10.0.tar.gz", hash = "sha256:21b81bda15b66ef5e1a777a21c4dcd9c20ad3efd0b3f817e7a809035269e1bd3"}, 1476 | ] 1477 | pyarrow = [ 1478 | {file = "pyarrow-3.0.0-cp36-cp36m-macosx_10_13_x86_64.whl", hash = "sha256:03e2435da817bc2b5d0fad6f2e53305eb36c24004ddfcb2b30e4217a1a80cf22"}, 1479 | {file = "pyarrow-3.0.0-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:2be3a9eab4bfd00024dc3c83fa03de1c1d04a0f47ebaf3dc483cd100546eacbf"}, 1480 | {file = "pyarrow-3.0.0-cp36-cp36m-manylinux2010_x86_64.whl", hash = "sha256:a76031ef19d11db2fef79a97cc69997c97bea35aa07efbe042a177c7e3b1a390"}, 1481 | {file = "pyarrow-3.0.0-cp36-cp36m-manylinux2014_x86_64.whl", hash = "sha256:a07e286e81ceb20f8f0c45f69760d2ebc434fe83794d5f9b44f89fc2dc6dc24d"}, 1482 | {file = "pyarrow-3.0.0-cp36-cp36m-win_amd64.whl", hash = "sha256:cfea99a01d844c3db5e25374a6cdcf3b5ba1698bfe95d41272c295a4581e884c"}, 1483 | {file = "pyarrow-3.0.0-cp37-cp37m-macosx_10_13_x86_64.whl", hash = "sha256:d5666a7fa2668f3ff95df028c2072d59e8b17e73d682068e8505dafa2688f3cc"}, 1484 | {file = "pyarrow-3.0.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:3ea6574d1ae2d9bff7e6e1715f64c31bdc01b42387a5c78311a8ce9c09cfe135"}, 1485 | {file = "pyarrow-3.0.0-cp37-cp37m-manylinux2010_x86_64.whl", hash = "sha256:2d5c95eb04a3d2e786e097b53534893eade6c8b3faf10f53a06143384b4446b1"}, 1486 | {file = "pyarrow-3.0.0-cp37-cp37m-manylinux2014_x86_64.whl", hash = "sha256:31e6fc0868963aba4e6b8a3e218c9a5ff347bca870d622da0b3d58269d0c5398"}, 1487 | {file = "pyarrow-3.0.0-cp37-cp37m-win_amd64.whl", hash = "sha256:960a9b0fd599601ddac42f16d5acf049637ec08957359c6741d6eb2bf0dbae97"}, 1488 | {file = "pyarrow-3.0.0-cp38-cp38-macosx_10_13_x86_64.whl", hash = "sha256:2c3353d38d137f1158595b3b18dcef711f3d8fdb57cf7ae2d861d07235064bc1"}, 1489 | {file = "pyarrow-3.0.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:72206cde1857d5420601feae75f53921cffab4326b42262a858c7b8be67982b7"}, 1490 | {file = "pyarrow-3.0.0-cp38-cp38-manylinux2010_x86_64.whl", hash = "sha256:dec007a0f7adba86bd170252140ede01646b45c3a470d5862ce00d8e40cd29bd"}, 1491 | {file = "pyarrow-3.0.0-cp38-cp38-manylinux2014_x86_64.whl", hash = "sha256:bf6684fe9e38f8ddb696e38901461eab783ec1d565974ebd5862270320b3e27f"}, 1492 | {file = "pyarrow-3.0.0-cp38-cp38-win_amd64.whl", hash = "sha256:3b46487c45faaea8d1a5aa65002e2832ae2e1c9e68ecb461cda4fa59891cf490"}, 1493 | {file = "pyarrow-3.0.0-cp39-cp39-macosx_10_13_x86_64.whl", hash = "sha256:978bbe8ec9090d1133a25f00f32ed92600f9d315fbfa29a17952bee01f0d7fe5"}, 1494 | {file = "pyarrow-3.0.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:b7a8903f2b8a80498725ef5d4a35cd7dd5a98b74e080d42692545e61a6cbfbe4"}, 1495 | {file = "pyarrow-3.0.0-cp39-cp39-manylinux2010_x86_64.whl", hash = "sha256:b1cf92df9f336f31706249e543dc0ffce3c67a78204ce540f1173c6c07dfafec"}, 1496 | {file = "pyarrow-3.0.0-cp39-cp39-manylinux2014_x86_64.whl", hash = "sha256:b08c119cc2b9fcd1567797fedb245a2f4352a3084a22b7298272afe7cf7a4730"}, 1497 | {file = "pyarrow-3.0.0-cp39-cp39-win_amd64.whl", hash = "sha256:5faa2dc73444bdcf042f121383965a47362be1f946303d46e8fd80f8d26cd90c"}, 1498 | {file = "pyarrow-3.0.0.tar.gz", hash = "sha256:4bf8cc43e1db1e0517466209ee8e8f459d9b5e1b4074863317f2a965cf59889e"}, 1499 | ] 1500 | pycparser = [ 1501 | {file = "pycparser-2.20-py2.py3-none-any.whl", hash = "sha256:7582ad22678f0fcd81102833f60ef8d0e57288b6b5fb00323d101be910e35705"}, 1502 | {file = "pycparser-2.20.tar.gz", hash = "sha256:2d475327684562c3a96cc71adf7dc8c4f0565175cf86b6d7a404ff4c771f15f0"}, 1503 | ] 1504 | pydeck = [ 1505 | {file = "pydeck-0.6.1-py2.py3-none-any.whl", hash = "sha256:9f77d28b45504010c48cc7a43bbc2108749862f6738f94dba2e9ad16a39b0be1"}, 1506 | {file = "pydeck-0.6.1.tar.gz", hash = "sha256:a431484424e92f75454cd5066935241d9244bc8c78afe478a7f83143878f28d0"}, 1507 | ] 1508 | pygments = [ 1509 | {file = "Pygments-2.8.0-py3-none-any.whl", hash = "sha256:b21b072d0ccdf29297a82a2363359d99623597b8a265b8081760e4d0f7153c88"}, 1510 | {file = "Pygments-2.8.0.tar.gz", hash = "sha256:37a13ba168a02ac54cc5891a42b1caec333e59b66addb7fa633ea8a6d73445c0"}, 1511 | ] 1512 | pyparsing = [ 1513 | {file = "pyparsing-2.4.7-py2.py3-none-any.whl", hash = "sha256:ef9d7589ef3c200abe66653d3f1ab1033c3c419ae9b9bdb1240a85b024efc88b"}, 1514 | {file = "pyparsing-2.4.7.tar.gz", hash = "sha256:c203ec8783bf771a155b207279b9bccb8dea02d8f0c9e5f8ead507bc3246ecc1"}, 1515 | ] 1516 | pyrsistent = [ 1517 | {file = "pyrsistent-0.17.3.tar.gz", hash = "sha256:2e636185d9eb976a18a8a8e96efce62f2905fea90041958d8cc2a189756ebf3e"}, 1518 | ] 1519 | pytest = [ 1520 | {file = "pytest-6.2.2-py3-none-any.whl", hash = "sha256:b574b57423e818210672e07ca1fa90aaf194a4f63f3ab909a2c67ebb22913839"}, 1521 | {file = "pytest-6.2.2.tar.gz", hash = "sha256:9d1edf9e7d0b84d72ea3dbcdfd22b35fb543a5e8f2a60092dd578936bf63d7f9"}, 1522 | ] 1523 | python-dateutil = [ 1524 | {file = "python-dateutil-2.8.1.tar.gz", hash = "sha256:73ebfe9dbf22e832286dafa60473e4cd239f8592f699aa5adaf10050e6e1823c"}, 1525 | {file = "python_dateutil-2.8.1-py2.py3-none-any.whl", hash = "sha256:75bb3f31ea686f1197762692a9ee6a7550b59fc6ca3a1f4b5d7e32fb98e2da2a"}, 1526 | ] 1527 | pytz = [ 1528 | {file = "pytz-2021.1-py2.py3-none-any.whl", hash = "sha256:eb10ce3e7736052ed3623d49975ce333bcd712c7bb19a58b9e2089d4057d0798"}, 1529 | {file = "pytz-2021.1.tar.gz", hash = "sha256:83a4a90894bf38e243cf052c8b58f381bfe9a7a483f6a9cab140bc7f702ac4da"}, 1530 | ] 1531 | pywin32 = [ 1532 | {file = "pywin32-300-cp35-cp35m-win32.whl", hash = "sha256:1c204a81daed2089e55d11eefa4826c05e604d27fe2be40b6bf8db7b6a39da63"}, 1533 | {file = "pywin32-300-cp35-cp35m-win_amd64.whl", hash = "sha256:350c5644775736351b77ba68da09a39c760d75d2467ecec37bd3c36a94fbed64"}, 1534 | {file = "pywin32-300-cp36-cp36m-win32.whl", hash = "sha256:a3b4c48c852d4107e8a8ec980b76c94ce596ea66d60f7a697582ea9dce7e0db7"}, 1535 | {file = "pywin32-300-cp36-cp36m-win_amd64.whl", hash = "sha256:27a30b887afbf05a9cbb05e3ffd43104a9b71ce292f64a635389dbad0ed1cd85"}, 1536 | {file = "pywin32-300-cp37-cp37m-win32.whl", hash = "sha256:d7e8c7efc221f10d6400c19c32a031add1c4a58733298c09216f57b4fde110dc"}, 1537 | {file = "pywin32-300-cp37-cp37m-win_amd64.whl", hash = "sha256:8151e4d7a19262d6694162d6da85d99a16f8b908949797fd99c83a0bfaf5807d"}, 1538 | {file = "pywin32-300-cp38-cp38-win32.whl", hash = "sha256:fbb3b1b0fbd0b4fc2a3d1d81fe0783e30062c1abed1d17c32b7879d55858cfae"}, 1539 | {file = "pywin32-300-cp38-cp38-win_amd64.whl", hash = "sha256:60a8fa361091b2eea27f15718f8eb7f9297e8d51b54dbc4f55f3d238093d5190"}, 1540 | {file = "pywin32-300-cp39-cp39-win32.whl", hash = "sha256:638b68eea5cfc8def537e43e9554747f8dee786b090e47ead94bfdafdb0f2f50"}, 1541 | {file = "pywin32-300-cp39-cp39-win_amd64.whl", hash = "sha256:b1609ce9bd5c411b81f941b246d683d6508992093203d4eb7f278f4ed1085c3f"}, 1542 | ] 1543 | pywinpty = [ 1544 | {file = "pywinpty-0.5.7-cp27-cp27m-win32.whl", hash = "sha256:b358cb552c0f6baf790de375fab96524a0498c9df83489b8c23f7f08795e966b"}, 1545 | {file = "pywinpty-0.5.7-cp27-cp27m-win_amd64.whl", hash = "sha256:1e525a4de05e72016a7af27836d512db67d06a015aeaf2fa0180f8e6a039b3c2"}, 1546 | {file = "pywinpty-0.5.7-cp35-cp35m-win32.whl", hash = "sha256:2740eeeb59297593a0d3f762269b01d0285c1b829d6827445fcd348fb47f7e70"}, 1547 | {file = "pywinpty-0.5.7-cp35-cp35m-win_amd64.whl", hash = "sha256:33df97f79843b2b8b8bc5c7aaf54adec08cc1bae94ee99dfb1a93c7a67704d95"}, 1548 | {file = "pywinpty-0.5.7-cp36-cp36m-win32.whl", hash = "sha256:e854211df55d107f0edfda8a80b39dfc87015bef52a8fe6594eb379240d81df2"}, 1549 | {file = "pywinpty-0.5.7-cp36-cp36m-win_amd64.whl", hash = "sha256:dbd838de92de1d4ebf0dce9d4d5e4fc38d0b7b1de837947a18b57a882f219139"}, 1550 | {file = "pywinpty-0.5.7-cp37-cp37m-win32.whl", hash = "sha256:5fb2c6c6819491b216f78acc2c521b9df21e0f53b9a399d58a5c151a3c4e2a2d"}, 1551 | {file = "pywinpty-0.5.7-cp37-cp37m-win_amd64.whl", hash = "sha256:dd22c8efacf600730abe4a46c1388355ce0d4ab75dc79b15d23a7bd87bf05b48"}, 1552 | {file = "pywinpty-0.5.7-cp38-cp38-win_amd64.whl", hash = "sha256:8fc5019ff3efb4f13708bd3b5ad327589c1a554cb516d792527361525a7cb78c"}, 1553 | {file = "pywinpty-0.5.7.tar.gz", hash = "sha256:2d7e9c881638a72ffdca3f5417dd1563b60f603e1b43e5895674c2a1b01f95a0"}, 1554 | ] 1555 | pyzmq = [ 1556 | {file = "pyzmq-22.0.3-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:c0cde362075ee8f3d2b0353b283e203c2200243b5a15d5c5c03b78112a17e7d4"}, 1557 | {file = "pyzmq-22.0.3-cp36-cp36m-manylinux1_i686.whl", hash = "sha256:ff1ea14075bbddd6f29bf6beb8a46d0db779bcec6b9820909584081ec119f8fd"}, 1558 | {file = "pyzmq-22.0.3-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:26380487eae4034d6c2a3fb8d0f2dff6dd0d9dd711894e8d25aa2d1938950a33"}, 1559 | {file = "pyzmq-22.0.3-cp36-cp36m-manylinux2014_aarch64.whl", hash = "sha256:3e29f9cf85a40d521d048b55c63f59d6c772ac1c4bf51cdfc23b62a62e377c33"}, 1560 | {file = "pyzmq-22.0.3-cp36-cp36m-win32.whl", hash = "sha256:4f34a173f813b38b83f058e267e30465ed64b22cd0cf6bad21148d3fa718f9bb"}, 1561 | {file = "pyzmq-22.0.3-cp36-cp36m-win_amd64.whl", hash = "sha256:30df70f81fe210506aa354d7fd486a39b87d9f7f24c3d3f4f698ec5d96b8c084"}, 1562 | {file = "pyzmq-22.0.3-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:7026f0353977431fc884abd4ac28268894bd1a780ba84bb266d470b0ec26d2ed"}, 1563 | {file = "pyzmq-22.0.3-cp37-cp37m-manylinux1_i686.whl", hash = "sha256:6d4163704201fff0f3ab0cd5d7a0ea1514ecfffd3926d62ec7e740a04d2012c7"}, 1564 | {file = "pyzmq-22.0.3-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:763c175294d861869f18eb42901d500eda7d3fa4565f160b3b2fd2678ea0ebab"}, 1565 | {file = "pyzmq-22.0.3-cp37-cp37m-manylinux2014_aarch64.whl", hash = "sha256:61e4bb6cd60caf1abcd796c3f48395e22c5b486eeca6f3a8797975c57d94b03e"}, 1566 | {file = "pyzmq-22.0.3-cp37-cp37m-win32.whl", hash = "sha256:b25e5d339550a850f7e919fe8cb4c8eabe4c917613db48dab3df19bfb9a28969"}, 1567 | {file = "pyzmq-22.0.3-cp37-cp37m-win_amd64.whl", hash = "sha256:3ef50d74469b03725d781a2a03c57537d86847ccde587130fe35caafea8f75c6"}, 1568 | {file = "pyzmq-22.0.3-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:60e63577b85055e4cc43892fecd877b86695ee3ef12d5d10a3c5d6e77a7cc1a3"}, 1569 | {file = "pyzmq-22.0.3-cp38-cp38-manylinux2010_i686.whl", hash = "sha256:f5831eff6b125992ec65d973f5151c48003b6754030094723ac4c6e80a97c8c4"}, 1570 | {file = "pyzmq-22.0.3-cp38-cp38-manylinux2010_x86_64.whl", hash = "sha256:9221783dacb419604d5345d0e097bddef4459a9a95322de6c306bf1d9896559f"}, 1571 | {file = "pyzmq-22.0.3-cp38-cp38-manylinux2014_aarch64.whl", hash = "sha256:b62ea18c0458a65ccd5be90f276f7a5a3f26a6dea0066d948ce2fa896051420f"}, 1572 | {file = "pyzmq-22.0.3-cp38-cp38-win32.whl", hash = "sha256:81e7df0da456206201e226491aa1fc449da85328bf33bbeec2c03bb3a9f18324"}, 1573 | {file = "pyzmq-22.0.3-cp38-cp38-win_amd64.whl", hash = "sha256:f52070871a0fd90a99130babf21f8af192304ec1e995bec2a9533efc21ea4452"}, 1574 | {file = "pyzmq-22.0.3-cp39-cp39-macosx_10_15_universal2.whl", hash = "sha256:c5e29fe4678f97ce429f076a2a049a3d0b2660ada8f2c621e5dc9939426056dd"}, 1575 | {file = "pyzmq-22.0.3-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:d18ddc6741b51f3985978f2fda57ddcdae359662d7a6b395bc8ff2292fca14bd"}, 1576 | {file = "pyzmq-22.0.3-cp39-cp39-manylinux2010_i686.whl", hash = "sha256:4231943514812dfb74f44eadcf85e8dd8cf302b4d0bce450ce1357cac88dbfdc"}, 1577 | {file = "pyzmq-22.0.3-cp39-cp39-manylinux2010_x86_64.whl", hash = "sha256:23a74de4b43c05c3044aeba0d1f3970def8f916151a712a3ac1e5cd9c0bc2902"}, 1578 | {file = "pyzmq-22.0.3-cp39-cp39-manylinux2014_aarch64.whl", hash = "sha256:532af3e6dddea62d9c49062ece5add998c9823c2419da943cf95589f56737de0"}, 1579 | {file = "pyzmq-22.0.3-cp39-cp39-win32.whl", hash = "sha256:33acd2b9790818b9d00526135acf12790649d8d34b2b04d64558b469c9d86820"}, 1580 | {file = "pyzmq-22.0.3-cp39-cp39-win_amd64.whl", hash = "sha256:a558c5bc89d56d7253187dccc4e81b5bb0eac5ae9511eb4951910a1245d04622"}, 1581 | {file = "pyzmq-22.0.3-pp36-pypy36_pp73-macosx_10_9_x86_64.whl", hash = "sha256:581787c62eaa0e0db6c5413cedc393ebbadac6ddfd22e1cf9a60da23c4f1a4b2"}, 1582 | {file = "pyzmq-22.0.3-pp36-pypy36_pp73-manylinux2010_x86_64.whl", hash = "sha256:38e3dca75d81bec4f2defa14b0a65b74545812bb519a8e89c8df96bbf4639356"}, 1583 | {file = "pyzmq-22.0.3-pp36-pypy36_pp73-win32.whl", hash = "sha256:2f971431aaebe0a8b54ac018e041c2f0b949a43745444e4dadcc80d0f0ef8457"}, 1584 | {file = "pyzmq-22.0.3-pp37-pypy37_pp73-macosx_10_9_x86_64.whl", hash = "sha256:da7d4d4c778c86b60949d17531e60c54ed3726878de8a7f8a6d6e7f8cc8c3205"}, 1585 | {file = "pyzmq-22.0.3-pp37-pypy37_pp73-manylinux2010_x86_64.whl", hash = "sha256:13465c1ff969cab328bc92f7015ce3843f6e35f8871ad79d236e4fbc85dbe4cb"}, 1586 | {file = "pyzmq-22.0.3-pp37-pypy37_pp73-win32.whl", hash = "sha256:279cc9b51db48bec2db146f38e336049ac5a59e5f12fb3a8ad864e238c1c62e3"}, 1587 | {file = "pyzmq-22.0.3.tar.gz", hash = "sha256:f7f63ce127980d40f3e6a5fdb87abf17ce1a7c2bd8bf2c7560e1bbce8ab1f92d"}, 1588 | ] 1589 | requests = [ 1590 | {file = "requests-2.25.1-py2.py3-none-any.whl", hash = "sha256:c210084e36a42ae6b9219e00e48287def368a26d03a048ddad7bfee44f75871e"}, 1591 | {file = "requests-2.25.1.tar.gz", hash = "sha256:27973dd4a904a4f13b263a19c866c13b92a39ed1c964655f025f3f8d3d75b804"}, 1592 | ] 1593 | scikit-learn = [ 1594 | {file = "scikit-learn-0.24.1.tar.gz", hash = "sha256:a0334a1802e64d656022c3bfab56a73fbd6bf4b1298343f3688af2151810bbdf"}, 1595 | {file = "scikit_learn-0.24.1-cp36-cp36m-macosx_10_13_x86_64.whl", hash = "sha256:9bed8a1ef133c8e2f13966a542cb8125eac7f4b67dcd234197c827ba9c7dd3e0"}, 1596 | {file = "scikit_learn-0.24.1-cp36-cp36m-manylinux1_i686.whl", hash = "sha256:a36e159a0521e13bbe15ca8c8d038b3a1dd4c7dad18d276d76992e03b92cf643"}, 1597 | {file = "scikit_learn-0.24.1-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:c658432d8a20e95398f6bb95ff9731ce9dfa343fdf21eea7ec6a7edfacd4b4d9"}, 1598 | {file = "scikit_learn-0.24.1-cp36-cp36m-manylinux2010_i686.whl", hash = "sha256:9dfa564ef27e8e674aa1cc74378416d580ac4ede1136c13dd555a87996e13422"}, 1599 | {file = "scikit_learn-0.24.1-cp36-cp36m-manylinux2010_x86_64.whl", hash = "sha256:9c6097b6a9b2bafc5e0f31f659e6ab5e131383209c30c9e978c5b8abdac5ed2a"}, 1600 | {file = "scikit_learn-0.24.1-cp36-cp36m-win32.whl", hash = "sha256:7b04691eb2f41d2c68dbda8d1bd3cb4ef421bdc43aaa56aeb6c762224552dfb6"}, 1601 | {file = "scikit_learn-0.24.1-cp36-cp36m-win_amd64.whl", hash = "sha256:1adf483e91007a87171d7ce58c34b058eb5dab01b5fee6052f15841778a8ecd8"}, 1602 | {file = "scikit_learn-0.24.1-cp37-cp37m-macosx_10_13_x86_64.whl", hash = "sha256:ddb52d088889f5596bc4d1de981f2eca106b58243b6679e4782f3ba5096fd645"}, 1603 | {file = "scikit_learn-0.24.1-cp37-cp37m-manylinux1_i686.whl", hash = "sha256:a29460499c1e62b7a830bb57ca42e615375a6ab1bcad053cd25b493588348ea8"}, 1604 | {file = "scikit_learn-0.24.1-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:0567a2d29ad08af98653300c623bd8477b448fe66ced7198bef4ed195925f082"}, 1605 | {file = "scikit_learn-0.24.1-cp37-cp37m-manylinux2010_i686.whl", hash = "sha256:99349d77f54e11f962d608d94dfda08f0c9e5720d97132233ebdf35be2858b2d"}, 1606 | {file = "scikit_learn-0.24.1-cp37-cp37m-manylinux2010_x86_64.whl", hash = "sha256:83b21ff053b1ff1c018a2d24db6dd3ea339b1acfbaa4d9c881731f43748d8b3b"}, 1607 | {file = "scikit_learn-0.24.1-cp37-cp37m-win32.whl", hash = "sha256:c3deb3b19dd9806acf00cf0d400e84562c227723013c33abefbbc3cf906596e9"}, 1608 | {file = "scikit_learn-0.24.1-cp37-cp37m-win_amd64.whl", hash = "sha256:d54dbaadeb1425b7d6a66bf44bee2bb2b899fe3e8850b8e94cfb9c904dcb46d0"}, 1609 | {file = "scikit_learn-0.24.1-cp38-cp38-macosx_10_13_x86_64.whl", hash = "sha256:3c4f07f47c04e81b134424d53c3f5e16dfd7f494e44fd7584ba9ce9de2c5e6c1"}, 1610 | {file = "scikit_learn-0.24.1-cp38-cp38-manylinux1_i686.whl", hash = "sha256:c13ebac42236b1c46397162471ea1c46af68413000e28b9309f8c05722c65a09"}, 1611 | {file = "scikit_learn-0.24.1-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:4ddd2b6f7449a5d539ff754fa92d75da22de261fd8fdcfb3596799fadf255101"}, 1612 | {file = "scikit_learn-0.24.1-cp38-cp38-manylinux2010_i686.whl", hash = "sha256:826b92bf45b8ad80444814e5f4ac032156dd481e48d7da33d611f8fe96d5f08b"}, 1613 | {file = "scikit_learn-0.24.1-cp38-cp38-manylinux2010_x86_64.whl", hash = "sha256:259ec35201e82e2db1ae2496f229e63f46d7f1695ae68eef9350b00dc74ba52f"}, 1614 | {file = "scikit_learn-0.24.1-cp38-cp38-win32.whl", hash = "sha256:8772b99d683be8f67fcc04789032f1b949022a0e6880ee7b75a7ec97dbbb5d0b"}, 1615 | {file = "scikit_learn-0.24.1-cp38-cp38-win_amd64.whl", hash = "sha256:ed9d65594948678827f4ff0e7ae23344e2f2b4cabbca057ccaed3118fdc392ca"}, 1616 | {file = "scikit_learn-0.24.1-cp39-cp39-macosx_10_13_x86_64.whl", hash = "sha256:8aa1b3ac46b80eaa552b637eeadbbce3be5931e4b5002b964698e33a1b589e1e"}, 1617 | {file = "scikit_learn-0.24.1-cp39-cp39-manylinux1_i686.whl", hash = "sha256:c7f4eb77504ac586d8ac1bde1b0c04b504487210f95297235311a0ab7edd7e38"}, 1618 | {file = "scikit_learn-0.24.1-cp39-cp39-manylinux1_x86_64.whl", hash = "sha256:087dfede39efb06ab30618f9ab55a0397f29c38d63cd0ab88d12b500b7d65fd7"}, 1619 | {file = "scikit_learn-0.24.1-cp39-cp39-manylinux2010_i686.whl", hash = "sha256:895dbf2030aa7337649e36a83a007df3c9811396b4e2fa672a851160f36ce90c"}, 1620 | {file = "scikit_learn-0.24.1-cp39-cp39-manylinux2010_x86_64.whl", hash = "sha256:9a24d1ccec2a34d4cd3f2a1f86409f3f5954cc23d4d2270ba0d03cf018aa4780"}, 1621 | {file = "scikit_learn-0.24.1-cp39-cp39-win32.whl", hash = "sha256:fab31f48282ebf54dd69f6663cd2d9800096bad1bb67bbc9c9ac84eb77b41972"}, 1622 | {file = "scikit_learn-0.24.1-cp39-cp39-win_amd64.whl", hash = "sha256:4562dcf4793e61c5d0f89836d07bc37521c3a1889da8f651e2c326463c4bd697"}, 1623 | ] 1624 | scipy = [ 1625 | {file = "scipy-1.6.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:a15a1f3fc0abff33e792d6049161b7795909b40b97c6cc2934ed54384017ab76"}, 1626 | {file = "scipy-1.6.1-cp37-cp37m-manylinux1_i686.whl", hash = "sha256:e79570979ccdc3d165456dd62041d9556fb9733b86b4b6d818af7a0afc15f092"}, 1627 | {file = "scipy-1.6.1-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:a423533c55fec61456dedee7b6ee7dce0bb6bfa395424ea374d25afa262be261"}, 1628 | {file = "scipy-1.6.1-cp37-cp37m-manylinux2014_aarch64.whl", hash = "sha256:33d6b7df40d197bdd3049d64e8e680227151673465e5d85723b3b8f6b15a6ced"}, 1629 | {file = "scipy-1.6.1-cp37-cp37m-win32.whl", hash = "sha256:6725e3fbb47da428794f243864f2297462e9ee448297c93ed1dcbc44335feb78"}, 1630 | {file = "scipy-1.6.1-cp37-cp37m-win_amd64.whl", hash = "sha256:5fa9c6530b1661f1370bcd332a1e62ca7881785cc0f80c0d559b636567fab63c"}, 1631 | {file = "scipy-1.6.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:bd50daf727f7c195e26f27467c85ce653d41df4358a25b32434a50d8870fc519"}, 1632 | {file = "scipy-1.6.1-cp38-cp38-manylinux1_i686.whl", hash = "sha256:f46dd15335e8a320b0fb4685f58b7471702234cba8bb3442b69a3e1dc329c345"}, 1633 | {file = "scipy-1.6.1-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:0e5b0ccf63155d90da576edd2768b66fb276446c371b73841e3503be1d63fb5d"}, 1634 | {file = "scipy-1.6.1-cp38-cp38-manylinux2014_aarch64.whl", hash = "sha256:2481efbb3740977e3c831edfd0bd9867be26387cacf24eb5e366a6a374d3d00d"}, 1635 | {file = "scipy-1.6.1-cp38-cp38-win32.whl", hash = "sha256:68cb4c424112cd4be886b4d979c5497fba190714085f46b8ae67a5e4416c32b4"}, 1636 | {file = "scipy-1.6.1-cp38-cp38-win_amd64.whl", hash = "sha256:5f331eeed0297232d2e6eea51b54e8278ed8bb10b099f69c44e2558c090d06bf"}, 1637 | {file = "scipy-1.6.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:0c8a51d33556bf70367452d4d601d1742c0e806cd0194785914daf19775f0e67"}, 1638 | {file = "scipy-1.6.1-cp39-cp39-manylinux1_i686.whl", hash = "sha256:83bf7c16245c15bc58ee76c5418e46ea1811edcc2e2b03041b804e46084ab627"}, 1639 | {file = "scipy-1.6.1-cp39-cp39-manylinux1_x86_64.whl", hash = "sha256:794e768cc5f779736593046c9714e0f3a5940bc6dcc1dba885ad64cbfb28e9f0"}, 1640 | {file = "scipy-1.6.1-cp39-cp39-manylinux2014_aarch64.whl", hash = "sha256:5da5471aed911fe7e52b86bf9ea32fb55ae93e2f0fac66c32e58897cfb02fa07"}, 1641 | {file = "scipy-1.6.1-cp39-cp39-win32.whl", hash = "sha256:8e403a337749ed40af60e537cc4d4c03febddcc56cd26e774c9b1b600a70d3e4"}, 1642 | {file = "scipy-1.6.1-cp39-cp39-win_amd64.whl", hash = "sha256:a5193a098ae9f29af283dcf0041f762601faf2e595c0db1da929875b7570353f"}, 1643 | {file = "scipy-1.6.1.tar.gz", hash = "sha256:c4fceb864890b6168e79b0e714c585dbe2fd4222768ee90bc1aa0f8218691b11"}, 1644 | ] 1645 | send2trash = [ 1646 | {file = "Send2Trash-1.5.0-py3-none-any.whl", hash = "sha256:f1691922577b6fa12821234aeb57599d887c4900b9ca537948d2dac34aea888b"}, 1647 | {file = "Send2Trash-1.5.0.tar.gz", hash = "sha256:60001cc07d707fe247c94f74ca6ac0d3255aabcb930529690897ca2a39db28b2"}, 1648 | ] 1649 | six = [ 1650 | {file = "six-1.15.0-py2.py3-none-any.whl", hash = "sha256:8b74bedcbbbaca38ff6d7491d76f2b06b3592611af620f8426e82dddb04a5ced"}, 1651 | {file = "six-1.15.0.tar.gz", hash = "sha256:30639c035cdb23534cd4aa2dd52c3bf48f06e5f4a941509c8bafd8ce11080259"}, 1652 | ] 1653 | smmap = [ 1654 | {file = "smmap-3.0.5-py2.py3-none-any.whl", hash = "sha256:7bfcf367828031dc893530a29cb35eb8c8f2d7c8f2d0989354d75d24c8573714"}, 1655 | {file = "smmap-3.0.5.tar.gz", hash = "sha256:84c2751ef3072d4f6b2785ec7ee40244c6f45eb934d9e543e2c51f1bd3d54c50"}, 1656 | ] 1657 | streamlit = [ 1658 | {file = "streamlit-0.78.0-py2.py3-none-any.whl", hash = "sha256:f74b8cfda27a2201a704b54bae39f25cc6c751c442aa5d4700440b1f1e42c71d"}, 1659 | {file = "streamlit-0.78.0.tar.gz", hash = "sha256:bfe5532d28596e6801de7c5a9ccbbafc55121dca30cd37bd08d3348fda084123"}, 1660 | ] 1661 | terminado = [ 1662 | {file = "terminado-0.9.2-py3-none-any.whl", hash = "sha256:23a053e06b22711269563c8bb96b36a036a86be8b5353e85e804f89b84aaa23f"}, 1663 | {file = "terminado-0.9.2.tar.gz", hash = "sha256:89e6d94b19e4bc9dce0ffd908dfaf55cc78a9bf735934e915a4a96f65ac9704c"}, 1664 | ] 1665 | testpath = [ 1666 | {file = "testpath-0.4.4-py2.py3-none-any.whl", hash = "sha256:bfcf9411ef4bf3db7579063e0546938b1edda3d69f4e1fb8756991f5951f85d4"}, 1667 | {file = "testpath-0.4.4.tar.gz", hash = "sha256:60e0a3261c149755f4399a1fff7d37523179a70fdc3abdf78de9fc2604aeec7e"}, 1668 | ] 1669 | threadpoolctl = [ 1670 | {file = "threadpoolctl-2.1.0-py3-none-any.whl", hash = "sha256:38b74ca20ff3bb42caca8b00055111d74159ee95c4370882bbff2b93d24da725"}, 1671 | {file = "threadpoolctl-2.1.0.tar.gz", hash = "sha256:ddc57c96a38beb63db45d6c159b5ab07b6bced12c45a1f07b2b92f272aebfa6b"}, 1672 | ] 1673 | toml = [ 1674 | {file = "toml-0.10.2-py2.py3-none-any.whl", hash = "sha256:806143ae5bfb6a3c6e736a764057db0e6a0e05e338b5630894a5f779cabb4f9b"}, 1675 | {file = "toml-0.10.2.tar.gz", hash = "sha256:b3bda1d108d5dd99f4a20d24d9c348e91c4db7ab1b749200bded2f839ccbe68f"}, 1676 | ] 1677 | toolz = [ 1678 | {file = "toolz-0.11.1-py3-none-any.whl", hash = "sha256:1bc473acbf1a1db4e72a1ce587be347450e8f08324908b8a266b486f408f04d5"}, 1679 | {file = "toolz-0.11.1.tar.gz", hash = "sha256:c7a47921f07822fe534fb1c01c9931ab335a4390c782bd28c6bcc7c2f71f3fbf"}, 1680 | ] 1681 | tornado = [ 1682 | {file = "tornado-6.1-cp35-cp35m-macosx_10_9_x86_64.whl", hash = "sha256:d371e811d6b156d82aa5f9a4e08b58debf97c302a35714f6f45e35139c332e32"}, 1683 | {file = "tornado-6.1-cp35-cp35m-manylinux1_i686.whl", hash = "sha256:0d321a39c36e5f2c4ff12b4ed58d41390460f798422c4504e09eb5678e09998c"}, 1684 | {file = "tornado-6.1-cp35-cp35m-manylinux1_x86_64.whl", hash = "sha256:9de9e5188a782be6b1ce866e8a51bc76a0fbaa0e16613823fc38e4fc2556ad05"}, 1685 | {file = "tornado-6.1-cp35-cp35m-manylinux2010_i686.whl", hash = "sha256:61b32d06ae8a036a6607805e6720ef00a3c98207038444ba7fd3d169cd998910"}, 1686 | {file = "tornado-6.1-cp35-cp35m-manylinux2010_x86_64.whl", hash = "sha256:3e63498f680547ed24d2c71e6497f24bca791aca2fe116dbc2bd0ac7f191691b"}, 1687 | {file = "tornado-6.1-cp35-cp35m-manylinux2014_aarch64.whl", hash = "sha256:6c77c9937962577a6a76917845d06af6ab9197702a42e1346d8ae2e76b5e3675"}, 1688 | {file = "tornado-6.1-cp35-cp35m-win32.whl", hash = "sha256:6286efab1ed6e74b7028327365cf7346b1d777d63ab30e21a0f4d5b275fc17d5"}, 1689 | {file = "tornado-6.1-cp35-cp35m-win_amd64.whl", hash = "sha256:fa2ba70284fa42c2a5ecb35e322e68823288a4251f9ba9cc77be04ae15eada68"}, 1690 | {file = "tornado-6.1-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:0a00ff4561e2929a2c37ce706cb8233b7907e0cdc22eab98888aca5dd3775feb"}, 1691 | {file = "tornado-6.1-cp36-cp36m-manylinux1_i686.whl", hash = "sha256:748290bf9112b581c525e6e6d3820621ff020ed95af6f17fedef416b27ed564c"}, 1692 | {file = "tornado-6.1-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:e385b637ac3acaae8022e7e47dfa7b83d3620e432e3ecb9a3f7f58f150e50921"}, 1693 | {file = "tornado-6.1-cp36-cp36m-manylinux2010_i686.whl", hash = "sha256:25ad220258349a12ae87ede08a7b04aca51237721f63b1808d39bdb4b2164558"}, 1694 | {file = "tornado-6.1-cp36-cp36m-manylinux2010_x86_64.whl", hash = "sha256:65d98939f1a2e74b58839f8c4dab3b6b3c1ce84972ae712be02845e65391ac7c"}, 1695 | {file = "tornado-6.1-cp36-cp36m-manylinux2014_aarch64.whl", hash = "sha256:e519d64089b0876c7b467274468709dadf11e41d65f63bba207e04217f47c085"}, 1696 | {file = "tornado-6.1-cp36-cp36m-win32.whl", hash = "sha256:b87936fd2c317b6ee08a5741ea06b9d11a6074ef4cc42e031bc6403f82a32575"}, 1697 | {file = "tornado-6.1-cp36-cp36m-win_amd64.whl", hash = "sha256:cc0ee35043162abbf717b7df924597ade8e5395e7b66d18270116f8745ceb795"}, 1698 | {file = "tornado-6.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:7250a3fa399f08ec9cb3f7b1b987955d17e044f1ade821b32e5f435130250d7f"}, 1699 | {file = "tornado-6.1-cp37-cp37m-manylinux1_i686.whl", hash = "sha256:ed3ad863b1b40cd1d4bd21e7498329ccaece75db5a5bf58cd3c9f130843e7102"}, 1700 | {file = "tornado-6.1-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:dcef026f608f678c118779cd6591c8af6e9b4155c44e0d1bc0c87c036fb8c8c4"}, 1701 | {file = "tornado-6.1-cp37-cp37m-manylinux2010_i686.whl", hash = "sha256:70dec29e8ac485dbf57481baee40781c63e381bebea080991893cd297742b8fd"}, 1702 | {file = "tornado-6.1-cp37-cp37m-manylinux2010_x86_64.whl", hash = "sha256:d3f7594930c423fd9f5d1a76bee85a2c36fd8b4b16921cae7e965f22575e9c01"}, 1703 | {file = "tornado-6.1-cp37-cp37m-manylinux2014_aarch64.whl", hash = "sha256:3447475585bae2e77ecb832fc0300c3695516a47d46cefa0528181a34c5b9d3d"}, 1704 | {file = "tornado-6.1-cp37-cp37m-win32.whl", hash = "sha256:e7229e60ac41a1202444497ddde70a48d33909e484f96eb0da9baf8dc68541df"}, 1705 | {file = "tornado-6.1-cp37-cp37m-win_amd64.whl", hash = "sha256:cb5ec8eead331e3bb4ce8066cf06d2dfef1bfb1b2a73082dfe8a161301b76e37"}, 1706 | {file = "tornado-6.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:20241b3cb4f425e971cb0a8e4ffc9b0a861530ae3c52f2b0434e6c1b57e9fd95"}, 1707 | {file = "tornado-6.1-cp38-cp38-manylinux1_i686.whl", hash = "sha256:c77da1263aa361938476f04c4b6c8916001b90b2c2fdd92d8d535e1af48fba5a"}, 1708 | {file = "tornado-6.1-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:fba85b6cd9c39be262fcd23865652920832b61583de2a2ca907dbd8e8a8c81e5"}, 1709 | {file = "tornado-6.1-cp38-cp38-manylinux2010_i686.whl", hash = "sha256:1e8225a1070cd8eec59a996c43229fe8f95689cb16e552d130b9793cb570a288"}, 1710 | {file = "tornado-6.1-cp38-cp38-manylinux2010_x86_64.whl", hash = "sha256:d14d30e7f46a0476efb0deb5b61343b1526f73ebb5ed84f23dc794bdb88f9d9f"}, 1711 | {file = "tornado-6.1-cp38-cp38-manylinux2014_aarch64.whl", hash = "sha256:8f959b26f2634a091bb42241c3ed8d3cedb506e7c27b8dd5c7b9f745318ddbb6"}, 1712 | {file = "tornado-6.1-cp38-cp38-win32.whl", hash = "sha256:34ca2dac9e4d7afb0bed4677512e36a52f09caa6fded70b4e3e1c89dbd92c326"}, 1713 | {file = "tornado-6.1-cp38-cp38-win_amd64.whl", hash = "sha256:6196a5c39286cc37c024cd78834fb9345e464525d8991c21e908cc046d1cc02c"}, 1714 | {file = "tornado-6.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:f0ba29bafd8e7e22920567ce0d232c26d4d47c8b5cf4ed7b562b5db39fa199c5"}, 1715 | {file = "tornado-6.1-cp39-cp39-manylinux1_i686.whl", hash = "sha256:33892118b165401f291070100d6d09359ca74addda679b60390b09f8ef325ffe"}, 1716 | {file = "tornado-6.1-cp39-cp39-manylinux1_x86_64.whl", hash = "sha256:7da13da6f985aab7f6f28debab00c67ff9cbacd588e8477034c0652ac141feea"}, 1717 | {file = "tornado-6.1-cp39-cp39-manylinux2010_i686.whl", hash = "sha256:e0791ac58d91ac58f694d8d2957884df8e4e2f6687cdf367ef7eb7497f79eaa2"}, 1718 | {file = "tornado-6.1-cp39-cp39-manylinux2010_x86_64.whl", hash = "sha256:66324e4e1beede9ac79e60f88de548da58b1f8ab4b2f1354d8375774f997e6c0"}, 1719 | {file = "tornado-6.1-cp39-cp39-manylinux2014_aarch64.whl", hash = "sha256:a48900ecea1cbb71b8c71c620dee15b62f85f7c14189bdeee54966fbd9a0c5bd"}, 1720 | {file = "tornado-6.1-cp39-cp39-win32.whl", hash = "sha256:d3d20ea5782ba63ed13bc2b8c291a053c8d807a8fa927d941bd718468f7b950c"}, 1721 | {file = "tornado-6.1-cp39-cp39-win_amd64.whl", hash = "sha256:548430be2740e327b3fe0201abe471f314741efcb0067ec4f2d7dcfb4825f3e4"}, 1722 | {file = "tornado-6.1.tar.gz", hash = "sha256:33c6e81d7bd55b468d2e793517c909b139960b6c790a60b7991b9b6b76fb9791"}, 1723 | ] 1724 | traitlets = [ 1725 | {file = "traitlets-5.0.5-py3-none-any.whl", hash = "sha256:69ff3f9d5351f31a7ad80443c2674b7099df13cc41fc5fa6e2f6d3b0330b0426"}, 1726 | {file = "traitlets-5.0.5.tar.gz", hash = "sha256:178f4ce988f69189f7e523337a3e11d91c786ded9360174a3d9ca83e79bc5396"}, 1727 | ] 1728 | tzlocal = [ 1729 | {file = "tzlocal-2.1-py2.py3-none-any.whl", hash = "sha256:e2cb6c6b5b604af38597403e9852872d7f534962ae2954c7f35efcb1ccacf4a4"}, 1730 | {file = "tzlocal-2.1.tar.gz", hash = "sha256:643c97c5294aedc737780a49d9df30889321cbe1204eac2c2ec6134035a92e44"}, 1731 | ] 1732 | urllib3 = [ 1733 | {file = "urllib3-1.26.3-py2.py3-none-any.whl", hash = "sha256:1b465e494e3e0d8939b50680403e3aedaa2bc434b7d5af64dfd3c958d7f5ae80"}, 1734 | {file = "urllib3-1.26.3.tar.gz", hash = "sha256:de3eedaad74a2683334e282005cd8d7f22f4d55fa690a2a1020a416cb0a47e73"}, 1735 | ] 1736 | validators = [ 1737 | {file = "validators-0.18.2-py3-none-any.whl", hash = "sha256:0143dcca8a386498edaf5780cbd5960da1a4c85e0719f3ee5c9b41249c4fefbd"}, 1738 | {file = "validators-0.18.2.tar.gz", hash = "sha256:37cd9a9213278538ad09b5b9f9134266e7c226ab1fede1d500e29e0a8fbb9ea6"}, 1739 | ] 1740 | watchdog = [ 1741 | {file = "watchdog-2.0.2-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:1f518a6940cde8720b8826a705c164e6b9bd6cf8c00f14269ffac51e017e06ec"}, 1742 | {file = "watchdog-2.0.2-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:74528772516228f6a015a647027057939ff0b695a0b864cb3037e8e1aabc7ca0"}, 1743 | {file = "watchdog-2.0.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:1cd715c4fb803581ded8943f39a51f21c17375d009ca9e3398d6b20638863a70"}, 1744 | {file = "watchdog-2.0.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:41b1a773f364f232b5bc184688e8d60451745d9e0971ac60c648bd47be8f4733"}, 1745 | {file = "watchdog-2.0.2-pp36-pypy36_pp73-macosx_10_9_x86_64.whl", hash = "sha256:035f4816daf3c62e03503c267620f3aa8fc7472df85ff3ef1e0c100ea1ed2744"}, 1746 | {file = "watchdog-2.0.2-pp37-pypy37_pp73-macosx_10_9_x86_64.whl", hash = "sha256:e0114e48ee981b38e328eaa0d5a625c7b4fc144b8dc7f7637749d6b5f7fefb0e"}, 1747 | {file = "watchdog-2.0.2-py3-none-manylinux2014_aarch64.whl", hash = "sha256:d2fcbc15772a82cd139c803a513c45b0fbc72a10a8a34dc2a8b429110b6f1236"}, 1748 | {file = "watchdog-2.0.2-py3-none-manylinux2014_armv7l.whl", hash = "sha256:adda34bfe6db05485c1dfcd98232bdec385f991fe16358750c2163473eefb985"}, 1749 | {file = "watchdog-2.0.2-py3-none-manylinux2014_i686.whl", hash = "sha256:a412b1914e27f67b0a10e1ee19b5d035a9f7c115a062bbbd640653d9820ba4c8"}, 1750 | {file = "watchdog-2.0.2-py3-none-manylinux2014_ppc64.whl", hash = "sha256:89102465764e453609463cf620e744da1b0aa1f9f321b05961e2e7e15b3c9d8b"}, 1751 | {file = "watchdog-2.0.2-py3-none-manylinux2014_ppc64le.whl", hash = "sha256:3e933f3567c4521dd1a5d59fd54a522cae90bebcbeb8b74b84a2f33c90f08388"}, 1752 | {file = "watchdog-2.0.2-py3-none-manylinux2014_s390x.whl", hash = "sha256:19675b8d1f00dabe74a0e66d87980623250d9360a21612e8c27b70a4b214ceeb"}, 1753 | {file = "watchdog-2.0.2-py3-none-manylinux2014_x86_64.whl", hash = "sha256:d54e187b76053982180532cb7fd31152201c438b348c456f699929f8a89e786d"}, 1754 | {file = "watchdog-2.0.2-py3-none-win32.whl", hash = "sha256:13c9ff58508dce55ba416eb0ef7af5aa5858558f2ec51112f099fd03503b670b"}, 1755 | {file = "watchdog-2.0.2-py3-none-win_amd64.whl", hash = "sha256:0f7e9de9ba84af15e9e9fc29c3b13c972daa4d2b11de29aa86b26a26bc877c06"}, 1756 | {file = "watchdog-2.0.2-py3-none-win_ia64.whl", hash = "sha256:ac6adbdf32e1d180574f9d0819e80259ae48e68727e80c3d950ed5a023714c3e"}, 1757 | {file = "watchdog-2.0.2.tar.gz", hash = "sha256:532fedd993e75554671faa36cd04c580ced3fae084254a779afbbd8aaf00566b"}, 1758 | ] 1759 | wcwidth = [ 1760 | {file = "wcwidth-0.2.5-py2.py3-none-any.whl", hash = "sha256:beb4802a9cebb9144e99086eff703a642a13d6a0052920003a230f3294bbe784"}, 1761 | {file = "wcwidth-0.2.5.tar.gz", hash = "sha256:c4d647b99872929fdb7bdcaa4fbe7f01413ed3d98077df798530e5b04f116c83"}, 1762 | ] 1763 | webencodings = [ 1764 | {file = "webencodings-0.5.1-py2.py3-none-any.whl", hash = "sha256:a0af1213f3c2226497a97e2b3aa01a7e4bee4f403f95be16fc9acd2947514a78"}, 1765 | {file = "webencodings-0.5.1.tar.gz", hash = "sha256:b36a1c245f2d304965eb4e0a82848379241dc04b865afcc4aab16748587e1923"}, 1766 | ] 1767 | widgetsnbextension = [ 1768 | {file = "widgetsnbextension-3.5.1-py2.py3-none-any.whl", hash = "sha256:bd314f8ceb488571a5ffea6cc5b9fc6cba0adaf88a9d2386b93a489751938bcd"}, 1769 | {file = "widgetsnbextension-3.5.1.tar.gz", hash = "sha256:079f87d87270bce047512400efd70238820751a11d2d8cb137a5a5bdbaf255c7"}, 1770 | ] 1771 | --------------------------------------------------------------------------------