chellow 1681398121.0.0__py3-none-any.whl → 1681477937.0.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.

Potentially problematic release.


This version of chellow might be problematic. Click here for more details.

chellow/e/views.py CHANGED
@@ -12,6 +12,7 @@ from dateutil.relativedelta import relativedelta
12
12
 
13
13
  from flask import (
14
14
  Blueprint,
15
+ Response,
15
16
  flash,
16
17
  g,
17
18
  make_response,
@@ -1900,6 +1901,53 @@ def llfcs_get():
1900
1901
  return render_template("llfcs.html", llfcs=llfcs, dno=dno)
1901
1902
 
1902
1903
 
1904
+ def _csv_response(fname, titles, rows):
1905
+ with StringIO() as f:
1906
+ writer = csv.writer(f)
1907
+ writer.writerow(titles)
1908
+ for row in rows:
1909
+ writer.writerow([csv_make_val(v) for v in row])
1910
+
1911
+ return Response(
1912
+ f.getvalue(),
1913
+ mimetype="text/csv",
1914
+ headers={"Content-disposition": f'attachment; filename="{fname}"'},
1915
+ )
1916
+
1917
+
1918
+ @e.route("/llfcs/csv")
1919
+ def llfcs_csv_get():
1920
+ dno_id = req_int("dno_id")
1921
+ dno = Party.get_dno_by_id(g.sess, dno_id)
1922
+ rows = g.sess.execute(
1923
+ select(
1924
+ Party.dno_code,
1925
+ Llfc.code,
1926
+ Llfc.description,
1927
+ VoltageLevel.code,
1928
+ Llfc.is_substation,
1929
+ Llfc.is_import,
1930
+ Llfc.valid_from,
1931
+ Llfc.valid_to,
1932
+ )
1933
+ .join(Party)
1934
+ .join(VoltageLevel)
1935
+ .where(Llfc.dno == dno)
1936
+ .order_by(Llfc.code)
1937
+ ).all()
1938
+ titles = (
1939
+ "dno_code",
1940
+ "code",
1941
+ "description",
1942
+ "voltage_level",
1943
+ "is_substation",
1944
+ "is_import",
1945
+ "valid_from",
1946
+ "valid_to",
1947
+ )
1948
+ return _csv_response(f"llfcs_{dno.dno_code}.csv", titles, rows)
1949
+
1950
+
1903
1951
  @e.route("/llfcs/<int:llfc_id>")
1904
1952
  def llfc_get(llfc_id):
1905
1953
  llfc = Llfc.get_by_id(g.sess, llfc_id)
@@ -2771,6 +2819,49 @@ def mtc_participants_get():
2771
2819
  )
2772
2820
 
2773
2821
 
2822
+ @e.route("/mtc_participants/csv")
2823
+ def mtc_participants_csv_get():
2824
+ participant_id = req_int("participant_id")
2825
+ participant = Participant.get_by_id(g.sess, participant_id)
2826
+ titles = (
2827
+ "participant_code",
2828
+ "code",
2829
+ "is_common",
2830
+ "has_related_metering",
2831
+ "description",
2832
+ "has_comms",
2833
+ "is_hh",
2834
+ "meter_type",
2835
+ "meter_payment_type",
2836
+ "tpr_count",
2837
+ "valid_from",
2838
+ "valid_to",
2839
+ )
2840
+ rows = g.sess.execute(
2841
+ select(
2842
+ Participant.code,
2843
+ Mtc.code,
2844
+ Mtc.is_common,
2845
+ Mtc.has_related_metering,
2846
+ MtcParticipant.description,
2847
+ MtcParticipant.has_comms,
2848
+ MtcParticipant.is_hh,
2849
+ MeterType.code,
2850
+ MeterPaymentType.code,
2851
+ MtcParticipant.tpr_count,
2852
+ MtcParticipant.valid_from,
2853
+ MtcParticipant.valid_to,
2854
+ )
2855
+ .join(Participant)
2856
+ .join(Mtc)
2857
+ .join(MeterType)
2858
+ .join(MeterPaymentType)
2859
+ .where(MtcParticipant.participant == participant)
2860
+ .order_by(Mtc.code)
2861
+ ).all()
2862
+ return _csv_response(f"mtc_participants_{participant.code}.csv", titles, rows)
2863
+
2864
+
2774
2865
  @e.route("/mtc_participants/<int:mtc_participant_id>")
