huff 1.4.0__py3-none-any.whl → 1.5.0__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
huff/ors.py CHANGED
@@ -4,8 +4,8 @@
4
4
  # Author: Thomas Wieland
5
5
  # ORCID: 0000-0001-5168-9846
6
6
  # mail: geowieland@googlemail.com
7
- # Version: 1.4.0
8
- # Last update: 2025-06-10 17:17
7
+ # Version: 1.4.1
8
+ # Last update: 2025-06-16 17:44
9
9
  # Copyright (c) 2025 Thomas Wieland
10
10
  #-----------------------------------------------------------------------
11
11
 
huff/osm.py CHANGED
@@ -4,8 +4,8 @@
4
4
  # Author: Thomas Wieland
5
5
  # ORCID: 0000-0001-5168-9846
6
6
  # mail: geowieland@googlemail.com
7
- # Version: 1.4.0
8
- # Last update: 2025-06-10 17:17
7
+ # Version: 1.4.1
8
+ # Last update: 2025-06-16 17:44
9
9
  # Copyright (c) 2025 Thomas Wieland
10
10
  #-----------------------------------------------------------------------
11
11
 
@@ -0,0 +1 @@
1
+ UTF-8
@@ -0,0 +1 @@
1
+ PROJCS["DHDN_3_Degree_Gauss_Zone_3",GEOGCS["GCS_Deutsches_Hauptdreiecksnetz",DATUM["D_Deutsches_Hauptdreiecksnetz",SPHEROID["Bessel_1841",6377397.155,299.1528128]],PRIMEM["Greenwich",0.0],UNIT["Degree",0.0174532925199433]],PROJECTION["Gauss_Kruger"],PARAMETER["False_Easting",3500000.0],PARAMETER["False_Northing",0.0],PARAMETER["Central_Meridian",9.0],PARAMETER["Scale_Factor",1.0],PARAMETER["Latitude_Of_Origin",0.0],UNIT["Meter",1.0]]
@@ -0,0 +1,26 @@
1
+ <!DOCTYPE qgis PUBLIC 'http://mrcc.com/qgis.dtd' 'SYSTEM'>
2
+ <qgis version="3.28.3-Firenze">
3
+ <identifier></identifier>
4
+ <parentidentifier></parentidentifier>
5
+ <language></language>
6
+ <type></type>
7
+ <title></title>
8
+ <abstract></abstract>
9
+ <links/>
10
+ <fees></fees>
11
+ <encoding></encoding>
12
+ <crs>
13
+ <spatialrefsys nativeFormat="Wkt">
14
+ <wkt></wkt>
15
+ <proj4></proj4>
16
+ <srsid>0</srsid>
17
+ <srid>0</srid>
18
+ <authid></authid>
19
+ <description></description>
20
+ <projectionacronym></projectionacronym>
21
+ <ellipsoidacronym></ellipsoidacronym>
22
+ <geographicflag>false</geographicflag>
23
+ </spatialrefsys>
24
+ </crs>
25
+ <extent/>
26
+ </qgis>
Binary file
huff/tests/tests_huff.py CHANGED
@@ -4,13 +4,13 @@
4
4
  # Author: Thomas Wieland
5
5
  # ORCID: 0000-0001-5168-9846
6
6
  # mail: geowieland@googlemail.com
7
- # Version: 1.4.0
8
- # Last update: 2025-06-10 17:16
7
+ # Version: 1.5.0
8
+ # Last update: 2025-06-25 18:32
9
9
  # Copyright (c) 2025 Thomas Wieland
10
10
  #-----------------------------------------------------------------------
11
11
 
12
12
 
13
- from huff.models import create_interaction_matrix, get_isochrones, load_geodata, load_interaction_matrix, modelfit
13
+ from huff.models import create_interaction_matrix, get_isochrones, load_geodata, load_interaction_matrix, load_marketareas, market_shares, modelfit
14
14
  from huff.osm import map_with_basemap
15
15
  from huff.gistools import buffers, point_spatial_join
16
16
 
@@ -39,8 +39,8 @@ Haslach.define_marketsize("pop")
39
39
  # Definition of market size variable
40
40
 
