haliax 1.4.dev447__tar.gz → 1.4.dev450__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.
- {haliax-1.4.dev447 → haliax-1.4.dev450}/PKG-INFO +1 -1
- {haliax-1.4.dev447 → haliax-1.4.dev450}/pyproject.toml +1 -0
- {haliax-1.4.dev447 → haliax-1.4.dev450}/src/haliax/__about__.py +1 -1
- {haliax-1.4.dev447 → haliax-1.4.dev450}/src/haliax/_src/state_dict.py +8 -2
- {haliax-1.4.dev447 → haliax-1.4.dev450}/src/haliax/nn/linear.py +5 -2
- {haliax-1.4.dev447 → haliax-1.4.dev450}/tests/test_state_dict.py +40 -1
- {haliax-1.4.dev447 → haliax-1.4.dev450}/uv.lock +2 -0
- {haliax-1.4.dev447 → haliax-1.4.dev450}/.agents/projects/api_parity.md +0 -0
- {haliax-1.4.dev447 → haliax-1.4.dev450}/.agents/refs.md +0 -0
- {haliax-1.4.dev447 → haliax-1.4.dev450}/.coveragerc +0 -0
- {haliax-1.4.dev447 → haliax-1.4.dev450}/.flake8 +0 -0
- {haliax-1.4.dev447 → haliax-1.4.dev450}/.github/workflows/publish_dev.yaml +0 -0
- {haliax-1.4.dev447 → haliax-1.4.dev450}/.github/workflows/run_pre_commit.yaml +0 -0
- {haliax-1.4.dev447 → haliax-1.4.dev450}/.github/workflows/run_quick_levanter_tests.yaml +0 -0
- {haliax-1.4.dev447 → haliax-1.4.dev450}/.github/workflows/run_tests.yaml +0 -0
- {haliax-1.4.dev447 → haliax-1.4.dev450}/.gitignore +0 -0
- {haliax-1.4.dev447 → haliax-1.4.dev450}/.playbooks/add-types.md +0 -0
- {haliax-1.4.dev447 → haliax-1.4.dev450}/.playbooks/wrap-non-named.md +0 -0
- {haliax-1.4.dev447 → haliax-1.4.dev450}/.pre-commit-config.yaml +0 -0
- {haliax-1.4.dev447 → haliax-1.4.dev450}/.readthedocs.yaml +0 -0
- {haliax-1.4.dev447 → haliax-1.4.dev450}/AGENTS.md +0 -0
- {haliax-1.4.dev447 → haliax-1.4.dev450}/AUTHORS.md +0 -0
- {haliax-1.4.dev447 → haliax-1.4.dev450}/CONTRIBUTING.md +0 -0
- {haliax-1.4.dev447 → haliax-1.4.dev450}/CONTRIBUTORS.md +0 -0
- {haliax-1.4.dev447 → haliax-1.4.dev450}/LICENSE +0 -0
- {haliax-1.4.dev447 → haliax-1.4.dev450}/README.md +0 -0
- {haliax-1.4.dev447 → haliax-1.4.dev450}/docs/api.md +0 -0
- {haliax-1.4.dev447 → haliax-1.4.dev450}/docs/broadcasting.md +0 -0
- {haliax-1.4.dev447 → haliax-1.4.dev450}/docs/cheatsheet.md +0 -0
- {haliax-1.4.dev447 → haliax-1.4.dev450}/docs/css/material.css +0 -0
- {haliax-1.4.dev447 → haliax-1.4.dev450}/docs/css/mkdocstrings.css +0 -0
- {haliax-1.4.dev447 → haliax-1.4.dev450}/docs/faq.md +0 -0
- {haliax-1.4.dev447 → haliax-1.4.dev450}/docs/figures/data_parallel_mesh.png +0 -0
- {haliax-1.4.dev447 → haliax-1.4.dev450}/docs/figures/data_parallel_mesh_replicated.png +0 -0
- {haliax-1.4.dev447 → haliax-1.4.dev450}/docs/figures/device_mesh_1d.png +0 -0
- {haliax-1.4.dev447 → haliax-1.4.dev450}/docs/figures/device_mesh_1d_zero.png +0 -0
- {haliax-1.4.dev447 → haliax-1.4.dev450}/docs/figures/device_mesh_2d.png +0 -0
- {haliax-1.4.dev447 → haliax-1.4.dev450}/docs/figures/device_mesh_2d_batch_partitioned.png +0 -0
- {haliax-1.4.dev447 → haliax-1.4.dev450}/docs/figures/device_mesh_2d_data_replicated.png +0 -0
- {haliax-1.4.dev447 → haliax-1.4.dev450}/docs/figures/device_mesh_2d_data_replicated_mlp_partitioned.png +0 -0
- {haliax-1.4.dev447 → haliax-1.4.dev450}/docs/figures/device_mesh_2d_intermediate_fully_partitioned.png +0 -0
- {haliax-1.4.dev447 → haliax-1.4.dev450}/docs/figures/device_mesh_2d_zero.png +0 -0
- {haliax-1.4.dev447 → haliax-1.4.dev450}/docs/fp8.md +0 -0
- {haliax-1.4.dev447 → haliax-1.4.dev450}/docs/index.md +0 -0
- {haliax-1.4.dev447 → haliax-1.4.dev450}/docs/indexing.md +0 -0
- {haliax-1.4.dev447 → haliax-1.4.dev450}/docs/matmul.md +0 -0
- {haliax-1.4.dev447 → haliax-1.4.dev450}/docs/mutable-refs.md +0 -0
- {haliax-1.4.dev447 → haliax-1.4.dev450}/docs/nn.md +0 -0
- {haliax-1.4.dev447 → haliax-1.4.dev450}/docs/partitioning.md +0 -0
- {haliax-1.4.dev447 → haliax-1.4.dev450}/docs/primer.md +0 -0
- {haliax-1.4.dev447 → haliax-1.4.dev450}/docs/rearrange.ipynb +0 -0
- {haliax-1.4.dev447 → haliax-1.4.dev450}/docs/rearrange.md +0 -0
- {haliax-1.4.dev447 → haliax-1.4.dev450}/docs/requirements.txt +0 -0
- {haliax-1.4.dev447 → haliax-1.4.dev450}/docs/scan.md +0 -0
- {haliax-1.4.dev447 → haliax-1.4.dev450}/docs/state-dict.md +0 -0
- {haliax-1.4.dev447 → haliax-1.4.dev450}/docs/tutorial.md +0 -0
- {haliax-1.4.dev447 → haliax-1.4.dev450}/docs/typing.md +0 -0
- {haliax-1.4.dev447 → haliax-1.4.dev450}/docs/vmap.md +0 -0
- {haliax-1.4.dev447 → haliax-1.4.dev450}/etc/license_header.txt +0 -0
- {haliax-1.4.dev447 → haliax-1.4.dev450}/mkdocs.yml +0 -0
- {haliax-1.4.dev447 → haliax-1.4.dev450}/src/haliax/__init__.py +0 -0
- {haliax-1.4.dev447 → haliax-1.4.dev450}/src/haliax/_src/__init__.py +0 -0
- {haliax-1.4.dev447 → haliax-1.4.dev450}/src/haliax/_src/compile_utils.py +0 -0
- {haliax-1.4.dev447 → haliax-1.4.dev450}/src/haliax/_src/dot.py +0 -0
- {haliax-1.4.dev447 → haliax-1.4.dev450}/src/haliax/_src/einsum.py +0 -0
- {haliax-1.4.dev447 → haliax-1.4.dev450}/src/haliax/_src/fp8.py +0 -0
- {haliax-1.4.dev447 → haliax-1.4.dev450}/src/haliax/_src/parsing.py +0 -0
- {haliax-1.4.dev447 → haliax-1.4.dev450}/src/haliax/_src/rearrange.py +0 -0
- {haliax-1.4.dev447 → haliax-1.4.dev450}/src/haliax/_src/scan.py +0 -0
- {haliax-1.4.dev447 → haliax-1.4.dev450}/src/haliax/_src/util.py +0 -0
- {haliax-1.4.dev447 → haliax-1.4.dev450}/src/haliax/axis.py +0 -0
- {haliax-1.4.dev447 → haliax-1.4.dev450}/src/haliax/core.py +0 -0
- {haliax-1.4.dev447 → haliax-1.4.dev450}/src/haliax/debug.py +0 -0
- {haliax-1.4.dev447 → haliax-1.4.dev450}/src/haliax/fft.py +0 -0
- {haliax-1.4.dev447 → haliax-1.4.dev450}/src/haliax/field.py +0 -0
- {haliax-1.4.dev447 → haliax-1.4.dev450}/src/haliax/haxtyping.py +0 -0
- {haliax-1.4.dev447 → haliax-1.4.dev450}/src/haliax/hof.py +0 -0
- {haliax-1.4.dev447 → haliax-1.4.dev450}/src/haliax/jax_utils.py +0 -0
- {haliax-1.4.dev447 → haliax-1.4.dev450}/src/haliax/nn/__init__.py +0 -0
- {haliax-1.4.dev447 → haliax-1.4.dev450}/src/haliax/nn/activations.py +0 -0
- {haliax-1.4.dev447 → haliax-1.4.dev450}/src/haliax/nn/attention.py +0 -0
- {haliax-1.4.dev447 → haliax-1.4.dev450}/src/haliax/nn/conv.py +0 -0
- {haliax-1.4.dev447 → haliax-1.4.dev450}/src/haliax/nn/dropout.py +0 -0
- {haliax-1.4.dev447 → haliax-1.4.dev450}/src/haliax/nn/embedding.py +0 -0
- {haliax-1.4.dev447 → haliax-1.4.dev450}/src/haliax/nn/loss.py +0 -0
- {haliax-1.4.dev447 → haliax-1.4.dev450}/src/haliax/nn/mlp.py +0 -0
- {haliax-1.4.dev447 → haliax-1.4.dev450}/src/haliax/nn/mup.py +0 -0
- {haliax-1.4.dev447 → haliax-1.4.dev450}/src/haliax/nn/normalization.py +0 -0
- {haliax-1.4.dev447 → haliax-1.4.dev450}/src/haliax/nn/pool.py +0 -0
- {haliax-1.4.dev447 → haliax-1.4.dev450}/src/haliax/nn/scan.py +0 -0
- {haliax-1.4.dev447 → haliax-1.4.dev450}/src/haliax/ops.py +0 -0
- {haliax-1.4.dev447 → haliax-1.4.dev450}/src/haliax/partitioning.py +0 -0
- {haliax-1.4.dev447 → haliax-1.4.dev450}/src/haliax/poly.py +0 -0
- {haliax-1.4.dev447 → haliax-1.4.dev450}/src/haliax/quantization.py +0 -0
- {haliax-1.4.dev447 → haliax-1.4.dev450}/src/haliax/random.py +0 -0
- {haliax-1.4.dev447 → haliax-1.4.dev450}/src/haliax/ref.py +0 -0
- {haliax-1.4.dev447 → haliax-1.4.dev450}/src/haliax/specialized_fns.py +0 -0
- {haliax-1.4.dev447 → haliax-1.4.dev450}/src/haliax/state_dict.py +0 -0
- {haliax-1.4.dev447 → haliax-1.4.dev450}/src/haliax/tree.py +0 -0
- {haliax-1.4.dev447 → haliax-1.4.dev450}/src/haliax/tree_util.py +0 -0
- {haliax-1.4.dev447 → haliax-1.4.dev450}/src/haliax/types.py +0 -0
- {haliax-1.4.dev447 → haliax-1.4.dev450}/src/haliax/util.py +0 -0
- {haliax-1.4.dev447 → haliax-1.4.dev450}/src/haliax/wrap.py +0 -0
- {haliax-1.4.dev447 → haliax-1.4.dev450}/tests/core_test.py +0 -0
- {haliax-1.4.dev447 → haliax-1.4.dev450}/tests/test_attention.py +0 -0
- {haliax-1.4.dev447 → haliax-1.4.dev450}/tests/test_axis.py +0 -0
- {haliax-1.4.dev447 → haliax-1.4.dev450}/tests/test_bitwise_ops.py +0 -0
- {haliax-1.4.dev447 → haliax-1.4.dev450}/tests/test_conv.py +0 -0
- {haliax-1.4.dev447 → haliax-1.4.dev450}/tests/test_debug.py +0 -0
- {haliax-1.4.dev447 → haliax-1.4.dev450}/tests/test_dot.py +0 -0
- {haliax-1.4.dev447 → haliax-1.4.dev450}/tests/test_dtype_typing.py +0 -0
- {haliax-1.4.dev447 → haliax-1.4.dev450}/tests/test_einsum.py +0 -0
- {haliax-1.4.dev447 → haliax-1.4.dev450}/tests/test_fft.py +0 -0
- {haliax-1.4.dev447 → haliax-1.4.dev450}/tests/test_field.py +0 -0
- {haliax-1.4.dev447 → haliax-1.4.dev450}/tests/test_fp8.py +0 -0
- {haliax-1.4.dev447 → haliax-1.4.dev450}/tests/test_hof.py +0 -0
- {haliax-1.4.dev447 → haliax-1.4.dev450}/tests/test_int8.py +0 -0
- {haliax-1.4.dev447 → haliax-1.4.dev450}/tests/test_moe_linear.py +0 -0
- {haliax-1.4.dev447 → haliax-1.4.dev450}/tests/test_mup_coordinate_check.py +0 -0
- {haliax-1.4.dev447 → haliax-1.4.dev450}/tests/test_mup_embedding.py +0 -0
- {haliax-1.4.dev447 → haliax-1.4.dev450}/tests/test_mup_linear.py +0 -0
- {haliax-1.4.dev447 → haliax-1.4.dev450}/tests/test_named_ref.py +0 -0
- {haliax-1.4.dev447 → haliax-1.4.dev450}/tests/test_namedarray_typing.py +0 -0
- {haliax-1.4.dev447 → haliax-1.4.dev450}/tests/test_nan_reductions.py +0 -0
- {haliax-1.4.dev447 → haliax-1.4.dev450}/tests/test_nn.py +0 -0
- {haliax-1.4.dev447 → haliax-1.4.dev450}/tests/test_ops.py +0 -0
- {haliax-1.4.dev447 → haliax-1.4.dev450}/tests/test_parsing.py +0 -0
- {haliax-1.4.dev447 → haliax-1.4.dev450}/tests/test_partitioning.py +0 -0
- {haliax-1.4.dev447 → haliax-1.4.dev450}/tests/test_poly_ops.py +0 -0
- {haliax-1.4.dev447 → haliax-1.4.dev450}/tests/test_pool.py +0 -0
- {haliax-1.4.dev447 → haliax-1.4.dev450}/tests/test_random.py +0 -0
- {haliax-1.4.dev447 → haliax-1.4.dev450}/tests/test_rearrange.py +0 -0
- {haliax-1.4.dev447 → haliax-1.4.dev450}/tests/test_scan.py +0 -0
- {haliax-1.4.dev447 → haliax-1.4.dev450}/tests/test_scatter_gather.py +0 -0
- {haliax-1.4.dev447 → haliax-1.4.dev450}/tests/test_specialized_fns.py +0 -0
- {haliax-1.4.dev447 → haliax-1.4.dev450}/tests/test_tree_util.py +0 -0
- {haliax-1.4.dev447 → haliax-1.4.dev450}/tests/test_utils.py +0 -0
- {haliax-1.4.dev447 → haliax-1.4.dev450}/tests/test_visualize_sharding.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: haliax
|
|
3
|
-
Version: 1.4.
|
|
3
|
+
Version: 1.4.dev450
|
|
4
4
|
Summary: Named Tensors for Legible Deep Learning in JAX
|
|
5
5
|
Project-URL: Homepage, https://github.com/stanford-crfm/haliax
|
|
6
6
|
Project-URL: Bug Tracker, https://github.com/stanford-crfm/haliax/issues/
|
|
@@ -26,8 +26,10 @@ from haliax.tree_util import scan_aware_tree_map
|
|
|
26
26
|
|
|
27
27
|
try:
|
|
28
28
|
import safetensors
|
|
29
|
+
import safetensors.numpy as safetensors_numpy
|
|
29
30
|
except ImportError:
|
|
30
31
|
safetensors = None
|
|
32
|
+
safetensors_numpy = None
|
|
31
33
|
|
|
32
34
|
|
|
33
35
|
StateDict = dict[str, Any]
|
|
@@ -436,7 +438,9 @@ def save_state_dict(state_dict: StateDict, path):
|
|
|
436
438
|
state_dict = {k: v for k, v in state_dict.items() if v is not None}
|
|
437
439
|
if jax.process_index() == 0:
|
|
438
440
|
# the "pt" is a lie but it doesn't seem to actually matter and HF demands it
|
|
439
|
-
|
|
441
|
+
if safetensors_numpy is None:
|
|
442
|
+
raise ImportError("safetensors_numpy is not installed")
|
|
443
|
+
safetensors_numpy.save_file(state_dict, path, metadata={"format": "pt"})
|
|
440
444
|
global _GLOBAL_SAVE_COUNT
|
|
441
445
|
sync_global_devices(f"save_state_dict {_GLOBAL_SAVE_COUNT}")
|
|
442
446
|
_GLOBAL_SAVE_COUNT += 1
|
|
@@ -447,5 +451,7 @@ def load_state_dict(path):
|
|
|
447
451
|
Load a model's state dict from a file, bringing all tensors to the CPU first and then converting to numpy.
|
|
448
452
|
This will load using safetensors format
|
|
449
453
|
"""
|
|
450
|
-
|
|
454
|
+
if safetensors_numpy is None:
|
|
455
|
+
raise ImportError("safetensors_numpy is not installed")
|
|
456
|
+
state_dict = safetensors_numpy.load_file(path)
|
|
451
457
|
return state_dict
|
|
@@ -158,12 +158,15 @@ class Linear(ModuleWithStateDictSerialization, ReparamEnabled):
|
|
|
158
158
|
return self.weight.axes[-len(self.Out) :] != self.Out
|
|
159
159
|
|
|
160
160
|
def to_state_dict(self, prefix: Optional[str] = None) -> StateDict:
|
|
161
|
-
|
|
161
|
+
# weight can be None for certain filtering things like LoRA
|
|
162
|
+
scaled = dataclasses.replace(self, weight=self.weight * self.reparam.active_scale if self.weight is not None else None)
|
|
162
163
|
return default_eqx_module_to_state_dict(scaled, prefix)
|
|
163
164
|
|
|
164
165
|
def from_state_dict(self: Mod, state_dict: StateDict, prefix: Optional[str] = None) -> Mod:
|
|
165
166
|
unscaled = default_eqx_module_from_state_dict(self, state_dict, prefix)
|
|
166
|
-
|
|
167
|
+
if unscaled.weight is not None:
|
|
168
|
+
unscaled = dataclasses.replace(unscaled, weight=unscaled.weight / self.reparam.active_scale)
|
|
169
|
+
return unscaled
|
|
167
170
|
|
|
168
171
|
@staticmethod
|
|
169
172
|
def input_reparam(use_mup: bool = True) -> type[AbstractLinearReparam]:
|
|
@@ -9,13 +9,14 @@ from typing import Any
|
|
|
9
9
|
import equinox as eqx
|
|
10
10
|
import jax
|
|
11
11
|
import jax.numpy as jnp
|
|
12
|
+
import numpy as np
|
|
12
13
|
import pytest
|
|
13
14
|
|
|
14
15
|
import haliax as hax
|
|
15
16
|
from haliax._src.state_dict import flatten_modules_for_export, unflatten_modules_from_export
|
|
16
17
|
from haliax.nn import Linear
|
|
17
18
|
from haliax.nn.scan import Stacked, _stack_state_dict, _unstack_state_dict
|
|
18
|
-
from haliax.state_dict import from_state_dict, to_state_dict
|
|
19
|
+
from haliax.state_dict import from_state_dict, load_state_dict, save_state_dict, to_state_dict
|
|
19
20
|
|
|
20
21
|
|
|
21
22
|
@pytest.mark.parametrize("out_dims_first", [True, False])
|
|
@@ -159,6 +160,44 @@ def test_export_layer_norm():
|
|
|
159
160
|
assert layer_norm == new_layer_norm
|
|
160
161
|
|
|
161
162
|
|
|
163
|
+
def test_save_state_dict_roundtrip(tmp_path):
|
|
164
|
+
pytest.importorskip("safetensors.numpy")
|
|
165
|
+
state_dict = {
|
|
166
|
+
"weight": np.arange(6, dtype=np.float32).reshape(2, 3),
|
|
167
|
+
"bias": np.linspace(0.0, 1.0, 3, dtype=np.float32),
|
|
168
|
+
}
|
|
169
|
+
path = tmp_path / "state.safetensors"
|
|
170
|
+
|
|
171
|
+
save_state_dict(state_dict, path)
|
|
172
|
+
|
|
173
|
+
assert path.exists()
|
|
174
|
+
loaded = load_state_dict(path)
|
|
175
|
+
|
|
176
|
+
assert set(loaded.keys()) == {"weight", "bias"}
|
|
177
|
+
np.testing.assert_array_equal(loaded["weight"], state_dict["weight"])
|
|
178
|
+
np.testing.assert_array_equal(loaded["bias"], state_dict["bias"])
|
|
179
|
+
|
|
180
|
+
|
|
181
|
+
def test_save_state_dict_filters_none_and_sets_metadata(tmp_path):
|
|
182
|
+
safetensors = pytest.importorskip("safetensors")
|
|
183
|
+
|
|
184
|
+
state_dict = {
|
|
185
|
+
"weight": np.ones((4,), dtype=np.float32),
|
|
186
|
+
"optional": None,
|
|
187
|
+
}
|
|
188
|
+
path = tmp_path / "state.safetensors"
|
|
189
|
+
|
|
190
|
+
save_state_dict(state_dict, path)
|
|
191
|
+
|
|
192
|
+
with safetensors.safe_open(str(path), framework="numpy") as f:
|
|
193
|
+
keys = list(f.keys())
|
|
194
|
+
|
|
195
|
+
assert "weight" in keys
|
|
196
|
+
assert "optional" not in keys
|
|
197
|
+
np.testing.assert_array_equal(f.get_tensor("weight"), state_dict["weight"])
|
|
198
|
+
assert f.metadata().get("format") == "pt"
|
|
199
|
+
|
|
200
|
+
|
|
162
201
|
def test_stacked_layer_norm():
|
|
163
202
|
L = hax.Axis("L", 4)
|
|
164
203
|
D = hax.Axis("D", 10)
|
|
@@ -315,6 +315,7 @@ dev = [
|
|
|
315
315
|
{ name = "pygments" },
|
|
316
316
|
{ name = "pymdown-extensions" },
|
|
317
317
|
{ name = "pytest" },
|
|
318
|
+
{ name = "safetensors" },
|
|
318
319
|
]
|
|
319
320
|
|
|
320
321
|
[package.metadata]
|
|
@@ -342,6 +343,7 @@ dev = [
|
|
|
342
343
|
{ name = "pygments" },
|
|
343
344
|
{ name = "pymdown-extensions" },
|
|
344
345
|
{ name = "pytest", specifier = ">=7.4.0" },
|
|
346
|
+
{ name = "safetensors", specifier = ">=0.4.3" },
|
|
345
347
|
]
|
|
346
348
|
|
|
347
349
|
[[package]]
|
|
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
|
|
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
|
|
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
|
|
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
|