2775
2866
  def mtc_participant_get(mtc_participant_id):
2776
2867
  mtc_participant = MtcParticipant.get_by_id(g.sess, mtc_participant_id)
@@ -2801,6 +2892,36 @@ def mtc_sscs_get():
2801
2892
  return render_template("mtc_sscs.html", mtc_sscs=mtc_sscs, dno=dno)
2802
2893
 
2803
2894
 
2895
+ @e.route("/mtc_sscs/csv")
2896
+ def mtc_sscs_csv_get():
2897
+ participant_id = req_int("participant_id")
2898
+ participant = Participant.get_by_id(g.sess, participant_id)
2899
+ titles = (
2900
+ "participant_code",
2901
+ "mtc_code",
2902
+ "ssc_code",
2903
+ "valid_from",
2904
+ "valid_to",
2905
+ )
2906
+ rows = g.sess.execute(
2907
+ select(
2908
+ Participant.code,
2909
+ Mtc.code,
2910
+ Ssc.code,
2911
+ MtcSsc.valid_from,
2912
+ MtcSsc.valid_to,
2913
+ )
2914
+ .select_from(MtcSsc)
2915
+ .join(MtcParticipant)
2916
+ .join(MtcParticipant.participant)
2917
+ .join(Mtc)
2918
+ .join(Ssc)
2919
+ .where(MtcParticipant.participant == participant)
2920
+ .order_by(Mtc.code, Ssc.code)
2921
+ ).all()
2922
+ return _csv_response(f"mtc_sscs_{participant.code}.csv", titles, rows)
2923
+
2924
+
2804
2925
  @e.route("/mtc_sscs/<int:mtc_ssc_id>")
2805
2926
  def mtc_ssc_get(mtc_ssc_id):
2806
2927
  mtc_ssc = MtcSsc.get_by_id(g.sess, mtc_ssc_id)
@@ -2829,6 +2950,36 @@ def mtc_llfcs_get():
2829
2950
  return render_template("mtc_llfcs.html", mtc_llfcs=mtc_llfcs, dno=dno)
2830
2951
 
2831
2952
 
2953
+ @e.route("/mtc_llfcs/csv")
2954
+ def mtc_llfcs_csv_get():
2955
+ participant_id = req_int("participant_id")
2956
+ participant = Participant.get_by_id(g.sess, participant_id)
2957
+ titles = (
2958
+ "participant_code",
2959
+ "mtc_code",
2960
+ "llfc_code",
2961
+ "valid_from",
2962
+ "valid_to",
2963
+ )
2964
+ rows = g.sess.execute(
2965
+ select(
2966
+ Participant.code,
2967
+ Mtc.code,
2968
+ Llfc.code,
2969
+ MtcLlfc.valid_from,
2970
+ MtcLlfc.valid_to,
2971
+ )
2972
+ .select_from(MtcLlfc)
2973
+ .join(MtcParticipant)
2974
+ .join(Participant)
2975
+ .join(Mtc)
2976
+ .join(Llfc)
2977
+ .where(MtcParticipant.participant == participant)
2978
+ .order_by(Mtc.code, Llfc.code)
2979
+ ).all()
2980
+ return _csv_response(f"mtc_sscs_{participant.code}.csv", titles, rows)
2981
+
2982
+
2832
2983
  @e.route("/mtc_llfcs/<int:mtc_llfc_id>")
2833
2984
  def mtc_llfc_get(mtc_llfc_id):
2834
2985
  mtc_llfc = MtcLlfc.get_by_id(g.sess, mtc_llfc_id)
@@ -2878,6 +3029,46 @@ def mtc_llfc_ssc_pcs_get():
2878
3029
  return render_template("mtc_llfc_ssc_pcs.html", mtc_llfc_ssc_pcs=combos, dno=dno)
2879
3030
 
2880
3031
 
