datastock 0.0.39__tar.gz → 0.0.41__tar.gz
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.
- {datastock-0.0.39/datastock.egg-info → datastock-0.0.41}/PKG-INFO +1 -1
- {datastock-0.0.39 → datastock-0.0.41}/datastock/_class1.py +13 -1
- {datastock-0.0.39 → datastock-0.0.41}/datastock/_class1_check.py +3 -1
- {datastock-0.0.39 → datastock-0.0.41}/datastock/_class1_uniformize.py +66 -10
- {datastock-0.0.39 → datastock-0.0.41}/datastock/_class2.py +7 -1
- {datastock-0.0.39 → datastock-0.0.41}/datastock/_class2_interactivity.py +10 -1
- {datastock-0.0.39 → datastock-0.0.41}/datastock/_generic_utils.py +108 -14
- {datastock-0.0.39 → datastock-0.0.41}/datastock/version.py +1 -1
- {datastock-0.0.39 → datastock-0.0.41/datastock.egg-info}/PKG-INFO +1 -1
- {datastock-0.0.39 → datastock-0.0.41}/LICENSE +0 -0
- {datastock-0.0.39 → datastock-0.0.41}/MANIFEST.in +0 -0
- {datastock-0.0.39 → datastock-0.0.41}/README.md +0 -0
- {datastock-0.0.39 → datastock-0.0.41}/_updateversion.py +0 -0
- {datastock-0.0.39 → datastock-0.0.41}/datastock/_DataCollection_utils.py +0 -0
- {datastock-0.0.39 → datastock-0.0.41}/datastock/__init__.py +0 -0
- {datastock-0.0.39 → datastock-0.0.41}/datastock/_class.py +0 -0
- {datastock-0.0.39 → datastock-0.0.41}/datastock/_class0.py +0 -0
- {datastock-0.0.39 → datastock-0.0.41}/datastock/_class1_binning.py +0 -0
- {datastock-0.0.39 → datastock-0.0.41}/datastock/_class1_compute.py +0 -0
- {datastock-0.0.39 → datastock-0.0.41}/datastock/_class1_domain.py +0 -0
- {datastock-0.0.39 → datastock-0.0.41}/datastock/_class1_interpolate.py +0 -0
- {datastock-0.0.39 → datastock-0.0.41}/datastock/_class1_show.py +0 -0
- {datastock-0.0.39 → datastock-0.0.41}/datastock/_class3.py +0 -0
- {datastock-0.0.39 → datastock-0.0.41}/datastock/_direct_calls.py +0 -0
- {datastock-0.0.39 → datastock-0.0.41}/datastock/_export_dataframe.py +0 -0
- {datastock-0.0.39 → datastock-0.0.41}/datastock/_find_plateau.py +0 -0
- {datastock-0.0.39 → datastock-0.0.41}/datastock/_generic_check.py +0 -0
- {datastock-0.0.39 → datastock-0.0.41}/datastock/_generic_utils_plot.py +0 -0
- {datastock-0.0.39 → datastock-0.0.41}/datastock/_plot_BvsA_as_distribution.py +0 -0
- {datastock-0.0.39 → datastock-0.0.41}/datastock/_plot_BvsA_as_distribution_check.py +0 -0
- {datastock-0.0.39 → datastock-0.0.41}/datastock/_plot_as_array.py +0 -0
- {datastock-0.0.39 → datastock-0.0.41}/datastock/_plot_as_array_1d.py +0 -0
- {datastock-0.0.39 → datastock-0.0.41}/datastock/_plot_as_array_234d.py +0 -0
- {datastock-0.0.39 → datastock-0.0.41}/datastock/_plot_as_mobile_lines.py +0 -0
- {datastock-0.0.39 → datastock-0.0.41}/datastock/_plot_as_profile1d.py +0 -0
- {datastock-0.0.39 → datastock-0.0.41}/datastock/_plot_correlations.py +0 -0
- {datastock-0.0.39 → datastock-0.0.41}/datastock/_plot_old_backup.py +0 -0
- {datastock-0.0.39 → datastock-0.0.41}/datastock/_plot_text.py +0 -0
- {datastock-0.0.39 → datastock-0.0.41}/datastock/_saveload.py +0 -0
- {datastock-0.0.39 → datastock-0.0.41}/datastock/tests/__init__.py +0 -0
- {datastock-0.0.39 → datastock-0.0.41}/datastock/tests/output/__init__.py +0 -0
- {datastock-0.0.39 → datastock-0.0.41}/datastock/tests/test_01_DataStock.py +0 -0
- {datastock-0.0.39 → datastock-0.0.41}/datastock.egg-info/SOURCES.txt +0 -0
- {datastock-0.0.39 → datastock-0.0.41}/datastock.egg-info/dependency_links.txt +0 -0
- {datastock-0.0.39 → datastock-0.0.41}/datastock.egg-info/requires.txt +0 -0
- {datastock-0.0.39 → datastock-0.0.41}/datastock.egg-info/top_level.txt +0 -0
- {datastock-0.0.39 → datastock-0.0.41}/pyproject.toml +0 -0
- {datastock-0.0.39 → datastock-0.0.41}/setup.cfg +0 -0
- {datastock-0.0.39 → datastock-0.0.41}/setup.py +0 -0
@@ -617,6 +617,9 @@ class DataStock1(DataStock0):
|
|
617
617
|
quant=None,
|
618
618
|
name=None,
|
619
619
|
units=None,
|
620
|
+
# exclude from search
|
621
|
+
key_exclude=None,
|
622
|
+
ref_exclude=None,
|
620
623
|
# nearest-neighbour interpolation input
|
621
624
|
values=None,
|
622
625
|
indices=None,
|
@@ -666,6 +669,9 @@ class DataStock1(DataStock0):
|
|
666
669
|
quant=quant,
|
667
670
|
name=name,
|
668
671
|
units=units,
|
672
|
+
# exclude from search
|
673
|
+
key_exclude=key_exclude,
|
674
|
+
ref_exclude=ref_exclude,
|
669
675
|
# parameters
|
670
676
|
values=values,
|
671
677
|
indices=indices,
|
@@ -686,6 +692,9 @@ class DataStock1(DataStock0):
|
|
686
692
|
# strategy for choosing common ref vector
|
687
693
|
strategy=None,
|
688
694
|
strategy_bounds=None,
|
695
|
+
# exclude from search
|
696
|
+
key_exclude=None,
|
697
|
+
ref_exclude=None,
|
689
698
|
# values, indices
|
690
699
|
values=None,
|
691
700
|
indices=None,
|
@@ -719,6 +728,9 @@ class DataStock1(DataStock0):
|
|
719
728
|
# strategy for choosing common ref vector
|
720
729
|
strategy=strategy,
|
721
730
|
strategy_bounds=strategy_bounds,
|
731
|
+
# exclude from search
|
732
|
+
key_exclude=key_exclude,
|
733
|
+
ref_exclude=ref_exclude,
|
722
734
|
# parameters
|
723
735
|
values=values,
|
724
736
|
indices=indices,
|
@@ -1040,4 +1052,4 @@ class DataStock1(DataStock0):
|
|
1040
1052
|
|
1041
1053
|
__all__ = [
|
1042
1054
|
sorted([k0 for k0 in locals() if k0.startswith('DataStock')])[-1]
|
1043
|
-
]
|
1055
|
+
]
|
@@ -904,7 +904,7 @@ def _check_ddata(
|
|
904
904
|
v0.get('ref') is None
|
905
905
|
or isinstance(v0.get('ref'), str)
|
906
906
|
or (
|
907
|
-
isinstance(v0.get('ref'), tuple)
|
907
|
+
isinstance(v0.get('ref'), (list, tuple))
|
908
908
|
and all([
|
909
909
|
isinstance(rr, str)
|
910
910
|
for rr in v0['ref']
|
@@ -977,6 +977,8 @@ def _check_ddata(
|
|
977
977
|
# find ref
|
978
978
|
if isinstance(v0['ref'], str):
|
979
979
|
ddata[k0]['ref'] = (v0['ref'],)
|
980
|
+
elif isinstance(v0['ref'], list):
|
981
|
+
ddata[k0]['ref'] = tuple(v0['ref'])
|
980
982
|
|
981
983
|
_check_data_ref(
|
982
984
|
k0=k0,
|
@@ -43,6 +43,9 @@ def get_ref_vector(
|
|
43
43
|
quant=None,
|
44
44
|
name=None,
|
45
45
|
units=None,
|
46
|
+
# exclude from search
|
47
|
+
key_exclude=None,
|
48
|
+
ref_exclude=None,
|
46
49
|
# parameters
|
47
50
|
values=None,
|
48
51
|
indices=None,
|
@@ -52,6 +55,7 @@ def get_ref_vector(
|
|
52
55
|
|
53
56
|
# ----------------
|
54
57
|
# check inputs
|
58
|
+
# ----------------
|
55
59
|
|
56
60
|
# ind_strict
|
57
61
|
ind_strict = _generic_check._check_var(
|
@@ -82,6 +86,27 @@ def get_ref_vector(
|
|
82
86
|
allowed=lkok,
|
83
87
|
)
|
84
88
|
|
89
|
+
# key_exclude
|
90
|
+
if key_exclude is not None:
|
91
|
+
if isinstance(key_exclude, str):
|
92
|
+
key_exclude = [key_exclude]
|
93
|
+
key_exclude = _generic_check._check_var_iter(
|
94
|
+
key_exclude, 'key_exclude',
|
95
|
+
types=(list, tuple),
|
96
|
+
types_iter=str,
|
97
|
+
)
|
98
|
+
|
99
|
+
# ref_exclude
|
100
|
+
if ref_exclude is not None:
|
101
|
+
if isinstance(ref_exclude, str):
|
102
|
+
ref_exclude = [ref_exclude]
|
103
|
+
ref_exclude = _generic_check._check_var_iter(
|
104
|
+
ref_exclude, 'ref_exclude',
|
105
|
+
types=(list, tuple),
|
106
|
+
types_iter=str,
|
107
|
+
)
|
108
|
+
|
109
|
+
# key0 vs ref
|
85
110
|
if key0 is None and ref is None:
|
86
111
|
msg = "Please provide key0 or ref at least!"
|
87
112
|
raise Exception(msg)
|
@@ -95,6 +120,7 @@ def get_ref_vector(
|
|
95
120
|
|
96
121
|
# ------------------------
|
97
122
|
# hasref, hasvect
|
123
|
+
# ------------------------
|
98
124
|
|
99
125
|
hasref = None
|
100
126
|
if ref is not None and key0 is not None:
|
@@ -109,8 +135,13 @@ def get_ref_vector(
|
|
109
135
|
elif key0 is not None:
|
110
136
|
refok = ddata[key0]['ref']
|
111
137
|
|
138
|
+
# ----------------------
|
112
139
|
# identify possible vect
|
140
|
+
# ----------------------
|
141
|
+
|
113
142
|
if hasref is not False:
|
143
|
+
|
144
|
+
|
114
145
|
lp = [('dim', dim), ('quant', quant), ('name', name), ('units', units)]
|
115
146
|
lk_vect = [
|
116
147
|
k0 for k0, v0 in ddata.items()
|
@@ -121,6 +152,8 @@ def get_ref_vector(
|
|
121
152
|
or (vv is not None and v0[ss] == vv)
|
122
153
|
for ss, vv in lp
|
123
154
|
])
|
155
|
+
and (key_exclude is None or k0 not in key_exclude)
|
156
|
+
and (ref_exclude is None or v0['ref'][0] not in ref_exclude)
|
124
157
|
]
|
125
158
|
|
126
159
|
# if key is provided
|
@@ -134,7 +167,7 @@ def get_ref_vector(
|
|
134
167
|
# cases
|
135
168
|
if len(lk_vect) == 0:
|
136
169
|
if warn is True:
|
137
|
-
msg = "No
|
170
|
+
msg = f"No vector found for key0 = '{key0}', ref '{ref}'!"
|
138
171
|
warnings.warn(msg)
|
139
172
|
hasvect = False
|
140
173
|
|
@@ -148,27 +181,30 @@ def get_ref_vector(
|
|
148
181
|
hasref = True
|
149
182
|
|
150
183
|
else:
|
151
|
-
|
152
|
-
|
153
|
-
|
154
|
-
|
155
|
-
|
156
|
-
|
157
|
-
|
158
|
-
|
159
|
-
warnings.warn(msg)
|
184
|
+
msg = (
|
185
|
+
f"Multiple possible vectors found:\n{lk_vect}\n"
|
186
|
+
f"\t- key0: {key0}\n"
|
187
|
+
f"\t- ref: {ref}\n"
|
188
|
+
f"\t- hasref: {hasref}\n"
|
189
|
+
f"\t- refok: {refok}\n"
|
190
|
+
)
|
191
|
+
warnings.warn(msg)
|
160
192
|
hasvect = False
|
161
193
|
else:
|
162
194
|
hasvect = False
|
163
195
|
|
196
|
+
# -------------------------
|
164
197
|
# set hasref if not yet set
|
198
|
+
|
165
199
|
if hasvect is False:
|
166
200
|
key_vector = None
|
167
201
|
if hasref is None:
|
168
202
|
hasref = False
|
169
203
|
ref = None
|
170
204
|
|
205
|
+
# ----------------------
|
171
206
|
# consistency check
|
207
|
+
|
172
208
|
assert hasref == (ref is not None)
|
173
209
|
assert hasvect == (key_vector is not None)
|
174
210
|
|
@@ -180,6 +216,7 @@ def get_ref_vector(
|
|
180
216
|
|
181
217
|
# -----------------
|
182
218
|
# values vs indices
|
219
|
+
# -----------------
|
183
220
|
|
184
221
|
dind = _get_ref_vector_values(
|
185
222
|
dref=dref,
|
@@ -193,7 +230,9 @@ def get_ref_vector(
|
|
193
230
|
indices=indices,
|
194
231
|
)
|
195
232
|
|
233
|
+
# -----
|
196
234
|
# val
|
235
|
+
|
197
236
|
if dind is None:
|
198
237
|
if key_vector is not None:
|
199
238
|
val = ddata[key_vector]['data']
|
@@ -457,6 +496,9 @@ def get_ref_vector_common(
|
|
457
496
|
quant=None,
|
458
497
|
name=None,
|
459
498
|
units=None,
|
499
|
+
# exclude from search
|
500
|
+
key_exclude=None,
|
501
|
+
ref_exclude=None,
|
460
502
|
# strategy for choosing common ref vector
|
461
503
|
strategy=None,
|
462
504
|
strategy_bounds=None,
|
@@ -522,6 +564,10 @@ def get_ref_vector_common(
|
|
522
564
|
quant=quant,
|
523
565
|
name=name,
|
524
566
|
units=units,
|
567
|
+
# exclude from search
|
568
|
+
key_exclude=key_exclude,
|
569
|
+
ref_exclude=ref_exclude,
|
570
|
+
# parameters
|
525
571
|
values=None,
|
526
572
|
indices=None,
|
527
573
|
)
|
@@ -699,6 +745,9 @@ def get_ref_vector_common(
|
|
699
745
|
dkeys=dkeys,
|
700
746
|
key_vector=key_vector,
|
701
747
|
val=val,
|
748
|
+
# exclude from search
|
749
|
+
key_exclude=key_exclude,
|
750
|
+
ref_exclude=ref_exclude,
|
702
751
|
# values, indices
|
703
752
|
values=values,
|
704
753
|
indices=indices,
|
@@ -727,6 +776,9 @@ def _get_ref_vector_common_values(
|
|
727
776
|
dkeys=None,
|
728
777
|
key_vector=None,
|
729
778
|
val=None,
|
779
|
+
# exclude from search
|
780
|
+
key_exclude=None,
|
781
|
+
ref_exclude=None,
|
730
782
|
# values, indices
|
731
783
|
values=None,
|
732
784
|
indices=None,
|
@@ -755,6 +807,10 @@ def _get_ref_vector_common_values(
|
|
755
807
|
quant=quant,
|
756
808
|
name=name,
|
757
809
|
units=units,
|
810
|
+
# exclude from search
|
811
|
+
key_exclude=key_exclude,
|
812
|
+
ref_exclude=ref_exclude,
|
813
|
+
# parameters
|
758
814
|
values=values,
|
759
815
|
indices=indices,
|
760
816
|
)
|
@@ -87,12 +87,18 @@ class DataStock2(DataStock1):
|
|
87
87
|
|
88
88
|
if isinstance(dtype, str):
|
89
89
|
dtype = [dtype]
|
90
|
+
lok = [
|
91
|
+
'xdata', 'ydata',
|
92
|
+
'data', 'data.T',
|
93
|
+
'xy', 'alpha',
|
94
|
+
'txt', 'x', 'y', 'position',
|
95
|
+
]
|
90
96
|
dtype = _generic_check._check_var_iter(
|
91
97
|
dtype,
|
92
98
|
'dtype',
|
93
99
|
types=(list, tuple),
|
94
100
|
types_iter=str,
|
95
|
-
allowed=
|
101
|
+
allowed=lok,
|
96
102
|
)
|
97
103
|
if len(dtype) != nref:
|
98
104
|
msg = (
|
@@ -479,6 +479,15 @@ def get_fupdate(handle=None, dtype=None, norm=None, bstr=None):
|
|
479
479
|
handle.set_alpha(norm(val))
|
480
480
|
elif dtype == 'txt':
|
481
481
|
func = lambda val, handle=handle, bstr=bstr: handle.set_text(bstr.format(val))
|
482
|
+
elif dtype == 'x':
|
483
|
+
def func(val, handle=handle):
|
484
|
+
handle.set_x(val)
|
485
|
+
elif dtype == 'y':
|
486
|
+
def func(val, handle=handle):
|
487
|
+
handle.set_y(val)
|
488
|
+
elif dtype == 'position':
|
489
|
+
def func(val, handle=handle):
|
490
|
+
handle.set_position(val)
|
482
491
|
else:
|
483
492
|
msg = f'Unknown mobile dtype: {dtype}'
|
484
493
|
raise Exception(msg)
|
@@ -579,4 +588,4 @@ def _update_mobile(k0=None, dmobile=None, dref=None, ddata=None):
|
|
579
588
|
# ddata[dmobile[k0]['data'][ii]]['data'][
|
580
589
|
# dmobile[k0]['func_slice'][ii](iref[ii])
|
581
590
|
# ]
|
582
|
-
# )
|
591
|
+
# )
|
@@ -361,10 +361,14 @@ def compare_dict(
|
|
361
361
|
|
362
362
|
# numpy arrays
|
363
363
|
elif isinstance(d0[k0], np.ndarray):
|
364
|
-
|
365
|
-
|
366
|
-
|
367
|
-
|
364
|
+
msg = _compare_arrays(
|
365
|
+
dname=dname,
|
366
|
+
k0=k0,
|
367
|
+
d0=d0,
|
368
|
+
d1=d1,
|
369
|
+
)
|
370
|
+
if msg is not None:
|
371
|
+
dkeys[key] = msg
|
368
372
|
|
369
373
|
# sparse arrays
|
370
374
|
elif scpsp.issparse(d0[k0]):
|
@@ -375,16 +379,15 @@ def compare_dict(
|
|
375
379
|
|
376
380
|
# lists and tuples
|
377
381
|
elif isinstance(d0[k0], (list, tuple)):
|
378
|
-
|
379
|
-
|
380
|
-
|
381
|
-
|
382
|
-
|
383
|
-
|
384
|
-
|
385
|
-
|
386
|
-
|
387
|
-
raise NotImplementedError(msg)
|
382
|
+
msg = _compare_list_tuple(
|
383
|
+
dname=dname,
|
384
|
+
k0=k0,
|
385
|
+
d0=d0,
|
386
|
+
d1=d1,
|
387
|
+
key=key,
|
388
|
+
)
|
389
|
+
if msg is not None:
|
390
|
+
dkeys[key] = msg
|
388
391
|
|
389
392
|
# functions
|
390
393
|
elif callable(d0[k0]):
|
@@ -423,6 +426,97 @@ def compare_dict(
|
|
423
426
|
return _compare_dict_verb_return(dkeys, returnas, verb)
|
424
427
|
|
425
428
|
|
429
|
+
def _compare_arrays(
|
430
|
+
dname=None,
|
431
|
+
k0=None,
|
432
|
+
d0=None,
|
433
|
+
d1=None,
|
434
|
+
):
|
435
|
+
|
436
|
+
msg = None
|
437
|
+
|
438
|
+
# shape
|
439
|
+
if d0[k0].shape != d1[k0].shape:
|
440
|
+
msg = f'!= shapes ({d0[k0].shape} vs {d1[k0].shape})'
|
441
|
+
|
442
|
+
# dtype
|
443
|
+
elif not d0[k0].dtype == d1[k0].dtype:
|
444
|
+
msg = f"!= dtypes ({d0[k0].dtype} vs {d1[k0].dtype})"
|
445
|
+
|
446
|
+
# special case: array of str
|
447
|
+
if 'str' in d0[k0].dtype.name:
|
448
|
+
d0flat = d0[k0].ravel().tolist()
|
449
|
+
d1flat = d1[k0].ravel().tolist()
|
450
|
+
c0 = all([ss == d1flat[ii] for ii, ss in enumerate(d0flat)])
|
451
|
+
else:
|
452
|
+
try:
|
453
|
+
c0 = np.allclose(d0[k0], d1[k0], equal_nan=True)
|
454
|
+
except Exception as err:
|
455
|
+
msg = (
|
456
|
+
f"Failed to compare 2 arrays from '{dname}':\n"
|
457
|
+
f"\t- d0['{k0}'] = {d0[k0]}\n"
|
458
|
+
f"\t- d1['{k0}'] = {d1[k0]}\n"
|
459
|
+
)
|
460
|
+
raise Exception(msg) from err
|
461
|
+
|
462
|
+
if not c0:
|
463
|
+
msg = "not allclose"
|
464
|
+
|
465
|
+
return msg
|
466
|
+
|
467
|
+
|
468
|
+
def _compare_list_tuple(
|
469
|
+
dname=None,
|
470
|
+
k0=None,
|
471
|
+
d0=None,
|
472
|
+
d1=None,
|
473
|
+
key=None,
|
474
|
+
):
|
475
|
+
|
476
|
+
msg = None
|
477
|
+
|
478
|
+
# length
|
479
|
+
if len(d0[k0]) != len(d1[k0]):
|
480
|
+
msg = f'!= length ({len(d0[k0])} vs {len(d1[k0])})'
|
481
|
+
|
482
|
+
# content type
|
483
|
+
ltyp0 = [_simple_type(type(ss)) for ss in d0[k0]]
|
484
|
+
ltyp1 = [_simple_type(type(ss)) for ss in d1[k0]]
|
485
|
+
if any([t0 != t1 for t0, t1 in zip(ltyp0, ltyp1)]):
|
486
|
+
msg = f"!= content type ({ltyp0} vs {ltyp1})"
|
487
|
+
|
488
|
+
# content
|
489
|
+
for ii in range(len(d0[k0])):
|
490
|
+
|
491
|
+
if isinstance(d0[k0][ii], np.ndarray):
|
492
|
+
c0 = np.allclose(d0[k0][ii], d1[k0][ii])
|
493
|
+
|
494
|
+
else:
|
495
|
+
|
496
|
+
try:
|
497
|
+
c0 = d0[k0][ii] == d1[k0][ii]
|
498
|
+
except Exception as err:
|
499
|
+
msg = (
|
500
|
+
f"Don't know how to handle {key}:\n"
|
501
|
+
f"\t- type: {type(d0[k0])}\n"
|
502
|
+
f"\t- value: {d0[k0]}\n"
|
503
|
+
)
|
504
|
+
raise NotImplementedError(msg) from err
|
505
|
+
|
506
|
+
if not c0:
|
507
|
+
msg = f"!= content at position {ii} ({d0[k0][ii]} vs {d1[k0][ii]})"
|
508
|
+
break
|
509
|
+
|
510
|
+
return msg
|
511
|
+
|
512
|
+
|
513
|
+
def _simple_type(typ):
|
514
|
+
return ''.join([
|
515
|
+
ss for ss in typ.__name__.replace('_', '')
|
516
|
+
if not ss.isdigit()
|
517
|
+
])
|
518
|
+
|
519
|
+
|
426
520
|
def compare_obj(
|
427
521
|
obj0=None,
|
428
522
|
obj1=None,
|
@@ -1,2 +1,2 @@
|
|
1
1
|
# Do not edit, pipeline versioning governed by git tags!
|
2
|
-
__version__ = '0.0.
|
2
|
+
__version__ = '0.0.41'
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|