annikwag commited on
Commit
883557f
1 Parent(s): d2ef56a

Upload 1639 files

Browse files

* Fix 'between organizations' filter functionality
* Implement unlimited results for single project matching and add 'show more' with download options
* Feature: Add Excel export option
* Add 'Only matches where country is identical' checkbox for multi-project matching
* Add 'Only matches between filtered organizations' checkbox for multi-project matching
* Remove nonsensical keyword search results in multi-project matching
* Fix duplicate countries in filters by ISO code
* Implement threshold for single-project matching and handle 0% match results
* Feature: Add a landing page for displaying projects based on filters without matching

This view is limited to 50 files because it contains too many changes.   See raw diff
Files changed (50) hide show
  1. .gitattributes +36 -36
  2. .streamlit/config.toml +13 -13
  3. README.md +13 -13
  4. __pycache__/app_matching_page.cpython-311.pyc +0 -0
  5. app.py +27 -24
  6. app_matching_page.py +670 -161
  7. env/Lib/site-packages/_distutils_hack/__init__.py +222 -0
  8. env/Lib/site-packages/_distutils_hack/__pycache__/__init__.cpython-311.pyc +0 -0
  9. env/Lib/site-packages/_distutils_hack/__pycache__/override.cpython-311.pyc +0 -0
  10. env/Lib/site-packages/_distutils_hack/override.py +1 -0
  11. env/Lib/site-packages/distutils-precedence.pth +3 -0
  12. env/Lib/site-packages/pip-23.2.1.dist-info/AUTHORS.txt +738 -0
  13. env/Lib/site-packages/pip-23.2.1.dist-info/INSTALLER +1 -0
  14. env/Lib/site-packages/pip-23.2.1.dist-info/LICENSE.txt +20 -0
  15. env/Lib/site-packages/pip-23.2.1.dist-info/METADATA +90 -0
  16. env/Lib/site-packages/pip-23.2.1.dist-info/RECORD +1003 -0
  17. env/Lib/site-packages/pip-23.2.1.dist-info/REQUESTED +0 -0
  18. env/Lib/site-packages/pip-23.2.1.dist-info/WHEEL +5 -0
  19. env/Lib/site-packages/pip-23.2.1.dist-info/entry_points.txt +4 -0
  20. env/Lib/site-packages/pip-23.2.1.dist-info/top_level.txt +1 -0
  21. env/Lib/site-packages/pip/__init__.py +13 -0
  22. env/Lib/site-packages/pip/__main__.py +24 -0
  23. env/Lib/site-packages/pip/__pip-runner__.py +50 -0
  24. env/Lib/site-packages/pip/__pycache__/__init__.cpython-311.pyc +0 -0
  25. env/Lib/site-packages/pip/__pycache__/__main__.cpython-311.pyc +0 -0
  26. env/Lib/site-packages/pip/__pycache__/__pip-runner__.cpython-311.pyc +0 -0
  27. env/Lib/site-packages/pip/_internal/__init__.py +19 -0
  28. env/Lib/site-packages/pip/_internal/__pycache__/__init__.cpython-311.pyc +0 -0
  29. env/Lib/site-packages/pip/_internal/__pycache__/build_env.cpython-311.pyc +0 -0
  30. env/Lib/site-packages/pip/_internal/__pycache__/cache.cpython-311.pyc +0 -0
  31. env/Lib/site-packages/pip/_internal/__pycache__/configuration.cpython-311.pyc +0 -0
  32. env/Lib/site-packages/pip/_internal/__pycache__/exceptions.cpython-311.pyc +0 -0
  33. env/Lib/site-packages/pip/_internal/__pycache__/main.cpython-311.pyc +0 -0
  34. env/Lib/site-packages/pip/_internal/__pycache__/pyproject.cpython-311.pyc +0 -0
  35. env/Lib/site-packages/pip/_internal/__pycache__/self_outdated_check.cpython-311.pyc +0 -0
  36. env/Lib/site-packages/pip/_internal/__pycache__/wheel_builder.cpython-311.pyc +0 -0
  37. env/Lib/site-packages/pip/_internal/build_env.py +311 -0
  38. env/Lib/site-packages/pip/_internal/cache.py +292 -0
  39. env/Lib/site-packages/pip/_internal/cli/__init__.py +4 -0
  40. env/Lib/site-packages/pip/_internal/cli/__pycache__/__init__.cpython-311.pyc +0 -0
  41. env/Lib/site-packages/pip/_internal/cli/__pycache__/autocompletion.cpython-311.pyc +0 -0
  42. env/Lib/site-packages/pip/_internal/cli/__pycache__/base_command.cpython-311.pyc +0 -0
  43. env/Lib/site-packages/pip/_internal/cli/__pycache__/cmdoptions.cpython-311.pyc +0 -0
  44. env/Lib/site-packages/pip/_internal/cli/__pycache__/command_context.cpython-311.pyc +0 -0
  45. env/Lib/site-packages/pip/_internal/cli/__pycache__/main.cpython-311.pyc +0 -0
  46. env/Lib/site-packages/pip/_internal/cli/__pycache__/main_parser.cpython-311.pyc +0 -0
  47. env/Lib/site-packages/pip/_internal/cli/__pycache__/parser.cpython-311.pyc +0 -0
  48. env/Lib/site-packages/pip/_internal/cli/__pycache__/progress_bars.cpython-311.pyc +0 -0
  49. env/Lib/site-packages/pip/_internal/cli/__pycache__/req_command.cpython-311.pyc +0 -0
  50. env/Lib/site-packages/pip/_internal/cli/__pycache__/spinners.cpython-311.pyc +0 -0
.gitattributes CHANGED
@@ -1,36 +1,36 @@
1
- *.7z filter=lfs diff=lfs merge=lfs -text
2
- *.arrow filter=lfs diff=lfs merge=lfs -text
3
- *.bin filter=lfs diff=lfs merge=lfs -text
4
- *.bz2 filter=lfs diff=lfs merge=lfs -text
5
- *.ckpt filter=lfs diff=lfs merge=lfs -text
6
- *.ftz filter=lfs diff=lfs merge=lfs -text
7
- *.gz filter=lfs diff=lfs merge=lfs -text
8
- *.h5 filter=lfs diff=lfs merge=lfs -text
9
- *.joblib filter=lfs diff=lfs merge=lfs -text
10
- *.lfs.* filter=lfs diff=lfs merge=lfs -text
11
- *.mlmodel filter=lfs diff=lfs merge=lfs -text
12
- *.model filter=lfs diff=lfs merge=lfs -text
13
- *.msgpack filter=lfs diff=lfs merge=lfs -text
14
- *.npy filter=lfs diff=lfs merge=lfs -text
15
- *.npz filter=lfs diff=lfs merge=lfs -text
16
- *.onnx filter=lfs diff=lfs merge=lfs -text
17
- *.ot filter=lfs diff=lfs merge=lfs -text
18
- *.parquet filter=lfs diff=lfs merge=lfs -text
19
- *.pb filter=lfs diff=lfs merge=lfs -text
20
- *.pickle filter=lfs diff=lfs merge=lfs -text
21
- *.pkl filter=lfs diff=lfs merge=lfs -text
22
- *.pt filter=lfs diff=lfs merge=lfs -text
23
- *.pth filter=lfs diff=lfs merge=lfs -text
24
- *.rar filter=lfs diff=lfs merge=lfs -text
25
- *.safetensors filter=lfs diff=lfs merge=lfs -text
26
- saved_model/**/* filter=lfs diff=lfs merge=lfs -text
27
- *.tar.* filter=lfs diff=lfs merge=lfs -text
28
- *.tar filter=lfs diff=lfs merge=lfs -text
29
- *.tflite filter=lfs diff=lfs merge=lfs -text
30
- *.tgz filter=lfs diff=lfs merge=lfs -text
31
- *.wasm filter=lfs diff=lfs merge=lfs -text
32
- *.xz filter=lfs diff=lfs merge=lfs -text
33
- *.zip filter=lfs diff=lfs merge=lfs -text
34
- *.zst filter=lfs diff=lfs merge=lfs -text
35
- *tfevents* filter=lfs diff=lfs merge=lfs -text
36
- *.csv filter=lfs diff=lfs merge=lfs -text
 
1
+ *.7z filter=lfs diff=lfs merge=lfs -text
2
+ *.arrow filter=lfs diff=lfs merge=lfs -text
3
+ *.bin filter=lfs diff=lfs merge=lfs -text
4
+ *.bz2 filter=lfs diff=lfs merge=lfs -text
5
+ *.ckpt filter=lfs diff=lfs merge=lfs -text
6
+ *.ftz filter=lfs diff=lfs merge=lfs -text
7
+ *.gz filter=lfs diff=lfs merge=lfs -text
8
+ *.h5 filter=lfs diff=lfs merge=lfs -text
9
+ *.joblib filter=lfs diff=lfs merge=lfs -text
10
+ *.lfs.* filter=lfs diff=lfs merge=lfs -text
11
+ *.mlmodel filter=lfs diff=lfs merge=lfs -text
12
+ *.model filter=lfs diff=lfs merge=lfs -text
13
+ *.msgpack filter=lfs diff=lfs merge=lfs -text
14
+ *.npy filter=lfs diff=lfs merge=lfs -text
15
+ *.npz filter=lfs diff=lfs merge=lfs -text
16
+ *.onnx filter=lfs diff=lfs merge=lfs -text
17
+ *.ot filter=lfs diff=lfs merge=lfs -text
18
+ *.parquet filter=lfs diff=lfs merge=lfs -text
19
+ *.pb filter=lfs diff=lfs merge=lfs -text
20
+ *.pickle filter=lfs diff=lfs merge=lfs -text
21
+ *.pkl filter=lfs diff=lfs merge=lfs -text
22
+ *.pt filter=lfs diff=lfs merge=lfs -text
23
+ *.pth filter=lfs diff=lfs merge=lfs -text
24
+ *.rar filter=lfs diff=lfs merge=lfs -text
25
+ *.safetensors filter=lfs diff=lfs merge=lfs -text
26
+ saved_model/**/* filter=lfs diff=lfs merge=lfs -text
27
+ *.tar.* filter=lfs diff=lfs merge=lfs -text
28
+ *.tar filter=lfs diff=lfs merge=lfs -text
29
+ *.tflite filter=lfs diff=lfs merge=lfs -text
30
+ *.tgz filter=lfs diff=lfs merge=lfs -text
31
+ *.wasm filter=lfs diff=lfs merge=lfs -text
32
+ *.xz filter=lfs diff=lfs merge=lfs -text
33
+ *.zip filter=lfs diff=lfs merge=lfs -text
34
+ *.zst filter=lfs diff=lfs merge=lfs -text
35
+ *tfevents* filter=lfs diff=lfs merge=lfs -text
36
+ *.csv filter=lfs diff=lfs merge=lfs -text
.streamlit/config.toml CHANGED
@@ -1,14 +1,14 @@
1
- [global]
2
-
3
- [server]
4
- headless = true
5
-
6
- [client]
7
- initialSidebarState = "expanded"
8
-
9
- [theme]
10
- primaryColor="#c30f08"
11
- backgroundColor="#ffffff"
12
- secondaryBackgroundColor="#eceded"
13
- textColor="#000000"
14
  font="sans serif"
 
1
+ [global]
2
+
3
+ [server]
4
+ headless = true
5
+
6
+ [client]
7
+ initialSidebarState = "expanded"
8
+
9
+ [theme]
10
+ primaryColor="#c30f08"
11
+ backgroundColor="#ffffff"
12
+ secondaryBackgroundColor="#eceded"
13
+ textColor="#000000"
14
  font="sans serif"
README.md CHANGED
@@ -1,13 +1,13 @@
1
- ---
2
- title: Development Banks Collaboration Analyzer
3
- emoji: 🗃️
4
- colorFrom: purple
5
- colorTo: green
6
- sdk: streamlit
7
- sdk_version: 1.32.2
8
- app_file: app.py
9
- pinned: false
10
- license: mit
11
- ---
12
-
13
- Check out the configuration reference at https://huggingface.co/docs/hub/spaces-config-reference
 
1
+ ---
2
+ title: Development Banks Collaboration Analyzer
3
+ emoji: 🐢
4
+ colorFrom: pink
5
+ colorTo: red
6
+ sdk: streamlit
7
+ sdk_version: 1.32.2
8
+ app_file: app.py
9
+ pinned: true
10
+ license: mit
11
+ ---
12
+
13
+ Check out the configuration reference at https://huggingface.co/docs/hub/spaces-config-reference
__pycache__/app_matching_page.cpython-311.pyc ADDED
Binary file (51.9 kB). View file
 
app.py CHANGED
@@ -1,24 +1,27 @@
1
- import streamlit as st
2
- from modules.navbar import show_navbar
3
-
4
- # PAGE CONFIG
5
- st.set_page_config(
6
- page_title='Development Banks Collaboration Analyzer',
7
- page_icon='📋',
8
- layout='wide',
9
- )
10
-
11
- # reduce space to the top
12
- st.markdown("""
13
- <style>
14
- .block-container {
15
- padding-top: 1rem;
16
- padding-bottom: 4rem;
17
- padding-left: 3rem;
18
- padding-right: 3rem;
19
- }
20
- </style>
21
- """, unsafe_allow_html=True)
22
-
23
- # NAVBAR
24
- navbar = show_navbar()
 
 
 
 
1
+ import streamlit as st
2
+
3
+
4
+ # PAGE CONFIG
5
+ st.set_page_config(
6
+ page_title='Development Banks Collaboration Analyzer',
7
+ page_icon='📋',
8
+ layout='wide',
9
+ )
10
+
11
+ from modules.navbar import show_navbar
12
+
13
+
14
+ # reduce space to the top
15
+ st.markdown("""
16
+ <style>
17
+ .block-container {
18
+ padding-top: 1rem;
19
+ padding-bottom: 4rem;
20
+ padding-left: 3rem;
21
+ padding-right: 3rem;
22
+ }
23
+ </style>
24
+ """, unsafe_allow_html=True)
25
+
26
+ # NAVBAR
27
+ navbar = show_navbar()
app_matching_page.py CHANGED
@@ -1,25 +1,21 @@
1
- """
2
- Dispaly matching pages
3
- """
4
-
5
- ################
6
- # DEPENDENCIES #
7
- ################
8
  import streamlit as st
9
  import pandas as pd
 
 
10
  from scipy.sparse import load_npz
11
  import pickle
12
  from sentence_transformers import SentenceTransformer
13
  from modules.multimatch_result_table import show_multi_table
14
  from modules.singlematch_result_table import show_single_table
 
15
  from functions.filter_multi_project_matching import filter_multi
16
  from functions.filter_single_project_matching import filter_single
 
17
  from functions.multi_project_matching import calc_multi_matches
18
  from functions.same_country_filter import same_country_filter
19
  from functions.single_project_matching import find_similar
20
  import gc
21
 
22
-
23
  # Catch DATA
24
  # Load Similarity matrix
25
  @st.cache_data
@@ -28,22 +24,26 @@ def load_sim_matrix():
28
  !!! Similarities when matches between same orgas are allowed
29
  """
30
  loaded_matrix = load_npz("src/extended_similarities.npz")
31
-
32
  return loaded_matrix
33
 
34
  # Load Non Similar Orga Matrix
35
- #
36
  def load_nonsameorga_sim_matrix():
37
  """
38
  !!! Similarities when matches between same orgas are NOT allowed
39
  """
40
  loaded_matrix = load_npz("src/extended_similarities_nonsimorga.npz")
41
-
42
  return loaded_matrix
43
 
44
  # Load Projects DFs
45
  @st.cache_data
46
  def load_projects():
 
 
 
 
 
 
 
47
  orgas_df = pd.read_csv("src/projects/project_orgas.csv")
48
  region_df = pd.read_csv("src/projects/project_region.csv")
49
  sector_df = pd.read_csv("src/projects/project_sector.csv")
@@ -55,11 +55,55 @@ def load_projects():
55
  projects_df = pd.merge(projects_df, status_df, on='iati_id', how='inner')
56
  projects_df = pd.merge(projects_df, texts_df, on='iati_id', how='inner')
57
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
58
  iati_search_list = [f'{row.iati_id}' for row in projects_df.itertuples()]
59
  title_search_list = [f'{row.title_main} ({row.orga_abbreviation.upper()})' for row in projects_df.itertuples()]
60
 
61
  return projects_df, iati_search_list, title_search_list
62
 
 
63
  # Load CRS 3 data
64
  @st.cache_data
65
  def getCRS3():
@@ -68,7 +112,6 @@ def getCRS3():
68
  CRS3_CODES = crs3_df['code'].tolist()
69
  CRS3_NAME = crs3_df['name'].tolist()
70
  CRS3_MERGED = {f"{name} - {code}": code for name, code in zip(CRS3_NAME, CRS3_CODES)}
71
-
72
  return CRS3_MERGED
73
 
74
  # Load CRS 5 data
@@ -79,7 +122,6 @@ def getCRS5():
79
  CRS5_CODES = crs5_df['code'].tolist()
80
  CRS5_NAME = crs5_df['name'].tolist()
81
  CRS5_MERGED = {code: [f"{name} - {code}"] for name, code in zip(CRS5_NAME, CRS5_CODES)}
82
-
83
  return CRS5_MERGED
84
 
85
  # Load SDG data
@@ -88,20 +130,60 @@ def getSDG():
88
  # Read in SDG CODELISTS
89
  sdg_df = pd.read_csv('src/codelists/sdg_goals.csv')
90
  SDG_NAMES = sdg_df['name'].tolist()
91
-
92
  return SDG_NAMES
93
 
94
- # Load Country Data
95
  @st.cache_data
96
  def getCountry():
97
  # Read in countries from codelist
98
  country_df = pd.read_csv('src/codelists/country_codes_ISO3166-1alpha-2.csv')
99
- COUNTRY_CODES = country_df['Alpha-2 code'].tolist()
100
- COUNTRY_NAMES = country_df['Country'].tolist()
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
101
 
102
- COUNTRY_OPTION_LIST = [f"{COUNTRY_NAMES[i]} ({COUNTRY_CODES[i][-3:-1].upper()})"for i in range(len(COUNTRY_NAMES))]
 
 
 
 
 
 
103
 
104
- return COUNTRY_OPTION_LIST
105
 
106
  # Load Sentence Transformer Model
107
  @st.cache_resource
@@ -110,126 +192,172 @@ def load_model():
110
  return model
111
 
112
  # Load Embeddings
113
- @st.cache_data
114
  def load_embeddings_and_index():
115
  # Load embeddings
116
  with open("src/embeddings.pkl", "rb") as fIn:
117
  stored_data = pickle.load(fIn)
118
  embeddings = stored_data["embeddings"]
119
-
120
  return embeddings
121
-
122
 
123
- # USE CACHE FUNCTIONS
124
- sim_matrix = load_sim_matrix() # For similarities when mathces between same orgas are allowed
125
- nonsameorgas_sim_matrix = load_nonsameorga_sim_matrix() #For similarities when mathces between same orgas are NOT allowed
126
  projects_df, iati_search_list, title_search_list = load_projects()
127
 
128
  CRS3_MERGED = getCRS3()
129
  CRS5_MERGED = getCRS5()
130
  SDG_NAMES = getSDG()
131
 
132
- COUNTRY_OPTION_LIST = getCountry()
133
-
134
- # LOAD MODEL FROM CACHE FO SEMANTIC SEARCH
135
  model = load_model()
136
  embeddings = load_embeddings_and_index()
137
 
138
- def show_multi_matching_page():
139
- #st.write(f"Current RAM usage of this app: {get_process_memory():.2f} MB")
140
- #st.write(" ")
141
- with st.expander("Explanation"):
142
- st.caption("""
143
- The Multi-Project Matching Feature uncovers synergy opportunities among various development banks and organizations by facilitating the search for
144
- similar projects within a selected filter setting. This innovative tool leverages an AI-driven similarity score to compare all available projects
145
- against those meeting the filter criteria, identifying potential matches that may not directly qualify under the selected filter settings.
146
- It integrates projects listed in the IATI database from leading organizations, including BMZ, KfW, GIZ, IAD, ADB, AfDB, EIB, WB, WBTF, and the German
147
- Federal Foreign Office (AA), offering a comprehensive platform for enhancing collaboration and maximizing the impact of development efforts.
148
- """)
149
- #st.write("----------------------")
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
150
 
151
  col1, col2, col3 = st.columns([10, 1, 10])
152
  with col1:
153
- st.subheader("Sector Filters (required)")
154
- st.caption("""
155
- Sector filters must be applied to see results. The CRS5 and CRS3 classifications organise development aid into categories,
156
- with the 5-digit level providing more specific detail within the broader 3-digit categories.
157
- The SDGs are 17 UN goals that aim to achieve global sustainability, peace and prosperity by 2030. Futhermore you can Search for projects with the query field.
158
- """)
159
- with col3:
160
- st.subheader("Additional Filters")
161
- st.caption("""
162
- The additional filters allow for a more detailed search for the Multi-Project Matching.
163
- """)
164
-
165
  st.session_state.crs5_option_disabled = True
166
  col1, col2, col3 = st.columns([10, 1, 10])
167
  with col1:
168
  # CRS 3 SELECTION
169
  crs3_option = st.multiselect(
170
- 'CRS 3',
171
- CRS3_MERGED,
172
- placeholder="Select a CRS 3 code"
173
- )
 
 
174
 
175
  # CRS 5 SELECTION
176
- ## Only enable crs5 select field when crs3 code is selected
177
- if crs3_option != []:
178
  st.session_state.crs5_option_disabled = False
179
 
180
- ## define list of crs5 codes dependend on crs3 codes
181
  crs5_list = [txt[0].replace('"', "") for crs3_item in crs3_option for code, txt in CRS5_MERGED.items() if str(code)[:3] == str(crs3_item)[-3:]]
182
 
183
- ## crs5 select field
184
  crs5_option = st.multiselect(
185
  'CRS 5',
186
  crs5_list,
187
  placeholder="Select a CRS 5 code",
188
- disabled=st.session_state.crs5_option_disabled
189
- )
190
-
 
 
191
  # SDG SELECTION
192
  sdg_option = st.selectbox(
193
- label = 'Sustainable Development Goal (SDG)',
194
- index = None,
195
- placeholder = "Select a SDG",
196
- options = SDG_NAMES[:-1],
197
- )
198
-
199
- # SEARCH BOX
200
- query = st.text_input("Search Query")
201
-
202
  with col3:
 
 
 
 
 
 
 
 
 
203
  # COUNTRY SELECTION
204
  country_option = st.multiselect(
205
- 'Country / Countries',
206
- COUNTRY_OPTION_LIST,
207
- placeholder="All countries selected"
208
- )
209
-
 
 
210
  # ORGA SELECTION
211
  orga_abbreviation = projects_df["orga_abbreviation"].unique()
212
  orga_full_names = projects_df["orga_full_name"].unique()
213
- orga_list = [f"{orga_full_names[i]} ({orga_abbreviation[i].upper()})"for i in range(len(orga_abbreviation))]
214
 
215
  orga_option = st.multiselect(
216
- 'Development Bank / Organization',
217
- orga_list,
218
- placeholder="All organizations selected"
219
- )
220
-
221
- different_orga_checkbox = st.checkbox("Only matches between different organizations", value=True)
222
- filterd_country_only_checkbox = st.checkbox("Only matches between filtered countries", value=True)
223
-
224
 
225
  # CRS CODE LIST
226
  crs3_list = [i[-3:] for i in crs3_option]
227
  crs5_list = [i[-5:] for i in crs5_option]
228
 
229
  # SDG CODE LIST
230
- if sdg_option != None:
231
  sdg_str = sdg_option.split(".")[0]
232
- print(sdg_str)
233
  else:
234
  sdg_str = ""
235
 
@@ -239,137 +367,518 @@ def show_multi_matching_page():
239
  # ORGANIZATION CODES LIST
240
  orga_code_list = [option.split("(")[1][:-1].lower() for option in orga_option]
241
 
 
 
242
  # FILTER DF WITH SELECTED FILTER OPTIONS
243
- TOP_X_PROJECTS = 30
244
- filtered_df = filter_multi(projects_df, crs3_list, crs5_list, sdg_str, country_code_list, orga_code_list, query, model, embeddings, TOP_X_PROJECTS)
245
  if isinstance(filtered_df, pd.DataFrame) and len(filtered_df) != 0:
246
- # FIND MATCHES
247
- ## If only same country checkbox i sactivated
248
- if filterd_country_only_checkbox:
249
- with st.spinner('Please wait...'):
250
- compare_df = same_country_filter(projects_df, country_code_list)
251
- else:
252
- compare_df = projects_df
253
-
254
- ## if show only different orgas checkbox is activated
255
- if different_orga_checkbox:
256
- with st.spinner('Please wait...'):
257
- p1_df, p2_df = calc_multi_matches(filtered_df, compare_df, nonsameorgas_sim_matrix, TOP_X_PROJECTS)
258
- else:
259
- with st.spinner('Please wait...'):
260
- p1_df, p2_df = calc_multi_matches(filtered_df, compare_df, sim_matrix, TOP_X_PROJECTS)
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
261
 
262
- # SHOW THE RESULT
263
- show_multi_table(p1_df, p2_df)
264
- del p1_df, p2_df
265
  else:
266
  st.write("-----")
267
  col1, col2, col3 = st.columns([1, 1, 1])
268
  with col2:
269
  st.write(" ")
270
  st.markdown("<span style='color: red'>There are no results for the applied filter. Try another filter!</span>", unsafe_allow_html=True)
271
-
272
  del crs3_list, crs5_list, sdg_str, filtered_df
273
  gc.collect()
274
 
275
 
276
 
 
 
277
  def show_single_matching_page():
 
 
 
 
 
278
 
279
  with st.expander("Explanation"):
280
  st.caption("""
281
- Single Project Matching empowers you to choose an individual project using either the project IATI ID or title, and then unveils the top 10 projects
282
- that bear the closest resemblance to your selected one. This selection is refined using a sophisticated AI algorithm that evaluates similarity based
283
- on several key dimensions: Sustainable Development Goals (SDG), Creditor Reporting System (CRS) codes, and textual analysis of project titles and
284
- descriptions.
 
 
 
 
285
  """)
286
- #st.write("---------")
287
 
288
- col1, col2 = st.columns([11, 20])
289
  with col1:
290
- st.subheader("Select a reference project")
291
  st.caption("""
292
- Select a reference project either by its title or IATI ID to find the 10 projects most similar to it.
293
  """)
294
- with col2:
295
- st.subheader("Filters for similar projects")
296
  st.caption("""
297
  The filters are applied to find the similar projects and are independend of the selected reference project.
298
  """)
299
 
300
- col1, col2, col3, col4 = st.columns([10, 1, 10, 10])
301
  with col1:
302
  search_option = st.selectbox(
303
- label = 'Search with project title or IATI ID',
304
- index = 0,
305
- placeholder = " ",
306
- options = ["Search with IATI ID", "Search with project title"],
307
- )
308
-
 
 
309
  if search_option == "Search with IATI ID":
310
  search_list = iati_search_list
311
  else:
312
  search_list = title_search_list
313
 
314
  project_option = st.selectbox(
315
- label = 'Search for a project',
316
- index = None,
317
- placeholder = " ",
318
- options = search_list,
319
- )
320
-
 
 
321
  with col3:
322
- # ORGA SELECTION
323
  orga_abbreviation = projects_df["orga_abbreviation"].unique()
324
  orga_full_names = projects_df["orga_full_name"].unique()
325
- orga_list = [f"{orga_full_names[i]} ({orga_abbreviation[i].upper()})"for i in range(len(orga_abbreviation))]
326
 
327
- orga_option_s = st.multiselect(
328
- 'Development Bank / Organization ',
329
- orga_list,
330
- placeholder="All organizations selected "
331
- )
332
-
333
- different_orga_checkbox_s = st.checkbox("Only matches between different organizations ", value=True)
 
334
 
335
-
336
- with col4:
337
- # COUNTRY SELECTION
338
  country_option_s = st.multiselect(
339
- 'Country / Countries ',
340
- COUNTRY_OPTION_LIST,
341
- placeholder="All countries selected "
342
- )
 
 
 
 
 
 
 
 
 
343
 
344
- st.write("--------------")
 
 
345
 
346
- #selected_index = None
347
  if project_option:
348
  selected_project_index = search_list.index(project_option)
349
- # COUNTRY CODES LIST
350
  country_code_list = [option[-3:-1] for option in country_option_s]
351
-
352
- # ORGANIZATION CODES LIST
353
  orga_code_list = [option.split("(")[1][:-1].lower() for option in orga_option_s]
354
 
355
- TOP_X_PROJECTS = 10
356
  with st.spinner('Please wait...'):
357
- filtered_df_s = filter_single(projects_df, country_code_list, orga_code_list)
358
 
359
- if isinstance(filtered_df_s, pd.DataFrame) and len(filtered_df_s) != 0:
360
  if different_orga_checkbox_s:
361
  with st.spinner('Please wait...'):
362
- top_projects_df = find_similar(selected_project_index, nonsameorgas_sim_matrix, filtered_df_s, 10)
363
  else:
364
  with st.spinner('Please wait...'):
365
- top_projects_df = find_similar(selected_project_index, sim_matrix, filtered_df_s, 10)
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
366
 
367
- show_single_table(selected_project_index, projects_df, top_projects_df)
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
368
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
369
  else:
370
  st.write("-----")
371
  col1, col2, col3 = st.columns([1, 1, 1])
372
  with col2:
373
  st.write(" ")
374
- st.markdown("<span style='color: red'>Ther are no results for this filter!</span>", unsafe_allow_html=True)
375
-
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
  import streamlit as st
2
  import pandas as pd
3
+ import io
4
+ import xlsxwriter
5
  from scipy.sparse import load_npz
6
  import pickle
7
  from sentence_transformers import SentenceTransformer
8
  from modules.multimatch_result_table import show_multi_table
9
  from modules.singlematch_result_table import show_single_table
10
+ from modules.allprojects_result_table import show_all_projects_table
11
  from functions.filter_multi_project_matching import filter_multi
12
  from functions.filter_single_project_matching import filter_single
13
+ from functions.filter_all_project_matching import filter_all_projects
14
  from functions.multi_project_matching import calc_multi_matches
15
  from functions.same_country_filter import same_country_filter
16
  from functions.single_project_matching import find_similar
17
  import gc
18
 
 
19
  # Catch DATA
20
  # Load Similarity matrix
21
  @st.cache_data
 
24
  !!! Similarities when matches between same orgas are allowed
25
  """
26
  loaded_matrix = load_npz("src/extended_similarities.npz")
 
27
  return loaded_matrix
28
 
29
  # Load Non Similar Orga Matrix
 
30
  def load_nonsameorga_sim_matrix():
31
  """
32
  !!! Similarities when matches between same orgas are NOT allowed
33
  """
34
  loaded_matrix = load_npz("src/extended_similarities_nonsimorga.npz")
 
35
  return loaded_matrix
36
 
37
  # Load Projects DFs
38
  @st.cache_data
39
  def load_projects():
40
+ def fix_faulty_descriptions(description): # In some BMZ projects there are duplicate descriptions
41
+ if description and ';' in description:
42
+ parts = description.split(';')
43
+ if len(parts) == 2 and parts[0].strip() == parts[1].strip():
44
+ return parts[0].strip()
45
+ return description
46
+
47
  orgas_df = pd.read_csv("src/projects/project_orgas.csv")
48
  region_df = pd.read_csv("src/projects/project_region.csv")
49
  sector_df = pd.read_csv("src/projects/project_sector.csv")
 
55
  projects_df = pd.merge(projects_df, status_df, on='iati_id', how='inner')
56
  projects_df = pd.merge(projects_df, texts_df, on='iati_id', how='inner')
57
 
58
+
59
+
60
+ # Add regions (should have been done in the preprocessing instead of here, so is just a quick fix to be able to add the region filter)
61
+ region_lookup_df = pd.read_csv('src/codelists/regions.csv', usecols=['alpha-2', 'region', 'sub-region'])
62
+
63
+ projects_df['country_code'] = projects_df['country'].str.replace(';', '').str.strip()
64
+ # Replace empty values in the 'country_code' column with 'Unknown'
65
+ projects_df['country_code'] = projects_df['country_code'].fillna('Unknown')
66
+
67
+ region_lookup_df['alpha-2'] = region_lookup_df['alpha-2'].str.strip()
68
+ projects_df = pd.merge(projects_df, region_lookup_df[['alpha-2', 'region', 'sub-region']], left_on='country_code', right_on='alpha-2', how='left')
69
+
70
+ projects_df.rename(columns={'region': 'continent', 'sub-region': 'region'}, inplace=True)
71
+ projects_df['continent'] = projects_df['continent'].fillna('Unknown')
72
+ projects_df['region'] = projects_df['region'].fillna('Unknown')
73
+
74
+
75
+ # Fix faulty descriptions for BMZ projects
76
+ bmz_mask = projects_df['orga_abbreviation'].str.lower() == 'bmz'
77
+ projects_df.loc[bmz_mask, 'description_main'] = projects_df.loc[bmz_mask, 'description_main'].apply(fix_faulty_descriptions)
78
+
79
+ # Add Project Link column
80
+ projects_df['Project Link'] = projects_df['iati_id'].apply(
81
+ lambda x: f'https://d-portal.org/ctrack.html#view=act&aid={x}'
82
+ )
83
+
84
+ # Create necessary columns for consistency
85
+ projects_df['crs_3_code_list'] = projects_df['crs_3_name'].apply(
86
+ lambda x: [""] if pd.isna(x) else (str(x).split(";")[:-1] if str(x).endswith(";") else str(x).split(";"))
87
+ )
88
+ projects_df['crs_5_code_list'] = projects_df['crs_5_name'].apply(
89
+ lambda x: [""] if pd.isna(x) else (str(x).split(";")[:-1] if str(x).endswith(";") else str(x).split(";"))
90
+ )
91
+ projects_df['sdg_list'] = projects_df['sgd_pred_code'].apply(
92
+ lambda x: [""] if pd.isna(x) else (str(x).split(";")[:-1] if str(x).endswith(";") else str(x).split(";"))
93
+ )
94
+
95
+ # Ensure country_flag is set to None if country_name is missing or "NA"
96
+ projects_df['country_flag'] = projects_df.apply(
97
+ lambda row: None if pd.isna(row['country_name']) or row['country_name'] == "NA" else row['country_flag'],
98
+ axis=1
99
+ )
100
+
101
  iati_search_list = [f'{row.iati_id}' for row in projects_df.itertuples()]