3032
+ @e.route("/mtc_llfc_ssc_pcs/csv")
3033
+ def mtc_llfc_ssc_pcs_csv_get():
3034
+ dno_id = req_int("dno_id")
3035
+ dno = Party.get_dno_by_id(g.sess, dno_id)
3036
+ titles = (
3037
+ "dno_code",
3038
+ "pc_code",
3039
+ "llfc_code",
3040
+ "ssc_code",
3041
+ "mtc_code",
3042
+ "valid_from",
3043
+ "valid_to",
3044
+ )
3045
+ rows = g.sess.execute(
3046
+ select(
3047
+ Party.dno_code,
3048
+ Pc.code,
3049
+ Llfc.code,
3050
+ Ssc.code,
3051
+ Mtc.code,
3052
+ MtcLlfcSscPc.valid_from,
3053
+ MtcLlfcSscPc.valid_to,
3054
+ )
3055
+ .select_from(MtcLlfcSscPc)
3056
+ .join(Pc)
3057
+ .join(MtcLlfcSsc)
3058
+ .join(Llfc)
3059
+ .join(Party)
3060
+ .join(MtcSsc)
3061
+ .join(Ssc)
3062
+ .join(MtcParticipant)
3063
+ .join(Mtc)
3064
+ .where(Llfc.dno == dno)
3065
+ .order_by(
3066
+ Pc.code, Llfc.code, Ssc.code, Mtc.code, MtcLlfcSscPc.valid_from.desc()
3067
+ )
3068
+ ).all()
3069
+ return _csv_response(f"mtc_llfc_ssc_pcs_{dno.dno_code}.csv", titles, rows)
3070
+
3071
+
2881
3072
  @e.route("/mtc_llfc_ssc_pcs/<int:combo_id>")
2882
3073
  def mtc_llfc_ssc_pc_get(combo_id):
2883
3074
  combo = MtcLlfcSscPc.get_by_id(g.sess, combo_id)
@@ -2915,6 +3106,40 @@ def mtc_llfc_sscs_get():
2915
3106
  return render_template("mtc_llfc_sscs.html", mtc_llfc_sscs=combos, dno=dno)
2916
3107
 
2917
3108
 
3109
+ @e.route("/mtc_llfc_sscs/csv")
3110
+ def mtc_llfc_sscs_csv_get():
3111
+ participant_id = req_int("participant_id")
3112
+ participant = Participant.get_by_id(g.sess, participant_id)
3113
+ titles = (
3114
+ "participant_code",
3115
+ "llfc_code",
3116
+ "ssc_code",
3117
+ "mtc_code",
3118
+ "valid_from",
3119
+ "valid_to",
3120
+ )
3121
+ rows = g.sess.execute(
3122
+ select(
3123
+ Participant.code,
3124
+ Llfc.code,
3125
+ Ssc.code,
3126
+ Mtc.code,
3127
+ MtcLlfcSsc.valid_from,
3128
+ MtcLlfcSsc.valid_to,
3129
+ )
3130
+ .select_from(MtcLlfcSsc)
3131
+ .join(MtcSsc)
3132
+ .join(MtcParticipant)
3133
+ .join(Participant)
3134
+ .join(Mtc)
3135
+ .join(Llfc)
3136
+ .join(Ssc)
3137
+ .where(MtcParticipant.participant == participant)
3138
+ .order_by(Llfc.code, Ssc.code, Mtc.code, MtcLlfcSsc.valid_from.desc())
3139
+ ).all()
3140
+ return _csv_response(f"mtc_llfc_sscs_{participant.code}.csv", titles, rows)
3141
+
3142
+
2918
3143
  @e.route("/mtc_llfc_sscs/<int:combo_id>")
2919
3144
  def mtc_llfc_ssc_get(combo_id):
2920
3145
  combo = MtcLlfcSsc.get_by_id(g.sess, combo_id)
chellow/rate_server.py CHANGED
@@ -14,7 +14,7 @@ from chellow.models import (
14
14
  Contract,
15
15
  Session,
16
16
  )
17
- from chellow.utils import hh_format, utc_datetime_now
17
+ from chellow.utils import ct_datetime_now, hh_format, utc_datetime_now
18
18
 
19
19
 
20
20
  importer = None
@@ -111,7 +111,7 @@ class RateServer(threading.Thread):
111
111
 
112
112
  def log(self, message):
113
113
  self.messages.appendleft(
114
- f"{utc_datetime_now().strftime('%Y-%m-%d %H:%M:%S')} - {message}"
114
+ f"{ct_datetime_now().strftime('%Y-%m-%d %H:%M:%S')} - {message}"
115
115
  )
