siglab-py 0.5.30__py3-none-any.whl → 0.6.12__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 siglab-py might be problematic. Click here for more details.

@@ -0,0 +1,240 @@
1
+ import math
2
+ import random
3
+ from typing import List, Dict, Union
4
+
5
+ from pandas import isna
6
+
7
+ def generate_rand_nums(
8
+ range_min : float = 0,
9
+ range_max : float = 1,
10
+ size=100, # list size
11
+ percent_in_range : float = 100,
12
+ abs_min : float = 0,
13
+ abs_max : float = 1
14
+ ) -> List[float]:
15
+ assert(range_min<range_max)
16
+
17
+ if abs_min>range_min:
18
+ abs_min = range_min
19
+ if abs_max<range_max:
20
+ abs_max = range_max
21
+
22
+ result : List[float] = []
23
+ for _ in range(int(size * percent_in_range/100)):
24
+ result.append(random.uniform(range_min, range_max))
25
+ for _ in range(size - len(result)):
26
+ if random.uniform(0, 1)>0.5:
27
+ result.append(random.uniform(abs_min, range_min))
28
+ else:
29
+ result.append(random.uniform(range_max, abs_max))
30
+
31
+ random.shuffle(result)
32
+
33
+ return result
34
+
35
+ # https://norman-lm-fung.medium.com/levels-are-psychological-7176cdefb5f2
36
+ def round_to_level(
37
+ num : float,
38
+ level_granularity : float = 0.01
39
+ ) -> float:
40
+ if math.isnan(num):
41
+ return num
42
+ level_size = num * level_granularity
43
+ magnitude = math.floor(math.log10(abs(level_size)))
44
+ base_increment = 10 ** magnitude
45
+ rounded_level_size = round(level_size / base_increment) * base_increment
46
+ rounded_num = round(num / rounded_level_size) * rounded_level_size
47
+ return rounded_num
48
+
49
+ def bucket_series(
50
+ values : List[float],
51
+ outlier_threshold_percent : float = 0,
52
+ level_granularity : float = 0.1 # 0.1 = 10%
53
+ ) -> Dict[
54
+ str,
55
+ Dict[str,Union[float, List[float]]]
56
+ ]:
57
+ buckets : Dict[
58
+ str,
59
+ Dict[str,Union[float, List[float]]]
60
+ ] = {}
61
+ list_0_to_1 : bool = True if len([x for x in values if x<0 or x>1])/len(values)*100 <= outlier_threshold_percent else False
62
+ list_m1_to_1 : bool = True if len([x for x in values if x<-1 or x>1])/len(values)*100 <= outlier_threshold_percent else False
63
+
64
+ list_0_to_100 : bool = True if len([x for x in values if x<0 or x>100])/len(values)*100 <= outlier_threshold_percent else False
65
+ if (
66
+ list_0_to_100
67
+ and (
68
+ not min(values)<100*(outlier_threshold_percent/100) or not max(values)>100*(1-outlier_threshold_percent/100)
69
+ )
70
+ ):
71
+ list_0_to_100 = False
72
+ list_m100_to_100 : bool = True if len([x for x in values if x<-100 or x>100])/len(values)*100 <= outlier_threshold_percent else False
73
+ if (
74
+ list_m100_to_100
75
+ and (
76
+ not min(values)<-100*(1-outlier_threshold_percent/100) or not max(values)>100*(1-outlier_threshold_percent/100)
77
+ )
78
+ ):
79
+ list_m100_to_100 = False
80
+
81
+ def _generate_sequence(start, stop, step):
82
+ result = []
83
+ current = start
84
+ num_steps = int((stop - start) / step) + 1
85
+ for i in range(num_steps):
86
+ result.append(round(start + i * step, 10))
87
+ return result
88
+
89
+ if list_0_to_1:
90
+ step = round_to_level(
91
+ 1 * level_granularity,
92
+ level_granularity=level_granularity
93
+ )
94
+ intervals = _generate_sequence(0.1, 1, step)
95
+ last_interval = 0
96
+ buckets[f"< 0"] = {
97
+ 'min' : float("-inf"),
98
+ 'max' : 0,
99
+ 'values' : [ x for x in values if x<0 ]
100
+ }
101
+ for interval in intervals:
102
+ buckets[f"{last_interval} - {interval}"] = {
103
+ 'min' : last_interval,
104
+ 'max' : interval,
105
+ 'values' : [ x for x in values if x>=last_interval and x<interval ]
106
+ }
107
+ last_interval = interval
108
+ buckets[f">1"] = {
109
+ 'min' : last_interval,
110
+ 'max' : float("inf"),
111
+ 'values' : [ x for x in values if x>=1 ]
112
+ }
113
+
114
+ elif not list_0_to_1 and list_m1_to_1:
115
+ step = round_to_level(
116
+ 1 * level_granularity,
117
+ level_granularity=level_granularity
118
+ )
119
+ intervals = _generate_sequence(-0.9, 1, step)
120
+ last_interval = -1
121
+ buckets[f"< -1"] = {
122
+ 'min' : float("-inf"),
123
+ 'max' : -1,
124
+ 'values' : [ x for x in values if x<-1 ]
125
+ }
126
+ for interval in intervals:
127
+ buckets[f"{last_interval} - {interval}"] = {
128
+ 'min' : last_interval,
129
+ 'max' : interval,
130
+ 'values' : [ x for x in values if x>=last_interval and x<interval ]
131
+ }
132
+ last_interval = interval
133
+ buckets[f">1"] = {
134
+ 'min' : last_interval,
135
+ 'max' : float("inf"),
136
+ 'values' : [ x for x in values if x>=1 ]
137
+ }
138
+
139
+ elif not list_0_to_1 and not list_m1_to_1 and list_0_to_100:
140
+ step = round_to_level(
141
+ 100 * level_granularity,
142
+ level_granularity=level_granularity
143
+ )
144
+ intervals = _generate_sequence(10, 100, step)
145
+ last_interval = 0
146
+ buckets[f"<0"] = {
147
+ 'min' : float("-inf"),
148
+ 'max' : 0,
149
+ 'values' : [ x for x in values if x<0 ]
150
+ }
151
+ for interval in intervals:
152
+ buckets[f"{last_interval} - {interval}"] = {
153
+ 'min' : last_interval,
154
+ 'max' : interval,
155
+ 'values' : [ x for x in values if x>=last_interval and x<interval ]
156
+ }
157
+ last_interval = interval
158
+ buckets[f">100"] = {
159
+ 'min' : last_interval,
160
+ 'max' : float("inf"),
161
+ 'values' : [ x for x in values if x>=100 ]
162
+ }
163
+
164
+ elif not list_0_to_1 and not list_m1_to_1 and not list_0_to_100 and list_m100_to_100:
165
+ step = round_to_level(
166
+ 100 * level_granularity,
167
+ level_granularity=level_granularity
168
+ )
169
+ intervals = _generate_sequence(-90, 100, step)
170
+ last_interval = -100
171
+ buckets[f"<-100"] = {
172
+ 'min' : float("-inf"),
173
+ 'max' : -100,
174
+ 'values' : [ x for x in values if x<-100 ]
175
+ }
176
+ for interval in intervals:
177
+ buckets[f"{last_interval} - {interval}"] = {
178
+ 'min' : last_interval,
179
+ 'max' : interval,
180
+ 'values' : [ x for x in values if x>=last_interval and x<interval ]
181
+ }
182
+ last_interval = interval
183
+ buckets[f">100"] = {
184
+ 'min' : last_interval,
185
+ 'max' : float("inf"),
186
+ 'values' : [ x for x in values if x>=100 ]
187
+ }
188
+
189
+ else:
190
+ range_min = round_to_level(
191
+ min(values),
192
+ level_granularity=level_granularity
193
+ )
194
+ range_max = round_to_level(
195
+ max(values),
196
+ level_granularity=level_granularity
197
+ )
198
+ step = round_to_level(
199
+ abs(range_max - range_min) * level_granularity,
200
+ level_granularity=level_granularity
201
+ )
202
+
203
+ intervals = _generate_sequence(range_min+step, range_max, step)
204
+ last_interval = range_min
205
+ buckets[f"< {range_min}"] = {
206
+ 'min' : float("-inf"),
207
+ 'max' : range_min,
208
+ 'values' : [ x for x in values if x<range_min ]
209
+ }
210
+ for interval in intervals:
211
+ buckets[f"{last_interval} - {interval}"] = {
212
+ 'min' : last_interval,
213
+ 'max' : interval,
214
+ 'values' : [ x for x in values if x>=last_interval and x<interval ]
215
+ }
216
+ last_interval = interval
217
+ buckets[f"> {range_max}"] = {
218
+ 'min' : last_interval,
219
+ 'max' : float("inf"),
220
+ 'values' : [ x for x in values if x>=range_max ]
221
+ }
222
+
223
+ for key in buckets:
224
+ bucket = buckets[key]
225
+ assert(len([x for x in bucket['values'] if x<bucket['min'] or x>bucket['max']])==0) # type: ignore
226
+
227
+ return buckets
228
+
229
+ def bucketize_val(
230
+ x : float,
231
+ buckets : Dict[
232
+ str,
233
+ Dict[str,Union[float, List[float]]]
234
+ ]
235
+ ) -> Union[str,None]:
236
+ for key in buckets:
237
+ bucket = buckets[key]
238
+ if x>=bucket['min'] and x<=bucket['max']: # type: ignore
239
+ return key
240
+ return None
@@ -116,15 +116,3 @@ def calc_eff_trailing_sl(
116
116
  effective_tp_trailing_percent = default_effective_tp_trailing_percent
117
117
 
118
118
  return effective_tp_trailing_percent
119
-
120
- # https://norman-lm-fung.medium.com/levels-are-psychological-7176cdefb5f2
121
- def round_to_level(
122
- price : float,
123
- level_granularity : float = 0.01
124
- ) -> float:
125
- level_size = price * level_granularity
126
- magnitude = math.floor(math.log10(level_size))
127
- base_increment = 10 ** magnitude
128
- rounded_level_size = round(level_size / base_increment) * base_increment
129
- rounded_price = round(price / rounded_level_size) * rounded_level_size
130
- return rounded_price
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: siglab_py
3
- Version: 0.5.30
3
+ Version: 0.6.12
4
4
  Summary: Market data fetches, TA calculations and generic order gateway.
5
5
  Author: r0bbarh00d
6
6
  Author-email: r0bbarh00d <r0bbarh00d@gmail.com>
@@ -0,0 +1,44 @@
1
+ siglab_py/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
2
+ siglab_py/constants.py,sha256=RlWh0-_sXHanfPIVLgDPLNbn9ljv3aZJYMv92Zd0jZI,701
3
+ siglab_py/exchanges/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
4
+ siglab_py/exchanges/any_exchange.py,sha256=Y-zue75ZSmu9Ga1fONbjBGLNH5pDHQI01hCSjuLBkAk,889
5
+ siglab_py/exchanges/binance.py,sha256=3hLeU5t4AXVLS2u6V8wlqsvdo3Uh00ebgx4MONy8X6k,1394
6
+ siglab_py/exchanges/deribit.py,sha256=gI5ezORDeu-Z1S8yxJj1Kj43OroK3ga9BckNijkuk8A,3361
7
+ siglab_py/exchanges/futubull.py,sha256=i0jNgl9BGJvgEIDeOkTfD52FaK77vX8axCKNYwJHwSI,21144
8
+ siglab_py/market_data_providers/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
9
+ siglab_py/market_data_providers/aggregated_orderbook_provider.py,sha256=FZRobEBNRzcNGlOG3u38OVhmOZYlkNm8dVvR-S7Ii2g,23342
10
+ siglab_py/market_data_providers/candles_provider.py,sha256=FXvciwU7ONC0VdX-fggELIl2yqd7mRB2CjDeUsDzr-A,14145
11
+ siglab_py/market_data_providers/candles_ta_provider.py,sha256=az3tVjR4g0vhOCc8S5kGvjuNIpwxnXarUhMi62Z5Pzc,12013
12
+ siglab_py/market_data_providers/ccxt_candles_ta_to_csv.py,sha256=DHj51QTbkCmEd9RFNVhWWpsSPz1aLd6zTLqkUUbEkK0,11158
13
+ siglab_py/market_data_providers/deribit_options_expiry_provider.py,sha256=e9Ee8TmC8pXaid8-jouSLKIpuW6_JBBgwRTieI665yQ,8684
14
+ siglab_py/market_data_providers/futu_candles_ta_to_csv.py,sha256=SCWlI_mOuErpGP8Kxh5WKEoff9cqqxO19oLFLd04bTs,10964
15
+ siglab_py/market_data_providers/google_monitor.py,sha256=B08Aj1urL4M9hVUfjubVwTsFhfsj5-eFaf36lYqZ8-o,14028
16
+ siglab_py/market_data_providers/orderbooks_provider.py,sha256=b1XgPVSTU3y0Dxm5DOKjeldK-0ZrP15_iG3fzjBBBG8,16376
17
+ siglab_py/market_data_providers/tg_monitor.py,sha256=LY4oRm5qQ_XiuLk0RMVDc0Vdsi6CKE6O9hgeGm3VXBM,21995
18
+ siglab_py/market_data_providers/trigger_provider.py,sha256=b9B1RSBI8bFyGsM4DVXhEY8w08iTy8sPZkTqoy72VJE,2505
19
+ siglab_py/ordergateway/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
20
+ siglab_py/ordergateway/client.py,sha256=LvtrYirrdFOcKgTkvuqwdEN7r3nurjX320ESnk7tHE0,15095
21
+ siglab_py/ordergateway/encrypt_keys_util.py,sha256=U_M-jPrPYOTO_sU0bMVkO5ruNXge5vek8yUGa8jaE-g,1349
22
+ siglab_py/ordergateway/gateway.py,sha256=KAulWLZf8UYFo0esWwb4H8NmGnylkkckx4xBcF6-IZQ,47343
23
+ siglab_py/ordergateway/test_ordergateway.py,sha256=4PE2flp_soGcD3DrI7zJOzZndjkb6I5XaDrFNNq4Huo,4009
24
+ siglab_py/tests/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
25
+ siglab_py/tests/integration/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
26
+ siglab_py/tests/integration/market_data_util_tests.py,sha256=XKO8CX9AF7xRjRvt4lb938v_s89d2IBLAXKfZDdUxdY,8705
27
+ siglab_py/tests/unit/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
28
+ siglab_py/tests/unit/analytic_util_tests.py,sha256=tV7MsItlidwqdAQ_kD1000PsG4zIoQyQY1RdOn5XQAQ,5942
29
+ siglab_py/tests/unit/market_data_util_tests.py,sha256=A1y83itISmMJdn6wLpfwcr4tGola8wTf1D1xbelMvgw,2026
30
+ siglab_py/tests/unit/simple_math_tests.py,sha256=rWqq93W4Vlqmu0UeZCmSOfLirr0gPh2ASVIZ8O77qXY,9653
31
+ siglab_py/tests/unit/trading_util_tests.py,sha256=LiflZrduWXyLMbpSFQCaydA7jdJx3vFR-3KuKRRGhjQ,2927
32
+ siglab_py/util/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
33
+ siglab_py/util/analytic_util.py,sha256=KoRDlesLuYKkr0V0ytJLEqaDHh6Tyfr6GhaPQYFCU2U,65225
34
+ siglab_py/util/aws_util.py,sha256=KGmjHrr1rpnnxr33nXHNzTul4tvyyxl9p6gpwNv0Ygc,2557
35
+ siglab_py/util/market_data_util.py,sha256=zTvOaUUF2vmwQRcpQPq0c2Ix1gFAhx22Vps9pzJsOXI,36290
36
+ siglab_py/util/notification_util.py,sha256=tNZMUkkjz4q1CKqcQq62oEmZgHgNIwz2Iw9J22V22Zw,2668
37
+ siglab_py/util/retry_util.py,sha256=g-UU6pkPouWZZRZEqP99R2Z0lX5xzckYkzjwqqSDpVQ,922
38
+ siglab_py/util/simple_math.py,sha256=F7vGj0O2Y9EAGcMFR6SN1tTjBWO_a7YZeiTzk3eHaVI,8518
39
+ siglab_py/util/slack_notification_util.py,sha256=G27n-adbT3Q6oaHSMvu_Nom794rrda5PprSF-zvmzkM,1912
40
+ siglab_py/util/trading_util.py,sha256=dlIOzoMGnddLSFODcJ61EBH1Aeruq4IT2MsxIdFkV9I,5252
41
+ siglab_py-0.6.12.dist-info/METADATA,sha256=J4m8p-webGGFtNwcc9s9W5sE3vZFPkkGwxYj23CLWnI,829
42
+ siglab_py-0.6.12.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
43
+ siglab_py-0.6.12.dist-info/top_level.txt,sha256=AbD4VR9OqmMOGlMJLkAVPGQMtUPIQv0t1BF5xmcLJSk,10
44
+ siglab_py-0.6.12.dist-info/RECORD,,
@@ -1,5 +1,5 @@
1
1
  Wheel-Version: 1.0
2
- Generator: setuptools (78.1.1)
2
+ Generator: setuptools (80.9.0)
3
3
  Root-Is-Purelib: true
4
4
  Tag: py3-none-any
5
5
 
@@ -1,39 +0,0 @@
1
- siglab_py/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
2
- siglab_py/constants.py,sha256=atSjvM0wv_f1wrzWHE0DcbUn6fqLmg-51BpfMJR1QB4,547
3
- siglab_py/exchanges/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
4
- siglab_py/exchanges/any_exchange.py,sha256=Y-zue75ZSmu9Ga1fONbjBGLNH5pDHQI01hCSjuLBkAk,889
5
- siglab_py/exchanges/futubull.py,sha256=f-_trzvuH5NaiG-PzyiNqZ12w7J-ARi_-xcr78rFU4E,20510
6
- siglab_py/market_data_providers/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
7
- siglab_py/market_data_providers/aggregated_orderbook_provider.py,sha256=FZRobEBNRzcNGlOG3u38OVhmOZYlkNm8dVvR-S7Ii2g,23342
8
- siglab_py/market_data_providers/candles_provider.py,sha256=fqHJjlECsBiBlpgyywrc4gTgxiROPNzZM8KxQBB5cOg,14139
9
- siglab_py/market_data_providers/candles_ta_provider.py,sha256=uiAhbEZZdTF-YulBHpSLwabos5LHCKU91NTiTmpUc0w,12001
10
- siglab_py/market_data_providers/ccxt_candles_ta_to_csv.py,sha256=DHj51QTbkCmEd9RFNVhWWpsSPz1aLd6zTLqkUUbEkK0,11158
11
- siglab_py/market_data_providers/deribit_options_expiry_provider.py,sha256=e9Ee8TmC8pXaid8-jouSLKIpuW6_JBBgwRTieI665yQ,8684
12
- siglab_py/market_data_providers/futu_candles_ta_to_csv.py,sha256=PZRpVL80CG6518uUg38Wb9aoWzidunyBAFFFGvrDnaI,10531
13
- siglab_py/market_data_providers/orderbooks_provider.py,sha256=olt-3LIkoyzQWfNNQRhJtKibLbkTutt_q_rCCTM7i1g,16216
14
- siglab_py/market_data_providers/test_provider.py,sha256=wBLCgcWjs7FGZJXWsNyn30lkOLa_cgpuvqRakMC0wbA,2221
15
- siglab_py/market_data_providers/tg_monitor.py,sha256=lRqONP0JAP223gyX37R-wCkhyGFKTvKkgmeDNoO3ay4,21813
16
- siglab_py/ordergateway/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
17
- siglab_py/ordergateway/client.py,sha256=LvtrYirrdFOcKgTkvuqwdEN7r3nurjX320ESnk7tHE0,15095
18
- siglab_py/ordergateway/encrypt_keys_util.py,sha256=-qi87db8To8Yf1WS1Q_Cp2Ya7ZqgWlRqSHfNXCM7wE4,1339
19
- siglab_py/ordergateway/gateway.py,sha256=Z-BQ-Z9gXoNrKQHzRIy9R1mnCybf9QwWhHpqkSI7bBM,43901
20
- siglab_py/ordergateway/test_ordergateway.py,sha256=4PE2flp_soGcD3DrI7zJOzZndjkb6I5XaDrFNNq4Huo,4009
21
- siglab_py/tests/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
22
- siglab_py/tests/integration/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
23
- siglab_py/tests/integration/market_data_util_tests.py,sha256=p-RWIJZLyj0lAdfi4QTIeAttCm_e8mEVWFKh4OWuogU,7189
24
- siglab_py/tests/unit/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
25
- siglab_py/tests/unit/analytic_util_tests.py,sha256=5Vic-lwuGvgLfjcP1gmrdBizMn0hXPMnixYKAF3y-fI,4366
26
- siglab_py/tests/unit/market_data_util_tests.py,sha256=A1y83itISmMJdn6wLpfwcr4tGola8wTf1D1xbelMvgw,2026
27
- siglab_py/tests/unit/trading_util_tests.py,sha256=9DZmTZlW55lPtNfTCukgDdiyBiMYv9R4mEFWJIJiTNg,3870
28
- siglab_py/util/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
29
- siglab_py/util/analytic_util.py,sha256=GCPbz41qCKBb2hjzMrqF0BuiOwxaFCsyYCwBfqC5wtE,55686
30
- siglab_py/util/aws_util.py,sha256=KGmjHrr1rpnnxr33nXHNzTul4tvyyxl9p6gpwNv0Ygc,2557
31
- siglab_py/util/market_data_util.py,sha256=mUXg4uaiX3b6_klgJWIEgnUQU4IUd6CwTOqKLiQWRlU,31307
32
- siglab_py/util/notification_util.py,sha256=vySgHjpHgwFDLW0tHSi_AGh9JBbPc25IUgvWxmjAeT8,2658
33
- siglab_py/util/retry_util.py,sha256=g-UU6pkPouWZZRZEqP99R2Z0lX5xzckYkzjwqqSDpVQ,922
34
- siglab_py/util/slack_notification_util.py,sha256=G27n-adbT3Q6oaHSMvu_Nom794rrda5PprSF-zvmzkM,1912
35
- siglab_py/util/trading_util.py,sha256=-TGNgJdy4HMDPgq31KQn_lRawFxuXnFU5NnLRb1XM5o,5757
36
- siglab_py-0.5.30.dist-info/METADATA,sha256=D-8hoBCaGYwWVu33axvqZEjYhKAz9XrMHdvs9YLyzK8,829
37
- siglab_py-0.5.30.dist-info/WHEEL,sha256=lTU6B6eIfYoiQJTZNc-fyaR6BpL6ehTzU3xGYxn2n8k,91
38
- siglab_py-0.5.30.dist-info/top_level.txt,sha256=AbD4VR9OqmMOGlMJLkAVPGQMtUPIQv0t1BF5xmcLJSk,10
39
- siglab_py-0.5.30.dist-info/RECORD,,