umaudemc 0.12.2__py3-none-any.whl → 0.13.1__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.
- umaudemc/__init__.py +1 -1
- umaudemc/__main__.py +5 -0
- umaudemc/api.py +1 -1
- umaudemc/backend/_spot.py +7 -8
- umaudemc/command/graph.py +30 -2
- umaudemc/common.py +0 -24
- umaudemc/counterprint.py +12 -4
- umaudemc/data/smcview.js +42 -29
- umaudemc/formatter.py +20 -25
- umaudemc/grapher.py +6 -5
- umaudemc/gtk.py +88 -499
- umaudemc/kleene.py +156 -0
- umaudemc/opsem.py +1 -1
- umaudemc/probabilistic.py +12 -9
- umaudemc/pyslang.py +320 -186
- umaudemc/simulators.py +3 -2
- umaudemc/statistical.py +1 -0
- umaudemc/webui.py +31 -33
- umaudemc/wrappers.py +44 -2
- {umaudemc-0.12.2.dist-info → umaudemc-0.13.1.dist-info}/METADATA +1 -1
- {umaudemc-0.12.2.dist-info → umaudemc-0.13.1.dist-info}/RECORD +25 -24
- {umaudemc-0.12.2.dist-info → umaudemc-0.13.1.dist-info}/WHEEL +1 -1
- {umaudemc-0.12.2.dist-info → umaudemc-0.13.1.dist-info}/LICENSE +0 -0
- {umaudemc-0.12.2.dist-info → umaudemc-0.13.1.dist-info}/entry_points.txt +0 -0
- {umaudemc-0.12.2.dist-info → umaudemc-0.13.1.dist-info}/top_level.txt +0 -0
umaudemc/simulators.py
CHANGED
|
@@ -79,8 +79,9 @@ class BaseSimulator:
|
|
|
79
79
|
if not t:
|
|
80
80
|
t, var = parse_hole_term(self.module, observation)
|
|
81
81
|
self.obs_cache[observation] = (t, var)
|
|
82
|
-
|
|
83
|
-
|
|
82
|
+
if var is not None:
|
|
83
|
+
subs = maude.Substitution({var: self.state})
|
|
84
|
+
t = subs.instantiate(t)
|
|
84
85
|
t.reduce()
|
|
85
86
|
|
|
86
87
|
return float(t == self.true) if t.getSort() == self.bool_sort else float(t)
|
umaudemc/statistical.py
CHANGED
|
@@ -221,6 +221,7 @@ def thread_main(program, qdata, simulator, num_sims, block_size, seed, queue, ba
|
|
|
221
221
|
def run_parallel(program, qdata, num_sims, max_sim, simulator, alpha, delta, block_size, jobs, verbose=False):
|
|
222
222
|
"""Run the simulation in multiple threads"""
|
|
223
223
|
import multiprocessing as mp
|
|
224
|
+
mp.set_start_method('fork', force=True)
|
|
224
225
|
|
|
225
226
|
# When the number of jobs is zero or negative, we take the CPU count
|
|
226
227
|
if jobs <= 0:
|
umaudemc/webui.py
CHANGED
|
@@ -2,7 +2,6 @@
|
|
|
2
2
|
# Web-based user interface
|
|
3
3
|
#
|
|
4
4
|
|
|
5
|
-
import cgi
|
|
6
5
|
import http.server
|
|
7
6
|
import json
|
|
8
7
|
import math
|
|
@@ -156,10 +155,10 @@ class RequestHandler(http.server.BaseHTTPRequestHandler):
|
|
|
156
155
|
"""Object charged of handling the requests"""
|
|
157
156
|
|
|
158
157
|
STATIC_FILES = {
|
|
159
|
-
'/'
|
|
160
|
-
'/smcview.css'
|
|
161
|
-
'/smcview.js'
|
|
162
|
-
'/smcgraph.js'
|
|
158
|
+
'/' : ('select.htm', 'text/html; charset=utf-8'),
|
|
159
|
+
'/smcview.css' : ('smcview.css', 'text/css; charset=utf-8'),
|
|
160
|
+
'/smcview.js' : ('smcview.js', 'text/javascript; charset=utf-8'),
|
|
161
|
+
'/smcgraph.js' : ('smcgraph.js', 'text/javascript; charset=utf-8'),
|
|
163
162
|
}
|
|
164
163
|
|
|
165
164
|
def do_GET(self):
|
|
@@ -176,12 +175,11 @@ class RequestHandler(http.server.BaseHTTPRequestHandler):
|
|
|
176
175
|
self.send_error(404)
|
|
177
176
|
|
|
178
177
|
def do_POST(self):
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
'CONTENT_TYPE': self.headers['Content-Type']})
|
|
178
|
+
# Read the JSON body of the request
|
|
179
|
+
form = json.loads(self.rfile.read(int(self.headers['Content-Length'])))
|
|
182
180
|
|
|
183
|
-
question = form.
|
|
184
|
-
url = form.
|
|
181
|
+
question = form.get('question')
|
|
182
|
+
url = form.get('url', None)
|
|
185
183
|
|
|
186
184
|
if question == 'ls':
|
|
187
185
|
base, parent, dirs, files = self.server.info.path_handler.browse_dir(url)
|
|
@@ -194,10 +192,10 @@ class RequestHandler(http.server.BaseHTTPRequestHandler):
|
|
|
194
192
|
self.end_headers()
|
|
195
193
|
|
|
196
194
|
response = {
|
|
197
|
-
'base'
|
|
198
|
-
'parent'
|
|
199
|
-
'dirs'
|
|
200
|
-
'files'
|
|
195
|
+
'base' : base,
|
|
196
|
+
'parent' : parent,
|
|
197
|
+
'dirs' : dirs,
|
|
198
|
+
'files' : files
|
|
201
199
|
}
|
|
202
200
|
self.wfile.write(json.dumps(response).encode('utf-8'))
|
|
203
201
|
elif question == 'sourceinfo':
|
|
@@ -217,16 +215,16 @@ class RequestHandler(http.server.BaseHTTPRequestHandler):
|
|
|
217
215
|
self.send_response(200)
|
|
218
216
|
self.send_header('Content-Type', 'text/json; charset=utf-8')
|
|
219
217
|
self.end_headers()
|
|
220
|
-
mod = form.
|
|
218
|
+
mod = form.get('mod')
|
|
221
219
|
minfo = self.server.info.remote.getModuleInfo(mod)
|
|
222
220
|
response = {
|
|
223
|
-
'name'
|
|
224
|
-
'type'
|
|
225
|
-
'params'
|
|
226
|
-
'valid'
|
|
227
|
-
'stateSorts'
|
|
228
|
-
'strategies'
|
|
229
|
-
'props'
|
|
221
|
+
'name' : mod,
|
|
222
|
+
'type' : minfo['type'],
|
|
223
|
+
'params' : [],
|
|
224
|
+
'valid' : minfo['valid'],
|
|
225
|
+
'stateSorts' : minfo.get('state', []),
|
|
226
|
+
'strategies' : [self.make_signature(signat) for signat in minfo.get('strat', ())],
|
|
227
|
+
'props' : [self.make_signature(signat) for signat in minfo.get('prop', ())]
|
|
230
228
|
}
|
|
231
229
|
self.wfile.write(json.dumps(response).encode('utf-8'))
|
|
232
230
|
elif question == 'modelcheck':
|
|
@@ -234,13 +232,13 @@ class RequestHandler(http.server.BaseHTTPRequestHandler):
|
|
|
234
232
|
self.send_header('Content-Type', 'text/json; charset=utf-8')
|
|
235
233
|
self.end_headers()
|
|
236
234
|
data = {
|
|
237
|
-
'module': form.
|
|
238
|
-
'initial': form.
|
|
239
|
-
'formula': form.
|
|
240
|
-
'strat': form.
|
|
241
|
-
'opaques': form.
|
|
242
|
-
'passign': self.make_passign(form),
|
|
243
|
-
'reward': form.
|
|
235
|
+
'module' : form.get('mod'),
|
|
236
|
+
'initial' : form.get('initial'),
|
|
237
|
+
'formula' : form.get('formula'),
|
|
238
|
+
'strat' : form.get('strategy'),
|
|
239
|
+
'opaques' : form.get('opaques'),
|
|
240
|
+
'passign' : self.make_passign(form),
|
|
241
|
+
'reward' : form.get('reward', None),
|
|
244
242
|
}
|
|
245
243
|
result = self.server.info.remote.modelCheck(data)
|
|
246
244
|
response = {
|
|
@@ -267,7 +265,7 @@ class RequestHandler(http.server.BaseHTTPRequestHandler):
|
|
|
267
265
|
|
|
268
266
|
self.wfile.write(json.dumps(response).encode('utf-8'))
|
|
269
267
|
elif question == 'wait':
|
|
270
|
-
mcref = int(form.
|
|
268
|
+
mcref = int(form.get('mcref'))
|
|
271
269
|
|
|
272
270
|
# Model checking is actually done here
|
|
273
271
|
result = self.server.info.remote.get_result(mcref)
|
|
@@ -327,16 +325,16 @@ class RequestHandler(http.server.BaseHTTPRequestHandler):
|
|
|
327
325
|
def make_passign(form):
|
|
328
326
|
"""Build a passign term from its name and argument"""
|
|
329
327
|
|
|
330
|
-
name = form.
|
|
328
|
+
name = form.get('pmethod', None)
|
|
331
329
|
|
|
332
330
|
if name is None:
|
|
333
331
|
return None
|
|
334
332
|
|
|
335
|
-
argument = form.
|
|
333
|
+
argument = form.get('pargument', '')
|
|
336
334
|
|
|
337
335
|
# Add mdp- prefix when MDP is selected and admissible
|
|
338
336
|
can_mdp = name not in ('uaction', 'strategy')
|
|
339
|
-
mdp = 'mdp-' if can_mdp and form.
|
|
337
|
+
mdp = 'mdp-' if can_mdp and form.get('mdp') == 'true' else ''
|
|
340
338
|
|
|
341
339
|
return f'{mdp}{name}({argument})' if argument else f'{mdp}{name}'
|
|
342
340
|
|
umaudemc/wrappers.py
CHANGED
|
@@ -11,6 +11,8 @@ from .common import maude, default_model_settings
|
|
|
11
11
|
|
|
12
12
|
|
|
13
13
|
def default_getNextStates(self, stateNr):
|
|
14
|
+
"""Generator of all the successors of a state"""
|
|
15
|
+
|
|
14
16
|
index = 0
|
|
15
17
|
next_state = self.getNextState(stateNr, index)
|
|
16
18
|
|
|
@@ -20,10 +22,38 @@ def default_getNextStates(self, stateNr):
|
|
|
20
22
|
next_state = self.getNextState(stateNr, index)
|
|
21
23
|
|
|
22
24
|
|
|
25
|
+
def standard_getTransitions(self, stateNr):
|
|
26
|
+
"""Generator of all the transitions (target state and rule) of a rewrite graph"""
|
|
27
|
+
|
|
28
|
+
index = 0
|
|
29
|
+
next_state = self.getNextState(stateNr, index)
|
|
30
|
+
|
|
31
|
+
while next_state != -1:
|
|
32
|
+
yield next_state, self.getRule(stateNr, next_state)
|
|
33
|
+
index = index + 1
|
|
34
|
+
next_state = self.getNextState(stateNr, index)
|
|
35
|
+
|
|
36
|
+
|
|
37
|
+
def strategy_getTransitions(self, stateNr):
|
|
38
|
+
"""Generator of all the transitions of a strategy-controlled rewrite graph"""
|
|
39
|
+
|
|
40
|
+
index = 0
|
|
41
|
+
next_state = self.getNextState(stateNr, index)
|
|
42
|
+
|
|
43
|
+
while next_state != -1:
|
|
44
|
+
yield next_state, self.getTransition(stateNr, next_state)
|
|
45
|
+
index = index + 1
|
|
46
|
+
next_state = self.getNextState(stateNr, index)
|
|
47
|
+
|
|
48
|
+
|
|
23
49
|
# Add getNextStates to the original graphs
|
|
24
50
|
maude.RewriteGraph.getNextStates = default_getNextStates
|
|
25
51
|
maude.StrategyRewriteGraph.getNextStates = default_getNextStates
|
|
26
52
|
|
|
53
|
+
# Add getTransitions to the original graphs
|
|
54
|
+
maude.RewriteGraph.getTransitions = standard_getTransitions
|
|
55
|
+
maude.StrategyRewriteGraph.getTransitions = strategy_getTransitions
|
|
56
|
+
|
|
27
57
|
# Add a property to know whether the graph is strategy-controlled
|
|
28
58
|
maude.RewriteGraph.strategyControlled = False
|
|
29
59
|
maude.StrategyRewriteGraph.strategyControlled = True
|
|
@@ -50,6 +80,9 @@ class WrappedGraph:
|
|
|
50
80
|
def getTransition(self, *args):
|
|
51
81
|
return self.graph.getTransition(*args)
|
|
52
82
|
|
|
83
|
+
def getTransitions(self, stateNr):
|
|
84
|
+
return self.graph.getTransitions(stateNr)
|
|
85
|
+
|
|
53
86
|
def getNrStates(self):
|
|
54
87
|
return self.graph.getNrStates()
|
|
55
88
|
|
|
@@ -113,6 +146,11 @@ class FailFreeGraph(WrappedGraph):
|
|
|
113
146
|
if self.valid_states[next_state]:
|
|
114
147
|
yield next_state
|
|
115
148
|
|
|
149
|
+
def getTransitions(self, stateNr):
|
|
150
|
+
for next_state, edge in self.graph.getTransitions(stateNr):
|
|
151
|
+
if self.valid_states[next_state]:
|
|
152
|
+
yield next_state, edge
|
|
153
|
+
|
|
116
154
|
|
|
117
155
|
class MergedGraph:
|
|
118
156
|
"""A graph where states are merged"""
|
|
@@ -141,6 +179,10 @@ class MergedGraph:
|
|
|
141
179
|
return trans
|
|
142
180
|
return None
|
|
143
181
|
|
|
182
|
+
def getTransitions(self, stateNr):
|
|
183
|
+
for next_state in self.getNextStates(stateNr):
|
|
184
|
+
yield next_state, self.getTransition(stateNr, next_state)
|
|
185
|
+
|
|
144
186
|
def getNrStates(self):
|
|
145
187
|
return len(self.states)
|
|
146
188
|
|
|
@@ -252,7 +294,7 @@ class BoundedGraph(WrappedGraph):
|
|
|
252
294
|
yield next_state
|
|
253
295
|
|
|
254
296
|
|
|
255
|
-
def
|
|
297
|
+
def wrap_graph(graph, purge_fails, merge_states):
|
|
256
298
|
"""Wrap graphs according to the model modification options"""
|
|
257
299
|
if purge_fails == 'yes':
|
|
258
300
|
graph = FailFreeGraph(graph)
|
|
@@ -277,4 +319,4 @@ def create_graph(term=None, strategy=None, opaque=(), full_matchrew=False, purge
|
|
|
277
319
|
# Wrap the graph with the model modification for branching-time
|
|
278
320
|
purge_fails, merge_states = default_model_settings(logic, purge_fails, merge_states, strategy,
|
|
279
321
|
tableau=tableau)
|
|
280
|
-
return
|
|
322
|
+
return wrap_graph(graph, purge_fails, merge_states)
|
|
@@ -1,29 +1,30 @@
|
|
|
1
|
-
umaudemc/__init__.py,sha256=
|
|
2
|
-
umaudemc/__main__.py,sha256=
|
|
3
|
-
umaudemc/api.py,sha256=
|
|
1
|
+
umaudemc/__init__.py,sha256=pMjW1X1oCiVe0NrTCY4GkT0Wt53V0JJzr08mFS8RKk8,23
|
|
2
|
+
umaudemc/__main__.py,sha256=PBIa2mStJwNIK5YnwoCefEB_a59VLkHE_Zp_1hnMyg4,14060
|
|
3
|
+
umaudemc/api.py,sha256=I-o5foy8NUlO4JT4pX9L7kkuHQG_8_GMkWlOKt708E8,19733
|
|
4
4
|
umaudemc/backends.py,sha256=mzJkALYwcKPInT0lBiRsCxJSewKvx5j_akQsqWN1Ezo,4590
|
|
5
|
-
umaudemc/common.py,sha256=
|
|
6
|
-
umaudemc/counterprint.py,sha256=
|
|
7
|
-
umaudemc/formatter.py,sha256=
|
|
5
|
+
umaudemc/common.py,sha256=5jtR_HLZmTDrZFU2Isd3tJudZdMD-RbkiuHMUA3wPiE,4922
|
|
6
|
+
umaudemc/counterprint.py,sha256=vVqM_UjGRk_xeftFxBGI5m6cQXV7mf8KvbQ_fvAvSQk,9226
|
|
7
|
+
umaudemc/formatter.py,sha256=36l0nc9IIe4B0_eW_PPfDTIxJj0mHKZfddCUugrEyjM,6024
|
|
8
8
|
umaudemc/formulae.py,sha256=jZPPDhjgsb7cs5rWvitiQoO0fd8JIlK98at2SN-LzVE,12156
|
|
9
|
-
umaudemc/grapher.py,sha256=
|
|
10
|
-
umaudemc/gtk.py,sha256=
|
|
9
|
+
umaudemc/grapher.py,sha256=K1chKNNlEzQvfOsiFmRPJmd9OpxRIrg6OyiMW6gqOCU,4348
|
|
10
|
+
umaudemc/gtk.py,sha256=61p4_OSFDfNHFD4lLz3QTZ7yZBra3RINmgbcnB-mUis,4249
|
|
11
11
|
umaudemc/jani.py,sha256=N5tE28jZC_OsI041nXOn02THlokpweATtEK-nx9pfWE,4130
|
|
12
|
+
umaudemc/kleene.py,sha256=Yxo9O2rjJNpS6y4Qfb_SP71tDrryV0KKUfmBIKXypwg,4458
|
|
12
13
|
umaudemc/mproc.py,sha256=9X5pTb3Z3XHcdOo8ynH7I5RZQpjzm9xr4IBbEtaglUE,11766
|
|
13
|
-
umaudemc/opsem.py,sha256=
|
|
14
|
-
umaudemc/probabilistic.py,sha256=
|
|
15
|
-
umaudemc/pyslang.py,sha256=
|
|
14
|
+
umaudemc/opsem.py,sha256=p49k8Dto0zJ7jeI8Ih5Q9bB4lqMQaF39kxprlvCMN3U,9448
|
|
15
|
+
umaudemc/probabilistic.py,sha256=f1ZtV84mAuaaGSmYCpun8gaUi5PFGCPD96BUgYvvBGk,29304
|
|
16
|
+
umaudemc/pyslang.py,sha256=m501iqJb4fVlIimpOy_tO7woK5QLkTWYav0no7onoXM,85099
|
|
16
17
|
umaudemc/quatex.py,sha256=HQoiC8N7WnloHPBgNlcpWUi0NcIyUXm3IK_glfHbu4A,21611
|
|
17
18
|
umaudemc/resources.py,sha256=k1sekrTafAcOb7GQN-mx2BgCBEBPUi-IR_4EjNjRRmU,1530
|
|
18
|
-
umaudemc/simulators.py,sha256=
|
|
19
|
-
umaudemc/statistical.py,sha256=
|
|
19
|
+
umaudemc/simulators.py,sha256=84W30MWWe4QRxK24RGA0zuwXjPya4wH18PrhPKdOpyU,13229
|
|
20
|
+
umaudemc/statistical.py,sha256=g5tfSzRWzKWivP793dxXuUJ1ftRrJKlSi27qvPPMxZs,9056
|
|
20
21
|
umaudemc/terminal.py,sha256=B4GWLyW4Sdymgoavj418y4TI4MnWqNu3JS4BBoSYeTc,1037
|
|
21
22
|
umaudemc/usermsgs.py,sha256=d3RfyBGEBmcV_c2MeXWCtZIiiM2vFnaHsN3MHwMnyAs,583
|
|
22
|
-
umaudemc/webui.py,sha256=
|
|
23
|
-
umaudemc/wrappers.py,sha256=
|
|
23
|
+
umaudemc/webui.py,sha256=7dWf5VVl5dGN9oBVTT8m6F4v_QqEbsKSH67q5FljuT8,11071
|
|
24
|
+
umaudemc/wrappers.py,sha256=uz9JV1zBVqzkuoByUd569fEcSxT_00aCJw-jcDtrFpE,9399
|
|
24
25
|
umaudemc/backend/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
25
26
|
umaudemc/backend/_pymc.py,sha256=asfN3uc0PbizVTiBt0Hs1n7jxzUN629Baj90z5X8Gjc,6679
|
|
26
|
-
umaudemc/backend/_spot.py,sha256=
|
|
27
|
+
umaudemc/backend/_spot.py,sha256=rwnXJG98kLsjjobeYdFh5RqK07al0bGMzjz2gLnUPOQ,9166
|
|
27
28
|
umaudemc/backend/_storm.py,sha256=yhHPNxLOekr9ZdzZv5Jzv1K6R5hIrYKQ4SES0rds_0A,4675
|
|
28
29
|
umaudemc/backend/_stormpy.py,sha256=KPbRkVYZhwlL007GfbJJc2VBHbBz3_UKqUNM0FV7PyU,8280
|
|
29
30
|
umaudemc/backend/bmcalc.py,sha256=fE6RxIETYu-ywzrwRvWJP5ZZbZXuUbO6TdV4bcJjA6E,17502
|
|
@@ -36,7 +37,7 @@ umaudemc/backend/spot.py,sha256=P7vkxhY7Tx9J_rOmlua3bfiO8iMgNIuEi25ZNYZRLHk,283
|
|
|
36
37
|
umaudemc/backend/storm.py,sha256=FlhJ0ZkJO84GjEUxuE2hQQJxJoeE_lElBB5NJL4NXTU,276
|
|
37
38
|
umaudemc/command/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
38
39
|
umaudemc/command/check.py,sha256=fzRUGAHNudZPYFk94ekwKplv9N7Fhsrmf5pOFsvPZwA,12030
|
|
39
|
-
umaudemc/command/graph.py,sha256=
|
|
40
|
+
umaudemc/command/graph.py,sha256=74U-yY9NEm5oTeUjspkwy6Ve_eLBTwx8LgZDzUk2LQw,6112
|
|
40
41
|
umaudemc/command/pcheck.py,sha256=RcgwQn8xBgt9eZC1sE3JzR97MB0SC6Q1AXuiKkkzJes,7274
|
|
41
42
|
umaudemc/command/scheck.py,sha256=eRGE-2SsOf6etIfJQ9dJe4cSch8qAs7IuOR94i-E1_U,4653
|
|
42
43
|
umaudemc/command/test.py,sha256=4Uw83V-gVbm21L0Zkv3mKOUpamiNM-qMxGVAYs-trdY,38734
|
|
@@ -47,11 +48,11 @@ umaudemc/data/result.htm,sha256=IwllBM3p4F-QFvOYZZR6bZicL-FuuPLainU9DUPPyNA,1766
|
|
|
47
48
|
umaudemc/data/select.htm,sha256=g0eXHHFxRpxJ9tqOfSgn_QmSQy0E-ET7MimBllGk6vk,4600
|
|
48
49
|
umaudemc/data/smcgraph.js,sha256=iCNQNmsuGdL_GLnqVhGDisediFtedxw3C24rxSiQwx8,6674
|
|
49
50
|
umaudemc/data/smcview.css,sha256=ExFqrMkSeaf8VxFrJXflyCsRW3FTwbv78q0Hoo2UVrM,3833
|
|
50
|
-
umaudemc/data/smcview.js,sha256=
|
|
51
|
+
umaudemc/data/smcview.js,sha256=_fHum1DRU1mhco-9-c6KqTLgiC5u_cCUf61jIK7wcIQ,14509
|
|
51
52
|
umaudemc/data/templog.maude,sha256=TZ-66hVWoG6gp7gJpS6FsQn7dpBTLrr76bKo-UfHGcA,9161
|
|
52
|
-
umaudemc-0.
|
|
53
|
-
umaudemc-0.
|
|
54
|
-
umaudemc-0.
|
|
55
|
-
umaudemc-0.
|
|
56
|
-
umaudemc-0.
|
|
57
|
-
umaudemc-0.
|
|
53
|
+
umaudemc-0.13.1.dist-info/LICENSE,sha256=MrEGL32oSWfnAZ0Bq4BZNcqnq3Mhp87Q4w6-deXfFnA,17992
|
|
54
|
+
umaudemc-0.13.1.dist-info/METADATA,sha256=FYNu7K2Mr4bn93Y0ssvIMn7jXBcK-okaAgVKP4nlBHY,1693
|
|
55
|
+
umaudemc-0.13.1.dist-info/WHEEL,sha256=GJ7t_kWBFywbagK5eo9IoUwLW6oyOeTKmQ-9iHFVNxQ,92
|
|
56
|
+
umaudemc-0.13.1.dist-info/entry_points.txt,sha256=8rYRlLkn4orZtAoujDSeol1t_UFBrK0bfjmLTNv9B44,52
|
|
57
|
+
umaudemc-0.13.1.dist-info/top_level.txt,sha256=Yo_CF78HLGBSblk3890qLcx6XZ17zHCbGcT9iG8sfMw,9
|
|
58
|
+
umaudemc-0.13.1.dist-info/RECORD,,
|
|
File without changes
|
|
File without changes
|
|
File without changes
|