102
  title_search_list = [f'{row.title_main} ({row.orga_abbreviation.upper()})' for row in projects_df.itertuples()]
103
 
104
  return projects_df, iati_search_list, title_search_list
105
 
106
+
107
  # Load CRS 3 data
108
  @st.cache_data
109
  def getCRS3():
 
112
  CRS3_CODES = crs3_df['code'].tolist()
113
  CRS3_NAME = crs3_df['name'].tolist()
114
  CRS3_MERGED = {f"{name} - {code}": code for name, code in zip(CRS3_NAME, CRS3_CODES)}
 
115
  return CRS3_MERGED
116
 
117
  # Load CRS 5 data
 
122
  CRS5_CODES = crs5_df['code'].tolist()
123
  CRS5_NAME = crs5_df['name'].tolist()
124
  CRS5_MERGED = {code: [f"{name} - {code}"] for name, code in zip(CRS5_NAME, CRS5_CODES)}
 
125
  return CRS5_MERGED
126
 
127
  # Load SDG data
 
130
  # Read in SDG CODELISTS
131
  sdg_df = pd.read_csv('src/codelists/sdg_goals.csv')
132
  SDG_NAMES = sdg_df['name'].tolist()
 
133
  return SDG_NAMES
134
 
 
135
  @st.cache_data
136
  def getCountry():
137
  # Read in countries from codelist
138
  country_df = pd.read_csv('src/codelists/country_codes_ISO3166-1alpha-2.csv')
139
+
140
+ # Read in regions from codelist, keeping only the relevant columns
141
+ region_lookup_df = pd.read_csv('src/codelists/regions.csv', usecols=['alpha-2', 'region', 'sub-region'])
142
+
143
+ # Strip quotes from the 'Alpha-2 code' column in country_df
144
+ country_df['Alpha-2 code'] = country_df['Alpha-2 code'].str.replace('"', '').str.strip()
145
+
146
+ # Ensure no leading/trailing spaces in the 'alpha-2' column in region_lookup_df
147
+ region_lookup_df['alpha-2'] = region_lookup_df['alpha-2'].str.strip()
148
+
149
+ # Merge country and region dataframes on 'Alpha-2 code' from country_df and 'alpha-2' from region_lookup_df
150
+ merged_df = pd.merge(country_df, region_lookup_df, how='left', left_on='Alpha-2 code', right_on='alpha-2')
151
+
152
+ # Handle any missing regions or sub-regions
153
+ merged_df['region'] = merged_df['region'].fillna('Unknown')
154
+ merged_df['sub-region'] = merged_df['sub-region'].fillna('Unknown')
155
+
156
+ # Extract necessary columns as lists
157
+ COUNTRY_CODES = merged_df['Alpha-2 code'].tolist()
158
+ COUNTRY_NAMES = merged_df['Country'].tolist()
159
+ REGIONS = merged_df['region'].tolist()
160
+ SUB_REGIONS = merged_df['sub-region'].tolist()
161
+
162
+ # Create the original COUNTRY_OPTION_LIST without regions
163
+ COUNTRY_OPTION_LIST = [f"{COUNTRY_NAMES[i]} ({COUNTRY_CODES[i]})" for i in range(len(COUNTRY_NAMES))]
164
+
165
+ # Create a hierarchical filter structure for sub-regions
166
+ sub_region_hierarchy = {}
167
+ sub_region_to_region = {}
168
+ for i in range(len(SUB_REGIONS)):
169
+ sub_region = SUB_REGIONS[i]
170
+ country = COUNTRY_CODES[i]
171
+ region = REGIONS[i]
172
+ if sub_region not in sub_region_hierarchy:
173
+ sub_region_hierarchy[sub_region] = []
174
+ sub_region_hierarchy[sub_region].append(country)
175
+
176
+ # Map sub-regions to regions
177
+ sub_region_to_region[sub_region] = region
178
 
179
+ # Sort the subregions by regions
180
+ sorted_sub_regions = sorted(sub_region_hierarchy.keys(), key=lambda x: sub_region_to_region[x])
181
+
182
+ return COUNTRY_OPTION_LIST, sorted_sub_regions
183
+
184
+ # Call the function to load and display the country data
185
+ COUNTRY_OPTION_LIST, REGION_OPTION_LIST = getCountry()
186
 
 
187
 
188
  # Load Sentence Transformer Model
189
  @st.cache_resource
 
192
  return model
193
 
194
  # Load Embeddings
195
+ @st.cache_data
196
  def load_embeddings_and_index():
197
  # Load embeddings
198
  with open("src/embeddings.pkl", "rb") as fIn:
199
  stored_data = pickle.load(fIn)
200
  embeddings = stored_data["embeddings"]
 
201
  return embeddings
 
202
 
203
+ # USE CACHE FUNCTIONS
204
+ sim_matrix = load_sim_matrix() # For similarities when matches between same orgas are allowed
205
+ nonsameorgas_sim_matrix = load_nonsameorga_sim_matrix() #For similarities when matches between same orgas are NOT allowed
206
  projects_df, iati_search_list, title_search_list = load_projects()
207
 
208
  CRS3_MERGED = getCRS3()
209
  CRS5_MERGED = getCRS5()
210
  SDG_NAMES = getSDG()
211
 
212
+ # LOAD MODEL FROM CACHE FOR SEMANTIC SEARCH
 
 
213
  model = load_model()
214
  embeddings = load_embeddings_and_index()
215
 
216
+
217
+
218
+ ##################################
219
+
220
+ def show_landing_page():
221
+ st.title("Project Synergy Finder")
222
+
223
+ st.subheader("About")
224
+ st.markdown("""
225
+ Multiple international organizations have projects in the same field and region. These projects could collaborate or learn from each other to increase their impact if they were aware of one another. The Project Synergy Finder facilitates the search for similar projects across different development organizations and banks in three distinct ways. """)
226
+ st.markdown("<br><br>", unsafe_allow_html=True) # Add two line breaks
227
+
228
+ st.subheader("Pages")
229
+ st.markdown("""
230
+ 1. **📊 All Projects**: Displays all projects included in the analysis.
231
+ *Example Use Case*: Show all World Bank and African Development Bank projects in East Africa working towards the Sustainable Development Goal of achieving gender equality.
232
+
233
+
234
+ 2. **🎯 Single-Project Matching**: Finds the top similar projects to a selected one.
235
+ *Example Use Case*: Show projects in Eastern Europe that are similar to the "Second Irrigation and Drainage Improvement Project" by the World Bank.
236
+
237
+
238
+ 3. **🔍 Multi-Project Matching**: Searches for matching pairs of projects.
239
+ *Example Use Case*: Show pairs of similar projects in the "Energy Policy" sector from different organizations within the same country.
240
+ """)
241
+ st.markdown("<br><br>", unsafe_allow_html=True) # Add two line breaks
242
+
243
+ st.subheader("Data")
244
+ st.markdown("""
245
+ **IATI Data**: The data is sourced from the [IATI d-portal](https://d-portal.org/), providing detailed project-level information. IATI (International Aid Transparency Initiative) is a global initiative to improve the transparency of development and humanitarian resources and their results to address poverty and crises.
246
+
247
+ **Data Update**: The data is updated irregularly, with the last retrieval on 10th May 2024.
248
+
249
+ **Project Data**: Includes Project Title, Description, URL, Country, and Sector classification (CRS). The CRS5 and CRS3 classifications organize development aid into categories, with the 5-digit level providing more specific details within the broader 3-digit categories.
250
+
251
+ **Organizations**: The tool currently includes projects from the following organizations:
252
+ - **IAD**: Inter-American Development Bank
253
+ - **ADB**: Asian Development Bank
254
+ - **AfDB**: African Development Bank
255
+ - **EIB**: European Investment Bank
256
+ - **WB**: World Bank
257
+ - **WBTF**: World Bank Trust Fund
258
+ - **BMZ**: Federal Ministry for Economic Cooperation and Development (Germany)
259
+ - **KfW**: KfW Development Bank (Germany)
260
+ - **GIZ**: Deutsche Gesellschaft für Internationale Zusammenarbeit (Germany)
261
+ - **AA**: German Federal Foreign Office (Germany)
262
+
263
+ **Additional Data**: The Sustainable Development Goals (SDGs) are 17 UN goals aimed at achieving global sustainability, peace, and prosperity by 2030. The SDG categorization in this tool is AI-predicted based on project descriptions and titles using a [SDG Classifier](https://huggingface.co/jonas/bert-base-uncased-finetuned-sdg) trainded on the OSDG dataset.
264
+ """)
265
+
266
+
267
+ ##################################
268
+
269
+
270
+ def show_all_projects_page():
271
+ # Define the page size at the beginning
272
+ page_size = 30
273
+
274
+ def reset_pagination():
275
+ st.session_state.current_end_idx_all = page_size
276
+
277
 
278
  col1, col2, col3 = st.columns([10, 1, 10])
279
  with col1:
280
+ st.subheader("Project Filter")
281
+
 
 
 
 
 
 
 
 
 
 
282
  st.session_state.crs5_option_disabled = True
283
  col1, col2, col3 = st.columns([10, 1, 10])
284
  with col1:
285
  # CRS 3 SELECTION
286
  crs3_option = st.multiselect(
287
+ 'CRS 3',
288
+ CRS3_MERGED,
289
+ placeholder="Select a CRS 3 code",
290
+ on_change=reset_pagination,
291
+ key='crs3_all_projects_page'
292
+ )
293
 
294
  # CRS 5 SELECTION
295
+ # Only enable crs5 select field when crs3 code is selected
296
+ if crs3_option:
297
  st.session_state.crs5_option_disabled = False
298
 
299
+ # Define list of crs5 codes depending on crs3 codes
300
  crs5_list = [txt[0].replace('"', "") for crs3_item in crs3_option for code, txt in CRS5_MERGED.items() if str(code)[:3] == str(crs3_item)[-3:]]
301
 
302
+ # crs5 select field
303
  crs5_option = st.multiselect(
304
  'CRS 5',
305
  crs5_list,
306
  placeholder="Select a CRS 5 code",
307
+ disabled=st.session_state.crs5_option_disabled,
308
+ on_change=reset_pagination,
309
+ key='crs5_all_projects_page'
310
+ )
311
+
312
  # SDG SELECTION
313
  sdg_option = st.selectbox(
314
+ label='Sustainable Development Goal',
315
+ index=None,
316
+ placeholder="Select a SDG",
317
+ options=SDG_NAMES[:-1],
318
+ on_change=reset_pagination,
319
+ key='sdg_all_projects_page'
320
+ )
321
+
 
322
  with col3:
323
+ # REGION SELECTION
324
+ region_option = st.multiselect(
325
+ 'Regions',
326
+ REGION_OPTION_LIST,
327
+ placeholder="All regions selected",
328
+ on_change=reset_pagination,
329
+ key='regions_all_projects_page'
330
+ )
331
+
332
  # COUNTRY SELECTION
333
  country_option = st.multiselect(
334
+ 'Countries',
335
+ COUNTRY_OPTION_LIST,
336
+ placeholder="All countries selected",
337
+ on_change=reset_pagination,
338
+ key='country_all_projects_page'
339
+ )
340
+
341
  # ORGA SELECTION
342
  orga_abbreviation = projects_df["orga_abbreviation"].unique()
343
  orga_full_names = projects_df["orga_full_name"].unique()
344
+ orga_list = [f"{orga_full_names[i]} ({orga_abbreviation[i].upper()})" for i in range(len(orga_abbreviation))]
345
 
346
  orga_option = st.multiselect(
347
+ 'Organizations',
348
+ orga_list,
349
+ placeholder="All organizations selected",
350
+ on_change=reset_pagination,
351
+ key='orga_all_projects_page'
352
+ )
 
 
353
 
354
  # CRS CODE LIST
355
  crs3_list = [i[-3:] for i in crs3_option]
356
  crs5_list = [i[-5:] for i in crs5_option]
357
 
358
  # SDG CODE LIST
359
+ if sdg_option is not None:
360
  sdg_str = sdg_option.split(".")[0]
 
361
  else:
362
  sdg_str = ""
363
 
 
367
  # ORGANIZATION CODES LIST
368
  orga_code_list = [option.split("(")[1][:-1].lower() for option in orga_option]
369
 
370
+ st.write("-----")
371
+
372
  # FILTER DF WITH SELECTED FILTER OPTIONS
373
+ filtered_df = filter_all_projects(projects_df, country_code_list, orga_code_list, crs3_list, crs5_list, sdg_str, region_option)
 
374
  if isinstance(filtered_df, pd.DataFrame) and len(filtered_df) != 0:
375
+ # Implement pagination
376
+ if 'current_end_idx_all' not in st.session_state:
377
+ st.session_state.current_end_idx_all = page_size
378
+
379
+ end_idx = st.session_state.current_end_idx_all
380
+
381
+ paginated_df = filtered_df.iloc[:end_idx]
382
+
383
+ col1, col2 = st.columns([7, 3])
384
+ with col1:
385
+ st.subheader("Filtered Projects")
386
+ with col2:
387
+ # Add a download button for the paginated results
388
+ def to_excel(df, sheet_name):
389
+ # Rename columns
390
+ df = df.rename(columns={
391
+ "iati_id": "IATI Identifier",
392
+ "title_main": "Title",
393
+ "orga_abbreviation": "Organization",
394
+ "description_main": "Description",
395
+ "country_name": "Country",
396
+ "sdg_list": "SDG List",
397
+ "crs_3_code_list": "CRS 3 Codes",
398
+ "crs_5_code_list": "CRS 5 Codes",
399
+ "Project Link": "Project Link"
400
+ })
401
+ output = io.BytesIO()
402
+ writer = pd.ExcelWriter(output, engine='xlsxwriter')
403
+ df.to_excel(writer, index=False, sheet_name=sheet_name)
404
+ writer.close()
405
+ processed_data = output.getvalue()
406
+ return processed_data
407
+
408
+ # Direct download buttons
409
+ columns_to_include = ["iati_id", "title_main", "orga_abbreviation", "description_main", "country_name", "sdg_list", "crs_3_code_list", "crs_5_code_list", "Project Link"]
410
+
411
+ with st.expander("Excel Download"):
412
+ # First 15 Results Button
413
+ df_to_download_15 = filtered_df[columns_to_include].head(15)
414
+ excel_data_15 = to_excel(df_to_download_15, "Sheet1")
415
+ st.download_button(label="First 30 Projects", data=excel_data_15, file_name="First_15_All_Projects_Filtered.xlsx", mime="application/vnd.openxmlformats-officedocument.spreadsheetml.sheet")
416
+
417
+ # All Results Button
418
+ df_to_download_all = filtered_df[columns_to_include]
419
+ excel_data_all = to_excel(df_to_download_all, "Sheet1")
420
+ st.download_button(label="All", data=excel_data_all, file_name="All_All_Projects_Filtered.xlsx", mime="application/vnd.openxmlformats-officedocument.spreadsheetml.sheet")
421
+
422
+ show_all_projects_table(projects_df, paginated_df)
423
+
424
+ st.write(f"Showing 1 to {min(end_idx, len(filtered_df))} of {len(filtered_df)} projects")
425
+
426
+ # Center the buttons and place them close together
427
+ col1, col2, col3, col4, col5 = st.columns([2, 1, 1, 1, 2])
428
+ with col2:
429
+ if st.button('Show More', key='show_more'):
430
+ st.session_state.current_end_idx_all = min(end_idx + page_size, len(filtered_df))
431
+ st.experimental_rerun()
432
+ with col4:
433
+ if st.button('Show Less', key='show_less') and end_idx > page_size:
434
+ st.session_state.current_end_idx_all = max(end_idx - page_size, page_size)
435
+ st.experimental_rerun()
436
 
 
 
 
437
  else:
438
  st.write("-----")
439
  col1, col2, col3 = st.columns([1, 1, 1])
440
  with col2:
441
  st.write(" ")
442
  st.markdown("<span style='color: red'>There are no results for the applied filter. Try another filter!</span>", unsafe_allow_html=True)
443
+
444
  del crs3_list, crs5_list, sdg_str, filtered_df
445
  gc.collect()
446
 
447
 
448
 
449
+ ##################################
450
+
451
  def show_single_matching_page():
452
+ # Define the page size at the beginning
453
+ page_size = 15
454
+
455
+ def reset_pagination():
456
+ st.session_state.current_end_idx_single = page_size
457
 
458
  with st.expander("Explanation"):
459
  st.caption("""
460
+ Single Project Matching enables you to choose an individual project using either the project IATI ID or title, to display projects most similar to it.
461
+
462
+ **Similarity Score**:
463
+ - Similarity ranges from 0 to 100 (identical projects score 100%), and is calculated based on
464
+ - Text similarity of project description and title (MiniLMM & Cosine Similiarity).
465
+ - Matching of SDGs (AI-predicted).
466
+ - Matching of CRS-3 & CRS-5 sector codes.
467
+ - Components are weighted to give a normalized score.
468
  """)
 
469
 
470
+ col1, col2, col3 = st.columns([10, 1, 10])
471
  with col1:
472
+ st.subheader("Reference Project")
473
  st.caption("""
474
+ Select a reference project either by its title or IATI ID.
475
  """)
476
+ with col3:
477
+ st.subheader("Filters for Similar Projects")
478
  st.caption("""
479
  The filters are applied to find the similar projects and are independend of the selected reference project.
480
  """)
481
 
482
+ col1, col2, col3 = st.columns([10, 1, 10])
483
  with col1:
484
  search_option = st.selectbox(
485
+ label='Search with project title or IATI ID',
486
+ index=0,
487
+ placeholder=" ",
488
+ options=["Search with IATI ID", "Search with project title"],
489
+ on_change=reset_pagination,
490
+ key='search_option_single'
491
+ )
492
+
493
  if search_option == "Search with IATI ID":
494
  search_list = iati_search_list
495
  else:
496
  search_list = title_search_list
497
 
498
  project_option = st.selectbox(
499
+ label='Search for a project',
500
+ index=None,
501
+ placeholder=" ",
502
+ options=search_list,
503
+ on_change=reset_pagination,
504
+ key='project_option_single'
505
+ )
506
+
507
  with col3:
 
508
  orga_abbreviation = projects_df["orga_abbreviation"].unique()
509
  orga_full_names = projects_df["orga_full_name"].unique()
510
+ orga_list = [f"{orga_full_names[i]} ({orga_abbreviation[i].upper()})" for i in range(len(orga_abbreviation))]
511
 
512
+ # REGION SELECTION
513
+ region_option_s = st.multiselect(
514
+ 'Regions',
515
+ REGION_OPTION_LIST,
516
+ placeholder="All regions selected",
517
+ on_change=reset_pagination,
518
+ key='regions_single_projects_page'
519
+ )
520
 
 
 
 
521
  country_option_s = st.multiselect(
522
+ 'Countries ',
523
+ COUNTRY_OPTION_LIST,
524
+ placeholder="All countries selected ",
525
+ on_change=reset_pagination,
526
+ key='country_option_single'
527
+ )
528
+ orga_option_s = st.multiselect(
529
+ 'Organizations',
530
+ orga_list,
531
+ placeholder="All organizations selected ",
532
+ on_change=reset_pagination,
533
+ key='orga_option_single'
534
+ )
535
 
536
+ different_orga_checkbox_s = st.checkbox("Only matches between different organizations ", value=True, on_change=reset_pagination, key='different_orga_checkbox_single')
537
+
538
+ st.write("-----")
539
 
 
540
  if project_option:
541
  selected_project_index = search_list.index(project_option)
 
542
  country_code_list = [option[-3:-1] for option in country_option_s]
 
 
543
  orga_code_list = [option.split("(")[1][:-1].lower() for option in orga_option_s]
544
 
545
+ TOP_X_PROJECTS = 1000
546
  with st.spinner('Please wait...'):
547
+ filtered_df_s = filter_single(projects_df, country_code_list, orga_code_list, region_option_s)
548
 
549
+ if isinstance(filtered_df_s, pd.DataFrame) and len(filtered_df_s) != 0:
550
  if different_orga_checkbox_s:
551
  with st.spinner('Please wait...'):
552
+ top_projects_df = find_similar(selected_project_index, nonsameorgas_sim_matrix, filtered_df_s, TOP_X_PROJECTS)
553
  else:
554
  with st.spinner('Please wait...'):
555
+ top_projects_df = find_similar(selected_project_index, sim_matrix, filtered_df_s, TOP_X_PROJECTS)
556
+
557
+ # Implement show more, show less, and show all functionality
558
+ if 'current_end_idx_single' not in st.session_state:
559
+ st.session_state.current_end_idx_single = page_size
560
+
561
+ end_idx = st.session_state.current_end_idx_single
562
+
563
+ paginated_df = top_projects_df.iloc[:end_idx]
564
+
565
+ # Add a download button for the paginated results
566
+ def to_excel(df, sheet_name):
567
+ # Rename columns
568
+ df = df.rename(columns={
569
+ "similarity": "Similarity Score",
570
+ "iati_id": "IATI Identifier",
571
+ "title_main": "Title",
572
+ "orga_abbreviation": "Organization",
573
+ "description_main": "Description",
574
+ "country_name": "Country",
575
+ "sdg_list": "SDG List",
576
+ "crs_3_code_list": "CRS 3 Codes",
577
+ "crs_5_code_list": "CRS 5 Codes",
578
+ "Project Link": "Project Link"
579
+ })
580
+ output = io.BytesIO()
581
+ writer = pd.ExcelWriter(output, engine='xlsxwriter')
582
+ df.to_excel(writer, index=False, sheet_name=sheet_name)
583
+ writer.close()
584
+ processed_data = output.getvalue()
585
+ return processed_data
586
+
587
+ # Direct download buttons
588
+ columns_to_include = ["similarity", "iati_id", "title_main", "orga_abbreviation", "description_main", "country_name", "sdg_list", "crs_3_code_list", "crs_5_code_list", "Project Link"]
589
+
590
+ col1, col2 = st.columns([15, 5])
591
+ with col2:
592
+ with st.expander("Excel Download"):
593
+ # First 15 Results Button
594
+ df_to_download_15 = top_projects_df[columns_to_include].head(15)
595
+ excel_data_15 = to_excel(df_to_download_15, "Sheet1")
596
+ st.download_button(label="Download first 15 projects", data=excel_data_15, file_name="First_15_Single_Project_Matching_Results.xlsx", mime="application/vnd.openxmlformats-officedocument.spreadsheetml.sheet")
597
+ df_to_download_all = top_projects_df[columns_to_include]
598
+ excel_data_all = to_excel(df_to_download_all, "Sheet1")
599
+ st.download_button(label="Download All", data=excel_data_all, file_name="All_Single_Project_Matching_Results.xlsx", mime="application/vnd.openxmlformats-officedocument.spreadsheetml.sheet")
600
+
601
+ show_single_table(selected_project_index, projects_df, paginated_df)
602
+
603
+ st.write(f"Showing 1 to {min(end_idx, len(top_projects_df))} of {len(top_projects_df)} projects")
604
+
605
+ # Center the buttons and place them close together
606
+ col1, col2, col3, col4, col5 = st.columns([2, 1, 1, 1, 2])
607
+ with col2:
608
+ if st.button('Show More'):
609
+ st.session_state.current_end_idx_single = min(end_idx + page_size, len(top_projects_df))
610
+ st.experimental_rerun()
611
+ with col3:
612
+ if st.button('Show Less') and end_idx > page_size:
613
+ st.session_state.current_end_idx_single = max(end_idx - page_size, page_size)
614
+ st.experimental_rerun()
615
+ with col4:
616
+ if st.button('Show All'):
617
+ st.session_state.current_end_idx_single = len(top_projects_df)
618
+ st.experimental_rerun()
619
+
620
+ else:
621
+ st.write("-----")
622
+ col1, col2, col3 = st.columns([1, 1, 1])
623
+ with col2:
624
+ st.write(" ")
625
+ st.markdown("<span style='color: red'>There are no results for this filter!</span>", unsafe_allow_html=True)
626
+ gc.collect()
627
+
628
 
629
+ ##################################
630
+ def show_multi_matching_page():
631
+ # Define the page size at the beginning
632
+ page_size = 30
633
+
634
+ def reset_pagination():
635
+ st.session_state.current_end_idx_multi = page_size
636
+
637
+ with st.expander("Explanation"):
638
+ st.caption("""
639
+ Multi-Project Matching enables to find collaboration opportunities by identifying matching (=similar) projects.
640
+
641
+ **How It Works**:
642
+ - Filter projects by CRS sector, SDG, country, and organization.
643
+ - Each match displays two similar projects side-by-side.
644
+
645
+ **Similarity Score**:
646
+ - Similarity ranges from 0 to 100 (Identical projects score 100%), and is calculated based on
647
+ - Text similarity of project description and title (MiniLMM & Cosine Similiarity).
648
+ - Matching of SDGs (AI-predicted).
649
+ - Matching of CRS-3 & CRS-5 sector codes.
650
+ - Components are weighted to give a normalized score.
651
+ """)
652
+ col1, col2, col3 = st.columns([10, 1, 10])
653
+ with col1:
654
+ st.subheader("Sector Filters")
655
+ st.caption("""
656
+ At least one sector filter must be applied to see results.
657
+ """)
658
+ with col3:
659
+ st.subheader("Additional Filters")
660
+
661
+ st.session_state.crs5_option_disabled = True
662
+ col1, col2, col3 = st.columns([10, 1, 10])
663
+ with col1:
664
+ crs3_option = st.multiselect(
665
+ 'CRS 3',
666
+ CRS3_MERGED,
667
+ placeholder="Select a CRS 3 code",
668
+ on_change=reset_pagination,
669
+ key='crs3_multi_projects_page'
670
+ )
671
+
672
+ if crs3_option:
673
+ st.session_state.crs5_option_disabled = False
674
+
675
+ crs5_list = [txt[0].replace('"', "") for crs3_item in crs3_option for code, txt in CRS5_MERGED.items() if str(code)[:3] == str(crs3_item)[-3:]]
676
+
677
+ crs5_option = st.multiselect(
678
+ 'CRS 5',
679
+ crs5_list,
680
+ placeholder="Select a CRS 5 code",
681
+ disabled=st.session_state.crs5_option_disabled,
682
+ on_change=reset_pagination,
683
+ key='crs5_multi_projects_page'
684
+ )
685
+
686
+ sdg_option = st.selectbox(
687
+ label='Sustainable Development Goal',
688
+ index=None,
689
+ placeholder="Select a SDG",
690
+ options=SDG_NAMES[:-1],
691
+ on_change=reset_pagination,
692
+ key='sdg_multi_projects_page'
693
+ )
694
+
695
+ query = ""
696
+
697
+ with col3:
698
+ region_option = st.multiselect(
699
+ 'Regions',
700
+ REGION_OPTION_LIST,
701
+ placeholder="All regions selected",
702
+ on_change=reset_pagination,
703
+ key='regions_multi_projects_page'
704
+ )
705
+ country_option = st.multiselect(
706
+ 'Countries',
707
+ COUNTRY_OPTION_LIST,
708
+ placeholder="All countries selected",
709
+ on_change=reset_pagination,
710
+ key='country_multi_projects_page'
711
+ )
712
 
713
+ orga_abbreviation = projects_df["orga_abbreviation"].unique()
714
+ orga_full_names = projects_df["orga_full_name"].unique()
715
+ orga_list = [f"{orga_full_names[i]} ({orga_abbreviation[i].upper()})" for i in range(len(orga_abbreviation))]
716
+
717
+ orga_option = st.multiselect(
718
+ 'Organizations',
719
+ orga_list,
720
+ placeholder="All organizations selected",
721
+ on_change=reset_pagination,
722
+ key='orga_multi_projects_page'
723
+ )
724
+
725
+ identical_country_checkbox = st.checkbox("Only matches where country is identical", value=True, on_change=reset_pagination, key='identical_country_checkbox_multi')
726
+ different_orga_checkbox = st.checkbox("Only matches between different organizations", value=True, on_change=reset_pagination, key='different_orga_checkbox_multi')
727
+ filtered_country_only_checkbox = st.checkbox("Only matches between filtered countries", value=True, on_change=reset_pagination, key='filtered_country_only_checkbox_multi')
728
+ filtered_orga_only_checkbox = st.checkbox("Only matches between filtered organisations", value=True, on_change=reset_pagination, key='filtered_orga_only_checkbox_multi')
729
+
730
+
731
+ # CRS CODE LIST
732
+ crs3_list = [i[-3:] for i in crs3_option]
733
+ crs5_list = [i[-5:] for i in crs5_option]
734
+
735
+ # SDG CODE LIST
736
+ sdg_str = sdg_option.split(".")[0] if sdg_option else ""
737
+
738
+ # COUNTRY CODES LIST
739
+ country_code_list = [option[-3:-1] for option in country_option]
740
+
741
+ # ORGANIZATION CODES LIST
742
+ orga_code_list = [option.split("(")[1][:-1].lower() for option in orga_option]
743
+
744
+ # Handle case where no organizations are selected but the checkbox is checked
745
+ if filtered_orga_only_checkbox and not orga_code_list:
746
+ orga_code_list = projects_df["orga_abbreviation"].unique().tolist()
747
+
748
+ # FILTER DF WITH SELECTED FILTER OPTIONS
749
+ TOP_X_PROJECTS = 2000
750
+ filtered_df = filter_multi(projects_df, crs3_list, crs5_list, sdg_str, country_code_list, orga_code_list, region_option, query, model, embeddings, TOP_X_PROJECTS)
751
+ if isinstance(filtered_df, pd.DataFrame) and len(filtered_df) != 0:
752
+ # FIND MATCHES
753
+ # If only same country checkbox is activated
754
+ if filtered_country_only_checkbox:
755
+ with st.spinner('Please wait...'):
756
+ compare_df = same_country_filter(projects_df, country_code_list)
757
+ else:
758
+ compare_df = projects_df
759
+
760
+ if filtered_orga_only_checkbox:
761
+ compare_df = compare_df[compare_df['orga_abbreviation'].isin(orga_code_list)]
762
+
763
+ # if show only different orgas checkbox is activated
764
+ with st.spinner('Please wait...'):
765
+ p1_df, p2_df = calc_multi_matches(filtered_df, compare_df, nonsameorgas_sim_matrix if different_orga_checkbox else sim_matrix, TOP_X_PROJECTS, identical_country=identical_country_checkbox)
766
+
767
+ # Sort by similarity before pagination
768
+ p1_df = p1_df.sort_values(by='similarity', ascending=False)
769
+ p2_df = p2_df.sort_values(by='similarity', ascending=False)
770
+
771
+ # Implement pagination
772
+ if 'current_end_idx_multi' not in st.session_state:
773
+ st.session_state.current_end_idx_multi = page_size
774
+
775
+ end_idx = st.session_state.current_end_idx_multi
776
+
777
+ paginated_p1_df = p1_df.iloc[:end_idx]
778
+ paginated_p2_df = p2_df.iloc[:end_idx]
779
+
780
+ if not paginated_p1_df.empty and not paginated_p2_df.empty:
781
+ col1, col2 = st.columns([10, 2])
782
+ with col1:
783
+ st.subheader("Matched Projects")
784
+ with col2:
785
+ # Add a download button for the paginated results
786
+ def to_excel(p1_df, p2_df, sheet_name):
787
+ # Rename columns
788
+ p1_df = p1_df.rename(columns={
789
+ "similarity": "Similarity Score",
790
+ "iati_id": "IATI Identifier",
791
+ "title_main": "Title",
792
+ "orga_abbreviation": "Organization",
793
+ "description_main": "Description",
794
+ "country_name": "Country",
795
+ "sdg_list": "SDG List",
796
+ "crs_3_code_list": "CRS 3 Codes",
797
+ "crs_5_code_list": "CRS 5 Codes",
798
+ "Project Link": "Project Link"
799
+ })
800
+ p2_df = p2_df.rename(columns={
801
+ "similarity": "Similarity Score",
802
+ "iati_id": "IATI Identifier",
803
+ "title_main": "Title",
804
+ "orga_abbreviation": "Organization",
805
+ "description_main": "Description",
806
+ "country_name": "Country",
807
+ "sdg_list": "SDG List",
808
+ "crs_3_code_list": "CRS 3 Codes",
809
+ "crs_5_code_list": "CRS 5 Codes",
810
+ "Project Link": "Project Link"
811
+ })
812
+
813
+ combined_df = pd.concat([p1_df, pd.DataFrame([{}]), p2_df], ignore_index=True)
814
+ combined_df.fillna('', inplace=True)
815
+
816
+ empty_row = pd.DataFrame([{}])
817
+ combined_df_list = []
818
+
819
+ for idx in range(0, len(p1_df), 2):
820
+ combined_df_list.append(p1_df.iloc[[idx]])
821
+ combined_df_list.append(p2_df.iloc[[idx]])
822
+ combined_df_list.append(empty_row)
823
+
824
+ combined_df = pd.concat(combined_df_list, ignore_index=True)
825
+
826
+ output = io.BytesIO()
827
+ writer = pd.ExcelWriter(output, engine='xlsxwriter')
828
+ combined_df.to_excel(writer, index=False, sheet_name=sheet_name)
829
+ writer.close()
830
+ processed_data = output.getvalue()
831
+ return processed_data
832
+
833
+ # Direct download buttons
834
+ columns_to_include = ["similarity", "iati_id", "title_main", "orga_abbreviation", "description_main", "country_name", "sdg_list", "crs_3_code_list", "crs_5_code_list", "Project Link"]
835
+
836
+ with st.expander("Excel Download"):
837
+ # First 15 Results Button
838
+ p1_df_to_download_15 = p1_df[columns_to_include].head(30)
839
+ p2_df_to_download_15 = p2_df[columns_to_include].head(30)
840
+ excel_data_15 = to_excel(p1_df_to_download_15, p2_df_to_download_15, "Sheet1")
841
+ st.download_button(label="First 15 Matches", data=excel_data_15, file_name="First_15_Multi_Projects_Matching_Results.xlsx", mime="application/vnd.openxmlformats-officedocument.spreadsheetml.sheet")
842
+
843
+ # All Results Button
844
+ p1_df_to_download_all = p1_df[columns_to_include]
845
+ p2_df_to_download_all = p2_df[columns_to_include]
846
+ excel_data_all = to_excel(p1_df_to_download_all, p2_df_to_download_all, "Sheet1")
847
+ st.download_button(label="All", data=excel_data_all, file_name="All_Multi_Projects_Matching_Results.xlsx", mime="application/vnd.openxmlformats-officedocument.spreadsheetml.sheet")
848
+
849
+ show_multi_table(paginated_p1_df, paginated_p2_df)
850
+
851
+ st.write(f"Showing 1 to {min(end_idx // 2, len(p1_df) // 2)} of {len(p1_df) // 2} matches")
852
+
853
+ # Center the buttons and place them close together
854
+ col1, col2, col3, col4, col5 = st.columns([2, 1, 1, 1, 2])
855
+ with col2:
856
+ if st.button('Show More', key='show_more_button'):
857
+ st.session_state.current_end_idx_multi = min(end_idx + page_size, len(p1_df))
858
+ st.experimental_rerun()
859
+ with col3:
860
+ if st.button('Show Less', key='show_less_button') and end_idx > page_size:
861
+ st.session_state.current_end_idx_multi = max(end_idx - page_size, page_size)
862
+ st.experimental_rerun()
863
+ with col4:
864
+ if st.button('Show All', key='show_all_button'):
865
+ st.session_state.current_end_idx_multi = len(p1_df)
866
+ st.experimental_rerun()
867
+
868
+ del p1_df, p2_df
869
  else:
870
  st.write("-----")
871
  col1, col2, col3 = st.columns([1, 1, 1])
872
  with col2:
873
  st.write(" ")
874
+ st.markdown("<span style='color: red'>There are no results for the applied filter. Try another filter!</span>", unsafe_allow_html=True)
875
+
876
+ else:
877
+ st.write("-----")
878
+ col1, col2, col3 = st.columns([1, 1, 1])
879
+ with col2:
880
+ st.write(" ")
881
+ st.markdown("<span style='color: red'>There are no results for the applied filter. Try another filter!</span>", unsafe_allow_html=True)
882
+
883
+ del crs3_list, crs5_list, sdg_str, filtered_df
884
+ gc.collect()
env/Lib/site-packages/_distutils_hack/__init__.py ADDED
@@ -0,0 +1,222 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # don't import any costly modules
2
+ import sys
3
+ import os
4
+
5
+
6
+ is_pypy = '__pypy__' in sys.builtin_module_names
7
+
8
+
9
+ def warn_distutils_present():
10
+ if 'distutils' not in sys.modules:
11
+ return
12
+ if is_pypy and sys.version_info < (3, 7):
13
+ # PyPy for 3.6 unconditionally imports distutils, so bypass the warning
14
+ # https://foss.heptapod.net/pypy/pypy/-/blob/be829135bc0d758997b3566062999ee8b23872b4/lib-python/3/site.py#L250
15
+ return
16
+ import warnings
17
+
18
+ warnings.warn(
19
+ "Distutils was imported before Setuptools, but importing Setuptools "
20
+ "also replaces the `distutils` module in `sys.modules`. This may lead "
21
+ "to undesirable behaviors or errors. To avoid these issues, avoid "
22
+ "using distutils directly, ensure that setuptools is installed in the "
23
+ "traditional way (e.g. not an editable install), and/or make sure "
24
+ "that setuptools is always imported before distutils."
25
+ )
26
+
27
+
28
+ def clear_distutils():
29
+ if 'distutils' not in sys.modules:
30
+ return
31
+ import warnings
32
+
33
+ warnings.warn("Setuptools is replacing distutils.")
34
+ mods = [
35
+ name
36
+ for name in sys.modules
37
+ if name == "distutils" or name.startswith("distutils.")
38
+ ]
39
+ for name in mods:
40
+ del sys.modules[name]
41
+
42
+
43
+ def enabled():
44
+ """
45
+ Allow selection of distutils by environment variable.
46
+ """
47
+ which = os.environ.get('SETUPTOOLS_USE_DISTUTILS', 'local')
48
+ return which == 'local'
49
+
50
+
51
+ def ensure_local_distutils():
52
+ import importlib
53
+
54
+ clear_distutils()
55
+
56
+ # With the DistutilsMetaFinder in place,
57
+ # perform an import to cause distutils to be
58
+ # loaded from setuptools._distutils. Ref #2906.
59
+ with shim():
60
+ importlib.import_module('distutils')
61
+
62
+ # check that submodules load as expected
63
+ core = importlib.import_module('distutils.core')
64
+ assert '_distutils' in core.__file__, core.__file__
65
+ assert 'setuptools._distutils.log' not in sys.modules
66
+
67
+
68
+ def do_override():
69
+ """
70
+ Ensure that the local copy of distutils is preferred over stdlib.
71
+
72
+ See https://github.com/pypa/setuptools/issues/417#issuecomment-392298401
73
+ for more motivation.
74
+ """
75
+ if enabled():
76
+ warn_distutils_present()
77
+ ensure_local_distutils()
78
+
79
+
80
+ class _TrivialRe:
81
+ def __init__(self, *patterns):
82
+ self._patterns = patterns
83
+
84
+ def match(self, string):
85
+ return all(pat in string for pat in self._patterns)
86
+
87
+
88
+ class DistutilsMetaFinder:
89
+ def find_spec(self, fullname, path, target=None):
90
+ # optimization: only consider top level modules and those
91
+ # found in the CPython test suite.
92
+ if path is not None and not fullname.startswith('test.'):
93
+ return
94
+
95
+ method_name = 'spec_for_{fullname}'.format(**locals())
96
+ method = getattr(self, method_name, lambda: None)
97
+ return method()
98
+
99
+ def spec_for_distutils(self):
100
+ if self.is_cpython():
101
+ return
102
+
103
+ import importlib
104
+ import importlib.abc
105
+ import importlib.util
106
+
107
+ try:
108
+ mod = importlib.import_module('setuptools._distutils')
109
+ except Exception:
110
+ # There are a couple of cases where setuptools._distutils
111
+ # may not be present:
112
+ # - An older Setuptools without a local distutils is
113
+ # taking precedence. Ref #2957.
114
+ # - Path manipulation during sitecustomize removes
115
+ # setuptools from the path but only after the hook
116
+ # has been loaded. Ref #2980.
117
+ # In either case, fall back to stdlib behavior.
118
+ return
119
+
120
+ class DistutilsLoader(importlib.abc.Loader):
121
+ def create_module(self, spec):
122
+ mod.__name__ = 'distutils'
123
+ return mod
124
+
125
+ def exec_module(self, module):
126
+ pass
127
+
128
+ return importlib.util.spec_from_loader(
129
+ 'distutils', DistutilsLoader(), origin=mod.__file__
130
+ )
131
+
132
+ @staticmethod
133
+ def is_cpython():
134
+ """
135
+ Suppress supplying distutils for CPython (build and tests).
136
+ Ref #2965 and #3007.
137
+ """
138
+ return os.path.isfile('pybuilddir.txt')
139
+
140
+ def spec_for_pip(self):
141
+ """
142
+ Ensure stdlib distutils when running under pip.
143
+ See pypa/pip#8761 for rationale.
144
+ """
145
+ if self.pip_imported_during_build():
146
+ return
147
+ clear_distutils()
148
+ self.spec_for_distutils = lambda: None
149
+
150
+ @classmethod
151
+ def pip_imported_during_build(cls):
152
+ """
153
+ Detect if pip is being imported in a build script. Ref #2355.
154
+ """
155
+ import traceback
156
+
157
+ return any(
158
+ cls.frame_file_is_setup(frame) for frame, line in traceback.walk_stack(None)
159
+ )
160
+
161
+ @staticmethod
162
+ def frame_file_is_setup(frame):
163
+ """
164
+ Return True if the indicated frame suggests a setup.py file.
165
+ """
166
+ # some frames may not have __file__ (#2940)
167
+ return frame.f_globals.get('__file__', '').endswith('setup.py')
168
+
169
+ def spec_for_sensitive_tests(self):
170
+ """
171
+ Ensure stdlib distutils when running select tests under CPython.
172
+
173
+ python/cpython#91169
174
+ """
175
+ clear_distutils()
176
+ self.spec_for_distutils = lambda: None
177
+
178
+ sensitive_tests = (
179
+ [
180
+ 'test.test_distutils',
181
+ 'test.test_peg_generator',
182
+ 'test.test_importlib',
183
+ ]
184
+ if sys.version_info < (3, 10)
185
+ else [
186
+ 'test.test_distutils',
187
+ ]
188
+ )
189
+
190
+
191
+ for name in DistutilsMetaFinder.sensitive_tests:
192
+ setattr(
193
+ DistutilsMetaFinder,
194
+ f'spec_for_{name}',
195
+ DistutilsMetaFinder.spec_for_sensitive_tests,
196
+ )
197
+
198
+
199
+ DISTUTILS_FINDER = DistutilsMetaFinder()
200
+
201
+
202
+ def add_shim():
203
+ DISTUTILS_FINDER in sys.meta_path or insert_shim()
204
+
205
+
206
+ class shim:
207
+ def __enter__(self):
208
+ insert_shim()
209
+
210
+ def __exit__(self, exc, value, tb):
211
+ remove_shim()
212
+
213
+
214
+ def insert_shim():
215
+ sys.meta_path.insert(0, DISTUTILS_FINDER)
216
+
217
+
218
+ def remove_shim():
219
+ try:
220
+ sys.meta_path.remove(DISTUTILS_FINDER)
221
+ except ValueError:
222
+ pass
env/Lib/site-packages/_distutils_hack/__pycache__/__init__.cpython-311.pyc ADDED
Binary file (11.3 kB). View file
 
env/Lib/site-packages/_distutils_hack/__pycache__/override.cpython-311.pyc ADDED
Binary file (415 Bytes). View file
 