116
116
 
117
117
  def set_progress(self, progress):
@@ -12,7 +12,10 @@
12
12
  {% block content %}
13
13
 
14
14
  <table class="sticky">
15
- <caption>Line Loss Factor Classes</caption>
15
+ <caption>
16
+ Line Loss Factor Classes
17
+ (<a href="/e/llfcs/csv?dno_id={{dno.id}}">Download CSV</a>)
18
+ </caption>
16
19
  <thead>
17
20
  <tr>
18
21
  <th>Code</th>
@@ -12,6 +12,10 @@
12
12
 
13
13
  {% block content %}
14
14
  <table class="sticky">
15
+ <caption>
16
+ Valid MTC, LLFC, SSC and PC Combinations
17
+ (<a href="/e/mtc_llfc_ssc_pcs/csv?dno_id={{dno.id}}">Download CSV</a>)
18
+ </caption>
15
19
  <thead>
16
20
  <tr>
17
21
  <th>View</th>
@@ -11,6 +11,11 @@
11
11
 
12
12
  {% block content %}
13
13
  <table class="sticky">
14
+ <caption>
15
+ Valid MTC LLFC SSC Combinations
16
+ (<a href="/e/mtc_llfc_sscs/csv?participant_id={{dno.participant.id}}"
17
+ >Download CSV</a>)
18
+ </caption>
14
19
  <thead>
15
20
  <tr>
16
21
  <th>View</th>
@@ -11,6 +11,11 @@
11
11
 
12
12
  {% block content %}
13
13
  <table class="sticky">
14
+ <caption>
15
+ Valid MTC LLFCs
16
+ (<a href="/e/mtc_llfcs/csv?participant_id={{dno.participant.id}}"
17
+ >Download CSV</a>)
18
+ </caption>
14
19
  <thead>
15
20
  <tr>
16
21
  <th>View</th>
@@ -11,7 +11,11 @@
11
11
 
12
12
  {% block content %}
13
13
  <table class="sticky">
14
- <caption>Meter Timeswitch Classes</caption>
14
+ <caption>
15
+ Meter Timeswitch Classes
16
+ (<a href="/e/mtc_participants/csv?participant_id={{dno.participant.id}}"
17
+ >Download CSV</a>)
18
+ </caption>
15
19
  <thead>
16
20
  <tr>
17
21
  <th>View</th>
@@ -11,6 +11,9 @@
11
11
 
12
12
  {% block content %}
13
13
  <table class="sticky">
14
+ <caption>
15
+ MTC SSCs
16
+ (<a href="/e/mtc_sscs/csv?participant_id={{dno.participant.id}}">Download CSV</a>)
14
17
  <thead>
15
18
  <tr>
16
19
  <th>View</th>
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: chellow
3
- Version: 1681398121.0.0
3
+ Version: 1681477937.0.0
4
4
  Summary: Web Application for checking UK energy bills.
5
5
  Project-URL: Homepage, https://github.com/WessexWater/chellow
6
6
  Classifier: License :: OSI Approved :: GNU General Public License v3 (GPLv3)
@@ -7,7 +7,7 @@ chellow/edi_lib.py,sha256=het3R0DBGtXEo-Sy1zvXQuX9EWQ1X6Y33G4l1hYYuds,51859
7
7
  chellow/general_import.py,sha256=Xuiwl-yeM0MCmPstzQR2E6ASs8sYE8b1GNeDLStnizY,58470
8
8
  chellow/models.py,sha256=UhVekL4GM_4zs6ZGu83QFssyEMbwLHWerT1dWcby-ps,233497
9
9
  chellow/proxy.py,sha256=Mzssi9nTf6s_G4RSn8k5oAHqzVYIxMsfbudj1amYucI,1387
10
- chellow/rate_server.py,sha256=zk8E_0mjjrLOus5_43ntTv76dF2PRO8psDYnYTS8vJI,5551
10
+ chellow/rate_server.py,sha256=Yj1Ax0RSQNJUAPXmnb13vmkj4xfM2nTgv02GIDgxysU,5567
11
11
  chellow/testing.py,sha256=rFkic1tj6IQ_QGctfpi-9qNle5WnshUX720ZGOSaoNQ,3915
