zhmiscellany 6.1.1__py3-none-any.whl → 6.1.3__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.
- zhmiscellany/misc.py +404 -405
- {zhmiscellany-6.1.1.dist-info → zhmiscellany-6.1.3.dist-info}/METADATA +2 -1
- {zhmiscellany-6.1.1.dist-info → zhmiscellany-6.1.3.dist-info}/RECORD +5 -5
- {zhmiscellany-6.1.1.dist-info → zhmiscellany-6.1.3.dist-info}/WHEEL +0 -0
- {zhmiscellany-6.1.1.dist-info → zhmiscellany-6.1.3.dist-info}/top_level.txt +0 -0
zhmiscellany/misc.py
CHANGED
|
@@ -258,441 +258,440 @@ def die_on_key(key='f9', show_message=False):
|
|
|
258
258
|
die()
|
|
259
259
|
zhmiscellany.processing.start_daemon(target=_die_on_key, args=(key,))
|
|
260
260
|
|
|
261
|
+
if WIN32_AVAILABLE:
|
|
262
|
+
temp_folder = os.popen(r'echo %TEMP%').read().replace('\n', '')
|
|
263
|
+
|
|
264
|
+
def obfuscate_python(python_code_string, do_not_obfuscate_indent_block_comment='# DNO', remove_prints=True, remove_comments=True, add_lines=True, new_line_ratio=10):
|
|
265
|
+
import keyword
|
|
266
|
+
|
|
267
|
+
obf = python_code_string
|
|
268
|
+
dno_sig = do_not_obfuscate_indent_block_comment
|
|
269
|
+
dno_char = '2LAM67M4'
|
|
270
|
+
|
|
271
|
+
if add_lines:
|
|
272
|
+
remove_comments = True # Sorry, right now it has to be like this, and I'm too lazy to implement this in a better way. Why would you not want to remove comments anyway...
|
|
273
|
+
|
|
274
|
+
if remove_prints or remove_comments:
|
|
275
|
+
lines = obf.split('\n')
|
|
276
|
+
for i, line in enumerate(lines):
|
|
277
|
+
if remove_prints:
|
|
278
|
+
if line.replace(' ', '').startswith('print('):
|
|
279
|
+
j = 0
|
|
280
|
+
for j, char in enumerate(line):
|
|
281
|
+
if char != ' ':
|
|
282
|
+
break
|
|
283
|
+
lines[i] = f'{" "*j}pass'
|
|
284
|
+
has_dno = line.endswith(dno_sig)
|
|
285
|
+
if remove_comments:
|
|
286
|
+
lines[i] = lines[i].split('#')[0]
|
|
287
|
+
if has_dno:
|
|
288
|
+
lines[i] = lines[i] + ' ' + dno_char
|
|
289
|
+
obf = '\n'.join(lines)
|
|
290
|
+
lines = obf.split('\n')
|
|
291
|
+
lines = [line for line in lines if not any([set(line) == set(j) for j in ['', ' ']])]
|
|
292
|
+
obf = '\n'.join(lines)
|
|
293
|
+
|
|
294
|
+
if add_lines:
|
|
295
|
+
# gather reserved strings
|
|
296
|
+
reserved = []
|
|
297
|
+
reserved.extend(keyword.kwlist) # keywords
|
|
298
|
+
reserved.extend(dir(builtins)) # functions/constants
|
|
299
|
+
reserved.extend([attr for attr in dir(object) if attr.startswith('__') and attr.endswith('__')]) # dunders
|
|
300
|
+
reserved.extend([name for name, obj in vars(builtins).items() if inspect.isclass(obj) and issubclass(obj, BaseException)]) # exceptions
|
|
301
|
+
# tokenize file
|
|
302
|
+
base_splits = '\n\\!#$%&()*+,-./:;<=>?@[\]^`{|}~'
|
|
303
|
+
var_splits = base_splits + ' "\''
|
|
304
|
+
token_splits = base_splits + ' _'
|
|
305
|
+
possible_existing_variables = zhmiscellany.string.multi_split(obf, list(var_splits))
|
|
306
|
+
tokens = zhmiscellany.string.multi_split(obf, list(token_splits))
|
|
307
|
+
tokens = [token for token in tokens if all([char in list(string.ascii_letters + string.digits + "_") for char in token])]
|
|
308
|
+
tokens = [token for token in tokens if dno_char not in token]
|
|
309
|
+
tokens = [token for token in tokens if token not in reserved]
|
|
310
|
+
tokens = list(dict.fromkeys(tokens))
|
|
311
|
+
number_tokens = [token for token in tokens if all([char in '1234567890' for char in token])]
|
|
312
|
+
#number_tokens = [token for token in number_tokens if set(token) != set('0')]
|
|
313
|
+
number_tokens = [token for token in number_tokens if not token.startswith('0')]
|
|
314
|
+
all_tkns = copy.deepcopy(tokens)
|
|
315
|
+
for i in number_tokens:
|
|
316
|
+
tokens.remove(i)
|
|
317
|
+
number_tokens = [num for num in number_tokens if len(str(num)) < 10000]
|
|
318
|
+
|
|
319
|
+
|
|
320
|
+
base_rng = random.Random(0.26900750624933856)
|
|
321
|
+
|
|
322
|
+
rngs = {
|
|
323
|
+
'num_rng': random.Random(base_rng.random()),
|
|
324
|
+
'var_name_rng': random.Random(base_rng.random()),
|
|
325
|
+
'str_rng': random.Random(base_rng.random()),
|
|
326
|
+
'lst_rng': random.Random(base_rng.random()),
|
|
327
|
+
'new_rng': random.Random(base_rng.random()),
|
|
328
|
+
'global_rng': random.Random(base_rng.random()),
|
|
329
|
+
'match_rng': random.Random(base_rng.random()),
|
|
330
|
+
'create_var_name': random.Random(base_rng.random()),
|
|
331
|
+
'make_random_number': random.Random(base_rng.random()),
|
|
332
|
+
'create_string': random.Random(base_rng.random()),
|
|
333
|
+
'create_list': random.Random(base_rng.random()),
|
|
334
|
+
}
|
|
335
|
+
|
|
336
|
+
|
|
337
|
+
if not number_tokens:
|
|
338
|
+
def make_random_number():
|
|
339
|
+
ends = [10, 100, 1000]
|
|
340
|
+
return rngs['make_random_number'].randint(0, rngs['make_random_number'].choice(ends))
|
|
341
|
+
number_tokens = [make_random_number for i in range(round((len(obf.split('\n'))*new_line_ratio)/10))]
|
|
342
|
+
total_new_lines = len(obf.split('\n'))*new_line_ratio
|
|
343
|
+
|
|
344
|
+
def create_var_name(vars):
|
|
345
|
+
while True:
|
|
346
|
+
var = rngs['create_var_name'].choice(tokens)
|
|
347
|
+
while True:
|
|
348
|
+
if var[0] in list('1234567890'):
|
|
349
|
+
break
|
|
350
|
+
if var not in possible_existing_variables and var not in vars['all']:
|
|
351
|
+
if rngs['create_var_name'].random() > 1/3:
|
|
352
|
+
return var
|
|
353
|
+
var = var + '_' + random.choice(tokens)
|
|
261
354
|
|
|
262
|
-
|
|
355
|
+
def create_string(nds=None):
|
|
356
|
+
stri = rngs['create_string'].choice(all_tkns)
|
|
263
357
|
|
|
358
|
+
if not nds:
|
|
359
|
+
stnds = ['"', "'", '"""', "'''"]
|
|
360
|
+
nds = rngs['create_string'].choice(stnds)
|
|
264
361
|
|
|
265
|
-
def obfuscate_python(python_code_string, do_not_obfuscate_indent_block_comment='# DNO', remove_prints=True, remove_comments=True, add_lines=True, new_line_ratio=10):
|
|
266
|
-
import keyword
|
|
267
|
-
|
|
268
|
-
obf = python_code_string
|
|
269
|
-
dno_sig = do_not_obfuscate_indent_block_comment
|
|
270
|
-
dno_char = '2LAM67M4'
|
|
271
|
-
|
|
272
|
-
if add_lines:
|
|
273
|
-
remove_comments = True # Sorry, right now it has to be like this, and I'm too lazy to implement this in a better way. Why would you not want to remove comments anyway...
|
|
274
|
-
|
|
275
|
-
if remove_prints or remove_comments:
|
|
276
|
-
lines = obf.split('\n')
|
|
277
|
-
for i, line in enumerate(lines):
|
|
278
|
-
if remove_prints:
|
|
279
|
-
if line.replace(' ', '').startswith('print('):
|
|
280
|
-
j = 0
|
|
281
|
-
for j, char in enumerate(line):
|
|
282
|
-
if char != ' ':
|
|
283
|
-
break
|
|
284
|
-
lines[i] = f'{" "*j}pass'
|
|
285
|
-
has_dno = line.endswith(dno_sig)
|
|
286
|
-
if remove_comments:
|
|
287
|
-
lines[i] = lines[i].split('#')[0]
|
|
288
|
-
if has_dno:
|
|
289
|
-
lines[i] = lines[i] + ' ' + dno_char
|
|
290
|
-
obf = '\n'.join(lines)
|
|
291
|
-
lines = obf.split('\n')
|
|
292
|
-
lines = [line for line in lines if not any([set(line) == set(j) for j in ['', ' ']])]
|
|
293
|
-
obf = '\n'.join(lines)
|
|
294
|
-
|
|
295
|
-
if add_lines:
|
|
296
|
-
# gather reserved strings
|
|
297
|
-
reserved = []
|
|
298
|
-
reserved.extend(keyword.kwlist) # keywords
|
|
299
|
-
reserved.extend(dir(builtins)) # functions/constants
|
|
300
|
-
reserved.extend([attr for attr in dir(object) if attr.startswith('__') and attr.endswith('__')]) # dunders
|
|
301
|
-
reserved.extend([name for name, obj in vars(builtins).items() if inspect.isclass(obj) and issubclass(obj, BaseException)]) # exceptions
|
|
302
|
-
# tokenize file
|
|
303
|
-
base_splits = '\n\\!#$%&()*+,-./:;<=>?@[\]^`{|}~'
|
|
304
|
-
var_splits = base_splits + ' "\''
|
|
305
|
-
token_splits = base_splits + ' _'
|
|
306
|
-
possible_existing_variables = zhmiscellany.string.multi_split(obf, list(var_splits))
|
|
307
|
-
tokens = zhmiscellany.string.multi_split(obf, list(token_splits))
|
|
308
|
-
tokens = [token for token in tokens if all([char in list(string.ascii_letters + string.digits + "_") for char in token])]
|
|
309
|
-
tokens = [token for token in tokens if dno_char not in token]
|
|
310
|
-
tokens = [token for token in tokens if token not in reserved]
|
|
311
|
-
tokens = list(dict.fromkeys(tokens))
|
|
312
|
-
number_tokens = [token for token in tokens if all([char in '1234567890' for char in token])]
|
|
313
|
-
#number_tokens = [token for token in number_tokens if set(token) != set('0')]
|
|
314
|
-
number_tokens = [token for token in number_tokens if not token.startswith('0')]
|
|
315
|
-
all_tkns = copy.deepcopy(tokens)
|
|
316
|
-
for i in number_tokens:
|
|
317
|
-
tokens.remove(i)
|
|
318
|
-
number_tokens = [num for num in number_tokens if len(str(num)) < 10000]
|
|
319
|
-
|
|
320
|
-
|
|
321
|
-
base_rng = random.Random(0.26900750624933856)
|
|
322
|
-
|
|
323
|
-
rngs = {
|
|
324
|
-
'num_rng': random.Random(base_rng.random()),
|
|
325
|
-
'var_name_rng': random.Random(base_rng.random()),
|
|
326
|
-
'str_rng': random.Random(base_rng.random()),
|
|
327
|
-
'lst_rng': random.Random(base_rng.random()),
|
|
328
|
-
'new_rng': random.Random(base_rng.random()),
|
|
329
|
-
'global_rng': random.Random(base_rng.random()),
|
|
330
|
-
'match_rng': random.Random(base_rng.random()),
|
|
331
|
-
'create_var_name': random.Random(base_rng.random()),
|
|
332
|
-
'make_random_number': random.Random(base_rng.random()),
|
|
333
|
-
'create_string': random.Random(base_rng.random()),
|
|
334
|
-
'create_list': random.Random(base_rng.random()),
|
|
335
|
-
}
|
|
336
|
-
|
|
337
|
-
|
|
338
|
-
if not number_tokens:
|
|
339
|
-
def make_random_number():
|
|
340
|
-
ends = [10, 100, 1000]
|
|
341
|
-
return rngs['make_random_number'].randint(0, rngs['make_random_number'].choice(ends))
|
|
342
|
-
number_tokens = [make_random_number for i in range(round((len(obf.split('\n'))*new_line_ratio)/10))]
|
|
343
|
-
total_new_lines = len(obf.split('\n'))*new_line_ratio
|
|
344
|
-
|
|
345
|
-
def create_var_name(vars):
|
|
346
|
-
while True:
|
|
347
|
-
var = rngs['create_var_name'].choice(tokens)
|
|
348
362
|
while True:
|
|
349
|
-
if
|
|
350
|
-
|
|
351
|
-
|
|
352
|
-
|
|
353
|
-
|
|
354
|
-
|
|
355
|
-
|
|
356
|
-
|
|
357
|
-
|
|
358
|
-
|
|
359
|
-
|
|
363
|
+
if rngs['create_string'].random() > 1/3:
|
|
364
|
+
stri = stri + ' ' + rngs['create_string'].choice(all_tkns)
|
|
365
|
+
else:
|
|
366
|
+
return nds + stri + nds
|
|
367
|
+
|
|
368
|
+
def create_list(vars, will_run=True):
|
|
369
|
+
lst_str = '['
|
|
370
|
+
elements = []
|
|
371
|
+
end = 2
|
|
372
|
+
if not will_run:
|
|
373
|
+
end = 3
|
|
374
|
+
chz = rngs['create_list'].randint(1, end)
|
|
360
375
|
stnds = ['"', "'", '"""', "'''"]
|
|
361
|
-
nds = rngs['
|
|
362
|
-
|
|
363
|
-
|
|
364
|
-
|
|
365
|
-
|
|
366
|
-
|
|
367
|
-
|
|
368
|
-
|
|
369
|
-
|
|
370
|
-
|
|
371
|
-
|
|
372
|
-
|
|
373
|
-
|
|
374
|
-
|
|
375
|
-
|
|
376
|
-
|
|
377
|
-
|
|
378
|
-
|
|
379
|
-
|
|
380
|
-
|
|
381
|
-
|
|
382
|
-
|
|
383
|
-
|
|
384
|
-
|
|
385
|
-
|
|
386
|
-
|
|
387
|
-
|
|
388
|
-
|
|
389
|
-
|
|
390
|
-
|
|
391
|
-
|
|
392
|
-
|
|
393
|
-
|
|
394
|
-
'
|
|
395
|
-
'
|
|
396
|
-
'
|
|
397
|
-
'
|
|
398
|
-
'
|
|
399
|
-
'
|
|
400
|
-
|
|
401
|
-
|
|
402
|
-
|
|
403
|
-
|
|
404
|
-
|
|
405
|
-
|
|
406
|
-
|
|
407
|
-
|
|
408
|
-
|
|
409
|
-
|
|
410
|
-
|
|
411
|
-
|
|
412
|
-
|
|
413
|
-
|
|
414
|
-
|
|
415
|
-
|
|
416
|
-
|
|
417
|
-
rngs['rand_var_sub'] = random.Random(base_rng.random())
|
|
418
|
-
rngs['gen_other_var'] = random.Random(base_rng.random())
|
|
419
|
-
rngs['rand_func'] = random.Random(base_rng.random())
|
|
420
|
-
rngs['rand_call_func'] = random.Random(base_rng.random())
|
|
421
|
-
|
|
422
|
-
dno_indent = None
|
|
423
|
-
|
|
424
|
-
for i, line in enumerate(lines):
|
|
425
|
-
indent = 0
|
|
426
|
-
for char in line:
|
|
427
|
-
if char == ' ':
|
|
428
|
-
indent += 1
|
|
429
|
-
else:
|
|
430
|
-
break
|
|
431
|
-
single_indent = 4 if indent % 4 == 0 else 2
|
|
432
|
-
varis['indent'] = indent
|
|
433
|
-
|
|
434
|
-
if line.endswith(dno_char) or indent == dno_indent:
|
|
435
|
-
dno_indent = indent
|
|
436
|
-
continue
|
|
437
|
-
else:
|
|
438
|
-
dno_indent = None
|
|
439
|
-
|
|
440
|
-
|
|
441
|
-
def gen_num_var(vars):
|
|
442
|
-
|
|
443
|
-
if 1 / 4 > rngs['gen_num_var'].random() and vars['num']:
|
|
444
|
-
cvar = rngs['gen_num_var'].choice(vars['num'])
|
|
445
|
-
else:
|
|
446
|
-
cvar = create_var_name(vars)
|
|
447
|
-
vars['num'].append(cvar)
|
|
448
|
-
vars['all'].append(cvar)
|
|
449
|
-
|
|
450
|
-
return cvar
|
|
451
|
-
|
|
452
|
-
def gen_str_var(vars):
|
|
453
|
-
|
|
454
|
-
non_num = []
|
|
455
|
-
non_num.extend(vars['str'])
|
|
456
|
-
non_num.extend(vars['lst'])
|
|
457
|
-
|
|
458
|
-
if 1 / 4 > rngs['gen_str_var'].random() and non_num:
|
|
459
|
-
cvar = rngs['gen_str_var'].choice(non_num)
|
|
460
|
-
else:
|
|
461
|
-
cvar = create_var_name(vars)
|
|
462
|
-
vars['str'].append(cvar)
|
|
463
|
-
vars['all'].append(cvar)
|
|
464
|
-
|
|
465
|
-
return cvar
|
|
466
|
-
|
|
467
|
-
def gen_lst_var(vars):
|
|
468
|
-
|
|
469
|
-
non_num = []
|
|
470
|
-
non_num.extend(vars['str'])
|
|
471
|
-
non_num.extend(vars['lst'])
|
|
376
|
+
nds = rngs['create_list'].choice(stnds)
|
|
377
|
+
while True:
|
|
378
|
+
if rngs['create_list'].random() > 1/6:
|
|
379
|
+
match chz:
|
|
380
|
+
case 1:
|
|
381
|
+
elements.append(create_string(nds))
|
|
382
|
+
case 2:
|
|
383
|
+
elements.append(rngs['create_list'].choice(number_tokens))
|
|
384
|
+
case 3:
|
|
385
|
+
elements.append(rngs['create_list'].choice(vars['all']))
|
|
386
|
+
else:
|
|
387
|
+
break
|
|
388
|
+
lst_str = lst_str + ', '.join(elements)
|
|
389
|
+
lst_str = lst_str + ']'
|
|
390
|
+
return lst_str
|
|
391
|
+
|
|
392
|
+
varis = {
|
|
393
|
+
'added_lines': [],
|
|
394
|
+
'all': [],
|
|
395
|
+
'num': [],
|
|
396
|
+
'str': [],
|
|
397
|
+
'lst': [],
|
|
398
|
+
'fun': [],
|
|
399
|
+
}
|
|
400
|
+
prev = ''
|
|
401
|
+
|
|
402
|
+
rngs['gen_num_var'] = random.Random(base_rng.random())
|
|
403
|
+
rngs['gen_str_var'] = random.Random(base_rng.random())
|
|
404
|
+
rngs['gen_lst_var'] = random.Random(base_rng.random())
|
|
405
|
+
rngs['rand_num'] = random.Random(base_rng.random())
|
|
406
|
+
rngs['rand_var'] = random.Random(base_rng.random())
|
|
407
|
+
rngs['rand_loop'] = random.Random(base_rng.random())
|
|
408
|
+
rngs['rand_num_add'] = random.Random(base_rng.random())
|
|
409
|
+
rngs['rand_num_sub'] = random.Random(base_rng.random())
|
|
410
|
+
rngs['rand_str'] = random.Random(base_rng.random())
|
|
411
|
+
rngs['rand_print'] = random.Random(base_rng.random())
|
|
412
|
+
rngs['rand_lst'] = random.Random(base_rng.random())
|
|
413
|
+
rngs['add_pass'] = random.Random(base_rng.random())
|
|
414
|
+
rngs['add_random_line'] = random.Random(base_rng.random())
|
|
415
|
+
rngs['rand_var_add'] = random.Random(base_rng.random())
|
|
416
|
+
rngs['rand_var_sub'] = random.Random(base_rng.random())
|
|
417
|
+
rngs['gen_other_var'] = random.Random(base_rng.random())
|
|
418
|
+
rngs['rand_func'] = random.Random(base_rng.random())
|
|
419
|
+
rngs['rand_call_func'] = random.Random(base_rng.random())
|
|
420
|
+
|
|
421
|
+
dno_indent = None
|
|
422
|
+
|
|
423
|
+
for i, line in enumerate(lines):
|
|
424
|
+
indent = 0
|
|
425
|
+
for char in line:
|
|
426
|
+
if char == ' ':
|
|
427
|
+
indent += 1
|
|
428
|
+
else:
|
|
429
|
+
break
|
|
430
|
+
single_indent = 4 if indent % 4 == 0 else 2
|
|
431
|
+
varis['indent'] = indent
|
|
472
432
|
|
|
473
|
-
if
|
|
474
|
-
|
|
433
|
+
if line.endswith(dno_char) or indent == dno_indent:
|
|
434
|
+
dno_indent = indent
|
|
435
|
+
continue
|
|
475
436
|
else:
|
|
476
|
-
|
|
477
|
-
vars['lst'].append(cvar)
|
|
478
|
-
vars['all'].append(cvar)
|
|
437
|
+
dno_indent = None
|
|
479
438
|
|
|
480
|
-
return cvar
|
|
481
439
|
|
|
482
|
-
|
|
483
|
-
cvar = create_var_name(vars)
|
|
484
|
-
vars['fun'].append(cvar)
|
|
485
|
-
vars['all'].append(cvar)
|
|
440
|
+
def gen_num_var(vars):
|
|
486
441
|
|
|
487
|
-
|
|
488
|
-
|
|
489
|
-
|
|
490
|
-
|
|
491
|
-
|
|
492
|
-
|
|
493
|
-
|
|
494
|
-
while rngs['global_rng'].random() > 1/(new_line_ratio*2) and (not any([prev.endswith(char) for char in list(' ,\\[{(')+reserved])) and (not any([char in line for char in ':'])):
|
|
442
|
+
if 1 / 4 > rngs['gen_num_var'].random() and vars['num']:
|
|
443
|
+
cvar = rngs['gen_num_var'].choice(vars['num'])
|
|
444
|
+
else:
|
|
445
|
+
cvar = create_var_name(vars)
|
|
446
|
+
vars['num'].append(cvar)
|
|
447
|
+
vars['all'].append(cvar)
|
|
495
448
|
|
|
496
|
-
def rand_num(vars, will_run=True): # var (new/old) to random int
|
|
497
|
-
cvar = gen_num_var(vars)
|
|
498
|
-
vars['added_lines'].append((i, f"{' ' * vars['indent']}{cvar} = {rngs['rand_num'].choice(number_tokens)}"))
|
|
499
449
|
return cvar
|
|
500
450
|
|
|
501
|
-
def
|
|
502
|
-
if will_run:
|
|
503
|
-
raise Exception('This should not be possible')
|
|
451
|
+
def gen_str_var(vars):
|
|
504
452
|
|
|
505
|
-
|
|
506
|
-
|
|
507
|
-
|
|
508
|
-
add_random_line(vars, will_run)
|
|
509
|
-
return
|
|
453
|
+
non_num = []
|
|
454
|
+
non_num.extend(vars['str'])
|
|
455
|
+
non_num.extend(vars['lst'])
|
|
510
456
|
|
|
511
|
-
if
|
|
512
|
-
cvar =
|
|
513
|
-
elif ev in vars['str']:
|
|
514
|
-
cvar = gen_str_var(vars)
|
|
515
|
-
elif ev in vars['lst']:
|
|
516
|
-
cvar = gen_lst_var(vars)
|
|
457
|
+
if 1 / 4 > rngs['gen_str_var'].random() and non_num:
|
|
458
|
+
cvar = rngs['gen_str_var'].choice(non_num)
|
|
517
459
|
else:
|
|
518
|
-
cvar =
|
|
519
|
-
|
|
520
|
-
|
|
521
|
-
return cvar
|
|
460
|
+
cvar = create_var_name(vars)
|
|
461
|
+
vars['str'].append(cvar)
|
|
462
|
+
vars['all'].append(cvar)
|
|
522
463
|
|
|
523
|
-
def rand_loop(vars, cvar, will_run=True):
|
|
524
|
-
if rngs['rand_loop'].random() > 1/(new_line_ratio/4):
|
|
525
|
-
return
|
|
526
|
-
end = 1
|
|
527
|
-
if cvar in vars['num']:
|
|
528
|
-
end = 2
|
|
529
|
-
choice = rngs['rand_loop'].randint(1, end)
|
|
530
|
-
match choice:
|
|
531
|
-
case 1:
|
|
532
|
-
vars['added_lines'].append((i, f"{' ' * vars['indent']}while {cvar}:"))
|
|
533
|
-
case 2:
|
|
534
|
-
vars['added_lines'].append((i, f"{' ' * vars['indent']}for {gen_other_var(vars)} in range(0, {cvar}):"))
|
|
535
|
-
|
|
536
|
-
vars['indent'] += single_indent
|
|
537
|
-
f = True
|
|
538
|
-
while rngs['rand_loop'].random() > 1 / (new_line_ratio * 2) or f:
|
|
539
|
-
add_random_line(vars, False)
|
|
540
|
-
f = False
|
|
541
|
-
vars['indent'] -= single_indent
|
|
542
|
-
|
|
543
|
-
def rand_func(vars, will_run=True):
|
|
544
|
-
if rngs['rand_func'].random() > 1/(new_line_ratio):
|
|
545
|
-
add_random_line(vars, will_run)
|
|
546
|
-
return
|
|
547
|
-
cvar = gen_func_var(vars)
|
|
548
|
-
ev = []
|
|
549
|
-
while rngs['rand_func'].random() < 1/3:
|
|
550
|
-
ev.append(create_var_name(vars))
|
|
551
|
-
ev = ', '.join(ev)
|
|
552
|
-
vars['added_lines'].append((i, f"{' ' * vars['indent']}def {cvar}({ev}):"))
|
|
553
|
-
vars['indent'] += single_indent
|
|
554
|
-
cvars = []
|
|
555
|
-
while rngs['rand_func'].random() > 1 / (new_line_ratio * 2) or len([e for e in cvars if e]) == 0:
|
|
556
|
-
cvars.append(add_random_line(vars, will_run))
|
|
557
|
-
cvars = [e for e in cvars if e]
|
|
558
|
-
ev = []
|
|
559
|
-
f = True
|
|
560
|
-
while rngs['rand_func'].random() < 1/3 or f:
|
|
561
|
-
ev.append(rngs['rand_func'].choice(cvars))
|
|
562
|
-
f = False
|
|
563
|
-
ev = ', '.join(ev)
|
|
564
|
-
if rngs['rand_func'].random() > 1/3:
|
|
565
|
-
vars['added_lines'].append((i, f"{' ' * vars['indent']}return {ev}"))
|
|
566
|
-
vars['indent'] -= single_indent
|
|
567
464
|
return cvar
|
|
568
465
|
|
|
569
|
-
def
|
|
570
|
-
if (not vars['fun']) or will_run:
|
|
571
|
-
add_random_line(vars, will_run)
|
|
572
|
-
return
|
|
573
|
-
func = rngs['rand_call_func'].choice(vars['fun'])
|
|
574
|
-
ev = []
|
|
575
|
-
while rngs['rand_call_func'].random() < 1/3:
|
|
576
|
-
ev.append(rngs['rand_call_func'].choice(vars['all']))
|
|
577
|
-
ev = ', '.join(ev)
|
|
578
|
-
vars['added_lines'].append((i, f"{' ' * vars['indent']}{func}({ev})"))
|
|
579
|
-
|
|
580
|
-
def rand_num_add(vars, will_run=True): # var (new/old) to random int + random int
|
|
581
|
-
cvar = gen_num_var(vars)
|
|
582
|
-
pos1 = rngs['rand_num_add'].choice(number_tokens)
|
|
583
|
-
pos2 = rngs['rand_num_add'].choice(number_tokens)
|
|
584
|
-
falsy = False
|
|
585
|
-
chz = rngs['rand_var_add'].randint(1, 3)
|
|
586
|
-
match chz:
|
|
587
|
-
case 1:
|
|
588
|
-
pos3 = '+'
|
|
589
|
-
if not (int(pos1) + int(pos2)): falsy = True
|
|
590
|
-
case 2:
|
|
591
|
-
pos3 = '-'
|
|
592
|
-
if not (int(pos1) - int(pos2)): falsy = True
|
|
593
|
-
case 3:
|
|
594
|
-
pos3 = '*'
|
|
595
|
-
if not (int(pos1) * int(pos2)): falsy = True
|
|
596
|
-
|
|
597
|
-
vars['added_lines'].append((i, f"{' ' * vars['indent']}{cvar} = {pos1} {pos3} {pos2}"))
|
|
598
|
-
if falsy:
|
|
599
|
-
rand_loop(vars, cvar)
|
|
600
|
-
return cvar
|
|
466
|
+
def gen_lst_var(vars):
|
|
601
467
|
|
|
602
|
-
|
|
603
|
-
|
|
604
|
-
|
|
605
|
-
cvar = gen_num_var(vars)
|
|
606
|
-
|
|
607
|
-
chz = rngs['rand_var_add'].randint(1, 2)
|
|
608
|
-
match chz:
|
|
609
|
-
case 1:pos1 = rngs['rand_var_add'].choice(number_tokens)
|
|
610
|
-
case 2:pos1 = rngs['rand_var_add'].choice(vars['all'])
|
|
611
|
-
|
|
612
|
-
chz = rngs['rand_var_add'].randint(1, 2)
|
|
613
|
-
match chz:
|
|
614
|
-
case 1:pos2 = rngs['rand_var_add'].choice(number_tokens)
|
|
615
|
-
case 2:pos2 = rngs['rand_var_add'].choice(vars['all'])
|
|
616
|
-
|
|
617
|
-
chz = rngs['rand_var_add'].randint(1, 7)
|
|
618
|
-
match chz:
|
|
619
|
-
case 1:pos3 = '+'
|
|
620
|
-
case 2:pos3 = '-'
|
|
621
|
-
case 3:pos3 = '/'
|
|
622
|
-
case 4:pos3 = '//'
|
|
623
|
-
case 5:pos3 = '%'
|
|
624
|
-
case 6:pos3 = '*'
|
|
625
|
-
case 7:pos3 = '**'
|
|
626
|
-
|
|
627
|
-
vars['added_lines'].append((i, f"{' ' * vars['indent']}{cvar} = {pos1} {pos3} {pos2}"))
|
|
628
|
-
return cvar
|
|
468
|
+
non_num = []
|
|
469
|
+
non_num.extend(vars['str'])
|
|
470
|
+
non_num.extend(vars['lst'])
|
|
629
471
|
|
|
630
|
-
|
|
631
|
-
|
|
632
|
-
|
|
633
|
-
|
|
472
|
+
if 1 / 4 > rngs['gen_lst_var'].random() and non_num:
|
|
473
|
+
cvar = rngs['gen_lst_var'].choice(non_num)
|
|
474
|
+
else:
|
|
475
|
+
cvar = create_var_name(vars)
|
|
476
|
+
vars['lst'].append(cvar)
|
|
477
|
+
vars['all'].append(cvar)
|
|
634
478
|
|
|
635
|
-
def rand_print(vars, will_run=False): # print 1 random var or 2 random string or 3 random int or 4 random list
|
|
636
|
-
if will_run:
|
|
637
|
-
raise Exception('This should not be possible')
|
|
638
|
-
cvar = gen_str_var(vars)
|
|
639
|
-
choice = rngs['rand_print'].randint(1, 4)
|
|
640
|
-
match choice:
|
|
641
|
-
case 1:
|
|
642
|
-
ev = rngs['rand_print'].choice(vars['all'])
|
|
643
|
-
case 2:
|
|
644
|
-
ev = create_string()
|
|
645
|
-
case 3:
|
|
646
|
-
ev = rngs['rand_print'].choice(number_tokens)
|
|
647
|
-
case 4:
|
|
648
|
-
ev = create_list(vars)
|
|
649
|
-
vars['added_lines'].append((i, f"{' ' * vars['indent']}print({ev})"))
|
|
650
|
-
|
|
651
|
-
def rand_lst(vars, will_run=True): # var (new/old) to random list
|
|
652
|
-
lst = create_list(vars, will_run)
|
|
653
|
-
cvar = gen_lst_var(vars)
|
|
654
|
-
vars['added_lines'].append((i, f"{' ' * vars['indent']}{cvar} = {lst}"))
|
|
655
|
-
if lst == '[]': # this will miss some but vast majority will be caught
|
|
656
|
-
rand_loop(vars, cvar)
|
|
657
479
|
return cvar
|
|
658
480
|
|
|
659
|
-
def
|
|
660
|
-
|
|
661
|
-
|
|
662
|
-
|
|
663
|
-
all_vars = run_vars + [rand_var, rand_print, rand_var_add, rand_call_func]
|
|
481
|
+
def gen_func_var(vars):
|
|
482
|
+
cvar = create_var_name(vars)
|
|
483
|
+
vars['fun'].append(cvar)
|
|
484
|
+
vars['all'].append(cvar)
|
|
664
485
|
|
|
665
|
-
def add_random_line(vars, will_run=True):
|
|
666
|
-
if will_run:
|
|
667
|
-
line_variations = run_vars
|
|
668
|
-
else:
|
|
669
|
-
line_variations = all_vars
|
|
670
|
-
variation = rngs['add_random_line'].choice(line_variations)
|
|
671
|
-
cvar = variation(vars, will_run)
|
|
672
486
|
return cvar
|
|
673
487
|
|
|
674
|
-
|
|
488
|
+
def gen_other_var(vars):
|
|
489
|
+
cvar = create_var_name(vars)
|
|
490
|
+
vars['all'].append(cvar)
|
|
491
|
+
return cvar
|
|
675
492
|
|
|
676
|
-
|
|
493
|
+
while rngs['global_rng'].random() > 1/(new_line_ratio*2) and (not any([prev.endswith(char) for char in list(' ,\\[{(')+reserved])) and (not any([char in line for char in ':'])):
|
|
677
494
|
|
|
678
|
-
|
|
679
|
-
|
|
680
|
-
|
|
681
|
-
|
|
495
|
+
def rand_num(vars, will_run=True): # var (new/old) to random int
|
|
496
|
+
cvar = gen_num_var(vars)
|
|
497
|
+
vars['added_lines'].append((i, f"{' ' * vars['indent']}{cvar} = {rngs['rand_num'].choice(number_tokens)}"))
|
|
498
|
+
return cvar
|
|
499
|
+
|
|
500
|
+
def rand_var(vars, will_run=False): # var (new/old) to random previous var
|
|
501
|
+
if will_run:
|
|
502
|
+
raise Exception('This should not be possible')
|
|
503
|
+
|
|
504
|
+
if vars['all']:
|
|
505
|
+
ev = rngs['rand_var'].choice(vars['all'])
|
|
506
|
+
else:
|
|
507
|
+
add_random_line(vars, will_run)
|
|
508
|
+
return
|
|
509
|
+
|
|
510
|
+
if ev in vars['num']:
|
|
511
|
+
cvar = gen_num_var(vars)
|
|
512
|
+
elif ev in vars['str']:
|
|
513
|
+
cvar = gen_str_var(vars)
|
|
514
|
+
elif ev in vars['lst']:
|
|
515
|
+
cvar = gen_lst_var(vars)
|
|
516
|
+
else:
|
|
517
|
+
cvar = gen_other_var(vars)
|
|
518
|
+
|
|
519
|
+
vars['added_lines'].append((i, f"{' ' * vars['indent']}{cvar} = {ev}"))
|
|
520
|
+
return cvar
|
|
521
|
+
|
|
522
|
+
def rand_loop(vars, cvar, will_run=True):
|
|
523
|
+
if rngs['rand_loop'].random() > 1/(new_line_ratio/4):
|
|
524
|
+
return
|
|
525
|
+
end = 1
|
|
526
|
+
if cvar in vars['num']:
|
|
527
|
+
end = 2
|
|
528
|
+
choice = rngs['rand_loop'].randint(1, end)
|
|
529
|
+
match choice:
|
|
530
|
+
case 1:
|
|
531
|
+
vars['added_lines'].append((i, f"{' ' * vars['indent']}while {cvar}:"))
|
|
532
|
+
case 2:
|
|
533
|
+
vars['added_lines'].append((i, f"{' ' * vars['indent']}for {gen_other_var(vars)} in range(0, {cvar}):"))
|
|
534
|
+
|
|
535
|
+
vars['indent'] += single_indent
|
|
536
|
+
f = True
|
|
537
|
+
while rngs['rand_loop'].random() > 1 / (new_line_ratio * 2) or f:
|
|
538
|
+
add_random_line(vars, False)
|
|
539
|
+
f = False
|
|
540
|
+
vars['indent'] -= single_indent
|
|
541
|
+
|
|
542
|
+
def rand_func(vars, will_run=True):
|
|
543
|
+
if rngs['rand_func'].random() > 1/(new_line_ratio):
|
|
544
|
+
add_random_line(vars, will_run)
|
|
545
|
+
return
|
|
546
|
+
cvar = gen_func_var(vars)
|
|
547
|
+
ev = []
|
|
548
|
+
while rngs['rand_func'].random() < 1/3:
|
|
549
|
+
ev.append(create_var_name(vars))
|
|
550
|
+
ev = ', '.join(ev)
|
|
551
|
+
vars['added_lines'].append((i, f"{' ' * vars['indent']}def {cvar}({ev}):"))
|
|
552
|
+
vars['indent'] += single_indent
|
|
553
|
+
cvars = []
|
|
554
|
+
while rngs['rand_func'].random() > 1 / (new_line_ratio * 2) or len([e for e in cvars if e]) == 0:
|
|
555
|
+
cvars.append(add_random_line(vars, will_run))
|
|
556
|
+
cvars = [e for e in cvars if e]
|
|
557
|
+
ev = []
|
|
558
|
+
f = True
|
|
559
|
+
while rngs['rand_func'].random() < 1/3 or f:
|
|
560
|
+
ev.append(rngs['rand_func'].choice(cvars))
|
|
561
|
+
f = False
|
|
562
|
+
ev = ', '.join(ev)
|
|
563
|
+
if rngs['rand_func'].random() > 1/3:
|
|
564
|
+
vars['added_lines'].append((i, f"{' ' * vars['indent']}return {ev}"))
|
|
565
|
+
vars['indent'] -= single_indent
|
|
566
|
+
return cvar
|
|
567
|
+
|
|
568
|
+
def rand_call_func(vars, will_run=True):
|
|
569
|
+
if (not vars['fun']) or will_run:
|
|
570
|
+
add_random_line(vars, will_run)
|
|
571
|
+
return
|
|
572
|
+
func = rngs['rand_call_func'].choice(vars['fun'])
|
|
573
|
+
ev = []
|
|
574
|
+
while rngs['rand_call_func'].random() < 1/3:
|
|
575
|
+
ev.append(rngs['rand_call_func'].choice(vars['all']))
|
|
576
|
+
ev = ', '.join(ev)
|
|
577
|
+
vars['added_lines'].append((i, f"{' ' * vars['indent']}{func}({ev})"))
|
|
578
|
+
|
|
579
|
+
def rand_num_add(vars, will_run=True): # var (new/old) to random int + random int
|
|
580
|
+
cvar = gen_num_var(vars)
|
|
581
|
+
pos1 = rngs['rand_num_add'].choice(number_tokens)
|
|
582
|
+
pos2 = rngs['rand_num_add'].choice(number_tokens)
|
|
583
|
+
falsy = False
|
|
584
|
+
chz = rngs['rand_var_add'].randint(1, 3)
|
|
585
|
+
match chz:
|
|
586
|
+
case 1:
|
|
587
|
+
pos3 = '+'
|
|
588
|
+
if not (int(pos1) + int(pos2)): falsy = True
|
|
589
|
+
case 2:
|
|
590
|
+
pos3 = '-'
|
|
591
|
+
if not (int(pos1) - int(pos2)): falsy = True
|
|
592
|
+
case 3:
|
|
593
|
+
pos3 = '*'
|
|
594
|
+
if not (int(pos1) * int(pos2)): falsy = True
|
|
595
|
+
|
|
596
|
+
vars['added_lines'].append((i, f"{' ' * vars['indent']}{cvar} = {pos1} {pos3} {pos2}"))
|
|
597
|
+
if falsy:
|
|
598
|
+
rand_loop(vars, cvar)
|
|
599
|
+
return cvar
|
|
600
|
+
|
|
601
|
+
def rand_var_add(vars, will_run=False): # var (new/old) to random int + random int
|
|
602
|
+
if will_run:
|
|
603
|
+
raise Exception('This should not be possible')
|
|
604
|
+
cvar = gen_num_var(vars)
|
|
682
605
|
|
|
683
|
-
|
|
684
|
-
|
|
685
|
-
|
|
686
|
-
|
|
687
|
-
|
|
688
|
-
|
|
689
|
-
|
|
690
|
-
|
|
691
|
-
|
|
692
|
-
|
|
693
|
-
|
|
694
|
-
|
|
695
|
-
|
|
606
|
+
chz = rngs['rand_var_add'].randint(1, 2)
|
|
607
|
+
match chz:
|
|
608
|
+
case 1:pos1 = rngs['rand_var_add'].choice(number_tokens)
|
|
609
|
+
case 2:pos1 = rngs['rand_var_add'].choice(vars['all'])
|
|
610
|
+
|
|
611
|
+
chz = rngs['rand_var_add'].randint(1, 2)
|
|
612
|
+
match chz:
|
|
613
|
+
case 1:pos2 = rngs['rand_var_add'].choice(number_tokens)
|
|
614
|
+
case 2:pos2 = rngs['rand_var_add'].choice(vars['all'])
|
|
615
|
+
|
|
616
|
+
chz = rngs['rand_var_add'].randint(1, 7)
|
|
617
|
+
match chz:
|
|
618
|
+
case 1:pos3 = '+'
|
|
619
|
+
case 2:pos3 = '-'
|
|
620
|
+
case 3:pos3 = '/'
|
|
621
|
+
case 4:pos3 = '//'
|
|
622
|
+
case 5:pos3 = '%'
|
|
623
|
+
case 6:pos3 = '*'
|
|
624
|
+
case 7:pos3 = '**'
|
|
625
|
+
|
|
626
|
+
vars['added_lines'].append((i, f"{' ' * vars['indent']}{cvar} = {pos1} {pos3} {pos2}"))
|
|
627
|
+
return cvar
|
|
628
|
+
|
|
629
|
+
def rand_str(vars, will_run=True): # var (new/old) to random string
|
|
630
|
+
cvar = gen_str_var(vars) # impossible for this to be falsy
|
|
631
|
+
vars['added_lines'].append((i, f"{' ' * vars['indent']}{cvar} = {create_string()}"))
|
|
632
|
+
return cvar
|
|
633
|
+
|
|
634
|
+
def rand_print(vars, will_run=False): # print 1 random var or 2 random string or 3 random int or 4 random list
|
|
635
|
+
if will_run:
|
|
636
|
+
raise Exception('This should not be possible')
|
|
637
|
+
cvar = gen_str_var(vars)
|
|
638
|
+
choice = rngs['rand_print'].randint(1, 4)
|
|
639
|
+
match choice:
|
|
640
|
+
case 1:
|
|
641
|
+
ev = rngs['rand_print'].choice(vars['all'])
|
|
642
|
+
case 2:
|
|
643
|
+
ev = create_string()
|
|
644
|
+
case 3:
|
|
645
|
+
ev = rngs['rand_print'].choice(number_tokens)
|
|
646
|
+
case 4:
|
|
647
|
+
ev = create_list(vars)
|
|
648
|
+
vars['added_lines'].append((i, f"{' ' * vars['indent']}print({ev})"))
|
|
649
|
+
|
|
650
|
+
def rand_lst(vars, will_run=True): # var (new/old) to random list
|
|
651
|
+
lst = create_list(vars, will_run)
|
|
652
|
+
cvar = gen_lst_var(vars)
|
|
653
|
+
vars['added_lines'].append((i, f"{' ' * vars['indent']}{cvar} = {lst}"))
|
|
654
|
+
if lst == '[]': # this will miss some but vast majority will be caught
|
|
655
|
+
rand_loop(vars, cvar)
|
|
656
|
+
return cvar
|
|
657
|
+
|
|
658
|
+
def add_pass(vars, will_run=True): # pass
|
|
659
|
+
vars['added_lines'].append((i, f"{' ' * vars['indent']}pass"))
|
|
660
|
+
|
|
661
|
+
run_vars = [rand_num, rand_num_add, rand_str, rand_lst, add_pass, rand_func]
|
|
662
|
+
all_vars = run_vars + [rand_var, rand_print, rand_var_add, rand_call_func]
|
|
663
|
+
|
|
664
|
+
def add_random_line(vars, will_run=True):
|
|
665
|
+
if will_run:
|
|
666
|
+
line_variations = run_vars
|
|
667
|
+
else:
|
|
668
|
+
line_variations = all_vars
|
|
669
|
+
variation = rngs['add_random_line'].choice(line_variations)
|
|
670
|
+
cvar = variation(vars, will_run)
|
|
671
|
+
return cvar
|
|
672
|
+
|
|
673
|
+
add_random_line(varis)
|
|
674
|
+
|
|
675
|
+
prev = line
|
|
676
|
+
|
|
677
|
+
varis['added_lines'].reverse()
|
|
678
|
+
for line in varis['added_lines']:
|
|
679
|
+
lines.insert(line[0], line[1])
|
|
680
|
+
obf = '\n'.join(lines)
|
|
681
|
+
|
|
682
|
+
lines = obf.split('\n')
|
|
683
|
+
for i, line in enumerate(lines):
|
|
684
|
+
if line.endswith(dno_char):
|
|
685
|
+
lines[i] = line.replace(dno_char, '')
|
|
686
|
+
line_char_list = list(lines[i])
|
|
687
|
+
if line_char_list:
|
|
688
|
+
while line_char_list[-1] == ' ':
|
|
689
|
+
line_char_list.pop()
|
|
690
|
+
if not line_char_list:
|
|
691
|
+
break
|
|
692
|
+
lines[i] = ''.join(line_char_list)
|
|
693
|
+
obf = '\n'.join(lines)
|
|
694
|
+
return obf
|
|
696
695
|
|
|
697
696
|
_CYAN = '\033[96m'
|
|
698
697
|
_RESET = '\033[0m'
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.1
|
|
2
2
|
Name: zhmiscellany
|
|
3
|
-
Version: 6.1.
|
|
3
|
+
Version: 6.1.3
|
|
4
4
|
Summary: A collection of useful/interesting python libraries made by zh.
|
|
5
5
|
Home-page: https://discord.gg/ThBBAuueVJ
|
|
6
6
|
Author: zh
|
|
@@ -20,6 +20,7 @@ Requires-Dist: psutil>=0
|
|
|
20
20
|
Requires-Dist: kthread>=0
|
|
21
21
|
Requires-Dist: pillow>=0
|
|
22
22
|
Requires-Dist: fuzzywuzzy>=0
|
|
23
|
+
Requires-Dist: pyautogui>=0; sys_platform == "linux"
|
|
23
24
|
Requires-Dist: ray>=0; sys_platform == "win32"
|
|
24
25
|
Requires-Dist: pywin32>=0; sys_platform == "win32"
|
|
25
26
|
Requires-Dist: random-header-generator>=0; sys_platform == "win32"
|
|
@@ -14,14 +14,14 @@ zhmiscellany/image.py,sha256=qUjxiYpc2VVZp2vwr1vN36O2PVQ7YlMKzhegQ1u4c0M,8198
|
|
|
14
14
|
zhmiscellany/list.py,sha256=S8Z85bLJEP9lk2JkGpzUcG6kpRB7a-NWDIHMPiF5bKo,1473
|
|
15
15
|
zhmiscellany/macro.py,sha256=kKtKYoHLSnBBHyGl8FlnfMaAoraKKSK023VA-mOezO0,27861
|
|
16
16
|
zhmiscellany/math.py,sha256=btOQTe_GvqP0A7Zz84tmN_c8j1NGe_mKnhmAt40lhLU,2482
|
|
17
|
-
zhmiscellany/misc.py,sha256=
|
|
17
|
+
zhmiscellany/misc.py,sha256=llL3ZHD5pxS4RDKLj3gX0k3NpE2mM5g3JVd0k_RvIUg,31979
|
|
18
18
|
zhmiscellany/netio.py,sha256=VCqlo3ev_iOTTu5sXTZQwsYU0WMbAlOTDRsJ5Dj5-fc,2519
|
|
19
19
|
zhmiscellany/pastebin.py,sha256=TbZ3DqFYXo5qt5d95ugrofYoptlzKkjXUr7VnEqa6ks,6357
|
|
20
20
|
zhmiscellany/pipes.py,sha256=zETvWP4PF-PuSzYwR1UCodY4ftNAgmCChb9DUMofXok,4657
|
|
21
21
|
zhmiscellany/processing.py,sha256=sDKIbzG9TNFyT6yJ4TJL59taG-59_v3CBLekVSLrwgE,10899
|
|
22
22
|
zhmiscellany/rust.py,sha256=znN6DYNoa_p-braTuDZKvUnXX8reWLFu_dG4fv2vLR0,442
|
|
23
23
|
zhmiscellany/string.py,sha256=xyqE6V5YF2nieZDcg5ZrXTIrH2D9oDRbZ5vQGz8rPys,4787
|
|
24
|
-
zhmiscellany-6.1.
|
|
25
|
-
zhmiscellany-6.1.
|
|
26
|
-
zhmiscellany-6.1.
|
|
27
|
-
zhmiscellany-6.1.
|
|
24
|
+
zhmiscellany-6.1.3.dist-info/METADATA,sha256=UQtMiCoWBMenj5AXC81dH8HirK5pTFr3FtiPQeUEMIA,43823
|
|
25
|
+
zhmiscellany-6.1.3.dist-info/WHEEL,sha256=tZoeGjtWxWRfdplE7E3d45VPlLNQnvbKiYnx7gwAy8A,92
|
|
26
|
+
zhmiscellany-6.1.3.dist-info/top_level.txt,sha256=ioDtsrevCI52rTxZntMPljRIBsZs73tD0hI00HektiE,13
|
|
27
|
+
zhmiscellany-6.1.3.dist-info/RECORD,,
|
|
File without changes
|
|
File without changes
|