env/Lib/site-packages/_distutils_hack/override.py ADDED
@@ -0,0 +1 @@
 
 
1
+ __import__('_distutils_hack').do_override()
env/Lib/site-packages/distutils-precedence.pth ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:2638ce9e2500e572a5e0de7faed6661eb569d1b696fcba07b0dd223da5f5d224
3
+ size 151
env/Lib/site-packages/pip-23.2.1.dist-info/AUTHORS.txt ADDED
@@ -0,0 +1,738 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ @Switch01
2
+ A_Rog
3
+ Aakanksha Agrawal
4
+ Abhinav Sagar
5
+ ABHYUDAY PRATAP SINGH
6
+ abs51295
7
+ AceGentile
8
+ Adam Chainz
9
+ Adam Tse
10
+ Adam Wentz
11
+ admin
12
+ Adrien Morison
13
+ ahayrapetyan
14
+ Ahilya
15
+ AinsworthK
16
+ Akash Srivastava
17
+ Alan Yee
18
+ Albert Tugushev
19
+ Albert-Guan
20
+ albertg
21
+ Alberto Sottile
22
+ Aleks Bunin
23
+ Alethea Flowers
24
+ Alex Gaynor
25
+ Alex Grönholm
26
+ Alex Hedges
27
+ Alex Loosley
28
+ Alex Morega
29
+ Alex Stachowiak
30
+ Alexander Shtyrov
31
+ Alexandre Conrad
32
+ Alexey Popravka
33
+ Alli
34
+ Ami Fischman
35
+ Ananya Maiti
36
+ Anatoly Techtonik
37
+ Anders Kaseorg
38
+ Andre Aguiar
39
+ Andreas Lutro
40
+ Andrei Geacar
41
+ Andrew Gaul
42
+ Andrew Shymanel
43
+ Andrey Bienkowski
44
+ Andrey Bulgakov
45
+ Andrés Delfino
46
+ Andy Freeland
47
+ Andy Kluger
48
+ Ani Hayrapetyan
49
+ Aniruddha Basak
50
+ Anish Tambe
51
+ Anrs Hu
52
+ Anthony Sottile
53
+ Antoine Musso
54
+ Anton Ovchinnikov
55
+ Anton Patrushev
56
+ Antonio Alvarado Hernandez
57
+ Antony Lee
58
+ Antti Kaihola
59
+ Anubhav Patel
60
+ Anudit Nagar
61
+ Anuj Godase
62
+ AQNOUCH Mohammed
63
+ AraHaan
64
+ Arindam Choudhury
65
+ Armin Ronacher
66
+ Artem
67
+ Arun Babu Neelicattu
68
+ Ashley Manton
69
+ Ashwin Ramaswami
70
+ atse
71
+ Atsushi Odagiri
72
+ Avinash Karhana
73
+ Avner Cohen
74
+ Awit (Ah-Wit) Ghirmai
75
+ Baptiste Mispelon
76
+ Barney Gale
77
+ barneygale
78
+ Bartek Ogryczak
79
+ Bastian Venthur
80
+ Ben Bodenmiller
81
+ Ben Darnell
82
+ Ben Hoyt
83
+ Ben Mares
84
+ Ben Rosser
85
+ Bence Nagy
86
+ Benjamin Peterson
87
+ Benjamin VanEvery
88
+ Benoit Pierre
89
+ Berker Peksag
90
+ Bernard
91
+ Bernard Tyers
92
+ Bernardo B. Marques
93
+ Bernhard M. Wiedemann
94
+ Bertil Hatt
95
+ Bhavam Vidyarthi
96
+ Blazej Michalik
97
+ Bogdan Opanchuk
98
+ BorisZZZ
99
+ Brad Erickson
100
+ Bradley Ayers
101
+ Brandon L. Reiss
102
+ Brandt Bucher
103
+ Brett Randall
104
+ Brett Rosen
105
+ Brian Cristante
106
+ Brian Rosner
107
+ briantracy
108
+ BrownTruck
109
+ Bruno Oliveira
110
+ Bruno Renié
111
+ Bruno S
112
+ Bstrdsmkr
113
+ Buck Golemon
114
+ burrows
115
+ Bussonnier Matthias
116
+ bwoodsend
117
+ c22
118
+ Caleb Martinez
119
+ Calvin Smith
120
+ Carl Meyer
121
+ Carlos Liam
122
+ Carol Willing
123
+ Carter Thayer
124
+ Cass
125
+ Chandrasekhar Atina
126
+ Chih-Hsuan Yen
127
+ Chris Brinker
128
+ Chris Hunt
129
+ Chris Jerdonek
130
+ Chris Kuehl
131
+ Chris McDonough
132
+ Chris Pawley
133
+ Chris Pryer
134
+ Chris Wolfe
135
+ Christian Clauss
136
+ Christian Heimes
137
+ Christian Oudard
138
+ Christoph Reiter
139
+ Christopher Hunt
140
+ Christopher Snyder
141
+ cjc7373
142
+ Clark Boylan
143
+ Claudio Jolowicz
144
+ Clay McClure
145
+ Cody
146
+ Cody Soyland
147
+ Colin Watson
148
+ Collin Anderson
149
+ Connor Osborn
150
+ Cooper Lees
151
+ Cooper Ry Lees
152
+ Cory Benfield
153
+ Cory Wright
154
+ Craig Kerstiens
155
+ Cristian Sorinel
156
+ Cristina
157
+ Cristina Muñoz
158
+ Curtis Doty
159
+ cytolentino
160
+ Daan De Meyer
161
+ Damian
162
+ Damian Quiroga
163
+ Damian Shaw
164
+ Dan Black
165
+ Dan Savilonis
166
+ Dan Sully
167
+ Dane Hillard
168
+ daniel
169
+ Daniel Collins
170
+ Daniel Hahler
171
+ Daniel Holth
172
+ Daniel Jost
173
+ Daniel Katz
174
+ Daniel Shaulov
175
+ Daniele Esposti
176
+ Daniele Nicolodi
177
+ Daniele Procida
178
+ Daniil Konovalenko
179
+ Danny Hermes
180
+ Danny McClanahan
181
+ Darren Kavanagh
182
+ Dav Clark
183
+ Dave Abrahams
184
+ Dave Jones
185
+ David Aguilar
186
+ David Black
187
+ David Bordeynik
188
+ David Caro
189
+ David D Lowe
190
+ David Evans
191
+ David Hewitt
192
+ David Linke
193
+ David Poggi
194
+ David Pursehouse
195
+ David Runge
196
+ David Tucker
197
+ David Wales
198
+ Davidovich
199
+ Deepak Sharma
200
+ Deepyaman Datta
201
+ Denise Yu
202
+ derwolfe
203
+ Desetude
204
+ Devesh Kumar Singh
205
+ Diego Caraballo
206
+ Diego Ramirez
207
+ DiegoCaraballo
208
+ Dimitri Merejkowsky
209
+ Dimitri Papadopoulos
210
+ Dirk Stolle
211
+ Dmitry Gladkov
212
+ Dmitry Volodin
213
+ Domen Kožar
214
+ Dominic Davis-Foster
215
+ Donald Stufft
216
+ Dongweiming
217
+ doron zarhi
218
+ Dos Moonen
219
+ Douglas Thor
220
+ DrFeathers
221
+ Dustin Ingram
222
+ Dwayne Bailey
223
+ Ed Morley
224
+ Edgar Ramírez
225
+ Ee Durbin
226
+ Eitan Adler
227
+ ekristina
228
+ elainechan
229
+ Eli Schwartz
230
+ Elisha Hollander
231
+ Ellen Marie Dash
232
+ Emil Burzo
233
+ Emil Styrke
234
+ Emmanuel Arias
235
+ Endoh Takanao
236
+ enoch
237
+ Erdinc Mutlu
238
+ Eric Cousineau
239
+ Eric Gillingham
240
+ Eric Hanchrow
241
+ Eric Hopper
242
+ Erik M. Bray
243
+ Erik Rose
244
+ Erwin Janssen
245
+ Eugene Vereshchagin
246
+ everdimension
247
+ Federico
248
+ Felipe Peter
249
+ Felix Yan
250
+ fiber-space
251
+ Filip Kokosiński
252
+ Filipe Laíns
253
+ Finn Womack
254
+ finnagin
255
+ Florian Briand
256
+ Florian Rathgeber
257
+ Francesco
258
+ Francesco Montesano
259
+ Frost Ming
260
+ Gabriel Curio
261
+ Gabriel de Perthuis
262
+ Garry Polley
263
+ gavin
264
+ gdanielson
265
+ Geoffrey Sneddon
266
+ George Song
267
+ Georgi Valkov
268
+ Georgy Pchelkin
269
+ ghost
270
+ Giftlin Rajaiah
271
+ gizmoguy1
272
+ gkdoc
273
+ Godefroid Chapelle
274
+ Gopinath M
275
+ GOTO Hayato
276
+ gousaiyang
277
+ gpiks
278
+ Greg Roodt
279
+ Greg Ward
280
+ Guilherme Espada
281
+ Guillaume Seguin
282
+ gutsytechster
283
+ Guy Rozendorn
284
+ Guy Tuval
285
+ gzpan123
286
+ Hanjun Kim
287
+ Hari Charan
288
+ Harsh Vardhan
289
+ harupy
290
+ Harutaka Kawamura
291
+ hauntsaninja
292
+ Henrich Hartzer
293
+ Henry Schreiner
294
+ Herbert Pfennig
295
+ Holly Stotelmyer
296
+ Honnix
297
+ Hsiaoming Yang
298
+ Hugo Lopes Tavares
299
+ Hugo van Kemenade
300
+ Hugues Bruant
301
+ Hynek Schlawack
302
+ Ian Bicking
303
+ Ian Cordasco
304
+ Ian Lee
305
+ Ian Stapleton Cordasco
306
+ Ian Wienand
307
+ Igor Kuzmitshov
308
+ Igor Sobreira
309
+ Ilan Schnell
310
+ Illia Volochii
311
+ Ilya Baryshev
312
+ Inada Naoki
313
+ Ionel Cristian Mărieș
314
+ Ionel Maries Cristian
315
+ Ivan Pozdeev
316
+ Jacob Kim
317
+ Jacob Walls
318
+ Jaime Sanz
319
+ jakirkham
320
+ Jakub Kuczys
321
+ Jakub Stasiak
322
+ Jakub Vysoky
323
+ Jakub Wilk
324
+ James Cleveland
325
+ James Curtin
326
+ James Firth
327
+ James Gerity
328
+ James Polley
329
+ Jan Pokorný
330
+ Jannis Leidel
331
+ Jarek Potiuk
332
+ jarondl
333
+ Jason Curtis
334
+ Jason R. Coombs
335
+ JasonMo
336
+ JasonMo1
337
+ Jay Graves
338
+ Jean-Christophe Fillion-Robin
339
+ Jeff Barber
340
+ Jeff Dairiki
341
+ Jelmer Vernooij
342
+ jenix21
343
+ Jeremy Stanley
344
+ Jeremy Zafran
345
+ Jesse Rittner
346
+ Jiashuo Li
347
+ Jim Fisher
348
+ Jim Garrison
349
+ Jiun Bae
350
+ Jivan Amara
351
+ Joe Bylund
352
+ Joe Michelini
353
+ John Paton
354
+ John T. Wodder II
355
+ John-Scott Atlakson
356
+ johnthagen
357
+ Jon Banafato
358
+ Jon Dufresne
359
+ Jon Parise
360
+ Jonas Nockert
361
+ Jonathan Herbert
362
+ Joonatan Partanen
363
+ Joost Molenaar
364
+ Jorge Niedbalski
365
+ Joseph Bylund
366
+ Joseph Long
367
+ Josh Bronson
368
+ Josh Hansen
369
+ Josh Schneier
370
+ Juan Luis Cano Rodríguez
371
+ Juanjo Bazán
372
+ Judah Rand
373
+ Julian Berman
374
+ Julian Gethmann
375
+ Julien Demoor
376
+ Jussi Kukkonen
377
+ jwg4
378
+ Jyrki Pulliainen
379
+ Kai Chen
380
+ Kai Mueller
381
+ Kamal Bin Mustafa
382
+ kasium
383
+ kaustav haldar
384
+ keanemind
385
+ Keith Maxwell
386
+ Kelsey Hightower
387
+ Kenneth Belitzky
388
+ Kenneth Reitz
389
+ Kevin Burke
390
+ Kevin Carter
391
+ Kevin Frommelt
392
+ Kevin R Patterson
393
+ Kexuan Sun
394
+ Kit Randel
395
+ Klaas van Schelven
396
+ KOLANICH
397
+ kpinc
398
+ Krishna Oza
399
+ Kumar McMillan
400
+ Kyle Persohn
401
+ lakshmanaram
402
+ Laszlo Kiss-Kollar
403
+ Laurent Bristiel
404
+ Laurent LAPORTE
405
+ Laurie O
406
+ Laurie Opperman
407
+ layday
408
+ Leon Sasson
409
+ Lev Givon
410
+ Lincoln de Sousa
411
+ Lipis
412
+ lorddavidiii
413
+ Loren Carvalho
414
+ Lucas Cimon
415
+ Ludovic Gasc
416
+ Lukas Juhrich
417
+ Luke Macken
418
+ Luo Jiebin
419
+ luojiebin
420
+ luz.paz
421
+ László Kiss Kollár
422
+ M00nL1ght
423
+ Marc Abramowitz
424
+ Marc Tamlyn
425
+ Marcus Smith
426
+ Mariatta
427
+ Mark Kohler
428
+ Mark Williams
429
+ Markus Hametner
430
+ Martey Dodoo
431
+ Martin Fischer
432
+ Martin Häcker
433
+ Martin Pavlasek
434
+ Masaki
435
+ Masklinn
436
+ Matej Stuchlik
437
+ Mathew Jennings
438
+ Mathieu Bridon
439
+ Mathieu Kniewallner
440
+ Matt Bacchi
441
+ Matt Good
442
+ Matt Maker
443
+ Matt Robenolt
444
+ matthew
445
+ Matthew Einhorn
446
+ Matthew Feickert
447
+ Matthew Gilliard
448
+ Matthew Iversen
449
+ Matthew Treinish
450
+ Matthew Trumbell
451
+ Matthew Willson
452
+ Matthias Bussonnier
453
+ mattip
454
+ Maurits van Rees
455
+ Max W Chase
456
+ Maxim Kurnikov
457
+ Maxime Rouyrre
458
+ mayeut
459
+ mbaluna
460
+ mdebi
461
+ memoselyk
462
+ meowmeowcat
463
+ Michael
464
+ Michael Aquilina
465
+ Michael E. Karpeles
466
+ Michael Klich
467
+ Michael Mintz
468
+ Michael Williamson
469
+ michaelpacer
470
+ Michał Górny
471
+ Mickaël Schoentgen
472
+ Miguel Araujo Perez
473
+ Mihir Singh
474
+ Mike
475
+ Mike Hendricks
476
+ Min RK
477
+ MinRK
478
+ Miro Hrončok
479
+ Monica Baluna
480
+ montefra
481
+ Monty Taylor
482
+ Muha Ajjan‮
483
+ Nadav Wexler
484
+ Nahuel Ambrosini
485
+ Nate Coraor
486
+ Nate Prewitt
487
+ Nathan Houghton
488
+ Nathaniel J. Smith
489
+ Nehal J Wani
490
+ Neil Botelho
491
+ Nguyễn Gia Phong
492
+ Nicholas Serra
493
+ Nick Coghlan
494
+ Nick Stenning
495
+ Nick Timkovich
496
+ Nicolas Bock
497
+ Nicole Harris
498
+ Nikhil Benesch
499
+ Nikhil Ladha
500
+ Nikita Chepanov
501
+ Nikolay Korolev
502
+ Nipunn Koorapati
503
+ Nitesh Sharma
504
+ Niyas Sait
505
+ Noah
506
+ Noah Gorny
507
+ Nowell Strite
508
+ NtaleGrey
509
+ nvdv
510
+ OBITORASU
511
+ Ofek Lev
512
+ ofrinevo
513
+ Oliver Freund
514
+ Oliver Jeeves
515
+ Oliver Mannion
516
+ Oliver Tonnhofer
517
+ Olivier Girardot
518
+ Olivier Grisel
519
+ Ollie Rutherfurd
520
+ OMOTO Kenji
521
+ Omry Yadan
522
+ onlinejudge95
523
+ Oren Held
524
+ Oscar Benjamin
525
+ Oz N Tiram
526
+ Pachwenko
527
+ Patrick Dubroy
528
+ Patrick Jenkins
529
+ Patrick Lawson
530
+ patricktokeeffe
531
+ Patrik Kopkan
532
+ Paul Kehrer
533
+ Paul Moore
534
+ Paul Nasrat
535
+ Paul Oswald
536
+ Paul van der Linden
537
+ Paulus Schoutsen
538
+ Pavel Safronov
539
+ Pavithra Eswaramoorthy
540
+ Pawel Jasinski
541
+ Paweł Szramowski
542
+ Pekka Klärck
543
+ Peter Gessler
544
+ Peter Lisák
545
+ Peter Waller
546
+ petr-tik
547
+ Phaneendra Chiruvella
548
+ Phil Elson
549
+ Phil Freo
550
+ Phil Pennock
551
+ Phil Whelan
552
+ Philip Jägenstedt
553
+ Philip Molloy
554
+ Philippe Ombredanne
555
+ Pi Delport
556
+ Pierre-Yves Rofes
557
+ Pieter Degroote
558
+ pip
559
+ Prabakaran Kumaresshan
560
+ Prabhjyotsing Surjit Singh Sodhi
561
+ Prabhu Marappan
562
+ Pradyun Gedam
563
+ Prashant Sharma
564
+ Pratik Mallya
565
+ pre-commit-ci[bot]
566
+ Preet Thakkar
567
+ Preston Holmes
568
+ Przemek Wrzos
569
+ Pulkit Goyal
570
+ q0w
571
+ Qiangning Hong
572
+ Quentin Lee
573
+ Quentin Pradet
574
+ R. David Murray
575
+ Rafael Caricio
576
+ Ralf Schmitt
577
+ Razzi Abuissa
578
+ rdb
579
+ Reece Dunham
580
+ Remi Rampin
581
+ Rene Dudfield
582
+ Riccardo Magliocchetti
583
+ Riccardo Schirone
584
+ Richard Jones
585
+ Richard Si
586
+ Ricky Ng-Adam
587
+ Rishi
588
+ RobberPhex
589
+ Robert Collins
590
+ Robert McGibbon
591
+ Robert Pollak
592
+ Robert T. McGibbon
593
+ robin elisha robinson
594
+ Roey Berman
595
+ Rohan Jain
596
+ Roman Bogorodskiy
597
+ Roman Donchenko
598
+ Romuald Brunet
599
+ ronaudinho
600
+ Ronny Pfannschmidt
601
+ Rory McCann
602
+ Ross Brattain
603
+ Roy Wellington Ⅳ
604
+ Ruairidh MacLeod
605
+ Russell Keith-Magee
606
+ Ryan Shepherd
607
+ Ryan Wooden
608
+ ryneeverett
609
+ Sachi King
610
+ Salvatore Rinchiera
611
+ sandeepkiran-js
612
+ Savio Jomton
613
+ schlamar
614
+ Scott Kitterman
615
+ Sean
616
+ seanj
617
+ Sebastian Jordan
618
+ Sebastian Schaetz
619
+ Segev Finer
620
+ SeongSoo Cho
621
+ Sergey Vasilyev
622
+ Seth Michael Larson
623
+ Seth Woodworth
624
+ Shantanu
625
+ shireenrao
626
+ Shivansh-007
627
+ Shlomi Fish
628
+ Shovan Maity
629
+ Simeon Visser
630
+ Simon Cross
631
+ Simon Pichugin
632
+ sinoroc
633
+ sinscary
634
+ snook92
635
+ socketubs
636
+ Sorin Sbarnea
637
+ Srinivas Nyayapati
638
+ Stavros Korokithakis
639
+ Stefan Scherfke
640
+ Stefano Rivera
641
+ Stephan Erb
642
+ Stephen Rosen
643
+ stepshal
644
+ Steve (Gadget) Barnes
645
+ Steve Barnes
646
+ Steve Dower
647
+ Steve Kowalik
648
+ Steven Myint
649
+ Steven Silvester
650
+ stonebig
651
+ Stéphane Bidoul
652
+ Stéphane Bidoul (ACSONE)
653
+ Stéphane Klein
654
+ Sumana Harihareswara
655
+ Surbhi Sharma
656
+ Sviatoslav Sydorenko
657
+ Swat009
658
+ Sylvain
659
+ Takayuki SHIMIZUKAWA
660
+ Taneli Hukkinen
661
+ tbeswick
662
+ Thiago
663
+ Thijs Triemstra
664
+ Thomas Fenzl
665
+ Thomas Grainger
666
+ Thomas Guettler
667
+ Thomas Johansson
668
+ Thomas Kluyver
669
+ Thomas Smith
670
+ Thomas VINCENT
671
+ Tim D. Smith
672
+ Tim Gates
673
+ Tim Harder
674
+ Tim Heap
675
+ tim smith
676
+ tinruufu
677
+ Tobias Hermann
678
+ Tom Forbes
679
+ Tom Freudenheim
680
+ Tom V
681
+ Tomas Hrnciar
682
+ Tomas Orsava
683
+ Tomer Chachamu
684
+ Tommi Enenkel | AnB
685
+ Tomáš Hrnčiar
686
+ Tony Beswick
687
+ Tony Narlock
688
+ Tony Zhaocheng Tan
689
+ TonyBeswick
690
+ toonarmycaptain
691
+ Toshio Kuratomi
692
+ toxinu
693
+ Travis Swicegood
694
+ Tushar Sadhwani
695
+ Tzu-ping Chung
696
+ Valentin Haenel
697
+ Victor Stinner
698
+ victorvpaulo
699
+ Vikram - Google
700
+ Viktor Szépe
701
+ Ville Skyttä
702
+ Vinay Sajip
703
+ Vincent Philippon
704
+ Vinicyus Macedo
705
+ Vipul Kumar
706
+ Vitaly Babiy
707
+ Vladimir Rutsky
708
+ W. Trevor King
709
+ Wil Tan
710
+ Wilfred Hughes
711
+ William Edwards
712
+ William ML Leslie
713
+ William T Olson
714
+ William Woodruff
715
+ Wilson Mo
716
+ wim glenn
717
+ Winson Luk
718
+ Wolfgang Maier
719
+ Wu Zhenyu
720
+ XAMES3
721
+ Xavier Fernandez
722
+ xoviat
723
+ xtreak
724
+ YAMAMOTO Takashi
725
+ Yen Chi Hsuan
726
+ Yeray Diaz Diaz
727
+ Yoval P
728
+ Yu Jian
729
+ Yuan Jing Vincent Yan
730
+ Yusuke Hayashi
731
+ Zearin
732
+ Zhiping Deng
733
+ ziebam
734
+ Zvezdan Petkovic
735
+ Łukasz Langa
736
+ Роман Донченко
737
+ Семён Марьясин
738
+ ‮rekcäH nitraM‮
env/Lib/site-packages/pip-23.2.1.dist-info/INSTALLER ADDED
@@ -0,0 +1 @@
 
 
1
+ pip
env/Lib/site-packages/pip-23.2.1.dist-info/LICENSE.txt ADDED
@@ -0,0 +1,20 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ Copyright (c) 2008-present The pip developers (see AUTHORS.txt file)
2
+
3
+ Permission is hereby granted, free of charge, to any person obtaining
4
+ a copy of this software and associated documentation files (the
5
+ "Software"), to deal in the Software without restriction, including
6
+ without limitation the rights to use, copy, modify, merge, publish,
7
+ distribute, sublicense, and/or sell copies of the Software, and to
8
+ permit persons to whom the Software is furnished to do so, subject to
9
+ the following conditions:
10
+
11
+ The above copyright notice and this permission notice shall be
12
+ included in all copies or substantial portions of the Software.
13
+
14
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
15
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
16
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
17
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
18
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
19
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
20
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
env/Lib/site-packages/pip-23.2.1.dist-info/METADATA ADDED
@@ -0,0 +1,90 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ Metadata-Version: 2.1
2
+ Name: pip
3
+ Version: 23.2.1
4
+ Summary: The PyPA recommended tool for installing Python packages.
5
+ Home-page: https://pip.pypa.io/
6
+ Author: The pip developers
7
+ Author-email: [email protected]
8
+ License: MIT
9
+ Project-URL: Documentation, https://pip.pypa.io
10
+ Project-URL: Source, https://github.com/pypa/pip
11
+ Project-URL: Changelog, https://pip.pypa.io/en/stable/news/
12
+ Classifier: Development Status :: 5 - Production/Stable
13
+ Classifier: Intended Audience :: Developers
14
+ Classifier: License :: OSI Approved :: MIT License
15
+ Classifier: Topic :: Software Development :: Build Tools
16
+ Classifier: Programming Language :: Python
17
+ Classifier: Programming Language :: Python :: 3
18
+ Classifier: Programming Language :: Python :: 3 :: Only
19
+ Classifier: Programming Language :: Python :: 3.7
20
+ Classifier: Programming Language :: Python :: 3.8
21
+ Classifier: Programming Language :: Python :: 3.9
22
+ Classifier: Programming Language :: Python :: 3.10
23
+ Classifier: Programming Language :: Python :: 3.11
24
+ Classifier: Programming Language :: Python :: 3.12
25
+ Classifier: Programming Language :: Python :: Implementation :: CPython
26
+ Classifier: Programming Language :: Python :: Implementation :: PyPy
27
+ Requires-Python: >=3.7
28
+ License-File: LICENSE.txt
29
+ License-File: AUTHORS.txt
30
+
31
+ pip - The Python Package Installer
32
+ ==================================
33
+
34
+ .. image:: https://img.shields.io/pypi/v/pip.svg
35
+ :target: https://pypi.org/project/pip/
36
+
37
+ .. image:: https://readthedocs.org/projects/pip/badge/?version=latest
38
+ :target: https://pip.pypa.io/en/latest
39
+
40
+ pip is the `package installer`_ for Python. You can use pip to install packages from the `Python Package Index`_ and other indexes.
41
+
42
+ Please take a look at our documentation for how to install and use pip:
43
+
44
+ * `Installation`_
45
+ * `Usage`_
46
+
47
+ We release updates regularly, with a new version every 3 months. Find more details in our documentation:
48
+
49
+ * `Release notes`_
50
+ * `Release process`_
51
+
52
+ In pip 20.3, we've `made a big improvement to the heart of pip`_; `learn more`_. We want your input, so `sign up for our user experience research studies`_ to help us do it right.
53
+
54
+ **Note**: pip 21.0, in January 2021, removed Python 2 support, per pip's `Python 2 support policy`_. Please migrate to Python 3.
55
+
56
+ If you find bugs, need help, or want to talk to the developers, please use our mailing lists or chat rooms:
57
+
58
+ * `Issue tracking`_
59
+ * `Discourse channel`_
60
+ * `User IRC`_
61
+
62
+ If you want to get involved head over to GitHub to get the source code, look at our development documentation and feel free to jump on the developer mailing lists and chat rooms:
63
+
64
+ * `GitHub page`_
65
+ * `Development documentation`_
66
+ * `Development IRC`_
67
+
68
+ Code of Conduct
69
+ ---------------
70
+
71
+ Everyone interacting in the pip project's codebases, issue trackers, chat
72
+ rooms, and mailing lists is expected to follow the `PSF Code of Conduct`_.
73
+
74
+ .. _package installer: https://packaging.python.org/guides/tool-recommendations/
75
+ .. _Python Package Index: https://pypi.org
76
+ .. _Installation: https://pip.pypa.io/en/stable/installation/
77
+ .. _Usage: https://pip.pypa.io/en/stable/
78
+ .. _Release notes: https://pip.pypa.io/en/stable/news.html
79
+ .. _Release process: https://pip.pypa.io/en/latest/development/release-process/
80
+ .. _GitHub page: https://github.com/pypa/pip
81
+ .. _Development documentation: https://pip.pypa.io/en/latest/development
82
+ .. _made a big improvement to the heart of pip: https://pyfound.blogspot.com/2020/11/pip-20-3-new-resolver.html
83
+ .. _learn more: https://pip.pypa.io/en/latest/user_guide/#changes-to-the-pip-dependency-resolver-in-20-3-2020
84
+ .. _sign up for our user experience research studies: https://pyfound.blogspot.com/2020/03/new-pip-resolver-to-roll-out-this-year.html
85
+ .. _Python 2 support policy: https://pip.pypa.io/en/latest/development/release-process/#python-2-support
86
+ .. _Issue tracking: https://github.com/pypa/pip/issues
87
+ .. _Discourse channel: https://discuss.python.org/c/packaging
88
+ .. _User IRC: https://kiwiirc.com/nextclient/#ircs://irc.libera.chat:+6697/pypa
89
+ .. _Development IRC: https://kiwiirc.com/nextclient/#ircs://irc.libera.chat:+6697/pypa-dev
90
+ .. _PSF Code of Conduct: https://github.com/pypa/.github/blob/main/CODE_OF_CONDUCT.md
env/Lib/site-packages/pip-23.2.1.dist-info/RECORD ADDED
@@ -0,0 +1,1003 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ ../../Scripts/pip.exe,sha256=dvUMxTK10NF92SmS00w2cTMjTK9K8wtiwuxgiIS95wY,108515
2
+ ../../Scripts/pip3.11.exe,sha256=dvUMxTK10NF92SmS00w2cTMjTK9K8wtiwuxgiIS95wY,108515
3
+ ../../Scripts/pip3.exe,sha256=dvUMxTK10NF92SmS00w2cTMjTK9K8wtiwuxgiIS95wY,108515
4
+ pip-23.2.1.dist-info/AUTHORS.txt,sha256=Pd_qYtjluu4WDft2A179dPtIvwYVBNtDfccCitVRMQM,10082
5
+ pip-23.2.1.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4
6
+ pip-23.2.1.dist-info/LICENSE.txt,sha256=Y0MApmnUmurmWxLGxIySTFGkzfPR_whtw0VtyLyqIQQ,1093
7
+ pip-23.2.1.dist-info/METADATA,sha256=yHPLQvsD1b6f-zdCQWMibZXbsAjs886JMSh3C0oxRhQ,4239
8
+ pip-23.2.1.dist-info/RECORD,,
9
+ pip-23.2.1.dist-info/REQUESTED,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
10
+ pip-23.2.1.dist-info/WHEEL,sha256=pkctZYzUS4AYVn6dJ-7367OJZivF2e8RA9b_ZBjif18,92
11
+ pip-23.2.1.dist-info/entry_points.txt,sha256=xg35gOct0aY8S3ftLtweJ0uw3KBAIVyW4k-0Jx1rkNE,125
12
+ pip-23.2.1.dist-info/top_level.txt,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4
13
+ pip/__init__.py,sha256=hELWH3UN2ilBntczbn1BJOIzJEoiE8w9H-gsR5TeuEk,357
14
+ pip/__main__.py,sha256=WzbhHXTbSE6gBY19mNN9m4s5o_365LOvTYSgqgbdBhE,854
15
+ pip/__pip-runner__.py,sha256=EnrfKmKMzWAdqg_JicLCOP9Y95Ux7zHh4ObvqLtQcjo,1444
16
+ pip/__pycache__/__init__.cpython-311.pyc,,
17
+ pip/__pycache__/__main__.cpython-311.pyc,,
18
+ pip/__pycache__/__pip-runner__.cpython-311.pyc,,
19
+ pip/_internal/__init__.py,sha256=nnFCuxrPMgALrIDxSoy-H6Zj4W4UY60D-uL1aJyq0pc,573
20
+ pip/_internal/__pycache__/__init__.cpython-311.pyc,,
21
+ pip/_internal/__pycache__/build_env.cpython-311.pyc,,
22
+ pip/_internal/__pycache__/cache.cpython-311.pyc,,
23
+ pip/_internal/__pycache__/configuration.cpython-311.pyc,,
24
+ pip/_internal/__pycache__/exceptions.cpython-311.pyc,,
25
+ pip/_internal/__pycache__/main.cpython-311.pyc,,
26
+ pip/_internal/__pycache__/pyproject.cpython-311.pyc,,
27
+ pip/_internal/__pycache__/self_outdated_check.cpython-311.pyc,,
28
+ pip/_internal/__pycache__/wheel_builder.cpython-311.pyc,,
29
+ pip/_internal/build_env.py,sha256=1ESpqw0iupS_K7phZK5zshVE5Czy9BtGLFU4W6Enva8,10243
30
+ pip/_internal/cache.py,sha256=pMyi1n2nfdo7xzLVhmdOvIy1INt27HbqhJNj7vMcWlI,10429
31
+ pip/_internal/cli/__init__.py,sha256=FkHBgpxxb-_gd6r1FjnNhfMOzAUYyXoXKJ6abijfcFU,132
32
+ pip/_internal/cli/__pycache__/__init__.cpython-311.pyc,,
33
+ pip/_internal/cli/__pycache__/autocompletion.cpython-311.pyc,,
34
+ pip/_internal/cli/__pycache__/base_command.cpython-311.pyc,,
35
+ pip/_internal/cli/__pycache__/cmdoptions.cpython-311.pyc,,
36
+ pip/_internal/cli/__pycache__/command_context.cpython-311.pyc,,
37
+ pip/_internal/cli/__pycache__/main.cpython-311.pyc,,
38
+ pip/_internal/cli/__pycache__/main_parser.cpython-311.pyc,,
39
+ pip/_internal/cli/__pycache__/parser.cpython-311.pyc,,
40
+ pip/_internal/cli/__pycache__/progress_bars.cpython-311.pyc,,
41
+ pip/_internal/cli/__pycache__/req_command.cpython-311.pyc,,
42
+ pip/_internal/cli/__pycache__/spinners.cpython-311.pyc,,
43
+ pip/_internal/cli/__pycache__/status_codes.cpython-311.pyc,,
44
+ pip/_internal/cli/autocompletion.py,sha256=wY2JPZY2Eji1vhR7bVo-yCBPJ9LCy6P80iOAhZD1Vi8,6676
45
+ pip/_internal/cli/base_command.py,sha256=ACUUqWkZMU2O1pmUSpfBV3fwb36JzzTHGrbKXyb5f74,8726
46
+ pip/_internal/cli/cmdoptions.py,sha256=0bXhKutppZLBgAL54iK3tTrj-JRVbUB5M_2pHv_wnKk,30030
47
+ pip/_internal/cli/command_context.py,sha256=RHgIPwtObh5KhMrd3YZTkl8zbVG-6Okml7YbFX4Ehg0,774
48
+ pip/_internal/cli/main.py,sha256=Uzxt_YD1hIvB1AW5mxt6IVcht5G712AtMqdo51UMhmQ,2816
49
+ pip/_internal/cli/main_parser.py,sha256=laDpsuBDl6kyfywp9eMMA9s84jfH2TJJn-vmL0GG90w,4338
50
+ pip/_internal/cli/parser.py,sha256=tWP-K1uSxnJyXu3WE0kkH3niAYRBeuUaxeydhzOdhL4,10817
51
+ pip/_internal/cli/progress_bars.py,sha256=So4mPoSjXkXiSHiTzzquH3VVyVD_njXlHJSExYPXAow,1968
52
+ pip/_internal/cli/req_command.py,sha256=GqS9jkeHktOy6zRzC6uhcRY7SelnAV1LZ6OfS_gNcEk,18440
53
+ pip/_internal/cli/spinners.py,sha256=hIJ83GerdFgFCdobIA23Jggetegl_uC4Sp586nzFbPE,5118
54
+ pip/_internal/cli/status_codes.py,sha256=sEFHUaUJbqv8iArL3HAtcztWZmGOFX01hTesSytDEh0,116
55
+ pip/_internal/commands/__init__.py,sha256=5oRO9O3dM2vGuh0bFw4HOVletryrz5HHMmmPWwJrH9U,3882
56
+ pip/_internal/commands/__pycache__/__init__.cpython-311.pyc,,
57
+ pip/_internal/commands/__pycache__/cache.cpython-311.pyc,,
58
+ pip/_internal/commands/__pycache__/check.cpython-311.pyc,,
59
+ pip/_internal/commands/__pycache__/completion.cpython-311.pyc,,
60
+ pip/_internal/commands/__pycache__/configuration.cpython-311.pyc,,
61
+ pip/_internal/commands/__pycache__/debug.cpython-311.pyc,,
62
+ pip/_internal/commands/__pycache__/download.cpython-311.pyc,,
63
+ pip/_internal/commands/__pycache__/freeze.cpython-311.pyc,,
64
+ pip/_internal/commands/__pycache__/hash.cpython-311.pyc,,
65
+ pip/_internal/commands/__pycache__/help.cpython-311.pyc,,
66
+ pip/_internal/commands/__pycache__/index.cpython-311.pyc,,
67
+ pip/_internal/commands/__pycache__/inspect.cpython-311.pyc,,
68
+ pip/_internal/commands/__pycache__/install.cpython-311.pyc,,
69
+ pip/_internal/commands/__pycache__/list.cpython-311.pyc,,
70
+ pip/_internal/commands/__pycache__/search.cpython-311.pyc,,
71
+ pip/_internal/commands/__pycache__/show.cpython-311.pyc,,
72
+ pip/_internal/commands/__pycache__/uninstall.cpython-311.pyc,,
73
+ pip/_internal/commands/__pycache__/wheel.cpython-311.pyc,,
74
+ pip/_internal/commands/cache.py,sha256=aDR3pKRRX9dHobQ2HzKryf02jgOZnGcnfEmX_288Vcg,7581
75
+ pip/_internal/commands/check.py,sha256=Rb13Q28yoLh0j1gpx5SU0jlResNct21eQCRsnaO9xKA,1782
76
+ pip/_internal/commands/completion.py,sha256=2frgchce-GE5Gh9SjEJV-MTcpxy3G9-Es8mpe66nHts,3986
77
+ pip/_internal/commands/configuration.py,sha256=NB5uf8HIX8-li95YLoZO09nALIWlLCHDF5aifSKcBn8,9815
78
+ pip/_internal/commands/debug.py,sha256=AesEID-4gPFDWTwPiPaGZuD4twdT-imaGuMR5ZfSn8s,6591
79
+ pip/_internal/commands/download.py,sha256=e4hw088zGo26WmJaMIRvCniLlLmoOjqolGyfHjsCkCQ,5335
80
+ pip/_internal/commands/freeze.py,sha256=2qjQrH9KWi5Roav0CuR7vc7hWm4uOi_0l6tp3ESKDHM,3172
81
+ pip/_internal/commands/hash.py,sha256=EVVOuvGtoPEdFi8SNnmdqlCQrhCxV-kJsdwtdcCnXGQ,1703
82
+ pip/_internal/commands/help.py,sha256=gcc6QDkcgHMOuAn5UxaZwAStsRBrnGSn_yxjS57JIoM,1132
83
+ pip/_internal/commands/index.py,sha256=cGQVSA5dAs7caQ9sz4kllYvaI4ZpGiq1WhCgaImXNSA,4793
84
+ pip/_internal/commands/inspect.py,sha256=2wSPt9yfr3r6g-s2S5L6PvRtaHNVyb4TuodMStJ39cw,3188
85
+ pip/_internal/commands/install.py,sha256=sdi44xeJlENfU-ziPl1TbUC3no2-ZGDpwBigmX1JuM0,28934
86
+ pip/_internal/commands/list.py,sha256=LNL6016BPvFpAZVzNoo_DWDzvRFpfw__m9Rp5kw-yUM,12457
87
+ pip/_internal/commands/search.py,sha256=sbBZiARRc050QquOKcCvOr2K3XLsoYebLKZGRi__iUI,5697
88
+ pip/_internal/commands/show.py,sha256=t5jia4zcYJRJZy4U_Von7zMl03hJmmcofj6oDNTnj7Y,6419
89
+ pip/_internal/commands/uninstall.py,sha256=OIqO9tqadY8kM4HwhFf1Q62fUIp7v8KDrTRo8yWMz7Y,3886
90
+ pip/_internal/commands/wheel.py,sha256=CSnX8Pmf1oPCnd7j7bn1_f58G9KHNiAblvVJ5zykN-A,6476
91
+ pip/_internal/configuration.py,sha256=i_dePJKndPAy7hf48Sl6ZuPyl3tFPCE67z0SNatwuwE,13839
92
+ pip/_internal/distributions/__init__.py,sha256=Hq6kt6gXBgjNit5hTTWLAzeCNOKoB-N0pGYSqehrli8,858
93
+ pip/_internal/distributions/__pycache__/__init__.cpython-311.pyc,,
94
+ pip/_internal/distributions/__pycache__/base.cpython-311.pyc,,
95
+ pip/_internal/distributions/__pycache__/installed.cpython-311.pyc,,
96
+ pip/_internal/distributions/__pycache__/sdist.cpython-311.pyc,,
97
+ pip/_internal/distributions/__pycache__/wheel.cpython-311.pyc,,
98
+ pip/_internal/distributions/base.py,sha256=jrF1Vi7eGyqFqMHrieh1PIOrGU7KeCxhYPZnbvtmvGY,1221
99
+ pip/_internal/distributions/installed.py,sha256=NI2OgsgH9iBq9l5vB-56vOg5YsybOy-AU4VE5CSCO2I,729
100
+ pip/_internal/distributions/sdist.py,sha256=SQBdkatXSigKGG_SaD0U0p1Jwdfrg26UCNcHgkXZfdA,6494
101
+ pip/_internal/distributions/wheel.py,sha256=m-J4XO-gvFerlYsFzzSXYDvrx8tLZlJFTCgDxctn8ig,1164
102
+ pip/_internal/exceptions.py,sha256=LyTVY2dANx-i_TEk5Yr9YcwUtiy0HOEFCAQq1F_46co,23737
103
+ pip/_internal/index/__init__.py,sha256=vpt-JeTZefh8a-FC22ZeBSXFVbuBcXSGiILhQZJaNpQ,30
104
+ pip/_internal/index/__pycache__/__init__.cpython-311.pyc,,
105
+ pip/_internal/index/__pycache__/collector.cpython-311.pyc,,
106
+ pip/_internal/index/__pycache__/package_finder.cpython-311.pyc,,
107
+ pip/_internal/index/__pycache__/sources.cpython-311.pyc,,
108
+ pip/_internal/index/collector.py,sha256=3OmYZ3tCoRPGOrELSgQWG-03M-bQHa2-VCA3R_nJAaU,16504
109
+ pip/_internal/index/package_finder.py,sha256=rrUw4vj7QE_eMt022jw--wQiKznMaUgVBkJ1UCrVUxo,37873
110
+ pip/_internal/index/sources.py,sha256=7jw9XSeeQA5K-H4I5a5034Ks2gkQqm4zPXjrhwnP1S4,6556
111
+ pip/_internal/locations/__init__.py,sha256=Dh8LJWG8LRlDK4JIj9sfRF96TREzE--N_AIlx7Tqoe4,15365
112
+ pip/_internal/locations/__pycache__/__init__.cpython-311.pyc,,
113
+ pip/_internal/locations/__pycache__/_distutils.cpython-311.pyc,,
114
+ pip/_internal/locations/__pycache__/_sysconfig.cpython-311.pyc,,
115
+ pip/_internal/locations/__pycache__/base.cpython-311.pyc,,
116
+ pip/_internal/locations/_distutils.py,sha256=cmi6h63xYNXhQe7KEWEMaANjHFy5yQOPt_1_RCWyXMY,6100
117
+ pip/_internal/locations/_sysconfig.py,sha256=jyNVtUfMIf0mtyY-Xp1m9yQ8iwECozSVVFmjkN9a2yw,7680
118
+ pip/_internal/locations/base.py,sha256=RQiPi1d4FVM2Bxk04dQhXZ2PqkeljEL2fZZ9SYqIQ78,2556
119
+ pip/_internal/main.py,sha256=r-UnUe8HLo5XFJz8inTcOOTiu_sxNhgHb6VwlGUllOI,340
120
+ pip/_internal/metadata/__init__.py,sha256=84j1dPJaIoz5Q2ZTPi0uB1iaDAHiUNfKtYSGQCfFKpo,4280
121
+ pip/_internal/metadata/__pycache__/__init__.cpython-311.pyc,,
122
+ pip/_internal/metadata/__pycache__/_json.cpython-311.pyc,,
123
+ pip/_internal/metadata/__pycache__/base.cpython-311.pyc,,
124
+ pip/_internal/metadata/__pycache__/pkg_resources.cpython-311.pyc,,
125
+ pip/_internal/metadata/_json.py,sha256=BTkWfFDrWFwuSodImjtbAh8wCL3isecbnjTb5E6UUDI,2595
126
+ pip/_internal/metadata/base.py,sha256=vIwIo1BtoqegehWMAXhNrpLGYBq245rcaCNkBMPnTU8,25277
127
+ pip/_internal/metadata/importlib/__init__.py,sha256=9ZVO8BoE7NEZPmoHp5Ap_NJo0HgNIezXXg-TFTtt3Z4,107
128
+ pip/_internal/metadata/importlib/__pycache__/__init__.cpython-311.pyc,,
129
+ pip/_internal/metadata/importlib/__pycache__/_compat.cpython-311.pyc,,
130
+ pip/_internal/metadata/importlib/__pycache__/_dists.cpython-311.pyc,,
131
+ pip/_internal/metadata/importlib/__pycache__/_envs.cpython-311.pyc,,
132
+ pip/_internal/metadata/importlib/_compat.py,sha256=GAe_prIfCE4iUylrnr_2dJRlkkBVRUbOidEoID7LPoE,1882
133
+ pip/_internal/metadata/importlib/_dists.py,sha256=BUV8y6D0PePZrEN3vfJL-m1FDqZ6YPRgAiBeBinHhNg,8181
134
+ pip/_internal/metadata/importlib/_envs.py,sha256=I1DHMyAgZb8jT8CYndWl2aw2dN675p-BKPCuJhvdhrY,7435
135
+ pip/_internal/metadata/pkg_resources.py,sha256=WjwiNdRsvxqxL4MA5Tb5a_q3Q3sUhdpbZF8wGLtPMI0,9773
136
+ pip/_internal/models/__init__.py,sha256=3DHUd_qxpPozfzouoqa9g9ts1Czr5qaHfFxbnxriepM,63
137
+ pip/_internal/models/__pycache__/__init__.cpython-311.pyc,,
138
+ pip/_internal/models/__pycache__/candidate.cpython-311.pyc,,
139
+ pip/_internal/models/__pycache__/direct_url.cpython-311.pyc,,
140
+ pip/_internal/models/__pycache__/format_control.cpython-311.pyc,,
141
+ pip/_internal/models/__pycache__/index.cpython-311.pyc,,
142
+ pip/_internal/models/__pycache__/installation_report.cpython-311.pyc,,
143
+ pip/_internal/models/__pycache__/link.cpython-311.pyc,,
144
+ pip/_internal/models/__pycache__/scheme.cpython-311.pyc,,
145
+ pip/_internal/models/__pycache__/search_scope.cpython-311.pyc,,
146
+ pip/_internal/models/__pycache__/selection_prefs.cpython-311.pyc,,
147
+ pip/_internal/models/__pycache__/target_python.cpython-311.pyc,,
148
+ pip/_internal/models/__pycache__/wheel.cpython-311.pyc,,
149
+ pip/_internal/models/candidate.py,sha256=6pcABsaR7CfIHlbJbr2_kMkVJFL_yrYjTx6SVWUnCPQ,990
150
+ pip/_internal/models/direct_url.py,sha256=EepBxI97j7wSZ3AmRETYyVTmR9NoTas15vc8popxVTg,6931
151
+ pip/_internal/models/format_control.py,sha256=DJpMYjxeYKKQdwNcML2_F0vtAh-qnKTYe-CpTxQe-4g,2520
152
+ pip/_internal/models/index.py,sha256=tYnL8oxGi4aSNWur0mG8DAP7rC6yuha_MwJO8xw0crI,1030
153
+ pip/_internal/models/installation_report.py,sha256=ueXv1RiMLAucaTuEvXACXX5R64_Wcm8b1Ztqx4Rd5xI,2609
154
+ pip/_internal/models/link.py,sha256=6OEk3bt41WU7QZoiyuoVPGsKOU-J_BbDDhouKbIXm0Y,20819
155
+ pip/_internal/models/scheme.py,sha256=3EFQp_ICu_shH1-TBqhl0QAusKCPDFOlgHFeN4XowWs,738
156
+ pip/_internal/models/search_scope.py,sha256=ASVyyZxiJILw7bTIVVpJx8J293M3Hk5F33ilGn0e80c,4643
157
+ pip/_internal/models/selection_prefs.py,sha256=KZdi66gsR-_RUXUr9uejssk3rmTHrQVJWeNA2sV-VSY,1907
158
+ pip/_internal/models/target_python.py,sha256=qKpZox7J8NAaPmDs5C_aniwfPDxzvpkrCKqfwndG87k,3858
159
+ pip/_internal/models/wheel.py,sha256=YqazoIZyma_Q1ejFa1C7NHKQRRWlvWkdK96VRKmDBeI,3600
160
+ pip/_internal/network/__init__.py,sha256=jf6Tt5nV_7zkARBrKojIXItgejvoegVJVKUbhAa5Ioc,50
161
+ pip/_internal/network/__pycache__/__init__.cpython-311.pyc,,
162
+ pip/_internal/network/__pycache__/auth.cpython-311.pyc,,
163
+ pip/_internal/network/__pycache__/cache.cpython-311.pyc,,
164
+ pip/_internal/network/__pycache__/download.cpython-311.pyc,,
165
+ pip/_internal/network/__pycache__/lazy_wheel.cpython-311.pyc,,
166
+ pip/_internal/network/__pycache__/session.cpython-311.pyc,,
167
+ pip/_internal/network/__pycache__/utils.cpython-311.pyc,,
168
+ pip/_internal/network/__pycache__/xmlrpc.cpython-311.pyc,,
169
+ pip/_internal/network/auth.py,sha256=TC-OcW2KU4W6R1hU4qPgQXvVH54adACpZz6sWq-R9NA,20541
170
+ pip/_internal/network/cache.py,sha256=hgXftU-eau4MWxHSLquTMzepYq5BPC2zhCkhN3glBy8,2145
171
+ pip/_internal/network/download.py,sha256=HvDDq9bVqaN3jcS3DyVJHP7uTqFzbShdkf7NFSoHfkw,6096
172
+ pip/_internal/network/lazy_wheel.py,sha256=2PXVduYZPCPZkkQFe1J1GbfHJWeCU--FXonGyIfw9eU,7638
173
+ pip/_internal/network/session.py,sha256=uhovd4J7abd0Yr2g426yC4aC6Uw1VKrQfpzalsEBEMw,18607
174
+ pip/_internal/network/utils.py,sha256=6A5SrUJEEUHxbGtbscwU2NpCyz-3ztiDlGWHpRRhsJ8,4073
175
+ pip/_internal/network/xmlrpc.py,sha256=AzQgG4GgS152_cqmGr_Oz2MIXsCal-xfsis7fA7nmU0,1791
176
+ pip/_internal/operations/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
177
+ pip/_internal/operations/__pycache__/__init__.cpython-311.pyc,,
178
+ pip/_internal/operations/__pycache__/check.cpython-311.pyc,,
179
+ pip/_internal/operations/__pycache__/freeze.cpython-311.pyc,,
180
+ pip/_internal/operations/__pycache__/prepare.cpython-311.pyc,,
181
+ pip/_internal/operations/build/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
182
+ pip/_internal/operations/build/__pycache__/__init__.cpython-311.pyc,,
183
+ pip/_internal/operations/build/__pycache__/build_tracker.cpython-311.pyc,,
184
+ pip/_internal/operations/build/__pycache__/metadata.cpython-311.pyc,,
185
+ pip/_internal/operations/build/__pycache__/metadata_editable.cpython-311.pyc,,
186
+ pip/_internal/operations/build/__pycache__/metadata_legacy.cpython-311.pyc,,
187
+ pip/_internal/operations/build/__pycache__/wheel.cpython-311.pyc,,
188
+ pip/_internal/operations/build/__pycache__/wheel_editable.cpython-311.pyc,,
189
+ pip/_internal/operations/build/__pycache__/wheel_legacy.cpython-311.pyc,,
190
+ pip/_internal/operations/build/build_tracker.py,sha256=vf81EwomN3xe9G8qRJED0VGqNikmRQRQoobNsxi5Xrs,4133
191
+ pip/_internal/operations/build/metadata.py,sha256=9S0CUD8U3QqZeXp-Zyt8HxwU90lE4QrnYDgrqZDzBnc,1422
192
+ pip/_internal/operations/build/metadata_editable.py,sha256=VLL7LvntKE8qxdhUdEJhcotFzUsOSI8NNS043xULKew,1474
193
+ pip/_internal/operations/build/metadata_legacy.py,sha256=o-eU21As175hDC7dluM1fJJ_FqokTIShyWpjKaIpHZw,2198
194
+ pip/_internal/operations/build/wheel.py,sha256=sT12FBLAxDC6wyrDorh8kvcZ1jG5qInCRWzzP-UkJiQ,1075
195
+ pip/_internal/operations/build/wheel_editable.py,sha256=yOtoH6zpAkoKYEUtr8FhzrYnkNHQaQBjWQ2HYae1MQg,1417
196
+ pip/_internal/operations/build/wheel_legacy.py,sha256=C9j6rukgQI1n_JeQLoZGuDdfUwzCXShyIdPTp6edbMQ,3064
197
+ pip/_internal/operations/check.py,sha256=LD5BisEdT9vgzS7rLYUuk01z0l4oMj2Q7SsAxVu-pEk,6806
198
+ pip/_internal/operations/freeze.py,sha256=uqoeTAf6HOYVMR2UgAT8N85UZoGEVEoQdan_Ao6SOfk,9816
199
+ pip/_internal/operations/install/__init__.py,sha256=mX7hyD2GNBO2mFGokDQ30r_GXv7Y_PLdtxcUv144e-s,51
200
+ pip/_internal/operations/install/__pycache__/__init__.cpython-311.pyc,,
201
+ pip/_internal/operations/install/__pycache__/editable_legacy.cpython-311.pyc,,
202
+ pip/_internal/operations/install/__pycache__/wheel.cpython-311.pyc,,
203
+ pip/_internal/operations/install/editable_legacy.py,sha256=YeR0KadWXw_ZheC1NtAG1qVIEkOgRGHc23x-YtGW7NU,1282
204
+ pip/_internal/operations/install/wheel.py,sha256=8lsVMt_FAuiGNsf_e7C7_cCSOEO7pHyjgVmRNx-WXrw,27475
205
+ pip/_internal/operations/prepare.py,sha256=nxjIiGRSiUUSRFpwN-Qro7N6BE9jqV4mudJ7CIv9qwY,28868
206
+ pip/_internal/pyproject.py,sha256=ltmrXWaMXjiJHbYyzWplTdBvPYPdKk99GjKuQVypGZU,7161
207
+ pip/_internal/req/__init__.py,sha256=TELFgZOof3lhMmaICVWL9U7PlhXo9OufokbMAJ6J2GI,2738
208
+ pip/_internal/req/__pycache__/__init__.cpython-311.pyc,,
209
+ pip/_internal/req/__pycache__/constructors.cpython-311.pyc,,
210
+ pip/_internal/req/__pycache__/req_file.cpython-311.pyc,,
211
+ pip/_internal/req/__pycache__/req_install.cpython-311.pyc,,
212
+ pip/_internal/req/__pycache__/req_set.cpython-311.pyc,,
213
+ pip/_internal/req/__pycache__/req_uninstall.cpython-311.pyc,,
214
+ pip/_internal/req/constructors.py,sha256=8YE-eNXMSZ1lgsJZg-HnIo8EdaGfiOM2t3EaLlLD5Og,16610
215
+ pip/_internal/req/req_file.py,sha256=5PCO4GnDEnUENiFj4vD_1QmAMjHNtvN6HXbETZ9UGok,17872
216
+ pip/_internal/req/req_install.py,sha256=hpG29Bm2PAq7G-ogTatZcNUgjwt0zpdTXtxGw4M_MtU,33084
217
+ pip/_internal/req/req_set.py,sha256=pSCcIKURDkGb6JAKsc-cdvnvnAJlYPk-p3vvON9M3DY,4704
218
+ pip/_internal/req/req_uninstall.py,sha256=sGwa_yZ6X2NcRSUJWzUlYkf8bDEjRySAE3aQ5OewIWA,24678
219
+ pip/_internal/resolution/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
220
+ pip/_internal/resolution/__pycache__/__init__.cpython-311.pyc,,
221
+ pip/_internal/resolution/__pycache__/base.cpython-311.pyc,,
222
+ pip/_internal/resolution/base.py,sha256=qlmh325SBVfvG6Me9gc5Nsh5sdwHBwzHBq6aEXtKsLA,583
223
+ pip/_internal/resolution/legacy/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
224
+ pip/_internal/resolution/legacy/__pycache__/__init__.cpython-311.pyc,,
225
+ pip/_internal/resolution/legacy/__pycache__/resolver.cpython-311.pyc,,
226
+ pip/_internal/resolution/legacy/resolver.py,sha256=th-eTPIvbecfJaUsdrbH1aHQvDV2yCE-RhrrpsJhKbE,24128
227
+ pip/_internal/resolution/resolvelib/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
228
+ pip/_internal/resolution/resolvelib/__pycache__/__init__.cpython-311.pyc,,
229
+ pip/_internal/resolution/resolvelib/__pycache__/base.cpython-311.pyc,,
230
+ pip/_internal/resolution/resolvelib/__pycache__/candidates.cpython-311.pyc,,
231
+ pip/_internal/resolution/resolvelib/__pycache__/factory.cpython-311.pyc,,
232
+ pip/_internal/resolution/resolvelib/__pycache__/found_candidates.cpython-311.pyc,,
233
+ pip/_internal/resolution/resolvelib/__pycache__/provider.cpython-311.pyc,,
234
+ pip/_internal/resolution/resolvelib/__pycache__/reporter.cpython-311.pyc,,
235
+ pip/_internal/resolution/resolvelib/__pycache__/requirements.cpython-311.pyc,,
236
+ pip/_internal/resolution/resolvelib/__pycache__/resolver.cpython-311.pyc,,
237
+ pip/_internal/resolution/resolvelib/base.py,sha256=u1O4fkvCO4mhmu5i32xrDv9AX5NgUci_eYVyBDQhTIM,5220
238
+ pip/_internal/resolution/resolvelib/candidates.py,sha256=u5mU96o2lnUy-ODRJv7Wevee0xCYI6IKIXNamSBQnso,18969
239
+ pip/_internal/resolution/resolvelib/factory.py,sha256=y1Q2fsV1GKDKPitoapOLLEs75WNzEpd4l_RezCt927c,27845
240
+ pip/_internal/resolution/resolvelib/found_candidates.py,sha256=hvL3Hoa9VaYo-qEOZkBi2Iqw251UDxPz-uMHVaWmLpE,5705
241
+ pip/_internal/resolution/resolvelib/provider.py,sha256=4t23ivjruqM6hKBX1KpGiTt-M4HGhRcZnGLV0c01K7U,9824
242
+ pip/_internal/resolution/resolvelib/reporter.py,sha256=YFm9hQvz4DFCbjZeFTQ56hTz3Ac-mDBnHkeNRVvMHLY,3100
243
+ pip/_internal/resolution/resolvelib/requirements.py,sha256=zHnERhfubmvKyM3kgdAOs0dYFiqUfzKR-DAt4y0NWOI,5454
244
+ pip/_internal/resolution/resolvelib/resolver.py,sha256=n2Vn9EC5-7JmcRY5erIPQ4hUWnEUngG0oYS3JW3xXZo,11642
245
+ pip/_internal/self_outdated_check.py,sha256=pnqBuKKZQ8OxKP0MaUUiDHl3AtyoMJHHG4rMQ7YcYXY,8167
246
+ pip/_internal/utils/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
247
+ pip/_internal/utils/__pycache__/__init__.cpython-311.pyc,,
248
+ pip/_internal/utils/__pycache__/_jaraco_text.cpython-311.pyc,,
249
+ pip/_internal/utils/__pycache__/_log.cpython-311.pyc,,
250
+ pip/_internal/utils/__pycache__/appdirs.cpython-311.pyc,,
251
+ pip/_internal/utils/__pycache__/compat.cpython-311.pyc,,
252
+ pip/_internal/utils/__pycache__/compatibility_tags.cpython-311.pyc,,
253
+ pip/_internal/utils/__pycache__/datetime.cpython-311.pyc,,
254
+ pip/_internal/utils/__pycache__/deprecation.cpython-311.pyc,,
255
+ pip/_internal/utils/__pycache__/direct_url_helpers.cpython-311.pyc,,
256
+ pip/_internal/utils/__pycache__/egg_link.cpython-311.pyc,,
257
+ pip/_internal/utils/__pycache__/encoding.cpython-311.pyc,,
258
+ pip/_internal/utils/__pycache__/entrypoints.cpython-311.pyc,,
259
+ pip/_internal/utils/__pycache__/filesystem.cpython-311.pyc,,
260
+ pip/_internal/utils/__pycache__/filetypes.cpython-311.pyc,,
261
+ pip/_internal/utils/__pycache__/glibc.cpython-311.pyc,,
262
+ pip/_internal/utils/__pycache__/hashes.cpython-311.pyc,,
263
+ pip/_internal/utils/__pycache__/inject_securetransport.cpython-311.pyc,,
264
+ pip/_internal/utils/__pycache__/logging.cpython-311.pyc,,
265
+ pip/_internal/utils/__pycache__/misc.cpython-311.pyc,,
266
+ pip/_internal/utils/__pycache__/models.cpython-311.pyc,,
267
+ pip/_internal/utils/__pycache__/packaging.cpython-311.pyc,,
268
+ pip/_internal/utils/__pycache__/setuptools_build.cpython-311.pyc,,
269
+ pip/_internal/utils/__pycache__/subprocess.cpython-311.pyc,,
270
+ pip/_internal/utils/__pycache__/temp_dir.cpython-311.pyc,,
271
+ pip/_internal/utils/__pycache__/unpacking.cpython-311.pyc,,
272
+ pip/_internal/utils/__pycache__/urls.cpython-311.pyc,,
273
+ pip/_internal/utils/__pycache__/virtualenv.cpython-311.pyc,,
274
+ pip/_internal/utils/__pycache__/wheel.cpython-311.pyc,,
275
+ pip/_internal/utils/_jaraco_text.py,sha256=yvDGelTVugRayPaOF2k4ab0Ky4d3uOkAfuOQjASjImY,3351
276
+ pip/_internal/utils/_log.py,sha256=-jHLOE_THaZz5BFcCnoSL9EYAtJ0nXem49s9of4jvKw,1015
277
+ pip/_internal/utils/appdirs.py,sha256=swgcTKOm3daLeXTW6v5BUS2Ti2RvEnGRQYH_yDXklAo,1665
278
+ pip/_internal/utils/compat.py,sha256=ACyBfLgj3_XG-iA5omEDrXqDM0cQKzi8h8HRBInzG6Q,1884
279
+ pip/_internal/utils/compatibility_tags.py,sha256=ydin8QG8BHqYRsPY4OL6cmb44CbqXl1T0xxS97VhHkk,5377
280
+ pip/_internal/utils/datetime.py,sha256=m21Y3wAtQc-ji6Veb6k_M5g6A0ZyFI4egchTdnwh-pQ,242
281
+ pip/_internal/utils/deprecation.py,sha256=NKo8VqLioJ4nnXXGmW4KdasxF90EFHkZaHeX1fT08C8,3627
282
+ pip/_internal/utils/direct_url_helpers.py,sha256=6F1tc2rcKaCZmgfVwsE6ObIe_Pux23mUVYA-2D9wCFc,3206
283
+ pip/_internal/utils/egg_link.py,sha256=ZryCchR_yQSCsdsMkCpxQjjLbQxObA5GDtLG0RR5mGc,2118
284
+ pip/_internal/utils/encoding.py,sha256=qqsXDtiwMIjXMEiIVSaOjwH5YmirCaK-dIzb6-XJsL0,1169
285
+ pip/_internal/utils/entrypoints.py,sha256=YlhLTRl2oHBAuqhc-zmL7USS67TPWVHImjeAQHreZTQ,3064
286
+ pip/_internal/utils/filesystem.py,sha256=RhMIXUaNVMGjc3rhsDahWQ4MavvEQDdqXqgq-F6fpw8,5122
287
+ pip/_internal/utils/filetypes.py,sha256=i8XAQ0eFCog26Fw9yV0Yb1ygAqKYB1w9Cz9n0fj8gZU,716
288
+ pip/_internal/utils/glibc.py,sha256=Mesxxgg3BLxheLZx-dSf30b6gKpOgdVXw6W--uHSszQ,3113
289
+ pip/_internal/utils/hashes.py,sha256=MjOigC75z6qoRMkgHiHqot7eqxfwDZSrEflJMPm-bHE,5118
290
+ pip/_internal/utils/inject_securetransport.py,sha256=o-QRVMGiENrTJxw3fAhA7uxpdEdw6M41TjHYtSVRrcg,795
291
+ pip/_internal/utils/logging.py,sha256=U2q0i1n8hPS2gQh8qcocAg5dovGAa_bR24akmXMzrk4,11632
292
+ pip/_internal/utils/misc.py,sha256=Ds3rSQU7HbdAywwmEBcPnVoLB1Tp_2gL6IbaWcpe8i0,22343
293
+ pip/_internal/utils/models.py,sha256=5GoYU586SrxURMvDn_jBMJInitviJg4O5-iOU-6I0WY,1193
294
+ pip/_internal/utils/packaging.py,sha256=5Wm6_x7lKrlqVjPI5MBN_RurcRHwVYoQ7Ksrs84de7s,2108
295
+ pip/_internal/utils/setuptools_build.py,sha256=ouXpud-jeS8xPyTPsXJ-m34NPvK5os45otAzdSV_IJE,4435
296
+ pip/_internal/utils/subprocess.py,sha256=0EMhgfPGFk8FZn6Qq7Hp9PN6YHuQNWiVby4DXcTCON4,9200
297
+ pip/_internal/utils/temp_dir.py,sha256=aCX489gRa4Nu0dMKRFyGhV6maJr60uEynu5uCbKR4Qg,7702
298
+ pip/_internal/utils/unpacking.py,sha256=SBb2iV1crb89MDRTEKY86R4A_UOWApTQn9VQVcMDOlE,8821
299
+ pip/_internal/utils/urls.py,sha256=AhaesUGl-9it6uvG6fsFPOr9ynFpGaTMk4t5XTX7Z_Q,1759
300
+ pip/_internal/utils/virtualenv.py,sha256=S6f7csYorRpiD6cvn3jISZYc3I8PJC43H5iMFpRAEDU,3456
301
+ pip/_internal/utils/wheel.py,sha256=lXOgZyTlOm5HmK8tw5iw0A3_5A6wRzsXHOaQkIvvloU,4549
302
+ pip/_internal/vcs/__init__.py,sha256=UAqvzpbi0VbZo3Ub6skEeZAw-ooIZR-zX_WpCbxyCoU,596
303
+ pip/_internal/vcs/__pycache__/__init__.cpython-311.pyc,,
304
+ pip/_internal/vcs/__pycache__/bazaar.cpython-311.pyc,,
305
+ pip/_internal/vcs/__pycache__/git.cpython-311.pyc,,
306
+ pip/_internal/vcs/__pycache__/mercurial.cpython-311.pyc,,
307
+ pip/_internal/vcs/__pycache__/subversion.cpython-311.pyc,,
308
+ pip/_internal/vcs/__pycache__/versioncontrol.cpython-311.pyc,,
309
+ pip/_internal/vcs/bazaar.py,sha256=j0oin0fpGRHcCFCxEcpPCQoFEvA-DMLULKdGP8Nv76o,3519
310
+ pip/_internal/vcs/git.py,sha256=mjhwudCx9WlLNkxZ6_kOKmueF0rLoU2i1xeASKF6yiQ,18116
311
+ pip/_internal/vcs/mercurial.py,sha256=1FG5Zh2ltJZKryO40d2l2Q91FYNazuS16kkpoAVOh0Y,5244
312
+ pip/_internal/vcs/subversion.py,sha256=vhZs8L-TNggXqM1bbhl-FpbxE3TrIB6Tgnx8fh3S2HE,11729
313
+ pip/_internal/vcs/versioncontrol.py,sha256=KUOc-hN51em9jrqxKwUR3JnkgSE-xSOqMiiJcSaL6B8,22811
314
+ pip/_internal/wheel_builder.py,sha256=3UlHfxQi7_AAXI7ur8aPpPbmqHhecCsubmkHEl-00KU,11842
315
+ pip/_vendor/__init__.py,sha256=fNxOSVD0auElsD8fN9tuq5psfgMQ-RFBtD4X5gjlRkg,4966
316
+ pip/_vendor/__pycache__/__init__.cpython-311.pyc,,
317
+ pip/_vendor/__pycache__/six.cpython-311.pyc,,
318
+ pip/_vendor/__pycache__/typing_extensions.cpython-311.pyc,,
319
+ pip/_vendor/cachecontrol/__init__.py,sha256=hrxlv3q7upsfyMw8k3gQ9vagBax1pYHSGGqYlZ0Zk0M,465
320
+ pip/_vendor/cachecontrol/__pycache__/__init__.cpython-311.pyc,,
321
+ pip/_vendor/cachecontrol/__pycache__/_cmd.cpython-311.pyc,,
322
+ pip/_vendor/cachecontrol/__pycache__/adapter.cpython-311.pyc,,
323
+ pip/_vendor/cachecontrol/__pycache__/cache.cpython-311.pyc,,
324
+ pip/_vendor/cachecontrol/__pycache__/compat.cpython-311.pyc,,
325
+ pip/_vendor/cachecontrol/__pycache__/controller.cpython-311.pyc,,
326
+ pip/_vendor/cachecontrol/__pycache__/filewrapper.cpython-311.pyc,,
327
+ pip/_vendor/cachecontrol/__pycache__/heuristics.cpython-311.pyc,,
328
+ pip/_vendor/cachecontrol/__pycache__/serialize.cpython-311.pyc,,
329
+ pip/_vendor/cachecontrol/__pycache__/wrapper.cpython-311.pyc,,
330
+ pip/_vendor/cachecontrol/_cmd.py,sha256=lxUXqfNTVx84zf6tcWbkLZHA6WVBRtJRpfeA9ZqhaAY,1379
331
+ pip/_vendor/cachecontrol/adapter.py,sha256=ew9OYEQHEOjvGl06ZsuX8W3DAvHWsQKHwWAxISyGug8,5033
332
+ pip/_vendor/cachecontrol/cache.py,sha256=Tty45fOjH40fColTGkqKQvQQmbYsMpk-nCyfLcv2vG4,1535
333
+ pip/_vendor/cachecontrol/caches/__init__.py,sha256=h-1cUmOz6mhLsjTjOrJ8iPejpGdLCyG4lzTftfGZvLg,242
334
+ pip/_vendor/cachecontrol/caches/__pycache__/__init__.cpython-311.pyc,,
335
+ pip/_vendor/cachecontrol/caches/__pycache__/file_cache.cpython-311.pyc,,
336
+ pip/_vendor/cachecontrol/caches/__pycache__/redis_cache.cpython-311.pyc,,
337
+ pip/_vendor/cachecontrol/caches/file_cache.py,sha256=GpexcE29LoY4MaZwPUTcUBZaDdcsjqyLxZFznk8Hbr4,5271
338
+ pip/_vendor/cachecontrol/caches/redis_cache.py,sha256=mp-QWonP40I3xJGK3XVO-Gs9a3UjzlqqEmp9iLJH9F4,1033
339
+ pip/_vendor/cachecontrol/compat.py,sha256=LNx7vqBndYdHU8YuJt53ab_8rzMGTXVrvMb7CZJkxG0,778
340
+ pip/_vendor/cachecontrol/controller.py,sha256=bAYrt7x_VH4toNpI066LQxbHpYGpY1MxxmZAhspplvw,16416
341
+ pip/_vendor/cachecontrol/filewrapper.py,sha256=X4BAQOO26GNOR7nH_fhTzAfeuct2rBQcx_15MyFBpcs,3946
342
+ pip/_vendor/cachecontrol/heuristics.py,sha256=8kAyuZLSCyEIgQr6vbUwfhpqg9ows4mM0IV6DWazevI,4154
343
+ pip/_vendor/cachecontrol/serialize.py,sha256=_U1NU_C-SDgFzkbAxAsPDgMTHeTWZZaHCQnZN_jh0U8,7105
344
+ pip/_vendor/cachecontrol/wrapper.py,sha256=X3-KMZ20Ho3VtqyVaXclpeQpFzokR5NE8tZSfvKVaB8,774
345
+ pip/_vendor/certifi/__init__.py,sha256=q5ePznlfOw-XYIOV6RTnh45yS9haN-Nb1d__4QXc3g0,94
346
+ pip/_vendor/certifi/__main__.py,sha256=1k3Cr95vCxxGRGDljrW3wMdpZdL3Nhf0u1n-k2qdsCY,255
347
+ pip/_vendor/certifi/__pycache__/__init__.cpython-311.pyc,,
348
+ pip/_vendor/certifi/__pycache__/__main__.cpython-311.pyc,,
349
+ pip/_vendor/certifi/__pycache__/core.cpython-311.pyc,,
350
+ pip/_vendor/certifi/cacert.pem,sha256=swFTXcpJHZgU6ij6oyCsehnQ9dlCN5lvoKO1qTZDJRQ,278952
351
+ pip/_vendor/certifi/core.py,sha256=ZwiOsv-sD_ouU1ft8wy_xZ3LQ7UbcVzyqj2XNyrsZis,4279
352
+ pip/_vendor/chardet/__init__.py,sha256=57R-HSxj0PWmILMN0GFmUNqEMfrEVSamXyjD-W6_fbs,4797
353
+ pip/_vendor/chardet/__pycache__/__init__.cpython-311.pyc,,
354
+ pip/_vendor/chardet/__pycache__/big5freq.cpython-311.pyc,,
355
+ pip/_vendor/chardet/__pycache__/big5prober.cpython-311.pyc,,
356
+ pip/_vendor/chardet/__pycache__/chardistribution.cpython-311.pyc,,
357
+ pip/_vendor/chardet/__pycache__/charsetgroupprober.cpython-311.pyc,,
358
+ pip/_vendor/chardet/__pycache__/charsetprober.cpython-311.pyc,,
359
+ pip/_vendor/chardet/__pycache__/codingstatemachine.cpython-311.pyc,,
360
+ pip/_vendor/chardet/__pycache__/codingstatemachinedict.cpython-311.pyc,,
361
+ pip/_vendor/chardet/__pycache__/cp949prober.cpython-311.pyc,,
362
+ pip/_vendor/chardet/__pycache__/enums.cpython-311.pyc,,
363
+ pip/_vendor/chardet/__pycache__/escprober.cpython-311.pyc,,
364
+ pip/_vendor/chardet/__pycache__/escsm.cpython-311.pyc,,
365
+ pip/_vendor/chardet/__pycache__/eucjpprober.cpython-311.pyc,,
366
+ pip/_vendor/chardet/__pycache__/euckrfreq.cpython-311.pyc,,
367
+ pip/_vendor/chardet/__pycache__/euckrprober.cpython-311.pyc,,
368
+ pip/_vendor/chardet/__pycache__/euctwfreq.cpython-311.pyc,,
369
+ pip/_vendor/chardet/__pycache__/euctwprober.cpython-311.pyc,,
370
+ pip/_vendor/chardet/__pycache__/gb2312freq.cpython-311.pyc,,
371
+ pip/_vendor/chardet/__pycache__/gb2312prober.cpython-311.pyc,,
372
+ pip/_vendor/chardet/__pycache__/hebrewprober.cpython-311.pyc,,
373
+ pip/_vendor/chardet/__pycache__/jisfreq.cpython-311.pyc,,
374
+ pip/_vendor/chardet/__pycache__/johabfreq.cpython-311.pyc,,
375
+ pip/_vendor/chardet/__pycache__/johabprober.cpython-311.pyc,,
376
+ pip/_vendor/chardet/__pycache__/jpcntx.cpython-311.pyc,,
377
+ pip/_vendor/chardet/__pycache__/langbulgarianmodel.cpython-311.pyc,,
378
+ pip/_vendor/chardet/__pycache__/langgreekmodel.cpython-311.pyc,,
379
+ pip/_vendor/chardet/__pycache__/langhebrewmodel.cpython-311.pyc,,
380
+ pip/_vendor/chardet/__pycache__/langhungarianmodel.cpython-311.pyc,,
381
+ pip/_vendor/chardet/__pycache__/langrussianmodel.cpython-311.pyc,,
382
+ pip/_vendor/chardet/__pycache__/langthaimodel.cpython-311.pyc,,
383
+ pip/_vendor/chardet/__pycache__/langturkishmodel.cpython-311.pyc,,
384
+ pip/_vendor/chardet/__pycache__/latin1prober.cpython-311.pyc,,
385
+ pip/_vendor/chardet/__pycache__/macromanprober.cpython-311.pyc,,
386
+ pip/_vendor/chardet/__pycache__/mbcharsetprober.cpython-311.pyc,,
387
+ pip/_vendor/chardet/__pycache__/mbcsgroupprober.cpython-311.pyc,,
388
+ pip/_vendor/chardet/__pycache__/mbcssm.cpython-311.pyc,,
389
+ pip/_vendor/chardet/__pycache__/resultdict.cpython-311.pyc,,
390
+ pip/_vendor/chardet/__pycache__/sbcharsetprober.cpython-311.pyc,,
391
+ pip/_vendor/chardet/__pycache__/sbcsgroupprober.cpython-311.pyc,,
392
+ pip/_vendor/chardet/__pycache__/sjisprober.cpython-311.pyc,,
393
+ pip/_vendor/chardet/__pycache__/universaldetector.cpython-311.pyc,,
394
+ pip/_vendor/chardet/__pycache__/utf1632prober.cpython-311.pyc,,
395
+ pip/_vendor/chardet/__pycache__/utf8prober.cpython-311.pyc,,
396
+ pip/_vendor/chardet/__pycache__/version.cpython-311.pyc,,
397
+ pip/_vendor/chardet/big5freq.py,sha256=ltcfP-3PjlNHCoo5e4a7C4z-2DhBTXRfY6jbMbB7P30,31274
398
+ pip/_vendor/chardet/big5prober.py,sha256=lPMfwCX6v2AaPgvFh_cSWZcgLDbWiFCHLZ_p9RQ9uxE,1763
399
+ pip/_vendor/chardet/chardistribution.py,sha256=13B8XUG4oXDuLdXvfbIWwLFeR-ZU21AqTS1zcdON8bU,10032
400
+ pip/_vendor/chardet/charsetgroupprober.py,sha256=UKK3SaIZB2PCdKSIS0gnvMtLR9JJX62M-fZJu3OlWyg,3915
401
+ pip/_vendor/chardet/charsetprober.py,sha256=L3t8_wIOov8em-vZWOcbkdsrwe43N6_gqNh5pH7WPd4,5420
402
+ pip/_vendor/chardet/cli/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
403
+ pip/_vendor/chardet/cli/__pycache__/__init__.cpython-311.pyc,,
404
+ pip/_vendor/chardet/cli/__pycache__/chardetect.cpython-311.pyc,,
405
+ pip/_vendor/chardet/cli/chardetect.py,sha256=zibMVg5RpKb-ME9_7EYG4ZM2Sf07NHcQzZ12U-rYJho,3242
406
+ pip/_vendor/chardet/codingstatemachine.py,sha256=K7k69sw3jY5DmTXoSJQVsUtFIQKYPQVOSJJhBuGv_yE,3732
407
+ pip/_vendor/chardet/codingstatemachinedict.py,sha256=0GY3Hi2qIZvDrOOJ3AtqppM1RsYxr_66ER4EHjuMiMc,542
408
+ pip/_vendor/chardet/cp949prober.py,sha256=0jKRV7fECuWI16rNnks0ZECKA1iZYCIEaP8A1ZvjUSI,1860
409
+ pip/_vendor/chardet/enums.py,sha256=TzECiZoCKNMqgwU76cPCeKWFBqaWvAdLMev5_bCkhY8,1683
410
+ pip/_vendor/chardet/escprober.py,sha256=Kho48X65xE0scFylIdeJjM2bcbvRvv0h0WUbMWrJD3A,4006
411
+ pip/_vendor/chardet/escsm.py,sha256=AqyXpA2FQFD7k-buBty_7itGEYkhmVa8X09NLRul3QM,12176
412
+ pip/_vendor/chardet/eucjpprober.py,sha256=5KYaM9fsxkRYzw1b5k0fL-j_-ezIw-ij9r97a9MHxLY,3934
413
+ pip/_vendor/chardet/euckrfreq.py,sha256=3mHuRvXfsq_QcQysDQFb8qSudvTiol71C6Ic2w57tKM,13566
414
+ pip/_vendor/chardet/euckrprober.py,sha256=hiFT6wM174GIwRvqDsIcuOc-dDsq2uPKMKbyV8-1Xnc,1753
415
+ pip/_vendor/chardet/euctwfreq.py,sha256=2alILE1Lh5eqiFJZjzRkMQXolNJRHY5oBQd-vmZYFFM,36913
416
+ pip/_vendor/chardet/euctwprober.py,sha256=NxbpNdBtU0VFI0bKfGfDkpP7S2_8_6FlO87dVH0ogws,1753
417
+ pip/_vendor/chardet/gb2312freq.py,sha256=49OrdXzD-HXqwavkqjo8Z7gvs58hONNzDhAyMENNkvY,20735
418
+ pip/_vendor/chardet/gb2312prober.py,sha256=KPEBueaSLSvBpFeINMu0D6TgHcR90e5PaQawifzF4o0,1759
419
+ pip/_vendor/chardet/hebrewprober.py,sha256=96T_Lj_OmW-fK7JrSHojYjyG3fsGgbzkoTNleZ3kfYE,14537
420
+ pip/_vendor/chardet/jisfreq.py,sha256=mm8tfrwqhpOd3wzZKS4NJqkYBQVcDfTM2JiQ5aW932E,25796
421
+ pip/_vendor/chardet/johabfreq.py,sha256=dBpOYG34GRX6SL8k_LbS9rxZPMjLjoMlgZ03Pz5Hmqc,42498
422
+ pip/_vendor/chardet/johabprober.py,sha256=O1Qw9nVzRnun7vZp4UZM7wvJSv9W941mEU9uDMnY3DU,1752
423
+ pip/_vendor/chardet/jpcntx.py,sha256=uhHrYWkLxE_rF5OkHKInm0HUsrjgKHHVQvtt3UcvotA,27055
424
+ pip/_vendor/chardet/langbulgarianmodel.py,sha256=vmbvYFP8SZkSxoBvLkFqKiH1sjma5ihk3PTpdy71Rr4,104562
425
+ pip/_vendor/chardet/langgreekmodel.py,sha256=JfB7bupjjJH2w3X_mYnQr9cJA_7EuITC2cRW13fUjeI,98484
426
+ pip/_vendor/chardet/langhebrewmodel.py,sha256=3HXHaLQPNAGcXnJjkIJfozNZLTvTJmf4W5Awi6zRRKc,98196
427
+ pip/_vendor/chardet/langhungarianmodel.py,sha256=WxbeQIxkv8YtApiNqxQcvj-tMycsoI4Xy-fwkDHpP_Y,101363
428
+ pip/_vendor/chardet/langrussianmodel.py,sha256=s395bTZ87ESTrZCOdgXbEjZ9P1iGPwCl_8xSsac_DLY,128035
429
+ pip/_vendor/chardet/langthaimodel.py,sha256=7bJlQitRpTnVGABmbSznHnJwOHDy3InkTvtFUx13WQI,102774
430
+ pip/_vendor/chardet/langturkishmodel.py,sha256=XY0eGdTIy4eQ9Xg1LVPZacb-UBhHBR-cq0IpPVHowKc,95372
431
+ pip/_vendor/chardet/latin1prober.py,sha256=p15EEmFbmQUwbKLC7lOJVGHEZwcG45ubEZYTGu01J5g,5380
432
+ pip/_vendor/chardet/macromanprober.py,sha256=9anfzmY6TBfUPDyBDOdY07kqmTHpZ1tK0jL-p1JWcOY,6077
433
+ pip/_vendor/chardet/mbcharsetprober.py,sha256=Wr04WNI4F3X_VxEverNG-H25g7u-MDDKlNt-JGj-_uU,3715
434
+ pip/_vendor/chardet/mbcsgroupprober.py,sha256=iRpaNBjV0DNwYPu_z6TiHgRpwYahiM7ztI_4kZ4Uz9A,2131
435
+ pip/_vendor/chardet/mbcssm.py,sha256=hUtPvDYgWDaA2dWdgLsshbwRfm3Q5YRlRogdmeRUNQw,30391
436
+ pip/_vendor/chardet/metadata/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
437
+ pip/_vendor/chardet/metadata/__pycache__/__init__.cpython-311.pyc,,
438
+ pip/_vendor/chardet/metadata/__pycache__/languages.cpython-311.pyc,,
439
+ pip/_vendor/chardet/metadata/languages.py,sha256=FhvBIdZFxRQ-dTwkb_0madRKgVBCaUMQz9I5xqjE5iQ,13560
440
+ pip/_vendor/chardet/resultdict.py,sha256=ez4FRvN5KaSosJeJ2WzUyKdDdg35HDy_SSLPXKCdt5M,402
441
+ pip/_vendor/chardet/sbcharsetprober.py,sha256=-nd3F90i7GpXLjehLVHqVBE0KlWzGvQUPETLBNn4o6U,6400
442
+ pip/_vendor/chardet/sbcsgroupprober.py,sha256=gcgI0fOfgw_3YTClpbra_MNxwyEyJ3eUXraoLHYb59E,4137
443
+ pip/_vendor/chardet/sjisprober.py,sha256=aqQufMzRw46ZpFlzmYaYeT2-nzmKb-hmcrApppJ862k,4007
444
+ pip/_vendor/chardet/universaldetector.py,sha256=xYBrg4x0dd9WnT8qclfADVD9ondrUNkqPmvte1pa520,14848
445
+ pip/_vendor/chardet/utf1632prober.py,sha256=pw1epGdMj1hDGiCu1AHqqzOEfjX8MVdiW7O1BlT8-eQ,8505
446
+ pip/_vendor/chardet/utf8prober.py,sha256=8m08Ub5490H4jQ6LYXvFysGtgKoKsHUd2zH_i8_TnVw,2812
447
+ pip/_vendor/chardet/version.py,sha256=lGtJcxGM44Qz4Cbk4rbbmrKxnNr1-97U25TameLehZw,244
448
+ pip/_vendor/colorama/__init__.py,sha256=wePQA4U20tKgYARySLEC047ucNX-g8pRLpYBuiHlLb8,266
449
+ pip/_vendor/colorama/__pycache__/__init__.cpython-311.pyc,,
450
+ pip/_vendor/colorama/__pycache__/ansi.cpython-311.pyc,,
451
+ pip/_vendor/colorama/__pycache__/ansitowin32.cpython-311.pyc,,
452
+ pip/_vendor/colorama/__pycache__/initialise.cpython-311.pyc,,
453
+ pip/_vendor/colorama/__pycache__/win32.cpython-311.pyc,,
454
+ pip/_vendor/colorama/__pycache__/winterm.cpython-311.pyc,,
455
+ pip/_vendor/colorama/ansi.py,sha256=Top4EeEuaQdBWdteKMEcGOTeKeF19Q-Wo_6_Cj5kOzQ,2522
456
+ pip/_vendor/colorama/ansitowin32.py,sha256=vPNYa3OZbxjbuFyaVo0Tmhmy1FZ1lKMWCnT7odXpItk,11128
457
+ pip/_vendor/colorama/initialise.py,sha256=-hIny86ClXo39ixh5iSCfUIa2f_h_bgKRDW7gqs-KLU,3325
458
+ pip/_vendor/colorama/tests/__init__.py,sha256=MkgPAEzGQd-Rq0w0PZXSX2LadRWhUECcisJY8lSrm4Q,75
459
+ pip/_vendor/colorama/tests/__pycache__/__init__.cpython-311.pyc,,
460
+ pip/_vendor/colorama/tests/__pycache__/ansi_test.cpython-311.pyc,,
461
+ pip/_vendor/colorama/tests/__pycache__/ansitowin32_test.cpython-311.pyc,,
462
+ pip/_vendor/colorama/tests/__pycache__/initialise_test.cpython-311.pyc,,
463
+ pip/_vendor/colorama/tests/__pycache__/isatty_test.cpython-311.pyc,,
464
+ pip/_vendor/colorama/tests/__pycache__/utils.cpython-311.pyc,,
465
+ pip/_vendor/colorama/tests/__pycache__/winterm_test.cpython-311.pyc,,
466
+ pip/_vendor/colorama/tests/ansi_test.py,sha256=FeViDrUINIZcr505PAxvU4AjXz1asEiALs9GXMhwRaE,2839
467
+ pip/_vendor/colorama/tests/ansitowin32_test.py,sha256=RN7AIhMJ5EqDsYaCjVo-o4u8JzDD4ukJbmevWKS70rY,10678
468
+ pip/_vendor/colorama/tests/initialise_test.py,sha256=BbPy-XfyHwJ6zKozuQOvNvQZzsx9vdb_0bYXn7hsBTc,6741
469
+ pip/_vendor/colorama/tests/isatty_test.py,sha256=Pg26LRpv0yQDB5Ac-sxgVXG7hsA1NYvapFgApZfYzZg,1866
470
+ pip/_vendor/colorama/tests/utils.py,sha256=1IIRylG39z5-dzq09R_ngufxyPZxgldNbrxKxUGwGKE,1079
471
+ pip/_vendor/colorama/tests/winterm_test.py,sha256=qoWFPEjym5gm2RuMwpf3pOis3a5r_PJZFCzK254JL8A,3709
472
+ pip/_vendor/colorama/win32.py,sha256=YQOKwMTwtGBbsY4dL5HYTvwTeP9wIQra5MvPNddpxZs,6181
473
+ pip/_vendor/colorama/winterm.py,sha256=XCQFDHjPi6AHYNdZwy0tA02H-Jh48Jp-HvCjeLeLp3U,7134
474
+ pip/_vendor/distlib/__init__.py,sha256=acgfseOC55dNrVAzaBKpUiH3Z6V7Q1CaxsiQ3K7pC-E,581
475
+ pip/_vendor/distlib/__pycache__/__init__.cpython-311.pyc,,
476
+ pip/_vendor/distlib/__pycache__/compat.cpython-311.pyc,,
477
+ pip/_vendor/distlib/__pycache__/database.cpython-311.pyc,,
478
+ pip/_vendor/distlib/__pycache__/index.cpython-311.pyc,,
479
+ pip/_vendor/distlib/__pycache__/locators.cpython-311.pyc,,
480
+ pip/_vendor/distlib/__pycache__/manifest.cpython-311.pyc,,
481
+ pip/_vendor/distlib/__pycache__/markers.cpython-311.pyc,,
482
+ pip/_vendor/distlib/__pycache__/metadata.cpython-311.pyc,,
483
+ pip/_vendor/distlib/__pycache__/resources.cpython-311.pyc,,
484
+ pip/_vendor/distlib/__pycache__/scripts.cpython-311.pyc,,
485
+ pip/_vendor/distlib/__pycache__/util.cpython-311.pyc,,
486
+ pip/_vendor/distlib/__pycache__/version.cpython-311.pyc,,
487
+ pip/_vendor/distlib/__pycache__/wheel.cpython-311.pyc,,
488
+ pip/_vendor/distlib/compat.py,sha256=tfoMrj6tujk7G4UC2owL6ArgDuCKabgBxuJRGZSmpko,41259
489
+ pip/_vendor/distlib/database.py,sha256=o_mw0fAr93NDAHHHfqG54Y1Hi9Rkfrp2BX15XWZYK50,51697
490
+ pip/_vendor/distlib/index.py,sha256=HFiDG7LMoaBs829WuotrfIwcErOOExUOR_AeBtw_TCU,20834
491
+ pip/_vendor/distlib/locators.py,sha256=wNzG-zERzS_XGls-nBPVVyLRHa2skUlkn0-5n0trMWA,51991
492
+ pip/_vendor/distlib/manifest.py,sha256=nQEhYmgoreaBZzyFzwYsXxJARu3fo4EkunU163U16iE,14811
493
+ pip/_vendor/distlib/markers.py,sha256=TpHHHLgkzyT7YHbwj-2i6weRaq-Ivy2-MUnrDkjau-U,5058
494
+ pip/_vendor/distlib/metadata.py,sha256=g_DIiu8nBXRzA-mWPRpatHGbmFZqaFoss7z9TG7QSUU,39801
495
+ pip/_vendor/distlib/resources.py,sha256=LwbPksc0A1JMbi6XnuPdMBUn83X7BPuFNWqPGEKI698,10820
496
+ pip/_vendor/distlib/scripts.py,sha256=BmkTKmiTk4m2cj-iueliatwz3ut_9SsABBW51vnQnZU,18102
497
+ pip/_vendor/distlib/t32.exe,sha256=a0GV5kCoWsMutvliiCKmIgV98eRZ33wXoS-XrqvJQVs,97792
498
+ pip/_vendor/distlib/t64-arm.exe,sha256=68TAa32V504xVBnufojh0PcenpR3U4wAqTqf-MZqbPw,182784
499
+ pip/_vendor/distlib/t64.exe,sha256=gaYY8hy4fbkHYTTnA4i26ct8IQZzkBG2pRdy0iyuBrc,108032
500
+ pip/_vendor/distlib/util.py,sha256=31dPXn3Rfat0xZLeVoFpuniyhe6vsbl9_QN-qd9Lhlk,66262
501
+ pip/_vendor/distlib/version.py,sha256=WG__LyAa2GwmA6qSoEJtvJE8REA1LZpbSizy8WvhJLk,23513
502
+ pip/_vendor/distlib/w32.exe,sha256=R4csx3-OGM9kL4aPIzQKRo5TfmRSHZo6QWyLhDhNBks,91648
503
+ pip/_vendor/distlib/w64-arm.exe,sha256=xdyYhKj0WDcVUOCb05blQYvzdYIKMbmJn2SZvzkcey4,168448
504
+ pip/_vendor/distlib/w64.exe,sha256=ejGf-rojoBfXseGLpya6bFTFPWRG21X5KvU8J5iU-K0,101888
505
+ pip/_vendor/distlib/wheel.py,sha256=Rgqs658VsJ3R2845qwnZD8XQryV2CzWw2mghwLvxxsI,43898
506
+ pip/_vendor/distro/__init__.py,sha256=2fHjF-SfgPvjyNZ1iHh_wjqWdR_Yo5ODHwZC0jLBPhc,981
507
+ pip/_vendor/distro/__main__.py,sha256=bu9d3TifoKciZFcqRBuygV3GSuThnVD_m2IK4cz96Vs,64
508
+ pip/_vendor/distro/__pycache__/__init__.cpython-311.pyc,,
509
+ pip/_vendor/distro/__pycache__/__main__.cpython-311.pyc,,
510
+ pip/_vendor/distro/__pycache__/distro.cpython-311.pyc,,
511
+ pip/_vendor/distro/distro.py,sha256=UZO1LjIhtFCMdlbiz39gj3raV-Amf3SBwzGzfApiMHw,49330
512
+ pip/_vendor/idna/__init__.py,sha256=KJQN1eQBr8iIK5SKrJ47lXvxG0BJ7Lm38W4zT0v_8lk,849
513
+ pip/_vendor/idna/__pycache__/__init__.cpython-311.pyc,,
514
+ pip/_vendor/idna/__pycache__/codec.cpython-311.pyc,,
515
+ pip/_vendor/idna/__pycache__/compat.cpython-311.pyc,,
516
+ pip/_vendor/idna/__pycache__/core.cpython-311.pyc,,
517
+ pip/_vendor/idna/__pycache__/idnadata.cpython-311.pyc,,
518
+ pip/_vendor/idna/__pycache__/intranges.cpython-311.pyc,,
519
+ pip/_vendor/idna/__pycache__/package_data.cpython-311.pyc,,
520
+ pip/_vendor/idna/__pycache__/uts46data.cpython-311.pyc,,
521
+ pip/_vendor/idna/codec.py,sha256=6ly5odKfqrytKT9_7UrlGklHnf1DSK2r9C6cSM4sa28,3374
522
+ pip/_vendor/idna/compat.py,sha256=0_sOEUMT4CVw9doD3vyRhX80X19PwqFoUBs7gWsFME4,321
523
+ pip/_vendor/idna/core.py,sha256=1JxchwKzkxBSn7R_oCE12oBu3eVux0VzdxolmIad24M,12950
524
+ pip/_vendor/idna/idnadata.py,sha256=xUjqKqiJV8Ho_XzBpAtv5JFoVPSupK-SUXvtjygUHqw,44375
525
+ pip/_vendor/idna/intranges.py,sha256=YBr4fRYuWH7kTKS2tXlFjM24ZF1Pdvcir-aywniInqg,1881
526
+ pip/_vendor/idna/package_data.py,sha256=C_jHJzmX8PI4xq0jpzmcTMxpb5lDsq4o5VyxQzlVrZE,21
527
+ pip/_vendor/idna/uts46data.py,sha256=zvjZU24s58_uAS850Mcd0NnD0X7_gCMAMjzWNIeUJdc,206539
528
+ pip/_vendor/msgpack/__init__.py,sha256=hyGhlnmcJkxryJBKC3X5FnEph375kQoL_mG8LZUuXgY,1132
529
+ pip/_vendor/msgpack/__pycache__/__init__.cpython-311.pyc,,
530
+ pip/_vendor/msgpack/__pycache__/exceptions.cpython-311.pyc,,
531
+ pip/_vendor/msgpack/__pycache__/ext.cpython-311.pyc,,
532
+ pip/_vendor/msgpack/__pycache__/fallback.cpython-311.pyc,,
533
+ pip/_vendor/msgpack/exceptions.py,sha256=dCTWei8dpkrMsQDcjQk74ATl9HsIBH0ybt8zOPNqMYc,1081
534
+ pip/_vendor/msgpack/ext.py,sha256=C5MK8JhVYGYFWPvxsORsqZAnvOXefYQ57m1Ym0luW5M,6079
535
+ pip/_vendor/msgpack/fallback.py,sha256=tvNBHyxxFbuVlC8GZShETClJxjLiDMOja4XwwyvNm2g,34544
536
+ pip/_vendor/packaging/__about__.py,sha256=ugASIO2w1oUyH8_COqQ2X_s0rDhjbhQC3yJocD03h2c,661
537
+ pip/_vendor/packaging/__init__.py,sha256=b9Kk5MF7KxhhLgcDmiUWukN-LatWFxPdNug0joPhHSk,497
538
+ pip/_vendor/packaging/__pycache__/__about__.cpython-311.pyc,,
539
+ pip/_vendor/packaging/__pycache__/__init__.cpython-311.pyc,,
540
+ pip/_vendor/packaging/__pycache__/_manylinux.cpython-311.pyc,,
541
+ pip/_vendor/packaging/__pycache__/_musllinux.cpython-311.pyc,,
542
+ pip/_vendor/packaging/__pycache__/_structures.cpython-311.pyc,,
543
+ pip/_vendor/packaging/__pycache__/markers.cpython-311.pyc,,
544
+ pip/_vendor/packaging/__pycache__/requirements.cpython-311.pyc,,
545
+ pip/_vendor/packaging/__pycache__/specifiers.cpython-311.pyc,,
546
+ pip/_vendor/packaging/__pycache__/tags.cpython-311.pyc,,
547
+ pip/_vendor/packaging/__pycache__/utils.cpython-311.pyc,,
548
+ pip/_vendor/packaging/__pycache__/version.cpython-311.pyc,,
549
+ pip/_vendor/packaging/_manylinux.py,sha256=XcbiXB-qcjv3bcohp6N98TMpOP4_j3m-iOA8ptK2GWY,11488
550
+ pip/_vendor/packaging/_musllinux.py,sha256=_KGgY_qc7vhMGpoqss25n2hiLCNKRtvz9mCrS7gkqyc,4378
551
+ pip/_vendor/packaging/_structures.py,sha256=q3eVNmbWJGG_S0Dit_S3Ao8qQqz_5PYTXFAKBZe5yr4,1431
552
+ pip/_vendor/packaging/markers.py,sha256=AJBOcY8Oq0kYc570KuuPTkvuqjAlhufaE2c9sCUbm64,8487
553
+ pip/_vendor/packaging/requirements.py,sha256=NtDlPBtojpn1IUC85iMjPNsUmufjpSlwnNA-Xb4m5NA,4676
554
+ pip/_vendor/packaging/specifiers.py,sha256=LRQ0kFsHrl5qfcFNEEJrIFYsnIHQUJXY9fIsakTrrqE,30110
555
+ pip/_vendor/packaging/tags.py,sha256=lmsnGNiJ8C4D_Pf9PbM0qgbZvD9kmB9lpZBQUZa3R_Y,15699
556
+ pip/_vendor/packaging/utils.py,sha256=dJjeat3BS-TYn1RrUFVwufUMasbtzLfYRoy_HXENeFQ,4200
557
+ pip/_vendor/packaging/version.py,sha256=_fLRNrFrxYcHVfyo8vk9j8s6JM8N_xsSxVFr6RJyco8,14665
558
+ pip/_vendor/pkg_resources/__init__.py,sha256=hTAeJCNYb7dJseIDVsYK3mPQep_gphj4tQh-bspX8bg,109364
559
+ pip/_vendor/pkg_resources/__pycache__/__init__.cpython-311.pyc,,
560
+ pip/_vendor/platformdirs/__init__.py,sha256=SkhEYVyC_HUHC6KX7n4M_6coyRMtEB38QMyOYIAX6Yk,20155
561
+ pip/_vendor/platformdirs/__main__.py,sha256=fVvSiTzr2-RM6IsjWjj4fkaOtDOgDhUWv6sA99do4CQ,1476
562
+ pip/_vendor/platformdirs/__pycache__/__init__.cpython-311.pyc,,
563
+ pip/_vendor/platformdirs/__pycache__/__main__.cpython-311.pyc,,
564
+ pip/_vendor/platformdirs/__pycache__/android.cpython-311.pyc,,
565
+ pip/_vendor/platformdirs/__pycache__/api.cpython-311.pyc,,
566
+ pip/_vendor/platformdirs/__pycache__/macos.cpython-311.pyc,,
567
+ pip/_vendor/platformdirs/__pycache__/unix.cpython-311.pyc,,
568
+ pip/_vendor/platformdirs/__pycache__/version.cpython-311.pyc,,
569
+ pip/_vendor/platformdirs/__pycache__/windows.cpython-311.pyc,,
570
+ pip/_vendor/platformdirs/android.py,sha256=y_EEMKwYl2-bzYBDovksSn8m76on0Lda8eyJksVQE9U,7211
571
+ pip/_vendor/platformdirs/api.py,sha256=jWtX06jAJytYrkJDOqEls97mCkyHRSZkoqUlbMK5Qew,7132
572
+ pip/_vendor/platformdirs/macos.py,sha256=LueVOoVgGWDBwQb8OFwXkVKfVn33CM1Lkwf1-A86tRQ,3678
573
+ pip/_vendor/platformdirs/unix.py,sha256=22JhR8ZY0aLxSVCFnKrc6f1iz6Gv42K24Daj7aTjfSg,8809
574
+ pip/_vendor/platformdirs/version.py,sha256=mavZTQIJIXfdewEaSTn7EWrNfPZWeRofb-74xqW5f2M,160
575
+ pip/_vendor/platformdirs/windows.py,sha256=4TtbPGoWG2PRgI11uquDa7eRk8TcxvnUNuuMGZItnXc,9573
576
+ pip/_vendor/pygments/__init__.py,sha256=6AuDljQtvf89DTNUyWM7k3oUlP_lq70NU-INKKteOBY,2983
577
+ pip/_vendor/pygments/__main__.py,sha256=es8EKMvXj5yToIfQ-pf3Dv5TnIeeM6sME0LW-n4ecHo,353
578
+ pip/_vendor/pygments/__pycache__/__init__.cpython-311.pyc,,
579
+ pip/_vendor/pygments/__pycache__/__main__.cpython-311.pyc,,
580
+ pip/_vendor/pygments/__pycache__/cmdline.cpython-311.pyc,,
581
+ pip/_vendor/pygments/__pycache__/console.cpython-311.pyc,,
582
+ pip/_vendor/pygments/__pycache__/filter.cpython-311.pyc,,
583
+ pip/_vendor/pygments/__pycache__/formatter.cpython-311.pyc,,
584
+ pip/_vendor/pygments/__pycache__/lexer.cpython-311.pyc,,
585
+ pip/_vendor/pygments/__pycache__/modeline.cpython-311.pyc,,
586
+ pip/_vendor/pygments/__pycache__/plugin.cpython-311.pyc,,
587
+ pip/_vendor/pygments/__pycache__/regexopt.cpython-311.pyc,,
588
+ pip/_vendor/pygments/__pycache__/scanner.cpython-311.pyc,,
589
+ pip/_vendor/pygments/__pycache__/sphinxext.cpython-311.pyc,,
590
+ pip/_vendor/pygments/__pycache__/style.cpython-311.pyc,,
591
+ pip/_vendor/pygments/__pycache__/token.cpython-311.pyc,,
592
+ pip/_vendor/pygments/__pycache__/unistring.cpython-311.pyc,,
593
+ pip/_vendor/pygments/__pycache__/util.cpython-311.pyc,,
594
+ pip/_vendor/pygments/cmdline.py,sha256=byxYJp9gnjVeyhRlZ3UTMgo_LhkXh1afvN8wJBtAcc8,23685
595
+ pip/_vendor/pygments/console.py,sha256=2wZ5W-U6TudJD1_NLUwjclMpbomFM91lNv11_60sfGY,1697
596
+ pip/_vendor/pygments/filter.py,sha256=j5aLM9a9wSx6eH1oy473oSkJ02hGWNptBlVo4s1g_30,1938
597
+ pip/_vendor/pygments/filters/__init__.py,sha256=h_koYkUFo-FFUxjs564JHUAz7O3yJpVwI6fKN3MYzG0,40386
598
+ pip/_vendor/pygments/filters/__pycache__/__init__.cpython-311.pyc,,
599
+ pip/_vendor/pygments/formatter.py,sha256=J9OL9hXLJKZk7moUgKwpjW9HNf4WlJFg_o_-Z_S_tTY,4178
600
+ pip/_vendor/pygments/formatters/__init__.py,sha256=_xgAcdFKr0QNYwh_i98AU9hvfP3X2wAkhElFcRRF3Uo,5424
601
+ pip/_vendor/pygments/formatters/__pycache__/__init__.cpython-311.pyc,,
602
+ pip/_vendor/pygments/formatters/__pycache__/_mapping.cpython-311.pyc,,
603
+ pip/_vendor/pygments/formatters/__pycache__/bbcode.cpython-311.pyc,,
604
+ pip/_vendor/pygments/formatters/__pycache__/groff.cpython-311.pyc,,
605
+ pip/_vendor/pygments/formatters/__pycache__/html.cpython-311.pyc,,
606
+ pip/_vendor/pygments/formatters/__pycache__/img.cpython-311.pyc,,
607
+ pip/_vendor/pygments/formatters/__pycache__/irc.cpython-311.pyc,,
608
+ pip/_vendor/pygments/formatters/__pycache__/latex.cpython-311.pyc,,
609
+ pip/_vendor/pygments/formatters/__pycache__/other.cpython-311.pyc,,
610
+ pip/_vendor/pygments/formatters/__pycache__/pangomarkup.cpython-311.pyc,,
611
+ pip/_vendor/pygments/formatters/__pycache__/rtf.cpython-311.pyc,,
612
+ pip/_vendor/pygments/formatters/__pycache__/svg.cpython-311.pyc,,
613
+ pip/_vendor/pygments/formatters/__pycache__/terminal.cpython-311.pyc,,
614
+ pip/_vendor/pygments/formatters/__pycache__/terminal256.cpython-311.pyc,,
615
+ pip/_vendor/pygments/formatters/_mapping.py,sha256=1Cw37FuQlNacnxRKmtlPX4nyLoX9_ttko5ZwscNUZZ4,4176
616
+ pip/_vendor/pygments/formatters/bbcode.py,sha256=r1b7wzWTJouADDLh-Z11iRi4iQxD0JKJ1qHl6mOYxsA,3314
617
+ pip/_vendor/pygments/formatters/groff.py,sha256=xy8Zf3tXOo6MWrXh7yPGWx3lVEkg_DhY4CxmsDb0IVo,5094
618
+ pip/_vendor/pygments/formatters/html.py,sha256=PIzAyilNqaTzSSP2slDG2VDLE3qNioWy2rgtSSoviuI,35610
619
+ pip/_vendor/pygments/formatters/img.py,sha256=XKXmg2_XONrR4mtq2jfEU8XCsoln3VSGTw-UYiEokys,21938
620
+ pip/_vendor/pygments/formatters/irc.py,sha256=Ep-m8jd3voFO6Fv57cUGFmz6JVA67IEgyiBOwv0N4a0,4981
621
+ pip/_vendor/pygments/formatters/latex.py,sha256=FGzJ-YqSTE8z_voWPdzvLY5Tq8jE_ygjGjM6dXZJ8-k,19351
622
+ pip/_vendor/pygments/formatters/other.py,sha256=gPxkk5BdAzWTCgbEHg1lpLi-1F6ZPh5A_aotgLXHnzg,5073
623
+ pip/_vendor/pygments/formatters/pangomarkup.py,sha256=6LKnQc8yh49f802bF0sPvbzck4QivMYqqoXAPaYP8uU,2212
624
+ pip/_vendor/pygments/formatters/rtf.py,sha256=aA0v_psW6KZI3N18TKDifxeL6mcF8EDXcPXDWI4vhVQ,5014
625
+ pip/_vendor/pygments/formatters/svg.py,sha256=dQONWypbzfvzGCDtdp3M_NJawScJvM2DiHbx1k-ww7g,7335
626
+ pip/_vendor/pygments/formatters/terminal.py,sha256=FG-rpjRpFmNpiGB4NzIucvxq6sQIXB3HOTo2meTKtrU,4674
627
+ pip/_vendor/pygments/formatters/terminal256.py,sha256=13SJ3D5pFdqZ9zROE6HbWnBDwHvOGE8GlsmqGhprRp4,11753
628
+ pip/_vendor/pygments/lexer.py,sha256=2BpqLlT2ExvOOi7vnjK5nB4Fp-m52ldiPaXMox5uwug,34618
629
+ pip/_vendor/pygments/lexers/__init__.py,sha256=j5KEi5O_VQ5GS59H49l-10gzUOkWKxlwGeVMlGO2MMk,12130
630
+ pip/_vendor/pygments/lexers/__pycache__/__init__.cpython-311.pyc,,
631
+ pip/_vendor/pygments/lexers/__pycache__/_mapping.cpython-311.pyc,,
632
+ pip/_vendor/pygments/lexers/__pycache__/python.cpython-311.pyc,,
633
+ pip/_vendor/pygments/lexers/_mapping.py,sha256=Hts4r_ZQ8icftGM7gkBPeED5lyVSv4affFgXYE6Ap04,72281
634
+ pip/_vendor/pygments/lexers/python.py,sha256=c7jnmKFU9DLxTJW0UbwXt6Z9FJqbBlVsWA1Qr9xSA_w,53424
635
+ pip/_vendor/pygments/modeline.py,sha256=eF2vO4LpOGoPvIKKkbPfnyut8hT4UiebZPpb-BYGQdI,986
636
+ pip/_vendor/pygments/plugin.py,sha256=j1Fh310RbV2DQ9nvkmkqvlj38gdyuYKllLnGxbc8sJM,2591
637
+ pip/_vendor/pygments/regexopt.py,sha256=jg1ALogcYGU96TQS9isBl6dCrvw5y5--BP_K-uFk_8s,3072
638
+ pip/_vendor/pygments/scanner.py,sha256=b_nu5_f3HCgSdp5S_aNRBQ1MSCm4ZjDwec2OmTRickw,3092
639
+ pip/_vendor/pygments/sphinxext.py,sha256=wBFYm180qea9JKt__UzhRlNRNhczPDFDaqGD21sbuso,6882
640
+ pip/_vendor/pygments/style.py,sha256=C4qyoJrUTkq-OV3iO-8Vz3UtWYpJwSTdh5_vlGCGdNQ,6257
641
+ pip/_vendor/pygments/styles/__init__.py,sha256=he7HjQx7sC0d2kfTVLjUs0J15mtToJM6M1brwIm9--Q,3700
642
+ pip/_vendor/pygments/styles/__pycache__/__init__.cpython-311.pyc,,
643
+ pip/_vendor/pygments/token.py,sha256=seNsmcch9OEHXYirh8Ool7w8xDhfNTbLj5rHAC-gc_o,6184
644
+ pip/_vendor/pygments/unistring.py,sha256=FaUfG14NBJEKLQoY9qj6JYeXrpYcLmKulghdxOGFaOc,63223
645
+ pip/_vendor/pygments/util.py,sha256=AEVY0qonyyEMgv4Do2dINrrqUAwUk2XYSqHM650uzek,10230
646
+ pip/_vendor/pyparsing/__init__.py,sha256=9m1JbE2JTLdBG0Mb6B0lEaZj181Wx5cuPXZpsbHEYgE,9116
647
+ pip/_vendor/pyparsing/__pycache__/__init__.cpython-311.pyc,,
648
+ pip/_vendor/pyparsing/__pycache__/actions.cpython-311.pyc,,
649
+ pip/_vendor/pyparsing/__pycache__/common.cpython-311.pyc,,
650
+ pip/_vendor/pyparsing/__pycache__/core.cpython-311.pyc,,
651
+ pip/_vendor/pyparsing/__pycache__/exceptions.cpython-311.pyc,,
652
+ pip/_vendor/pyparsing/__pycache__/helpers.cpython-311.pyc,,
653
+ pip/_vendor/pyparsing/__pycache__/results.cpython-311.pyc,,
654
+ pip/_vendor/pyparsing/__pycache__/testing.cpython-311.pyc,,
655
+ pip/_vendor/pyparsing/__pycache__/unicode.cpython-311.pyc,,
656
+ pip/_vendor/pyparsing/__pycache__/util.cpython-311.pyc,,
657
+ pip/_vendor/pyparsing/actions.py,sha256=05uaIPOznJPQ7VgRdmGCmG4sDnUPtwgv5qOYIqbL2UY,6567
658
+ pip/_vendor/pyparsing/common.py,sha256=p-3c83E5-DjlkF35G0O9-kjQRpoejP-2_z0hxZ-eol4,13387
659
+ pip/_vendor/pyparsing/core.py,sha256=yvuRlLpXSF8mgk-QhiW3OVLqD9T0rsj9tbibhRH4Yaw,224445
660
+ pip/_vendor/pyparsing/diagram/__init__.py,sha256=nxmDOoYF9NXuLaGYy01tKFjkNReWJlrGFuJNWEiTo84,24215
661
+ pip/_vendor/pyparsing/diagram/__pycache__/__init__.cpython-311.pyc,,
662
+ pip/_vendor/pyparsing/exceptions.py,sha256=6Jc6W1eDZBzyFu1J0YrcdNFVBC-RINujZmveSnB8Rxw,9523
663
+ pip/_vendor/pyparsing/helpers.py,sha256=BZJHCA8SS0pYio30KGQTc9w2qMOaK4YpZ7hcvHbnTgk,38646
664
+ pip/_vendor/pyparsing/results.py,sha256=9dyqQ-w3MjfmxWbFt8KEPU6IfXeyRdoWp2Og802rUQY,26692
665
+ pip/_vendor/pyparsing/testing.py,sha256=eJncg0p83zm1FTPvM9auNT6oavIvXaibmRFDf1qmwkY,13488
666
+ pip/_vendor/pyparsing/unicode.py,sha256=fAPdsJiARFbkPAih6NkYry0dpj4jPqelGVMlE4wWFW8,10646
667
+ pip/_vendor/pyparsing/util.py,sha256=vTMzTdwSDyV8d_dSgquUTdWgBFoA_W30nfxEJDsshRQ,8670
668
+ pip/_vendor/pyproject_hooks/__init__.py,sha256=kCehmy0UaBa9oVMD7ZIZrnswfnP3LXZ5lvnNJAL5JBM,491
669
+ pip/_vendor/pyproject_hooks/__pycache__/__init__.cpython-311.pyc,,
670
+ pip/_vendor/pyproject_hooks/__pycache__/_compat.cpython-311.pyc,,
671
+ pip/_vendor/pyproject_hooks/__pycache__/_impl.cpython-311.pyc,,
672
+ pip/_vendor/pyproject_hooks/_compat.py,sha256=by6evrYnqkisiM-MQcvOKs5bgDMzlOSgZqRHNqf04zE,138
673
+ pip/_vendor/pyproject_hooks/_impl.py,sha256=61GJxzQip0IInhuO69ZI5GbNQ82XEDUB_1Gg5_KtUoc,11920
674
+ pip/_vendor/pyproject_hooks/_in_process/__init__.py,sha256=9gQATptbFkelkIy0OfWFEACzqxXJMQDWCH9rBOAZVwQ,546
675
+ pip/_vendor/pyproject_hooks/_in_process/__pycache__/__init__.cpython-311.pyc,,
676
+ pip/_vendor/pyproject_hooks/_in_process/__pycache__/_in_process.cpython-311.pyc,,
677
+ pip/_vendor/pyproject_hooks/_in_process/_in_process.py,sha256=m2b34c917IW5o-Q_6TYIHlsK9lSUlNiyrITTUH_zwew,10927
678
+ pip/_vendor/requests/__init__.py,sha256=owujob4dk45Siy4EYtbCKR6wcFph7E04a_v_OuAacBA,5169
679
+ pip/_vendor/requests/__pycache__/__init__.cpython-311.pyc,,
680
+ pip/_vendor/requests/__pycache__/__version__.cpython-311.pyc,,
681
+ pip/_vendor/requests/__pycache__/_internal_utils.cpython-311.pyc,,
682
+ pip/_vendor/requests/__pycache__/adapters.cpython-311.pyc,,
683
+ pip/_vendor/requests/__pycache__/api.cpython-311.pyc,,
684
+ pip/_vendor/requests/__pycache__/auth.cpython-311.pyc,,
685
+ pip/_vendor/requests/__pycache__/certs.cpython-311.pyc,,
686
+ pip/_vendor/requests/__pycache__/compat.cpython-311.pyc,,
687
+ pip/_vendor/requests/__pycache__/cookies.cpython-311.pyc,,
688
+ pip/_vendor/requests/__pycache__/exceptions.cpython-311.pyc,,
689
+ pip/_vendor/requests/__pycache__/help.cpython-311.pyc,,
690
+ pip/_vendor/requests/__pycache__/hooks.cpython-311.pyc,,
691
+ pip/_vendor/requests/__pycache__/models.cpython-311.pyc,,
692
+ pip/_vendor/requests/__pycache__/packages.cpython-311.pyc,,
693
+ pip/_vendor/requests/__pycache__/sessions.cpython-311.pyc,,
694
+ pip/_vendor/requests/__pycache__/status_codes.cpython-311.pyc,,
695
+ pip/_vendor/requests/__pycache__/structures.cpython-311.pyc,,
696
+ pip/_vendor/requests/__pycache__/utils.cpython-311.pyc,,
697
+ pip/_vendor/requests/__version__.py,sha256=ssI3Ezt7PaxgkOW45GhtwPUclo_SO_ygtIm4A74IOfw,435
698
+ pip/_vendor/requests/_internal_utils.py,sha256=nMQymr4hs32TqVo5AbCrmcJEhvPUh7xXlluyqwslLiQ,1495
699
+ pip/_vendor/requests/adapters.py,sha256=idj6cZcId3L5xNNeJ7ieOLtw3awJk5A64xUfetHwq3M,19697
700
+ pip/_vendor/requests/api.py,sha256=q61xcXq4tmiImrvcSVLTbFyCiD2F-L_-hWKGbz4y8vg,6449
701
+ pip/_vendor/requests/auth.py,sha256=h-HLlVx9j8rKV5hfSAycP2ApOSglTz77R0tz7qCbbEE,10187
702
+ pip/_vendor/requests/certs.py,sha256=PVPooB0jP5hkZEULSCwC074532UFbR2Ptgu0I5zwmCs,575
703
+ pip/_vendor/requests/compat.py,sha256=IhK9quyX0RRuWTNcg6d2JGSAOUbM6mym2p_2XjLTwf4,1286
704
+ pip/_vendor/requests/cookies.py,sha256=kD3kNEcCj-mxbtf5fJsSaT86eGoEYpD3X0CSgpzl7BM,18560
705
+ pip/_vendor/requests/exceptions.py,sha256=FA-_kVwBZ2jhXauRctN_ewHVK25b-fj0Azyz1THQ0Kk,3823
706
+ pip/_vendor/requests/help.py,sha256=FnAAklv8MGm_qb2UilDQgS6l0cUttiCFKUjx0zn2XNA,3879
707
+ pip/_vendor/requests/hooks.py,sha256=CiuysiHA39V5UfcCBXFIx83IrDpuwfN9RcTUgv28ftQ,733
708
+ pip/_vendor/requests/models.py,sha256=dDZ-iThotky-Noq9yy97cUEJhr3wnY6mv-xR_ePg_lk,35288
709
+ pip/_vendor/requests/packages.py,sha256=njJmVifY4aSctuW3PP5EFRCxjEwMRDO6J_feG2dKWsI,695
710
+ pip/_vendor/requests/sessions.py,sha256=-LvTzrPtetSTrR3buxu4XhdgMrJFLB1q5D7P--L2Xhw,30373
711
+ pip/_vendor/requests/status_codes.py,sha256=FvHmT5uH-_uimtRz5hH9VCbt7VV-Nei2J9upbej6j8g,4235
712
+ pip/_vendor/requests/structures.py,sha256=-IbmhVz06S-5aPSZuUthZ6-6D9XOjRuTXHOabY041XM,2912
713
+ pip/_vendor/requests/utils.py,sha256=kOPn0qYD6xRTzaxbqTdYiSInBZHl6379AJsyIgzYGLY,33460
714
+ pip/_vendor/resolvelib/__init__.py,sha256=h509TdEcpb5-44JonaU3ex2TM15GVBLjM9CNCPwnTTs,537
715
+ pip/_vendor/resolvelib/__pycache__/__init__.cpython-311.pyc,,
716
+ pip/_vendor/resolvelib/__pycache__/providers.cpython-311.pyc,,
717
+ pip/_vendor/resolvelib/__pycache__/reporters.cpython-311.pyc,,
718
+ pip/_vendor/resolvelib/__pycache__/resolvers.cpython-311.pyc,,
719
+ pip/_vendor/resolvelib/__pycache__/structs.cpython-311.pyc,,
720
+ pip/_vendor/resolvelib/compat/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
721
+ pip/_vendor/resolvelib/compat/__pycache__/__init__.cpython-311.pyc,,
722
+ pip/_vendor/resolvelib/compat/__pycache__/collections_abc.cpython-311.pyc,,
723
+ pip/_vendor/resolvelib/compat/collections_abc.py,sha256=uy8xUZ-NDEw916tugUXm8HgwCGiMO0f-RcdnpkfXfOs,156
724
+ pip/_vendor/resolvelib/providers.py,sha256=fuuvVrCetu5gsxPB43ERyjfO8aReS3rFQHpDgiItbs4,5871
725
+ pip/_vendor/resolvelib/reporters.py,sha256=TSbRmWzTc26w0ggsV1bxVpeWDB8QNIre6twYl7GIZBE,1601
726
+ pip/_vendor/resolvelib/resolvers.py,sha256=G8rsLZSq64g5VmIq-lB7UcIJ1gjAxIQJmTF4REZleQ0,20511
727
+ pip/_vendor/resolvelib/structs.py,sha256=0_1_XO8z_CLhegP3Vpf9VJ3zJcfLm0NOHRM-i0Ykz3o,4963
728
+ pip/_vendor/rich/__init__.py,sha256=dRxjIL-SbFVY0q3IjSMrfgBTHrm1LZDgLOygVBwiYZc,6090
729
+ pip/_vendor/rich/__main__.py,sha256=TT8sb9PTnsnKhhrGuHkLN0jdN0dtKhtPkEr9CidDbPM,8478
730
+ pip/_vendor/rich/__pycache__/__init__.cpython-311.pyc,,
731
+ pip/_vendor/rich/__pycache__/__main__.cpython-311.pyc,,
732
+ pip/_vendor/rich/__pycache__/_cell_widths.cpython-311.pyc,,
733
+ pip/_vendor/rich/__pycache__/_emoji_codes.cpython-311.pyc,,
734
+ pip/_vendor/rich/__pycache__/_emoji_replace.cpython-311.pyc,,
735
+ pip/_vendor/rich/__pycache__/_export_format.cpython-311.pyc,,
736
+ pip/_vendor/rich/__pycache__/_extension.cpython-311.pyc,,
737
+ pip/_vendor/rich/__pycache__/_fileno.cpython-311.pyc,,
738
+ pip/_vendor/rich/__pycache__/_inspect.cpython-311.pyc,,
739
+ pip/_vendor/rich/__pycache__/_log_render.cpython-311.pyc,,
740
+ pip/_vendor/rich/__pycache__/_loop.cpython-311.pyc,,
741
+ pip/_vendor/rich/__pycache__/_null_file.cpython-311.pyc,,
742
+ pip/_vendor/rich/__pycache__/_palettes.cpython-311.pyc,,
743
+ pip/_vendor/rich/__pycache__/_pick.cpython-311.pyc,,
744
+ pip/_vendor/rich/__pycache__/_ratio.cpython-311.pyc,,
745
+ pip/_vendor/rich/__pycache__/_spinners.cpython-311.pyc,,
746
+ pip/_vendor/rich/__pycache__/_stack.cpython-311.pyc,,
747
+ pip/_vendor/rich/__pycache__/_timer.cpython-311.pyc,,
748
+ pip/_vendor/rich/__pycache__/_win32_console.cpython-311.pyc,,
749
+ pip/_vendor/rich/__pycache__/_windows.cpython-311.pyc,,
750
+ pip/_vendor/rich/__pycache__/_windows_renderer.cpython-311.pyc,,
751
+ pip/_vendor/rich/__pycache__/_wrap.cpython-311.pyc,,
752
+ pip/_vendor/rich/__pycache__/abc.cpython-311.pyc,,
753
+ pip/_vendor/rich/__pycache__/align.cpython-311.pyc,,
754
+ pip/_vendor/rich/__pycache__/ansi.cpython-311.pyc,,
755
+ pip/_vendor/rich/__pycache__/bar.cpython-311.pyc,,
756
+ pip/_vendor/rich/__pycache__/box.cpython-311.pyc,,
757
+ pip/_vendor/rich/__pycache__/cells.cpython-311.pyc,,
758
+ pip/_vendor/rich/__pycache__/color.cpython-311.pyc,,
759
+ pip/_vendor/rich/__pycache__/color_triplet.cpython-311.pyc,,
760
+ pip/_vendor/rich/__pycache__/columns.cpython-311.pyc,,
761
+ pip/_vendor/rich/__pycache__/console.cpython-311.pyc,,
762
+ pip/_vendor/rich/__pycache__/constrain.cpython-311.pyc,,
763
+ pip/_vendor/rich/__pycache__/containers.cpython-311.pyc,,
764
+ pip/_vendor/rich/__pycache__/control.cpython-311.pyc,,
765
+ pip/_vendor/rich/__pycache__/default_styles.cpython-311.pyc,,
766
+ pip/_vendor/rich/__pycache__/diagnose.cpython-311.pyc,,
767
+ pip/_vendor/rich/__pycache__/emoji.cpython-311.pyc,,
768
+ pip/_vendor/rich/__pycache__/errors.cpython-311.pyc,,
769
+ pip/_vendor/rich/__pycache__/file_proxy.cpython-311.pyc,,
770
+ pip/_vendor/rich/__pycache__/filesize.cpython-311.pyc,,
771
+ pip/_vendor/rich/__pycache__/highlighter.cpython-311.pyc,,
772
+ pip/_vendor/rich/__pycache__/json.cpython-311.pyc,,
773
+ pip/_vendor/rich/__pycache__/jupyter.cpython-311.pyc,,
774
+ pip/_vendor/rich/__pycache__/layout.cpython-311.pyc,,
775
+ pip/_vendor/rich/__pycache__/live.cpython-311.pyc,,
776
+ pip/_vendor/rich/__pycache__/live_render.cpython-311.pyc,,
777
+ pip/_vendor/rich/__pycache__/logging.cpython-311.pyc,,
778
+ pip/_vendor/rich/__pycache__/markup.cpython-311.pyc,,
779
+ pip/_vendor/rich/__pycache__/measure.cpython-311.pyc,,
780
+ pip/_vendor/rich/__pycache__/padding.cpython-311.pyc,,
781
+ pip/_vendor/rich/__pycache__/pager.cpython-311.pyc,,
782
+ pip/_vendor/rich/__pycache__/palette.cpython-311.pyc,,
783
+ pip/_vendor/rich/__pycache__/panel.cpython-311.pyc,,
784
+ pip/_vendor/rich/__pycache__/pretty.cpython-311.pyc,,
785
+ pip/_vendor/rich/__pycache__/progress.cpython-311.pyc,,
786
+ pip/_vendor/rich/__pycache__/progress_bar.cpython-311.pyc,,
787
+ pip/_vendor/rich/__pycache__/prompt.cpython-311.pyc,,
788
+ pip/_vendor/rich/__pycache__/protocol.cpython-311.pyc,,
789
+ pip/_vendor/rich/__pycache__/region.cpython-311.pyc,,
790
+ pip/_vendor/rich/__pycache__/repr.cpython-311.pyc,,
791
+ pip/_vendor/rich/__pycache__/rule.cpython-311.pyc,,
792
+ pip/_vendor/rich/__pycache__/scope.cpython-311.pyc,,
793
+ pip/_vendor/rich/__pycache__/screen.cpython-311.pyc,,
794
+ pip/_vendor/rich/__pycache__/segment.cpython-311.pyc,,
795
+ pip/_vendor/rich/__pycache__/spinner.cpython-311.pyc,,
796
+ pip/_vendor/rich/__pycache__/status.cpython-311.pyc,,
797
+ pip/_vendor/rich/__pycache__/style.cpython-311.pyc,,
798
+ pip/_vendor/rich/__pycache__/styled.cpython-311.pyc,,
799
+ pip/_vendor/rich/__pycache__/syntax.cpython-311.pyc,,
800
+ pip/_vendor/rich/__pycache__/table.cpython-311.pyc,,
801
+ pip/_vendor/rich/__pycache__/terminal_theme.cpython-311.pyc,,
802
+ pip/_vendor/rich/__pycache__/text.cpython-311.pyc,,
803
+ pip/_vendor/rich/__pycache__/theme.cpython-311.pyc,,
804
+ pip/_vendor/rich/__pycache__/themes.cpython-311.pyc,,
805
+ pip/_vendor/rich/__pycache__/traceback.cpython-311.pyc,,
806
+ pip/_vendor/rich/__pycache__/tree.cpython-311.pyc,,
807
+ pip/_vendor/rich/_cell_widths.py,sha256=2n4EiJi3X9sqIq0O16kUZ_zy6UYMd3xFfChlKfnW1Hc,10096
808
+ pip/_vendor/rich/_emoji_codes.py,sha256=hu1VL9nbVdppJrVoijVshRlcRRe_v3dju3Mmd2sKZdY,140235
809
+ pip/_vendor/rich/_emoji_replace.py,sha256=n-kcetsEUx2ZUmhQrfeMNc-teeGhpuSQ5F8VPBsyvDo,1064
810
+ pip/_vendor/rich/_export_format.py,sha256=qxgV3nKnXQu1hfbnRVswPYy-AwIg1X0LSC47cK5s8jk,2100
811
+ pip/_vendor/rich/_extension.py,sha256=Xt47QacCKwYruzjDi-gOBq724JReDj9Cm9xUi5fr-34,265
812
+ pip/_vendor/rich/_fileno.py,sha256=HWZxP5C2ajMbHryvAQZseflVfQoGzsKOHzKGsLD8ynQ,799
813
+ pip/_vendor/rich/_inspect.py,sha256=oZJGw31e64dwXSCmrDnvZbwVb1ZKhWfU8wI3VWohjJk,9695
814
+ pip/_vendor/rich/_log_render.py,sha256=1ByI0PA1ZpxZY3CGJOK54hjlq4X-Bz_boIjIqCd8Kns,3225
815
+ pip/_vendor/rich/_loop.py,sha256=hV_6CLdoPm0va22Wpw4zKqM0RYsz3TZxXj0PoS-9eDQ,1236
816
+ pip/_vendor/rich/_null_file.py,sha256=tGSXk_v-IZmbj1GAzHit8A3kYIQMiCpVsCFfsC-_KJ4,1387
817
+ pip/_vendor/rich/_palettes.py,sha256=cdev1JQKZ0JvlguV9ipHgznTdnvlIzUFDBb0It2PzjI,7063
818
+ pip/_vendor/rich/_pick.py,sha256=evDt8QN4lF5CiwrUIXlOJCntitBCOsI3ZLPEIAVRLJU,423
819
+ pip/_vendor/rich/_ratio.py,sha256=2lLSliL025Y-YMfdfGbutkQDevhcyDqc-DtUYW9mU70,5472
820
+ pip/_vendor/rich/_spinners.py,sha256=U2r1_g_1zSjsjiUdAESc2iAMc3i4ri_S8PYP6kQ5z1I,19919
821
+ pip/_vendor/rich/_stack.py,sha256=-C8OK7rxn3sIUdVwxZBBpeHhIzX0eI-VM3MemYfaXm0,351
822
+ pip/_vendor/rich/_timer.py,sha256=zelxbT6oPFZnNrwWPpc1ktUeAT-Vc4fuFcRZLQGLtMI,417
823
+ pip/_vendor/rich/_win32_console.py,sha256=P0vxI2fcndym1UU1S37XAzQzQnkyY7YqAKmxm24_gug,22820
824
+ pip/_vendor/rich/_windows.py,sha256=dvNl9TmfPzNVxiKk5WDFihErZ5796g2UC9-KGGyfXmk,1926
825
+ pip/_vendor/rich/_windows_renderer.py,sha256=t74ZL3xuDCP3nmTp9pH1L5LiI2cakJuQRQleHCJerlk,2783
826
+ pip/_vendor/rich/_wrap.py,sha256=xfV_9t0Sg6rzimmrDru8fCVmUlalYAcHLDfrJZnbbwQ,1840
827
+ pip/_vendor/rich/abc.py,sha256=ON-E-ZqSSheZ88VrKX2M3PXpFbGEUUZPMa_Af0l-4f0,890
828
+ pip/_vendor/rich/align.py,sha256=Ji-Yokfkhnfe_xMmr4ISjZB07TJXggBCOYoYa-HDAr8,10368
829
+ pip/_vendor/rich/ansi.py,sha256=iD6532QYqnBm6hADulKjrV8l8kFJ-9fEVooHJHH3hMg,6906
830
+ pip/_vendor/rich/bar.py,sha256=a7UD303BccRCrEhGjfMElpv5RFYIinaAhAuqYqhUvmw,3264
831
+ pip/_vendor/rich/box.py,sha256=FJ6nI3jD7h2XNFU138bJUt2HYmWOlRbltoCEuIAZhew,9842
832
+ pip/_vendor/rich/cells.py,sha256=627ztJs9zOL-38HJ7kXBerR-gT8KBfYC8UzEwMJDYYo,4509
833
+ pip/_vendor/rich/color.py,sha256=9Gh958U3f75WVdLTeC0U9nkGTn2n0wnojKpJ6jQEkIE,18224
834
+ pip/_vendor/rich/color_triplet.py,sha256=3lhQkdJbvWPoLDO-AnYImAWmJvV5dlgYNCVZ97ORaN4,1054
835
+ pip/_vendor/rich/columns.py,sha256=HUX0KcMm9dsKNi11fTbiM_h2iDtl8ySCaVcxlalEzq8,7131
836
+ pip/_vendor/rich/console.py,sha256=pDvkbLkvtZIMIwQx_jkZ-seyNl4zGBLviXoWXte9fwg,99218
837
+ pip/_vendor/rich/constrain.py,sha256=1VIPuC8AgtKWrcncQrjBdYqA3JVWysu6jZo1rrh7c7Q,1288
838
+ pip/_vendor/rich/containers.py,sha256=aKgm5UDHn5Nmui6IJaKdsZhbHClh_X7D-_Wg8Ehrr7s,5497
839
+ pip/_vendor/rich/control.py,sha256=DSkHTUQLorfSERAKE_oTAEUFefZnZp4bQb4q8rHbKws,6630
840
+ pip/_vendor/rich/default_styles.py,sha256=-Fe318kMVI_IwciK5POpThcO0-9DYJ67TZAN6DlmlmM,8082
841
+ pip/_vendor/rich/diagnose.py,sha256=an6uouwhKPAlvQhYpNNpGq9EJysfMIOvvCbO3oSoR24,972
842
+ pip/_vendor/rich/emoji.py,sha256=omTF9asaAnsM4yLY94eR_9dgRRSm1lHUszX20D1yYCQ,2501
843
+ pip/_vendor/rich/errors.py,sha256=5pP3Kc5d4QJ_c0KFsxrfyhjiPVe7J1zOqSFbFAzcV-Y,642
844
+ pip/_vendor/rich/file_proxy.py,sha256=Tl9THMDZ-Pk5Wm8sI1gGg_U5DhusmxD-FZ0fUbcU0W0,1683
845
+ pip/_vendor/rich/filesize.py,sha256=9fTLAPCAwHmBXdRv7KZU194jSgNrRb6Wx7RIoBgqeKY,2508
846
+ pip/_vendor/rich/highlighter.py,sha256=p3C1g4QYzezFKdR7NF9EhPbzQDvdPUhGRgSyGGEmPko,9584
847
+ pip/_vendor/rich/json.py,sha256=EYp9ucj-nDjYDkHCV6Mk1ve8nUOpuFLaW76X50Mis2M,5032
848
+ pip/_vendor/rich/jupyter.py,sha256=QyoKoE_8IdCbrtiSHp9TsTSNyTHY0FO5whE7jOTd9UE,3252
849
+ pip/_vendor/rich/layout.py,sha256=RFYL6HdCFsHf9WRpcvi3w-fpj-8O5dMZ8W96VdKNdbI,14007
850
+ pip/_vendor/rich/live.py,sha256=vZzYvu7fqwlv3Gthl2xiw1Dc_O80VlGcCV0DOHwCyDM,14273
851
+ pip/_vendor/rich/live_render.py,sha256=zElm3PrfSIvjOce28zETHMIUf9pFYSUA5o0AflgUP64,3667
852
+ pip/_vendor/rich/logging.py,sha256=uB-cB-3Q4bmXDLLpbOWkmFviw-Fde39zyMV6tKJ2WHQ,11903
853
+ pip/_vendor/rich/markup.py,sha256=xzF4uAafiEeEYDJYt_vUnJOGoTU8RrH-PH7WcWYXjCg,8198
854
+ pip/_vendor/rich/measure.py,sha256=HmrIJX8sWRTHbgh8MxEay_83VkqNW_70s8aKP5ZcYI8,5305
855
+ pip/_vendor/rich/padding.py,sha256=kTFGsdGe0os7tXLnHKpwTI90CXEvrceeZGCshmJy5zw,4970
856
+ pip/_vendor/rich/pager.py,sha256=SO_ETBFKbg3n_AgOzXm41Sv36YxXAyI3_R-KOY2_uSc,828
857
+ pip/_vendor/rich/palette.py,sha256=lInvR1ODDT2f3UZMfL1grq7dY_pDdKHw4bdUgOGaM4Y,3396
858
+ pip/_vendor/rich/panel.py,sha256=wGMe40J8KCGgQoM0LyjRErmGIkv2bsYA71RCXThD0xE,10574
859
+ pip/_vendor/rich/pretty.py,sha256=eLEYN9xVaMNuA6EJVYm4li7HdOHxCqmVKvnOqJpyFt0,35852
860
+ pip/_vendor/rich/progress.py,sha256=n4KF9vky8_5iYeXcyZPEvzyLplWlDvFLkM5JI0Bs08A,59706
861
+ pip/_vendor/rich/progress_bar.py,sha256=cEoBfkc3lLwqba4XKsUpy4vSQKDh2QQ5J2J94-ACFoo,8165
862
+ pip/_vendor/rich/prompt.py,sha256=x0mW-pIPodJM4ry6grgmmLrl8VZp99kqcmdnBe70YYA,11303
863
+ pip/_vendor/rich/protocol.py,sha256=5hHHDDNHckdk8iWH5zEbi-zuIVSF5hbU2jIo47R7lTE,1391
864
+ pip/_vendor/rich/region.py,sha256=rNT9xZrVZTYIXZC0NYn41CJQwYNbR-KecPOxTgQvB8Y,166
865
+ pip/_vendor/rich/repr.py,sha256=9Z8otOmM-tyxnyTodvXlectP60lwahjGiDTrbrxPSTg,4431
866
+ pip/_vendor/rich/rule.py,sha256=0fNaS_aERa3UMRc3T5WMpN_sumtDxfaor2y3of1ftBk,4602
867
+ pip/_vendor/rich/scope.py,sha256=TMUU8qo17thyqQCPqjDLYpg_UU1k5qVd-WwiJvnJVas,2843
868
+ pip/_vendor/rich/screen.py,sha256=YoeReESUhx74grqb0mSSb9lghhysWmFHYhsbMVQjXO8,1591
869
+ pip/_vendor/rich/segment.py,sha256=XLnJEFvcV3bjaVzMNUJiem3n8lvvI9TJ5PTu-IG2uTg,24247
870
+ pip/_vendor/rich/spinner.py,sha256=15koCmF0DQeD8-k28Lpt6X_zJQUlzEhgo_6A6uy47lc,4339
871
+ pip/_vendor/rich/status.py,sha256=gJsIXIZeSo3urOyxRUjs6VrhX5CZrA0NxIQ-dxhCnwo,4425
872
+ pip/_vendor/rich/style.py,sha256=3hiocH_4N8vwRm3-8yFWzM7tSwjjEven69XqWasSQwM,27073
873
+ pip/_vendor/rich/styled.py,sha256=eZNnzGrI4ki_54pgY3Oj0T-x3lxdXTYh4_ryDB24wBU,1258
874
+ pip/_vendor/rich/syntax.py,sha256=jgDiVCK6cpR0NmBOpZmIu-Ud4eaW7fHvjJZkDbjpcSA,35173
875
+ pip/_vendor/rich/table.py,sha256=-WzesL-VJKsaiDU3uyczpJMHy6VCaSewBYJwx8RudI8,39684
876
+ pip/_vendor/rich/terminal_theme.py,sha256=1j5-ufJfnvlAo5Qsi_ACZiXDmwMXzqgmFByObT9-yJY,3370
877
+ pip/_vendor/rich/text.py,sha256=_8JBlSau0c2z8ENOZMi1hJ7M1ZGY408E4-hXjHyyg1A,45525
878
+ pip/_vendor/rich/theme.py,sha256=belFJogzA0W0HysQabKaHOc3RWH2ko3fQAJhoN-AFdo,3777
879
+ pip/_vendor/rich/themes.py,sha256=0xgTLozfabebYtcJtDdC5QkX5IVUEaviqDUJJh4YVFk,102
880
+ pip/_vendor/rich/traceback.py,sha256=yCLVrCtyoFNENd9mkm2xeG3KmqkTwH9xpFOO7p2Bq0A,29604
881
+ pip/_vendor/rich/tree.py,sha256=BMbUYNjS9uodNPfvtY_odmU09GA5QzcMbQ5cJZhllQI,9169
882
+ pip/_vendor/six.py,sha256=TOOfQi7nFGfMrIvtdr6wX4wyHH8M7aknmuLfo2cBBrM,34549
883
+ pip/_vendor/tenacity/__init__.py,sha256=3kvAL6KClq8GFo2KFhmOzskRKSDQI-ubrlfZ8AQEEI0,20493
884
+ pip/_vendor/tenacity/__pycache__/__init__.cpython-311.pyc,,
885
+ pip/_vendor/tenacity/__pycache__/_asyncio.cpython-311.pyc,,
886
+ pip/_vendor/tenacity/__pycache__/_utils.cpython-311.pyc,,
887
+ pip/_vendor/tenacity/__pycache__/after.cpython-311.pyc,,
888
+ pip/_vendor/tenacity/__pycache__/before.cpython-311.pyc,,
889
+ pip/_vendor/tenacity/__pycache__/before_sleep.cpython-311.pyc,,
890
+ pip/_vendor/tenacity/__pycache__/nap.cpython-311.pyc,,
891
+ pip/_vendor/tenacity/__pycache__/retry.cpython-311.pyc,,
892
+ pip/_vendor/tenacity/__pycache__/stop.cpython-311.pyc,,
893
+ pip/_vendor/tenacity/__pycache__/tornadoweb.cpython-311.pyc,,
894
+ pip/_vendor/tenacity/__pycache__/wait.cpython-311.pyc,,
895
+ pip/_vendor/tenacity/_asyncio.py,sha256=Qi6wgQsGa9MQibYRy3OXqcDQswIZZ00dLOoSUGN-6o8,3551
896
+ pip/_vendor/tenacity/_utils.py,sha256=ubs6a7sxj3JDNRKWCyCU2j5r1CB7rgyONgZzYZq6D_4,2179
897
+ pip/_vendor/tenacity/after.py,sha256=S5NCISScPeIrKwIeXRwdJl3kV9Q4nqZfnNPDx6Hf__g,1682
898
+ pip/_vendor/tenacity/before.py,sha256=dIZE9gmBTffisfwNkK0F1xFwGPV41u5GK70UY4Pi5Kc,1562
899
+ pip/_vendor/tenacity/before_sleep.py,sha256=YmpgN9Y7HGlH97U24vvq_YWb5deaK4_DbiD8ZuFmy-E,2372
900
+ pip/_vendor/tenacity/nap.py,sha256=fRWvnz1aIzbIq9Ap3gAkAZgDH6oo5zxMrU6ZOVByq0I,1383
901
+ pip/_vendor/tenacity/retry.py,sha256=jrzD_mxA5mSTUEdiYB7SHpxltjhPSYZSnSRATb-ggRc,8746
902
+ pip/_vendor/tenacity/stop.py,sha256=YMJs7ZgZfND65PRLqlGB_agpfGXlemx_5Hm4PKnBqpQ,3086
903
+ pip/_vendor/tenacity/tornadoweb.py,sha256=po29_F1Mt8qZpsFjX7EVwAT0ydC_NbVia9gVi7R_wXA,2142
904
+ pip/_vendor/tenacity/wait.py,sha256=3FcBJoCDgym12_dN6xfK8C1gROY0Hn4NSI2u8xv50uE,8024
905
+ pip/_vendor/tomli/__init__.py,sha256=JhUwV66DB1g4Hvt1UQCVMdfCu-IgAV8FXmvDU9onxd4,396
906
+ pip/_vendor/tomli/__pycache__/__init__.cpython-311.pyc,,
907
+ pip/_vendor/tomli/__pycache__/_parser.cpython-311.pyc,,
908
+ pip/_vendor/tomli/__pycache__/_re.cpython-311.pyc,,
909
+ pip/_vendor/tomli/__pycache__/_types.cpython-311.pyc,,
910
+ pip/_vendor/tomli/_parser.py,sha256=g9-ENaALS-B8dokYpCuzUFalWlog7T-SIYMjLZSWrtM,22633
911
+ pip/_vendor/tomli/_re.py,sha256=dbjg5ChZT23Ka9z9DHOXfdtSpPwUfdgMXnj8NOoly-w,2943
912
+ pip/_vendor/tomli/_types.py,sha256=-GTG2VUqkpxwMqzmVO4F7ybKddIbAnuAHXfmWQcTi3Q,254
913
+ pip/_vendor/typing_extensions.py,sha256=EWpcpyQnVmc48E9fSyPGs-vXgHcAk9tQABQIxmMsCGk,111130
914
+ pip/_vendor/urllib3/__init__.py,sha256=iXLcYiJySn0GNbWOOZDDApgBL1JgP44EZ8i1760S8Mc,3333
915
+ pip/_vendor/urllib3/__pycache__/__init__.cpython-311.pyc,,
916
+ pip/_vendor/urllib3/__pycache__/_collections.cpython-311.pyc,,
917
+ pip/_vendor/urllib3/__pycache__/_version.cpython-311.pyc,,
918
+ pip/_vendor/urllib3/__pycache__/connection.cpython-311.pyc,,
919
+ pip/_vendor/urllib3/__pycache__/connectionpool.cpython-311.pyc,,
920
+ pip/_vendor/urllib3/__pycache__/exceptions.cpython-311.pyc,,
921
+ pip/_vendor/urllib3/__pycache__/fields.cpython-311.pyc,,
922
+ pip/_vendor/urllib3/__pycache__/filepost.cpython-311.pyc,,
923
+ pip/_vendor/urllib3/__pycache__/poolmanager.cpython-311.pyc,,
924
+ pip/_vendor/urllib3/__pycache__/request.cpython-311.pyc,,
925
+ pip/_vendor/urllib3/__pycache__/response.cpython-311.pyc,,
926
+ pip/_vendor/urllib3/_collections.py,sha256=Rp1mVyBgc_UlAcp6M3at1skJBXR5J43NawRTvW2g_XY,10811
927
+ pip/_vendor/urllib3/_version.py,sha256=6zoYnDykPLfe92fHqXalH8SxhWVl31yYLCP0lDri_SA,64
928
+ pip/_vendor/urllib3/connection.py,sha256=92k9td_y4PEiTIjNufCUa1NzMB3J3w0LEdyokYgXnW8,20300
929
+ pip/_vendor/urllib3/connectionpool.py,sha256=ItVDasDnPRPP9R8bNxY7tPBlC724nJ9nlxVgXG_SLbI,39990
930
+ pip/_vendor/urllib3/contrib/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
931
+ pip/_vendor/urllib3/contrib/__pycache__/__init__.cpython-311.pyc,,
932
+ pip/_vendor/urllib3/contrib/__pycache__/_appengine_environ.cpython-311.pyc,,
933
+ pip/_vendor/urllib3/contrib/__pycache__/appengine.cpython-311.pyc,,
934
+ pip/_vendor/urllib3/contrib/__pycache__/ntlmpool.cpython-311.pyc,,
935
+ pip/_vendor/urllib3/contrib/__pycache__/pyopenssl.cpython-311.pyc,,
936
+ pip/_vendor/urllib3/contrib/__pycache__/securetransport.cpython-311.pyc,,
937
+ pip/_vendor/urllib3/contrib/__pycache__/socks.cpython-311.pyc,,
938
+ pip/_vendor/urllib3/contrib/_appengine_environ.py,sha256=bDbyOEhW2CKLJcQqAKAyrEHN-aklsyHFKq6vF8ZFsmk,957
939
+ pip/_vendor/urllib3/contrib/_securetransport/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
940
+ pip/_vendor/urllib3/contrib/_securetransport/__pycache__/__init__.cpython-311.pyc,,
941
+ pip/_vendor/urllib3/contrib/_securetransport/__pycache__/bindings.cpython-311.pyc,,
942
+ pip/_vendor/urllib3/contrib/_securetransport/__pycache__/low_level.cpython-311.pyc,,
943
+ pip/_vendor/urllib3/contrib/_securetransport/bindings.py,sha256=4Xk64qIkPBt09A5q-RIFUuDhNc9mXilVapm7WnYnzRw,17632
944
+ pip/_vendor/urllib3/contrib/_securetransport/low_level.py,sha256=B2JBB2_NRP02xK6DCa1Pa9IuxrPwxzDzZbixQkb7U9M,13922
945
+ pip/_vendor/urllib3/contrib/appengine.py,sha256=VR68eAVE137lxTgjBDwCna5UiBZTOKa01Aj_-5BaCz4,11036
946
+ pip/_vendor/urllib3/contrib/ntlmpool.py,sha256=NlfkW7WMdW8ziqudopjHoW299og1BTWi0IeIibquFwk,4528
947
+ pip/_vendor/urllib3/contrib/pyopenssl.py,sha256=hDJh4MhyY_p-oKlFcYcQaVQRDv6GMmBGuW9yjxyeejM,17081
948
+ pip/_vendor/urllib3/contrib/securetransport.py,sha256=yhZdmVjY6PI6EeFbp7qYOp6-vp1Rkv2NMuOGaEj7pmc,34448
949
+ pip/_vendor/urllib3/contrib/socks.py,sha256=aRi9eWXo9ZEb95XUxef4Z21CFlnnjbEiAo9HOseoMt4,7097
950
+ pip/_vendor/urllib3/exceptions.py,sha256=0Mnno3KHTNfXRfY7638NufOPkUb6mXOm-Lqj-4x2w8A,8217
951
+ pip/_vendor/urllib3/fields.py,sha256=kvLDCg_JmH1lLjUUEY_FLS8UhY7hBvDPuVETbY8mdrM,8579
952
+ pip/_vendor/urllib3/filepost.py,sha256=5b_qqgRHVlL7uLtdAYBzBh-GHmU5AfJVt_2N0XS3PeY,2440
953
+ pip/_vendor/urllib3/packages/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
954
+ pip/_vendor/urllib3/packages/__pycache__/__init__.cpython-311.pyc,,
955
+ pip/_vendor/urllib3/packages/__pycache__/six.cpython-311.pyc,,
956
+ pip/_vendor/urllib3/packages/backports/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
957
+ pip/_vendor/urllib3/packages/backports/__pycache__/__init__.cpython-311.pyc,,
958
+ pip/_vendor/urllib3/packages/backports/__pycache__/makefile.cpython-311.pyc,,
959
+ pip/_vendor/urllib3/packages/backports/__pycache__/weakref_finalize.cpython-311.pyc,,
960
+ pip/_vendor/urllib3/packages/backports/makefile.py,sha256=nbzt3i0agPVP07jqqgjhaYjMmuAi_W5E0EywZivVO8E,1417
961
+ pip/_vendor/urllib3/packages/backports/weakref_finalize.py,sha256=tRCal5OAhNSRyb0DhHp-38AtIlCsRP8BxF3NX-6rqIA,5343
962
+ pip/_vendor/urllib3/packages/six.py,sha256=b9LM0wBXv7E7SrbCjAm4wwN-hrH-iNxv18LgWNMMKPo,34665
963
+ pip/_vendor/urllib3/poolmanager.py,sha256=0i8cJgrqupza67IBPZ_u9jXvnSxr5UBlVEiUqdkPtYI,19752
964
+ pip/_vendor/urllib3/request.py,sha256=ZFSIqX0C6WizixecChZ3_okyu7BEv0lZu1VT0s6h4SM,5985
965
+ pip/_vendor/urllib3/response.py,sha256=fmDJAFkG71uFTn-sVSTh2Iw0WmcXQYqkbRjihvwBjU8,30641
966
+ pip/_vendor/urllib3/util/__init__.py,sha256=JEmSmmqqLyaw8P51gUImZh8Gwg9i1zSe-DoqAitn2nc,1155
967
+ pip/_vendor/urllib3/util/__pycache__/__init__.cpython-311.pyc,,
968
+ pip/_vendor/urllib3/util/__pycache__/connection.cpython-311.pyc,,
969
+ pip/_vendor/urllib3/util/__pycache__/proxy.cpython-311.pyc,,
970
+ pip/_vendor/urllib3/util/__pycache__/queue.cpython-311.pyc,,
971
+ pip/_vendor/urllib3/util/__pycache__/request.cpython-311.pyc,,
972
+ pip/_vendor/urllib3/util/__pycache__/response.cpython-311.pyc,,
973
+ pip/_vendor/urllib3/util/__pycache__/retry.cpython-311.pyc,,
974
+ pip/_vendor/urllib3/util/__pycache__/ssl_.cpython-311.pyc,,
975
+ pip/_vendor/urllib3/util/__pycache__/ssl_match_hostname.cpython-311.pyc,,
976
+ pip/_vendor/urllib3/util/__pycache__/ssltransport.cpython-311.pyc,,
977
+ pip/_vendor/urllib3/util/__pycache__/timeout.cpython-311.pyc,,
978
+ pip/_vendor/urllib3/util/__pycache__/url.cpython-311.pyc,,
979
+ pip/_vendor/urllib3/util/__pycache__/wait.cpython-311.pyc,,
980
+ pip/_vendor/urllib3/util/connection.py,sha256=5Lx2B1PW29KxBn2T0xkN1CBgRBa3gGVJBKoQoRogEVk,4901
981
+ pip/_vendor/urllib3/util/proxy.py,sha256=zUvPPCJrp6dOF0N4GAVbOcl6o-4uXKSrGiTkkr5vUS4,1605
982
+ pip/_vendor/urllib3/util/queue.py,sha256=nRgX8_eX-_VkvxoX096QWoz8Ps0QHUAExILCY_7PncM,498
983
+ pip/_vendor/urllib3/util/request.py,sha256=C0OUt2tcU6LRiQJ7YYNP9GvPrSvl7ziIBekQ-5nlBZk,3997
984
+ pip/_vendor/urllib3/util/response.py,sha256=GJpg3Egi9qaJXRwBh5wv-MNuRWan5BIu40oReoxWP28,3510
985
+ pip/_vendor/urllib3/util/retry.py,sha256=4laWh0HpwGijLiBmdBIYtbhYekQnNzzhx2W9uys0RHA,22003
986
+ pip/_vendor/urllib3/util/ssl_.py,sha256=X4-AqW91aYPhPx6-xbf66yHFQKbqqfC_5Zt4WkLX1Hc,17177
987
+ pip/_vendor/urllib3/util/ssl_match_hostname.py,sha256=Ir4cZVEjmAk8gUAIHWSi7wtOO83UCYABY2xFD1Ql_WA,5758
988
+ pip/_vendor/urllib3/util/ssltransport.py,sha256=NA-u5rMTrDFDFC8QzRKUEKMG0561hOD4qBTr3Z4pv6E,6895
989
+ pip/_vendor/urllib3/util/timeout.py,sha256=cwq4dMk87mJHSBktK1miYJ-85G-3T3RmT20v7SFCpno,10168
990
+ pip/_vendor/urllib3/util/url.py,sha256=lCAE7M5myA8EDdW0sJuyyZhVB9K_j38ljWhHAnFaWoE,14296
991
+ pip/_vendor/urllib3/util/wait.py,sha256=fOX0_faozG2P7iVojQoE1mbydweNyTcm-hXEfFrTtLI,5403
992
+ pip/_vendor/vendor.txt,sha256=EyWEHCgXKFKiE8Mku6LONUDLF6UwDwjX1NP2ccKLrLo,475
993
+ pip/_vendor/webencodings/__init__.py,sha256=qOBJIuPy_4ByYH6W_bNgJF-qYQ2DoU-dKsDu5yRWCXg,10579
994
+ pip/_vendor/webencodings/__pycache__/__init__.cpython-311.pyc,,
995
+ pip/_vendor/webencodings/__pycache__/labels.cpython-311.pyc,,
996
+ pip/_vendor/webencodings/__pycache__/mklabels.cpython-311.pyc,,
997
+ pip/_vendor/webencodings/__pycache__/tests.cpython-311.pyc,,
998
+ pip/_vendor/webencodings/__pycache__/x_user_defined.cpython-311.pyc,,
999
+ pip/_vendor/webencodings/labels.py,sha256=4AO_KxTddqGtrL9ns7kAPjb0CcN6xsCIxbK37HY9r3E,8979
1000
+ pip/_vendor/webencodings/mklabels.py,sha256=GYIeywnpaLnP0GSic8LFWgd0UVvO_l1Nc6YoF-87R_4,1305
1001
+ pip/_vendor/webencodings/tests.py,sha256=OtGLyjhNY1fvkW1GvLJ_FV9ZoqC9Anyjr7q3kxTbzNs,6563
1002
+ pip/_vendor/webencodings/x_user_defined.py,sha256=yOqWSdmpytGfUgh_Z6JYgDNhoc-BAHyyeeT15Fr42tM,4307
1003
+ pip/py.typed,sha256=EBVvvPRTn_eIpz5e5QztSCdrMX7Qwd7VP93RSoIlZ2I,286
env/Lib/site-packages/pip-23.2.1.dist-info/REQUESTED ADDED
File without changes
env/Lib/site-packages/pip-23.2.1.dist-info/WHEEL ADDED
@@ -0,0 +1,5 @@
 
 
 
 
 
 
1
+ Wheel-Version: 1.0
2
+ Generator: bdist_wheel (0.40.0)
3
+ Root-Is-Purelib: true
4
+ Tag: py3-none-any
5
+
env/Lib/site-packages/pip-23.2.1.dist-info/entry_points.txt ADDED
@@ -0,0 +1,4 @@
 
 
 
 
 