12
12
  chellow/utils.py,sha256=IHC4Pcd_9CRbmJXAOlDvTyAcUoaWeLSH37zgjqVYYl4,18981
13
13
  chellow/views.py,sha256=PgfW3T0dRgEHIkAwLDQjyhZHmubvBHdmtrDswz-eoK0,82326
@@ -33,7 +33,7 @@ chellow/e/scenario.py,sha256=IuyE494XaBLq3FW7NdJePD6J4cTzPogfACO6dThiY00,23239
33
33
  chellow/e/system_price.py,sha256=IPBLSRPzGA3yca4tpR8PJemwPbgqVjn1WnljOMUyWnA,8145
34
34
  chellow/e/tlms.py,sha256=gXBZTHXqGVcaTGHaYGVA5Ir5pzoBDqFC1Kl1mQ0IDqU,9549
35
35
  chellow/e/tnuos.py,sha256=rFGQRLjqvJcaDUZyZcR9ScbDe0M26wUbUXlmui8xqLE,13863
36
- chellow/e/views.py,sha256=AY1t0vx-TCM-8Eh_DlYnXzgQjeeYfbLdFtTk4BX2FIQ,174281
36
+ chellow/e/views.py,sha256=5pp-sbUHaiQ1N0RgY73XQbHlqrZP3y64HrZgPTmFxE4,180225
37
37
  chellow/e/bill_parsers/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
38
38
  chellow/e/bill_parsers/activity_mop_stark_xlsx.py,sha256=v1s4O8phVJVn9sOs9HKrKYcECAP0ApnUgqCaa2ARYiQ,4234
39
39
  chellow/e/bill_parsers/annual_mop_stark_xlsx.py,sha256=4dAWjaxsDnnGBnRAjgFe7IZLxIcLMGiTuXh1uqNnnlQ,4382
@@ -209,7 +209,7 @@ chellow/templates/e/hh_datum_edit.html,sha256=TJPvQ7FHw1yjkBwpXul0ZBs8UQtZR98wJ3
209
209
  chellow/templates/e/lafs.html,sha256=7MQvmoGCY-JCSDDos7vJVRKWAvqqM0eqhA0-hvaO1_o,996
210
210
  chellow/templates/e/llfc.html,sha256=B0tw7PHvEEvxJWhAGe9dZji_J9apAz-TpNlkqvYFKfE,1168
211
211
  chellow/templates/e/llfc_edit.html,sha256=YwtEf8DwoX_t3RHNxPbZYFzikBL-Ly7UyjHs-YuJ3bk,1038
212
- chellow/templates/e/llfcs.html,sha256=kiLtiuPKUiK8A2B0RnSZMcfYHzGL05iD03Scbme9t8w,1158
212
+ chellow/templates/e/llfcs.html,sha256=OlY9x3XKs0OAoa4ZOZoRokYEjIZ_isfoBtn3DGL-u6o,1228
213
213
  chellow/templates/e/market_role.html,sha256=hQ62PwzByIKDfYRWMLsg8uuA2Yh6u_X9iaee5u31p80,1025
214
214
  chellow/templates/e/market_roles.html,sha256=5nzQuKz0QDoZe1Vf9kAc8THSpmFgYqTE8CYCUFYnVdg,464
215
215
  chellow/templates/e/meter_payment_type.html,sha256=r_9k2GmkfpPflZOXxoC7bi2st4tHVDp4daMmmpGIUfQ,659
@@ -239,13 +239,13 @@ chellow/templates/e/mtc.html,sha256=buHTHmV5Ldqgk72Bt7hVSSq75mg0mr0oJrhH_J6CLeU,
239
239
  chellow/templates/e/mtc_llfc.html,sha256=FiqWDNAwYDAxSmGufmpjNQtqRD0FOD34n_ZTN6Rz1tY,1004
240
240
  chellow/templates/e/mtc_llfc_ssc.html,sha256=G_Gqn4Avf2GDzvvW4OnFCJR_Oa2yrN18-AKZgtRKnnw,1400
241
241
  chellow/templates/e/mtc_llfc_ssc_pc.html,sha256=-QpyNMAqoQh3iub7Oz6BA1SOmiBEFmgexF4y7Z30oFA,1516