41
41
  Haslach.define_transportcosts_weighting(
42
- #param_lambda = -2.2,
43
- # one weighting parameter for power function (default)
42
+ # param_lambda = -2.2,
43
+ # # one weighting parameter for power function (default)
44
44
  param_lambda = [10, -0.5],
45
45
  func="logistic"
46
46
  # two weighting parameters for logistic function
@@ -77,7 +77,8 @@ Haslach_supermarkets.isochrones(
77
77
  save_output=True,
78
78
  ors_auth="5b3ce3597851110001cf62480a15aafdb5a64f4d91805929f8af6abd",
79
79
  output_filepath="Haslach_supermarkets_iso.shp",
80
- output_crs="EPSG:31467"
80
+ output_crs="EPSG:31467",
81
+ delay=0.2
81
82
  )
82
83
  # Obtaining isochrones for walking (5 and 10 minutes)
83
84
  # ORS API documentation: https://openrouteservice.org/dev/#/api-docs/v2/
@@ -99,43 +100,90 @@ haslach_interactionmatrix = create_interaction_matrix(
99
100
  )
100
101
  # Creating interaction matrix
101
102
 
102
- interaction_matrix = haslach_interactionmatrix.transport_costs(
103
+ haslach_interactionmatrix.transport_costs(
103
104
  #ors_auth="5b3ce3597851110001cf62480a15aafdb5a64f4d91805929f8af6abd"
104
- network=False
105
+ network=False,
106
+ #distance_unit="meters",
105
107
  # set network = True to calculate transport costs matrix via ORS API (default)
106
108
  )
107
109
  # Obtaining transport costs (default: driving-car)
108
110
  # ORS API documentation: https://openrouteservice.org/dev/#/api-docs/v2/
109
111
 
110
- interaction_matrix.summary()
112
+ haslach_interactionmatrix.summary()
111
113
  # Summary of interaction matrix
112
114
 
113
- print(interaction_matrix.hansen())
115
+ print(haslach_interactionmatrix.hansen())
114
116
  # Hansen accessibility for interaction matrix
115
117
 
116
- interaction_matrix = interaction_matrix.flows()
118
+ haslach_interactionmatrix.flows()
117
119
  # Calculating spatial flows for interaction matrix
118
120
 
119
- huff_model = interaction_matrix.marketareas()
121
+ huff_model = haslach_interactionmatrix.marketareas()
120
122
  # Calculating total market areas
121
123
  # Result of class HuffModel
122
124
 
123
125
  huff_model.summary()
124
126
  # Summary of Huff model
125
127
 
126
- huff_model_mlfit = huff_model.ml_fit(
127
- initial_params=[1, 10, -0.5],
128
- bounds = [(0, 1), (7, 12), (-0.7, -0.1)],
128
+ print(huff_model.get_market_areas_df())
129
+ # Showing total market areas
130
+
131
+
132
+ # Maximum Likelihood fit for Huff Model:
133
+
134
+ haslach_interactionmatrix.huff_ml_fit(
135
+ #initial_params=[1, -2],
136
+ initial_params=[1, 9, -0.6],
137
+ method="trust-constr",
138
+ #bounds = [(0.8, 0.9999),(-2.5, -1.5)],
139
+ bounds = [(0.8, 0.9999),(7, 11),(-0.9, -0.4)],
129
140
  )
130
- print(huff_model_mlfit)
131
141
  # Maximum Likelihood fit for Huff Model
132
142
 
143
+ haslach_interactionmatrix.summary()
144
+ # Summary of fitted ML-fitted interaction matrix (Huff model)
145
+
146
+ huff_model_fit = haslach_interactionmatrix.marketareas()
147
+ # Calculcation of total market areas
148
+ # Result of class HuffModel
149
+
150
+ huff_model_fit.summary()
151
+ # Huff model summary
152
+
153
+
154
+ # Adding new supply location:
155
+
156
+ Haslach_new_supermarket = load_geodata(
157
+ "data/Haslach_new_supermarket.shp",
158
+ location_type="destinations",
159
+ unique_id="LFDNR"
160
+ )
161
+ # Loading new supply locations (shapefile)
162
+
163
+ Haslach_new_supermarket.summary()
164
+ # Summary of new supply locations data
165
+
166
+ Haslach_supermarkets.add_new_destinations(Haslach_new_supermarket)
167
+ # Adding new supermarket to existing supply locations
168
+
169
+ Haslach_supermarkets.summary()
170
+ # Summary of updated supply locations
171
+
172
+ huff_model.update()
173
+ # Update interaction matrix
174
+
175
+ huff_model.summary()
176
+ # Summary of updated interaction matrix
177
+
133
178
  print(huff_model.get_market_areas_df())
134
- # Showing total market areas
179
+ # Showing total market areas of model with estimated parameters and new destination
135
180
 
136
- print(interaction_matrix.get_interaction_matrix_df())
181
+ print(huff_model.get_interaction_matrix_df())
137
182
  # Showing df of interaction matrix
138
183
 
184
+ huff_model.get_interaction_matrix_df().to_excel("interaction_matrix_df.xlsx")
185
+ # Export of interaction matrix
186
+
139
187
 
140
188
  # Multiplicative Competitive Interaction Model:
141
189
 
@@ -164,8 +212,10 @@ Wieland2015_interaction_matrix = load_interaction_matrix(
164
212
  "K",
165
213
  "K_KKr"
166
214
  ],
215
+ market_size_col="Sum_Ek1",
216
+ flows_col="Anb_Eink1",
167
217
  transport_costs_col="Dist_Min2",
168
- probabilities_col="MA",
218
+ probabilities_col="MA_Anb1",
169
219
  data_type="xlsx"
170
220
  )
171
221
 
@@ -182,10 +232,8 @@ Wieland2015_fit = Wieland2015_interaction_matrix.mci_fit(
182
232
  )
183
233
  # Fitting MCI model with four independent variables
184
234
 
185
- Wieland2015_fit.summary()
186
- # MCI model summary
187
-
188
235
  Wieland2015_fit.probabilities()
236
+ # Calculating probabilities
189
237
 
190
238
  Wieland2015_fit_interactionmatrix = Wieland2015_fit.get_interaction_matrix_df()
191
239
  # Export interaction matrix
@@ -194,6 +242,93 @@ Wieland2015_fit.summary()
194
242
  # MCI model summary
195
243
 
196
244
 
245
+ # Parameter estimation via Maximum Likelihood:
246
+
247
+ Wieland2015_interaction_matrix2 = load_interaction_matrix(
248
+ data="data/Wieland2015.xlsx",
249
+ customer_origins_col="Quellort",
250
+ supply_locations_col="Zielort",
251
+ attraction_col=[
252
+ "VF",
253
+ "K",
254
+ "K_KKr"
255
+ ],
256
+ market_size_col="Sum_Ek",
257
+ flows_col="Anb_Eink",
258
+ transport_costs_col="Dist_Min2",
259
+ probabilities_col="MA_Anb",
260
+ data_type="xlsx",
261
+ xlsx_sheet="interactionmatrix",
262
+ check_df_vars=False
263
+ )
264
+ # Loading empirical interaction matrix again
265
+
266
+ Wieland2015_interaction_matrix2.define_weightings(
267
+ vars_funcs = {
268
+ 0: {
269
+ "name": "A_j",
270
+ "func": "power"
271
+ },
272
+ 1: {
273
+ "name": "t_ij",
274
+ "func": "power",
275
+ #"func": "exponential"
276
+ #"func": "logistic"
277
+ },
278
+ 2: {
279
+ "name": "K",
280
+ "func": "power"
281
+ },
282
+ 3: {
283
+ "name": "K_KKr",
284
+ "func": "power"
285
+ }
286
+ }
287
+ )
288
+ # Defining weighting functions
289
+
290
+ Wieland2015_interaction_matrix2.huff_ml_fit(
291
+ # Power TC function
292
+ initial_params=[0.9, -0.5, 0.5, 0.3],
293
+ bounds=[(0.5, 1), (-0.7, -0.2), (0.2, 0.7), (0.2, 0.7)],
294
+ # # Logistic TC function:
295
+ # initial_params=[0.9, 10, -0.5, 0.5, 0.3],
296
+ # bounds=[(0.5, 1), (8, 12), (-0.7, -0.2), (0.2, 0.7), (0.2, 0.7)],
297
+ fit_by="flows",
298
+ method = "trust-constr"
299
+ )
300
+ # ML fit with power transport cost function
301
+
302
+ Wieland2015_interaction_matrix2.summary()
303
+ # Summary of interaction matrix
304
+
305
+ huff_model_fit2 = Wieland2015_interaction_matrix2.marketareas()
306
+ # Calculation of market areas
307
+
308
+ huff_model_fit2.summary()
309
+ # Summary of Hudd model
310
+
311
+
312
+ # Loading and including total market areas
313
+
314
+ Wieland2025_totalmarketareas = load_marketareas(
315
+ data="data/Wieland2015.xlsx",
316
+ supply_locations_col="Zielort",
317
+ total_col="Anb_Eink",
318
+ data_type="xlsx",
319
+ xlsx_sheet="total_marketareas"
320
+ )
321
+ # Loading empirical total market areas
322
+
323
+ huff_model_fit2 = Wieland2025_totalmarketareas.add_to_model(
324
+ huff_model_fit2
325
+ )
326
+ # Adding total market areas to HuffModel object
327
+
328
+ print(huff_model_fit2.get_market_areas_df())
329
+ # Showing total market areas of HuffModel object
330
+
331
+
197
332
  # Buffer analysis:
198
333
 
199
334
  Haslach_supermarkets_gdf = Haslach_supermarkets.get_geodata_gpd_original()
@@ -252,7 +387,8 @@ map_with_basemap(
252
387
  Haslach_supermarkets_gdf
253
388
  ],
254
389
  styles={
255
- 0: {"name": "Isochrones",
390
+ 0: {
391
+ "name": "Isochrones",
256
392
  "color": {
257
393
  "segm_min": {
258
394
  "3": "midnightblue",
@@ -264,11 +400,13 @@ map_with_basemap(
264
400
  },
265
401
  "alpha": 0.3
266
402
  },
267
- 1: {"name": "Districts",
403
+ 1: {
404
+ "name": "Districts",
268
405
  "color": "black",
269
406
  "alpha": 1
270
407
  },
271
- 2: {"name": "Supermarket chains",
408
+ 2: {
409
+ "name": "Supermarket chains",
272
410
  "color": {
273
411
  "Name": {
274
412
  "Aldi S├╝d": "blue",
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: huff
3
- Version: 1.4.0
3
+ Version: 1.5.0
4
4
  Summary: huff: Huff Model Market Area Analysis
5
5
  Author: Thomas Wieland
6
6
  Author-email: geowieland@googlemail.com
@@ -28,14 +28,25 @@ Thomas Wieland [ORCID](https://orcid.org/0000-0001-5168-9846) [EMail](mailto:geo
28
28
  See the /tests directory for usage examples of most of the included functions.
29
29
 
30
30
 
31
+ ## Updates v1.5.0
32
+ - Extensions:
33
+ - Huff model utility via InteractionMatrix.utility() extended to >2 variables
34
+ - Huff Model Maximum Likelihood fit via InteractionMatrix.huff_ml_fit() extended: >2 variables, fit by flows or probabilities
35
+ - Loading total market areas data as class MarketAreas
36
+ - Extended output of InteractionMatrix.summary()
37
+ - Bugfixes:
38
+ - InteractionMatrix.utility(): Tests for availability of relevant columns
39
+ - InteractionMatrix.flows(): Tests for availability of relevant columns
40
+ - modelfit(): Symmetrical (M)APE instead of (M)APE when observed contains zeros
41
+
31
42
  ## Features
32
43
 
33
44
  - **Huff Model**:
34
45
  - Defining origins and destinations with weightings
35
46
  - Creating interaction matrix from origins and destinations
36
- - Market simulation with basic Huff Model
37
47
  - Different function types: power, exponential, logistic
38
- - Huff model parameter estimation via Maximum Likelihood (ML)
48
+ - Huff model parameter estimation via Maximum Likelihood (ML) by probalities and customer flows
49
+ - Huff model market simulation
39
50
  - **Multiplicative Competitive Interaction Model**:
40
51
  - Log-centering transformation of interaction matrix
41
52
  - Fitting MCI model with >= 2 independent variables
@@ -0,0 +1,30 @@
1
+ huff/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
2
+ huff/gistools.py,sha256=fgeE1IsUO7UIaawb23kuiz_Rlxn7T18iLLTA5yvgp74,7038
3
+ huff/models.py,sha256=fGQP6eZOkV9wRVNw_0jYY8zIW74VAR0MMQ9YR8Vjcn4,105491
4
+ huff/ors.py,sha256=JlO2UEishQX87PIiktksOrVT5QdB-GEWgjXcxoR_KuA,11929
5
+ huff/osm.py,sha256=9A-7hxeZyjA2r8w2_IqqwH14qq2Y9AS1GxVKOD7utqs,7747
6
+ huff/tests/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
7
+ huff/tests/tests_huff.py,sha256=xhJcUYQ6dJIg6cPMez8yRIcicvuXkww8NPHXmt-Qrjg,11955
8
+ huff/tests/data/Haslach.cpg,sha256=OtMDH1UDpEBK-CUmLugjLMBNTqZoPULF3QovKiesmCQ,5
9
+ huff/tests/data/Haslach.dbf,sha256=GVPIt05OzDO7UrRDcsMhiYWvyXAPg6Z-qkiysFzj-fc,506
10
+ huff/tests/data/Haslach.prj,sha256=2Jy1Vlzh7UxQ1MXpZ9UYLs2SxfrObj2xkEkZyLqmGTY,437
11
+ huff/tests/data/Haslach.qmd,sha256=JlcOYzG4vI1NH1IuOpxwIPnJsCyC-pDRAI00TzEvNf0,2522
12
+ huff/tests/data/Haslach.shp,sha256=s7ks-ukOIKMJCD5x6m0MO6pwkg1USvhudQKTg74ib1E,212
13
+ huff/tests/data/Haslach.shx,sha256=VEMghRPP_HUYIuGoxR7X0eHQe9LnO4s8JP4twfzKyyk,132
14
+ huff/tests/data/Haslach_new_supermarket.cpg,sha256=OtMDH1UDpEBK-CUmLugjLMBNTqZoPULF3QovKiesmCQ,5
15
+ huff/tests/data/Haslach_new_supermarket.dbf,sha256=QFO7fq2F2dSOh-JEXF8lq_vZKfaPzCHNGCUtSkixbD4,3054
16
+ huff/tests/data/Haslach_new_supermarket.prj,sha256=2Jy1Vlzh7UxQ1MXpZ9UYLs2SxfrObj2xkEkZyLqmGTY,437
17
+ huff/tests/data/Haslach_new_supermarket.qmd,sha256=Yo2TZyuelYj3Uc00_Wa5a8ZfA-GeyRA1PsODQS9tRPg,666
18
+ huff/tests/data/Haslach_new_supermarket.shp,sha256=RYyoQPM-W-5Ifm9PV2H6oghhm954BMmZzZ9Q_WlUOPQ,128
19
+ huff/tests/data/Haslach_new_supermarket.shx,sha256=wSYoIeoHrdsiLqVPxRPA5ZBy7IQ7lx1BoXjV9fXEP9w,108
20
+ huff/tests/data/Haslach_supermarkets.cpg,sha256=OtMDH1UDpEBK-CUmLugjLMBNTqZoPULF3QovKiesmCQ,5
21
+ huff/tests/data/Haslach_supermarkets.dbf,sha256=4fTBxntDvQ8qFPdGK82ywJd2Xq_9nApDyi3h5_KPFSc,21282
22
+ huff/tests/data/Haslach_supermarkets.prj,sha256=2Jy1Vlzh7UxQ1MXpZ9UYLs2SxfrObj2xkEkZyLqmGTY,437
23
+ huff/tests/data/Haslach_supermarkets.qmd,sha256=JlcOYzG4vI1NH1IuOpxwIPnJsCyC-pDRAI00TzEvNf0,2522
24
+ huff/tests/data/Haslach_supermarkets.shp,sha256=X7QbQ0BTMag_B-bDRbpr-go2BQIXo3Y8zMAKpYZmlps,324
25
+ huff/tests/data/Haslach_supermarkets.shx,sha256=j23QHX-SmdAeN04rw0x8nUOran-OCg_T6r_LvzzEPWs,164
26
+ huff/tests/data/Wieland2015.xlsx,sha256=jUt9YcRrYL99AjxzXKMXD3o5erjd9r_jYfnALdrTQ3o,24333
27
+ huff-1.5.0.dist-info/METADATA,sha256=Ig_hu8ssyzbtuAUUxMw3ykAHpthSoyMeSxAgeSw3P9o,6319
28
+ huff-1.5.0.dist-info/WHEEL,sha256=tZoeGjtWxWRfdplE7E3d45VPlLNQnvbKiYnx7gwAy8A,92
29
+ huff-1.5.0.dist-info/top_level.txt,sha256=nlzX-PxZNFmIxANIJMySuIFPihd6qOBkRlhIC28NEsQ,5
30
+ huff-1.5.0.dist-info/RECORD,,
@@ -1,24 +0,0 @@
1
- huff/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
2
- huff/gistools.py,sha256=Bl_5hqjbXwVgUDDXV5Ti-vXhUsKiaMLIFKDDW7CqCd0,7038
3
- huff/models.py,sha256=PBB58aO-4XIl-QvO-nfw6X8ElXhzUVsiEMG_PYzgI2M,75159
4
- huff/ors.py,sha256=CATQf0s-6iq1VMnQFMlPA2AjyyYyApfarVXyzOtVNo0,11929
5
- huff/osm.py,sha256=91spvaFVyKuGLbuRSx6mfi306Lt94J_scD_SQPwrggo,7747
6
- huff/tests/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
7
- huff/tests/tests_huff.py,sha256=AfvCjadGeGp6rHod9bTJQsCYk5K3YfwlVg1s16R_1BA,8149
8
- huff/tests/data/Haslach.cpg,sha256=OtMDH1UDpEBK-CUmLugjLMBNTqZoPULF3QovKiesmCQ,5
9
- huff/tests/data/Haslach.dbf,sha256=GVPIt05OzDO7UrRDcsMhiYWvyXAPg6Z-qkiysFzj-fc,506
10
- huff/tests/data/Haslach.prj,sha256=2Jy1Vlzh7UxQ1MXpZ9UYLs2SxfrObj2xkEkZyLqmGTY,437
11
- huff/tests/data/Haslach.qmd,sha256=JlcOYzG4vI1NH1IuOpxwIPnJsCyC-pDRAI00TzEvNf0,2522
12
- huff/tests/data/Haslach.shp,sha256=s7ks-ukOIKMJCD5x6m0MO6pwkg1USvhudQKTg74ib1E,212
13
- huff/tests/data/Haslach.shx,sha256=VEMghRPP_HUYIuGoxR7X0eHQe9LnO4s8JP4twfzKyyk,132
14
- huff/tests/data/Haslach_supermarkets.cpg,sha256=OtMDH1UDpEBK-CUmLugjLMBNTqZoPULF3QovKiesmCQ,5
15
- huff/tests/data/Haslach_supermarkets.dbf,sha256=4fTBxntDvQ8qFPdGK82ywJd2Xq_9nApDyi3h5_KPFSc,21282
16
- huff/tests/data/Haslach_supermarkets.prj,sha256=2Jy1Vlzh7UxQ1MXpZ9UYLs2SxfrObj2xkEkZyLqmGTY,437
17
- huff/tests/data/Haslach_supermarkets.qmd,sha256=JlcOYzG4vI1NH1IuOpxwIPnJsCyC-pDRAI00TzEvNf0,2522
18
- huff/tests/data/Haslach_supermarkets.shp,sha256=X7QbQ0BTMag_B-bDRbpr-go2BQIXo3Y8zMAKpYZmlps,324
19
- huff/tests/data/Haslach_supermarkets.shx,sha256=j23QHX-SmdAeN04rw0x8nUOran-OCg_T6r_LvzzEPWs,164
20
- huff/tests/data/Wieland2015.xlsx,sha256=SaVM-Hi5dBTmf2bzszMnZ2Ec8NUE05S_5F2lQj0ayS0,19641
21
- huff-1.4.0.dist-info/METADATA,sha256=OHL8b-FoJaADeRyUJDpQZoWYsm3Avm1bBxYak5rc6rI,5692
22
- huff-1.4.0.dist-info/WHEEL,sha256=tZoeGjtWxWRfdplE7E3d45VPlLNQnvbKiYnx7gwAy8A,92
23
- huff-1.4.0.dist-info/top_level.txt,sha256=nlzX-PxZNFmIxANIJMySuIFPihd6qOBkRlhIC28NEsQ,5
24
- huff-1.4.0.dist-info/RECORD,,
File without changes