1
+ [console_scripts]
2
+ pip = pip._internal.cli.main:main
3
+ pip3 = pip._internal.cli.main:main
4
+ pip3.11 = pip._internal.cli.main:main
env/Lib/site-packages/pip-23.2.1.dist-info/top_level.txt ADDED
@@ -0,0 +1 @@
 
 
1
+ pip
env/Lib/site-packages/pip/__init__.py ADDED
@@ -0,0 +1,13 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ from typing import List, Optional
2
+
3
+ __version__ = "23.2.1"
4
+
5
+
6
+ def main(args: Optional[List[str]] = None) -> int:
7
+ """This is an internal API only meant for use by pip's own console scripts.
8
+
9
+ For additional details, see https://github.com/pypa/pip/issues/7498.
10
+ """
11
+ from pip._internal.utils.entrypoints import _wrapper
12
+
13
+ return _wrapper(args)
env/Lib/site-packages/pip/__main__.py ADDED
@@ -0,0 +1,24 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import os
2
+ import sys
3
+
4
+ # Remove '' and current working directory from the first entry
5
+ # of sys.path, if present to avoid using current directory
6
+ # in pip commands check, freeze, install, list and show,
7
+ # when invoked as python -m pip <command>
8
+ if sys.path[0] in ("", os.getcwd()):
9
+ sys.path.pop(0)
10
+
11
+ # If we are running from a wheel, add the wheel to sys.path
12
+ # This allows the usage python pip-*.whl/pip install pip-*.whl
13
+ if __package__ == "":
14
+ # __file__ is pip-*.whl/pip/__main__.py
15
+ # first dirname call strips of '/__main__.py', second strips off '/pip'
16
+ # Resulting path is the name of the wheel itself
17
+ # Add that to sys.path so we can import pip
18
+ path = os.path.dirname(os.path.dirname(__file__))
19
+ sys.path.insert(0, path)
20
+
21
+ if __name__ == "__main__":
22
+ from pip._internal.cli.main import main as _main
23
+
24
+ sys.exit(_main())
env/Lib/site-packages/pip/__pip-runner__.py ADDED
@@ -0,0 +1,50 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ """Execute exactly this copy of pip, within a different environment.
2
+
3
+ This file is named as it is, to ensure that this module can't be imported via
4
+ an import statement.
5
+ """
6
+
7
+ # /!\ This version compatibility check section must be Python 2 compatible. /!\
8
+
9
+ import sys
10
+
11
+ # Copied from setup.py
12
+ PYTHON_REQUIRES = (3, 7)
13
+
14
+
15
+ def version_str(version): # type: ignore
16
+ return ".".join(str(v) for v in version)
17
+
18
+
19
+ if sys.version_info[:2] < PYTHON_REQUIRES:
20
+ raise SystemExit(
21
+ "This version of pip does not support python {} (requires >={}).".format(
22
+ version_str(sys.version_info[:2]), version_str(PYTHON_REQUIRES)
23
+ )
24
+ )
25
+
26
+ # From here on, we can use Python 3 features, but the syntax must remain
27
+ # Python 2 compatible.
28
+
29
+ import runpy # noqa: E402
30
+ from importlib.machinery import PathFinder # noqa: E402
31
+ from os.path import dirname # noqa: E402
32
+
33
+ PIP_SOURCES_ROOT = dirname(dirname(__file__))
34
+
35
+
36
+ class PipImportRedirectingFinder:
37
+ @classmethod
38
+ def find_spec(self, fullname, path=None, target=None): # type: ignore
39
+ if fullname != "pip":
40
+ return None
41
+
42
+ spec = PathFinder.find_spec(fullname, [PIP_SOURCES_ROOT], target)
43
+ assert spec, (PIP_SOURCES_ROOT, fullname)
44
+ return spec
45
+
46
+
47
+ sys.meta_path.insert(0, PipImportRedirectingFinder())
48
+
49
+ assert __name__ == "__main__", "Cannot run __pip-runner__.py as a non-main module"
50
+ runpy.run_module("pip", run_name="__main__", alter_sys=True)
env/Lib/site-packages/pip/__pycache__/__init__.cpython-311.pyc ADDED
Binary file (870 Bytes). View file
 