242
- chellow/templates/e/mtc_llfc_ssc_pcs.html,sha256=NtPlH-yM1XILWLsyF6YMDwg7dskfgPrvtcjyPCh9D8U,1519
243
- chellow/templates/e/mtc_llfc_sscs.html,sha256=Yyjrfb2Damfvuz-0koip3aJ_VH_UMuMsGSNgsSLmWmc,1611
244
- chellow/templates/e/mtc_llfcs.html,sha256=ekwnUMvpftcu77An30g692tn3Xam7xmxeOJU6GgIuZk,1315
242
+ chellow/templates/e/mtc_llfc_ssc_pcs.html,sha256=-NLolWBMHWhlYcTZdBfbU92v_nXFu8wa36APXMakzBg,1663
243
+ chellow/templates/e/mtc_llfc_sscs.html,sha256=lRq3D5LOs3h5-lntQfN7bTgZYBw4fOjQne1TDcL6SwE,1768
244
+ chellow/templates/e/mtc_llfcs.html,sha256=z_maAgtaeNERgaRUvjf5Kp6kChpyYnNRO6thq9uMmsM,1452
245
245
  chellow/templates/e/mtc_participant.html,sha256=URmZviX13A-PY8-zMZ-CecytAhbh1_GVFkKgo2vBncg,2232
246
- chellow/templates/e/mtc_participants.html,sha256=-SuIG3ZoMRN24zrp-sYm9enqr_TlmgLacz9D81Oeb0E,1515
246
+ chellow/templates/e/mtc_participants.html,sha256=QhJ7CCvio7HiCT3QWVeMN425EzJAob3M5VWIG7dywZI,1621
247
247
  chellow/templates/e/mtc_ssc.html,sha256=4-N2CFEHXTjWTEbo8De2QVlKFRraW6z7V6ISSWXjrGg,985
248
- chellow/templates/e/mtc_sscs.html,sha256=dU3sy-U27IxNGBHwTy4iMCjsxb7WrTK04qTvnUREZhk,1295
248
+ chellow/templates/e/mtc_sscs.html,sha256=aiC8h7xETnxB77tj4Jll0d0ECBxvsVhxYKRootAPbE4,1405
249
249
  chellow/templates/e/mtcs.html,sha256=1VC5VTNF6t7QNReDILHJh0vaVSx-ajKjjKe_KinRdgY,853
250
250
  chellow/templates/e/ods_monthly_duration.html,sha256=8B-eDtHOnW5KYrRLX1R9ylg1_lyuOe5n8aHicyqhJfY,1367
251
251
  chellow/templates/e/participant.html,sha256=1GnUAavaektvmznO2UyA4LfHI96wtYpNZ_RNgjV2ivg,1022
@@ -348,6 +348,6 @@ chellow/templates/g/supply_note_edit.html,sha256=6UQf_qbhFDys3cVsTp-c7ABWZpggW9R
348
348
  chellow/templates/g/supply_notes.html,sha256=WR3YwGh_qqTklSJ7JqWX6BKBc9rk_jMff4RiWZiF2CM,936
349
349
  chellow/templates/g/unit.html,sha256=KouNVU0-i84afANkLQ_heJ0uDfJ9H5A05PuLqb8iCN8,438
350
350
  chellow/templates/g/units.html,sha256=p5Nd-lAIboKPEOO6N451hx1bcKxMg4BDODnZ-43MmJc,441
351
- chellow-1681398121.0.0.dist-info/METADATA,sha256=Mx_iD6QSwXextqFc-nP1svFV5pYPI6x4KtlskfccQfU,12160
352
- chellow-1681398121.0.0.dist-info/WHEEL,sha256=EI2JsGydwUL5GP9t6kzZv7G3HDPi7FuZDDf9In6amRM,87
353
- chellow-1681398121.0.0.dist-info/RECORD,,
351
+ chellow-1681477937.0.0.dist-info/METADATA,sha256=WOmFLi6H_nw__yPpIBZzAsN5GnW6aCCdU7m5arvheAw,12160
352
+ chellow-1681477937.0.0.dist-info/WHEEL,sha256=EI2JsGydwUL5GP9t6kzZv7G3HDPi7FuZDDf9In6amRM,87
353
+ chellow-1681477937.0.0.dist-info/RECORD,,