env/Lib/site-packages/pip/__pycache__/__main__.cpython-311.pyc ADDED
Binary file (987 Bytes). View file
 
env/Lib/site-packages/pip/__pycache__/__pip-runner__.cpython-311.pyc ADDED
Binary file (2.61 kB). View file
 
env/Lib/site-packages/pip/_internal/__init__.py ADDED
@@ -0,0 +1,19 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ from typing import List, Optional
2
+
3
+ import pip._internal.utils.inject_securetransport # noqa
4
+ from pip._internal.utils import _log
5
+
6
+ # init_logging() must be called before any call to logging.getLogger()
7
+ # which happens at import of most modules.
8
+ _log.init_logging()
9
+
10
+
11
+ def main(args: (Optional[List[str]]) = None) -> int:
12
+ """This is preserved for old console scripts that may still be referencing
13
+ it.
14
+
15
+ For additional details, see https://github.com/pypa/pip/issues/7498.
16
+ """
17
+ from pip._internal.utils.entrypoints import _wrapper
18
+
19
+ return _wrapper(args)
env/Lib/site-packages/pip/_internal/__pycache__/__init__.cpython-311.pyc ADDED
Binary file (1.05 kB). View file
 
env/Lib/site-packages/pip/_internal/__pycache__/build_env.cpython-311.pyc ADDED
Binary file (16.2 kB). View file
 
env/Lib/site-packages/pip/_internal/__pycache__/cache.cpython-311.pyc ADDED
Binary file (14.4 kB). View file
 
env/Lib/site-packages/pip/_internal/__pycache__/configuration.cpython-311.pyc ADDED
Binary file (19.6 kB). View file
 
env/Lib/site-packages/pip/_internal/__pycache__/exceptions.cpython-311.pyc ADDED
Binary file (37.7 kB). View file
 
env/Lib/site-packages/pip/_internal/__pycache__/main.cpython-311.pyc ADDED
Binary file (853 Bytes). View file
 
env/Lib/site-packages/pip/_internal/__pycache__/pyproject.cpython-311.pyc ADDED
Binary file (5.72 kB). View file
 
env/Lib/site-packages/pip/_internal/__pycache__/self_outdated_check.cpython-311.pyc ADDED
Binary file (11.4 kB). View file
 
env/Lib/site-packages/pip/_internal/__pycache__/wheel_builder.cpython-311.pyc ADDED
Binary file (15.4 kB). View file
 
env/Lib/site-packages/pip/_internal/build_env.py ADDED
@@ -0,0 +1,311 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ """Build Environment used for isolation during sdist building
2
+ """
3
+
4
+ import logging
5
+ import os
6
+ import pathlib
7
+ import site
8
+ import sys
9
+ import textwrap
10
+ from collections import OrderedDict
11
+ from types import TracebackType
12
+ from typing import TYPE_CHECKING, Iterable, List, Optional, Set, Tuple, Type, Union
13
+
14
+ from pip._vendor.certifi import where
15
+ from pip._vendor.packaging.requirements import Requirement
16
+ from pip._vendor.packaging.version import Version
17
+
18
+ from pip import __file__ as pip_location
19
+ from pip._internal.cli.spinners import open_spinner
20
+ from pip._internal.locations import get_platlib, get_purelib, get_scheme
21
+ from pip._internal.metadata import get_default_environment, get_environment
22
+ from pip._internal.utils.subprocess import call_subprocess
23
+ from pip._internal.utils.temp_dir import TempDirectory, tempdir_kinds
24
+
25
+ if TYPE_CHECKING:
26
+ from pip._internal.index.package_finder import PackageFinder
27
+
28
+ logger = logging.getLogger(__name__)
29
+
30
+
31
+ def _dedup(a: str, b: str) -> Union[Tuple[str], Tuple[str, str]]:
32
+ return (a, b) if a != b else (a,)
33
+
34
+
35
+ class _Prefix:
36
+ def __init__(self, path: str) -> None:
37
+ self.path = path
38
+ self.setup = False
39
+ scheme = get_scheme("", prefix=path)
40
+ self.bin_dir = scheme.scripts
41
+ self.lib_dirs = _dedup(scheme.purelib, scheme.platlib)
42
+
43
+
44
+ def get_runnable_pip() -> str:
45
+ """Get a file to pass to a Python executable, to run the currently-running pip.
46
+
47
+ This is used to run a pip subprocess, for installing requirements into the build
48
+ environment.
49
+ """
50
+ source = pathlib.Path(pip_location).resolve().parent
51
+
52
+ if not source.is_dir():
53
+ # This would happen if someone is using pip from inside a zip file. In that
54
+ # case, we can use that directly.
55
+ return str(source)
56
+
57
+ return os.fsdecode(source / "__pip-runner__.py")
58
+
59
+
60
+ def _get_system_sitepackages() -> Set[str]:
61
+ """Get system site packages
62
+
63
+ Usually from site.getsitepackages,
64
+ but fallback on `get_purelib()/get_platlib()` if unavailable
65
+ (e.g. in a virtualenv created by virtualenv<20)
66
+
67
+ Returns normalized set of strings.
68
+ """
69
+ if hasattr(site, "getsitepackages"):
70
+ system_sites = site.getsitepackages()
71
+ else:
72
+ # virtualenv < 20 overwrites site.py without getsitepackages
73
+ # fallback on get_purelib/get_platlib.
74
+ # this is known to miss things, but shouldn't in the cases
75
+ # where getsitepackages() has been removed (inside a virtualenv)
76
+ system_sites = [get_purelib(), get_platlib()]
77
+ return {os.path.normcase(path) for path in system_sites}
78
+
79
+
80
+ class BuildEnvironment:
81
+ """Creates and manages an isolated environment to install build deps"""
82
+
83
+ def __init__(self) -> None:
84
+ temp_dir = TempDirectory(kind=tempdir_kinds.BUILD_ENV, globally_managed=True)
85
+
86
+ self._prefixes = OrderedDict(
87
+ (name, _Prefix(os.path.join(temp_dir.path, name)))
88
+ for name in ("normal", "overlay")
89
+ )
90
+
91
+ self._bin_dirs: List[str] = []
92
+ self._lib_dirs: List[str] = []
93
+ for prefix in reversed(list(self._prefixes.values())):
94
+ self._bin_dirs.append(prefix.bin_dir)
95
+ self._lib_dirs.extend(prefix.lib_dirs)
96
+
97
+ # Customize site to:
98
+ # - ensure .pth files are honored
99
+ # - prevent access to system site packages
100
+ system_sites = _get_system_sitepackages()
101
+
102
+ self._site_dir = os.path.join(temp_dir.path, "site")
103
+ if not os.path.exists(self._site_dir):
104
+ os.mkdir(self._site_dir)
105
+ with open(
106
+ os.path.join(self._site_dir, "sitecustomize.py"), "w", encoding="utf-8"
107
+ ) as fp:
108
+ fp.write(
109
+ textwrap.dedent(
110
+ """
111
+ import os, site, sys
112
+
113
+ # First, drop system-sites related paths.
114
+ original_sys_path = sys.path[:]
115
+ known_paths = set()
116
+ for path in {system_sites!r}:
117
+ site.addsitedir(path, known_paths=known_paths)
118
+ system_paths = set(
119
+ os.path.normcase(path)
120
+ for path in sys.path[len(original_sys_path):]
121
+ )
122
+ original_sys_path = [
123
+ path for path in original_sys_path
124
+ if os.path.normcase(path) not in system_paths
125
+ ]
126
+ sys.path = original_sys_path
127
+
128
+ # Second, add lib directories.
129
+ # ensuring .pth file are processed.
130
+ for path in {lib_dirs!r}:
131
+ assert not path in sys.path
132
+ site.addsitedir(path)
133
+ """
134
+ ).format(system_sites=system_sites, lib_dirs=self._lib_dirs)
135
+ )
136
+
137
+ def __enter__(self) -> None:
138
+ self._save_env = {
139
+ name: os.environ.get(name, None)
140
+ for name in ("PATH", "PYTHONNOUSERSITE", "PYTHONPATH")
141
+ }
142
+
143
+ path = self._bin_dirs[:]
144
+ old_path = self._save_env["PATH"]
145
+ if old_path:
146
+ path.extend(old_path.split(os.pathsep))
147
+
148
+ pythonpath = [self._site_dir]
149
+
150
+ os.environ.update(
151
+ {
152
+ "PATH": os.pathsep.join(path),
153
+ "PYTHONNOUSERSITE": "1",
154
+ "PYTHONPATH": os.pathsep.join(pythonpath),
155
+ }
156
+ )
157
+
158
+ def __exit__(
159
+ self,
160
+ exc_type: Optional[Type[BaseException]],
161
+ exc_val: Optional[BaseException],
162
+ exc_tb: Optional[TracebackType],
163
+ ) -> None:
164
+ for varname, old_value in self._save_env.items():
165
+ if old_value is None:
166
+ os.environ.pop(varname, None)
167
+ else:
168
+ os.environ[varname] = old_value
169
+
170
+ def check_requirements(
171
+ self, reqs: Iterable[str]
172
+ ) -> Tuple[Set[Tuple[str, str]], Set[str]]:
173
+ """Return 2 sets:
174
+ - conflicting requirements: set of (installed, wanted) reqs tuples
175
+ - missing requirements: set of reqs
176
+ """
177
+ missing = set()
178
+ conflicting = set()
179
+ if reqs:
180
+ env = (
181
+ get_environment(self._lib_dirs)
182
+ if hasattr(self, "_lib_dirs")
183
+ else get_default_environment()
184
+ )
185
+ for req_str in reqs:
186
+ req = Requirement(req_str)
187
+ # We're explicitly evaluating with an empty extra value, since build
188
+ # environments are not provided any mechanism to select specific extras.
189
+ if req.marker is not None and not req.marker.evaluate({"extra": ""}):
190
+ continue
191
+ dist = env.get_distribution(req.name)
192
+ if not dist:
193
+ missing.add(req_str)
194
+ continue
195
+ if isinstance(dist.version, Version):
196
+ installed_req_str = f"{req.name}=={dist.version}"
197
+ else:
198
+ installed_req_str = f"{req.name}==={dist.version}"
199
+ if not req.specifier.contains(dist.version, prereleases=True):
200
+ conflicting.add((installed_req_str, req_str))
201
+ # FIXME: Consider direct URL?
202
+ return conflicting, missing
203
+
204
+ def install_requirements(
205
+ self,
206
+ finder: "PackageFinder",
207
+ requirements: Iterable[str],
208
+ prefix_as_string: str,
209
+ *,
210
+ kind: str,
211
+ ) -> None:
212
+ prefix = self._prefixes[prefix_as_string]
213
+ assert not prefix.setup
214
+ prefix.setup = True
215
+ if not requirements:
216
+ return
217
+ self._install_requirements(
218
+ get_runnable_pip(),
219
+ finder,
220
+ requirements,
221
+ prefix,
222
+ kind=kind,
223
+ )
224
+
225
+ @staticmethod
226
+ def _install_requirements(
227
+ pip_runnable: str,
228
+ finder: "PackageFinder",
229
+ requirements: Iterable[str],
230
+ prefix: _Prefix,
231
+ *,
232
+ kind: str,
233
+ ) -> None:
234
+ args: List[str] = [
235
+ sys.executable,
236
+ pip_runnable,
237
+ "install",
238
+ "--ignore-installed",
239
+ "--no-user",
240
+ "--prefix",
241
+ prefix.path,
242
+ "--no-warn-script-location",
243
+ ]
244
+ if logger.getEffectiveLevel() <= logging.DEBUG:
245
+ args.append("-v")
246
+ for format_control in ("no_binary", "only_binary"):
247
+ formats = getattr(finder.format_control, format_control)
248
+ args.extend(
249
+ (
250
+ "--" + format_control.replace("_", "-"),
251
+ ",".join(sorted(formats or {":none:"})),
252
+ )
253
+ )
254
+
255
+ index_urls = finder.index_urls
256
+ if index_urls:
257
+ args.extend(["-i", index_urls[0]])
258
+ for extra_index in index_urls[1:]:
259
+ args.extend(["--extra-index-url", extra_index])
260
+ else:
261
+ args.append("--no-index")
262
+ for link in finder.find_links:
263
+ args.extend(["--find-links", link])
264
+
265
+ for host in finder.trusted_hosts:
266
+ args.extend(["--trusted-host", host])
267
+ if finder.allow_all_prereleases:
268
+ args.append("--pre")
269
+ if finder.prefer_binary:
270
+ args.append("--prefer-binary")
271
+ args.append("--")
272
+ args.extend(requirements)
273
+ extra_environ = {"_PIP_STANDALONE_CERT": where()}
274
+ with open_spinner(f"Installing {kind}") as spinner:
275
+ call_subprocess(
276
+ args,
277
+ command_desc=f"pip subprocess to install {kind}",
278
+ spinner=spinner,
279
+ extra_environ=extra_environ,
280
+ )
281
+
282
+
283
+ class NoOpBuildEnvironment(BuildEnvironment):
284
+ """A no-op drop-in replacement for BuildEnvironment"""
285
+
286
+ def __init__(self) -> None:
287
+ pass
288
+
289
+ def __enter__(self) -> None:
290
+ pass
291
+
292
+ def __exit__(
293
+ self,
294
+ exc_type: Optional[Type[BaseException]],
295
+ exc_val: Optional[BaseException],
296
+ exc_tb: Optional[TracebackType],
297
+ ) -> None:
298
+ pass
299
+
300
+ def cleanup(self) -> None:
301
+ pass
302
+
303
+ def install_requirements(
304
+ self,
305
+ finder: "PackageFinder",
306
+ requirements: Iterable[str],
307
+ prefix_as_string: str,
308
+ *,
309
+ kind: str,
310
+ ) -> None:
311
+ raise NotImplementedError()
env/Lib/site-packages/pip/_internal/cache.py ADDED
@@ -0,0 +1,292 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ """Cache Management
2
+ """
3
+
4
+ import hashlib
5
+ import json
6
+ import logging
7
+ import os
8
+ from pathlib import Path
9
+ from typing import Any, Dict, List, Optional
10
+
11
+ from pip._vendor.packaging.tags import Tag, interpreter_name, interpreter_version
12
+ from pip._vendor.packaging.utils import canonicalize_name
13
+
14
+ from pip._internal.exceptions import InvalidWheelFilename
15
+ from pip._internal.models.direct_url import DirectUrl
16
+ from pip._internal.models.link import Link
17
+ from pip._internal.models.wheel import Wheel
18
+ from pip._internal.utils.temp_dir import TempDirectory, tempdir_kinds
19
+ from pip._internal.utils.urls import path_to_url
20
+
21
+ logger = logging.getLogger(__name__)
22
+
23
+ ORIGIN_JSON_NAME = "origin.json"
24
+
25
+
26
+ def _hash_dict(d: Dict[str, str]) -> str:
27
+ """Return a stable sha224 of a dictionary."""
28
+ s = json.dumps(d, sort_keys=True, separators=(",", ":"), ensure_ascii=True)
29
+ return hashlib.sha224(s.encode("ascii")).hexdigest()
30
+
31
+
32
+ class Cache:
33
+ """An abstract class - provides cache directories for data from links
34
+
35
+ :param cache_dir: The root of the cache.
36
+ """
37
+
38
+ def __init__(self, cache_dir: str) -> None:
39
+ super().__init__()
40
+ assert not cache_dir or os.path.isabs(cache_dir)
41
+ self.cache_dir = cache_dir or None
42
+
43
+ def _get_cache_path_parts(self, link: Link) -> List[str]:
44
+ """Get parts of part that must be os.path.joined with cache_dir"""
45
+
46
+ # We want to generate an url to use as our cache key, we don't want to
47
+ # just re-use the URL because it might have other items in the fragment
48
+ # and we don't care about those.
49
+ key_parts = {"url": link.url_without_fragment}
50
+ if link.hash_name is not None and link.hash is not None:
51
+ key_parts[link.hash_name] = link.hash
52
+ if link.subdirectory_fragment:
53
+ key_parts["subdirectory"] = link.subdirectory_fragment
54
+
55
+ # Include interpreter name, major and minor version in cache key
56
+ # to cope with ill-behaved sdists that build a different wheel
57
+ # depending on the python version their setup.py is being run on,
58
+ # and don't encode the difference in compatibility tags.
59
+ # https://github.com/pypa/pip/issues/7296
60
+ key_parts["interpreter_name"] = interpreter_name()
61
+ key_parts["interpreter_version"] = interpreter_version()
62
+
63
+ # Encode our key url with sha224, we'll use this because it has similar
64
+ # security properties to sha256, but with a shorter total output (and
65
+ # thus less secure). However the differences don't make a lot of
66
+ # difference for our use case here.
67
+ hashed = _hash_dict(key_parts)
68
+
69
+ # We want to nest the directories some to prevent having a ton of top
70
+ # level directories where we might run out of sub directories on some
71
+ # FS.
72
+ parts = [hashed[:2], hashed[2:4], hashed[4:6], hashed[6:]]
73
+
74
+ return parts
75
+
76
+ def _get_candidates(self, link: Link, canonical_package_name: str) -> List[Any]:
77
+ can_not_cache = not self.cache_dir or not canonical_package_name or not link
78
+ if can_not_cache:
79
+ return []
80
+
81
+ candidates = []
82
+ path = self.get_path_for_link(link)
83
+ if os.path.isdir(path):
84
+ for candidate in os.listdir(path):
85
+ candidates.append((candidate, path))
86
+ return candidates
87
+
88
+ def get_path_for_link(self, link: Link) -> str:
89
+ """Return a directory to store cached items in for link."""
90
+ raise NotImplementedError()
91
+
92
+ def get(
93
+ self,
94
+ link: Link,
95
+ package_name: Optional[str],
96
+ supported_tags: List[Tag],
97
+ ) -> Link:
98
+ """Returns a link to a cached item if it exists, otherwise returns the
99
+ passed link.
100
+ """
101
+ raise NotImplementedError()
102
+
103
+
104
+ class SimpleWheelCache(Cache):
105
+ """A cache of wheels for future installs."""
106
+
107
+ def __init__(self, cache_dir: str) -> None:
108
+ super().__init__(cache_dir)
109
+
110
+ def get_path_for_link(self, link: Link) -> str:
111
+ """Return a directory to store cached wheels for link
112
+
113
+ Because there are M wheels for any one sdist, we provide a directory
114
+ to cache them in, and then consult that directory when looking up
115
+ cache hits.
116
+
117
+ We only insert things into the cache if they have plausible version
118
+ numbers, so that we don't contaminate the cache with things that were
119
+ not unique. E.g. ./package might have dozens of installs done for it
120
+ and build a version of 0.0...and if we built and cached a wheel, we'd
121
+ end up using the same wheel even if the source has been edited.
122
+
123
+ :param link: The link of the sdist for which this will cache wheels.
124
+ """
125
+ parts = self._get_cache_path_parts(link)
126
+ assert self.cache_dir
127
+ # Store wheels within the root cache_dir
128
+ return os.path.join(self.cache_dir, "wheels", *parts)
129
+
130
+ def get(
131
+ self,
132
+ link: Link,
133
+ package_name: Optional[str],
134
+ supported_tags: List[Tag],
135
+ ) -> Link:
136
+ candidates = []
137
+
138
+ if not package_name:
139
+ return link
140
+
141
+ canonical_package_name = canonicalize_name(package_name)
142
+ for wheel_name, wheel_dir in self._get_candidates(link, canonical_package_name):
143
+ try:
144
+ wheel = Wheel(wheel_name)
145
+ except InvalidWheelFilename:
146
+ continue
147
+ if canonicalize_name(wheel.name) != canonical_package_name:
148
+ logger.debug(
149
+ "Ignoring cached wheel %s for %s as it "
150
+ "does not match the expected distribution name %s.",
151
+ wheel_name,
152
+ link,
153
+ package_name,
154
+ )
155
+ continue
156
+ if not wheel.supported(supported_tags):
157
+ # Built for a different python/arch/etc
158
+ continue
159
+ candidates.append(
160
+ (
161
+ wheel.support_index_min(supported_tags),
162
+ wheel_name,
163
+ wheel_dir,
164
+ )
165
+ )
166
+
167
+ if not candidates:
168
+ return link
169
+
170
+ _, wheel_name, wheel_dir = min(candidates)
171
+ return Link(path_to_url(os.path.join(wheel_dir, wheel_name)))
172
+
173
+
174
+ class EphemWheelCache(SimpleWheelCache):
175
+ """A SimpleWheelCache that creates it's own temporary cache directory"""
176
+
177
+ def __init__(self) -> None:
178
+ self._temp_dir = TempDirectory(
179
+ kind=tempdir_kinds.EPHEM_WHEEL_CACHE,
180
+ globally_managed=True,
181
+ )
182
+
183
+ super().__init__(self._temp_dir.path)
184
+
185
+
186
+ class CacheEntry:
187
+ def __init__(
188
+ self,
189
+ link: Link,
190
+ persistent: bool,
191
+ ):
192
+ self.link = link
193
+ self.persistent = persistent
194
+ self.origin: Optional[DirectUrl] = None
195
+ origin_direct_url_path = Path(self.link.file_path).parent / ORIGIN_JSON_NAME
196
+ if origin_direct_url_path.exists():
197
+ try:
198
+ self.origin = DirectUrl.from_json(
199
+ origin_direct_url_path.read_text(encoding="utf-8")
200
+ )
201
+ except Exception as e:
202
+ logger.warning(
203
+ "Ignoring invalid cache entry origin file %s for %s (%s)",
204
+ origin_direct_url_path,
205
+ link.filename,
206
+ e,
207
+ )
208
+
209
+
210
+ class WheelCache(Cache):
211
+ """Wraps EphemWheelCache and SimpleWheelCache into a single Cache
212
+
213
+ This Cache allows for gracefully degradation, using the ephem wheel cache
214
+ when a certain link is not found in the simple wheel cache first.
215
+ """
216
+
217
+ def __init__(self, cache_dir: str) -> None:
218
+ super().__init__(cache_dir)
219
+ self._wheel_cache = SimpleWheelCache(cache_dir)
220
+ self._ephem_cache = EphemWheelCache()
221
+
222
+ def get_path_for_link(self, link: Link) -> str:
223
+ return self._wheel_cache.get_path_for_link(link)
224
+
225
+ def get_ephem_path_for_link(self, link: Link) -> str:
226
+ return self._ephem_cache.get_path_for_link(link)
227
+
228
+ def get(
229
+ self,
230
+ link: Link,
231
+ package_name: Optional[str],
232
+ supported_tags: List[Tag],
233
+ ) -> Link:
234
+ cache_entry = self.get_cache_entry(link, package_name, supported_tags)
235
+ if cache_entry is None:
236
+ return link
237
+ return cache_entry.link
238
+
239
+ def get_cache_entry(
240
+ self,
241
+ link: Link,
242
+ package_name: Optional[str],
243
+ supported_tags: List[Tag],
244
+ ) -> Optional[CacheEntry]:
245
+ """Returns a CacheEntry with a link to a cached item if it exists or
246
+ None. The cache entry indicates if the item was found in the persistent
247
+ or ephemeral cache.
248
+ """
249
+ retval = self._wheel_cache.get(
250
+ link=link,
251
+ package_name=package_name,
252
+ supported_tags=supported_tags,
253
+ )
254
+ if retval is not link:
255
+ return CacheEntry(retval, persistent=True)
256
+
257
+ retval = self._ephem_cache.get(
258
+ link=link,
259
+ package_name=package_name,
260
+ supported_tags=supported_tags,
261
+ )
262
+ if retval is not link:
263
+ return CacheEntry(retval, persistent=False)
264
+
265
+ return None
266
+
267
+ @staticmethod
268
+ def record_download_origin(cache_dir: str, download_info: DirectUrl) -> None:
269
+ origin_path = Path(cache_dir) / ORIGIN_JSON_NAME
270
+ if origin_path.exists():
271
+ try:
272
+ origin = DirectUrl.from_json(origin_path.read_text(encoding="utf-8"))
273
+ except Exception as e:
274
+ logger.warning(
275
+ "Could not read origin file %s in cache entry (%s). "
276
+ "Will attempt to overwrite it.",
277
+ origin_path,
278
+ e,
279
+ )
280
+ else:
281
+ # TODO: use DirectUrl.equivalent when
282
+ # https://github.com/pypa/pip/pull/10564 is merged.
283
+ if origin.url != download_info.url:
284
+ logger.warning(
285
+ "Origin URL %s in cache entry %s does not match download URL "
286
+ "%s. This is likely a pip bug or a cache corruption issue. "
287
+ "Will overwrite it with the new value.",
288
+ origin.url,
289
+ cache_dir,
290
+ download_info.url,
291
+ )
292
+ origin_path.write_text(download_info.to_json(), encoding="utf-8")
env/Lib/site-packages/pip/_internal/cli/__init__.py ADDED
@@ -0,0 +1,4 @@
 
 
 
 
 
1
+ """Subpackage containing all of pip's command line interface related code
2
+ """
3
+
4
+ # This file intentionally does not import submodules
env/Lib/site-packages/pip/_internal/cli/__pycache__/__init__.cpython-311.pyc ADDED
Binary file (388 Bytes). View file
 
env/Lib/site-packages/pip/_internal/cli/__pycache__/autocompletion.cpython-311.pyc ADDED
Binary file (10.2 kB). View file
 
env/Lib/site-packages/pip/_internal/cli/__pycache__/base_command.cpython-311.pyc ADDED
Binary file (12 kB). View file
 
env/Lib/site-packages/pip/_internal/cli/__pycache__/cmdoptions.cpython-311.pyc ADDED
Binary file (33.8 kB). View file
 
env/Lib/site-packages/pip/_internal/cli/__pycache__/command_context.cpython-311.pyc ADDED
Binary file (2.21 kB). View file
 
env/Lib/site-packages/pip/_internal/cli/__pycache__/main.cpython-311.pyc ADDED
Binary file (2.68 kB). View file
 
env/Lib/site-packages/pip/_internal/cli/__pycache__/main_parser.cpython-311.pyc ADDED
Binary file (5.62 kB). View file
 
env/Lib/site-packages/pip/_internal/cli/__pycache__/parser.cpython-311.pyc ADDED
Binary file (17.1 kB). View file
 
env/Lib/site-packages/pip/_internal/cli/__pycache__/progress_bars.cpython-311.pyc ADDED
Binary file (3.27 kB). View file
 
env/Lib/site-packages/pip/_internal/cli/__pycache__/req_command.cpython-311.pyc ADDED
Binary file (20.4 kB). View file
 
env/Lib/site-packages/pip/_internal/cli/__pycache__/spinners.cpython-311.pyc ADDED
Binary file (8.94 kB). View file