ruyi 0.42.0b20251017__tar.gz → 0.43.0a20251017__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.
- {ruyi-0.42.0b20251017 → ruyi-0.43.0a20251017}/PKG-INFO +1 -2
- {ruyi-0.42.0b20251017 → ruyi-0.43.0a20251017}/pyproject.toml +1 -2
- {ruyi-0.42.0b20251017 → ruyi-0.43.0a20251017}/ruyi/__main__.py +4 -0
- {ruyi-0.42.0b20251017 → ruyi-0.43.0a20251017}/ruyi/cli/oobe.py +1 -1
- {ruyi-0.42.0b20251017 → ruyi-0.43.0a20251017}/ruyi/telemetry/aggregate.py +1 -1
- {ruyi-0.42.0b20251017 → ruyi-0.43.0a20251017}/ruyi/telemetry/provider.py +1 -1
- {ruyi-0.42.0b20251017 → ruyi-0.43.0a20251017}/ruyi/telemetry/store.py +1 -1
- {ruyi-0.42.0b20251017 → ruyi-0.43.0a20251017}/ruyi/utils/global_mode.py +1 -1
- {ruyi-0.42.0b20251017/ruyi/telemetry → ruyi-0.43.0a20251017/ruyi/utils}/node_info.py +52 -1
- {ruyi-0.42.0b20251017 → ruyi-0.43.0a20251017}/ruyi/version.py +1 -1
- {ruyi-0.42.0b20251017 → ruyi-0.43.0a20251017}/LICENSE-Apache.txt +0 -0
- {ruyi-0.42.0b20251017 → ruyi-0.43.0a20251017}/README.md +0 -0
- {ruyi-0.42.0b20251017 → ruyi-0.43.0a20251017}/ruyi/__init__.py +0 -0
- {ruyi-0.42.0b20251017 → ruyi-0.43.0a20251017}/ruyi/cli/__init__.py +0 -0
- {ruyi-0.42.0b20251017 → ruyi-0.43.0a20251017}/ruyi/cli/builtin_commands.py +0 -0
- {ruyi-0.42.0b20251017 → ruyi-0.43.0a20251017}/ruyi/cli/cmd.py +0 -0
- {ruyi-0.42.0b20251017 → ruyi-0.43.0a20251017}/ruyi/cli/completer.py +0 -0
- {ruyi-0.42.0b20251017 → ruyi-0.43.0a20251017}/ruyi/cli/completion.py +0 -0
- {ruyi-0.42.0b20251017 → ruyi-0.43.0a20251017}/ruyi/cli/config_cli.py +0 -0
- {ruyi-0.42.0b20251017 → ruyi-0.43.0a20251017}/ruyi/cli/main.py +0 -0
- {ruyi-0.42.0b20251017 → ruyi-0.43.0a20251017}/ruyi/cli/self_cli.py +0 -0
- {ruyi-0.42.0b20251017 → ruyi-0.43.0a20251017}/ruyi/cli/user_input.py +0 -0
- {ruyi-0.42.0b20251017 → ruyi-0.43.0a20251017}/ruyi/cli/version_cli.py +0 -0
- {ruyi-0.42.0b20251017 → ruyi-0.43.0a20251017}/ruyi/config/__init__.py +0 -0
- {ruyi-0.42.0b20251017 → ruyi-0.43.0a20251017}/ruyi/config/editor.py +0 -0
- {ruyi-0.42.0b20251017 → ruyi-0.43.0a20251017}/ruyi/config/errors.py +0 -0
- {ruyi-0.42.0b20251017 → ruyi-0.43.0a20251017}/ruyi/config/news.py +0 -0
- {ruyi-0.42.0b20251017 → ruyi-0.43.0a20251017}/ruyi/config/schema.py +0 -0
- {ruyi-0.42.0b20251017 → ruyi-0.43.0a20251017}/ruyi/device/__init__.py +0 -0
- {ruyi-0.42.0b20251017 → ruyi-0.43.0a20251017}/ruyi/device/provision.py +0 -0
- {ruyi-0.42.0b20251017 → ruyi-0.43.0a20251017}/ruyi/device/provision_cli.py +0 -0
- {ruyi-0.42.0b20251017 → ruyi-0.43.0a20251017}/ruyi/log/__init__.py +0 -0
- {ruyi-0.42.0b20251017 → ruyi-0.43.0a20251017}/ruyi/mux/__init__.py +0 -0
- {ruyi-0.42.0b20251017 → ruyi-0.43.0a20251017}/ruyi/mux/runtime.py +0 -0
- {ruyi-0.42.0b20251017 → ruyi-0.43.0a20251017}/ruyi/mux/venv/__init__.py +0 -0
- {ruyi-0.42.0b20251017 → ruyi-0.43.0a20251017}/ruyi/mux/venv/emulator_cfg.py +0 -0
- {ruyi-0.42.0b20251017 → ruyi-0.43.0a20251017}/ruyi/mux/venv/maker.py +0 -0
- {ruyi-0.42.0b20251017 → ruyi-0.43.0a20251017}/ruyi/mux/venv/venv_cli.py +0 -0
- {ruyi-0.42.0b20251017 → ruyi-0.43.0a20251017}/ruyi/mux/venv_cfg.py +0 -0
- {ruyi-0.42.0b20251017 → ruyi-0.43.0a20251017}/ruyi/pluginhost/__init__.py +0 -0
- {ruyi-0.42.0b20251017 → ruyi-0.43.0a20251017}/ruyi/pluginhost/api.py +0 -0
- {ruyi-0.42.0b20251017 → ruyi-0.43.0a20251017}/ruyi/pluginhost/ctx.py +0 -0
- {ruyi-0.42.0b20251017 → ruyi-0.43.0a20251017}/ruyi/pluginhost/paths.py +0 -0
- {ruyi-0.42.0b20251017 → ruyi-0.43.0a20251017}/ruyi/pluginhost/plugin_cli.py +0 -0
- {ruyi-0.42.0b20251017 → ruyi-0.43.0a20251017}/ruyi/pluginhost/unsandboxed.py +0 -0
- {ruyi-0.42.0b20251017 → ruyi-0.43.0a20251017}/ruyi/py.typed +0 -0
- {ruyi-0.42.0b20251017 → ruyi-0.43.0a20251017}/ruyi/resource_bundle/__init__.py +0 -0
- {ruyi-0.42.0b20251017 → ruyi-0.43.0a20251017}/ruyi/resource_bundle/__main__.py +0 -0
- {ruyi-0.42.0b20251017 → ruyi-0.43.0a20251017}/ruyi/resource_bundle/data.py +0 -0
- {ruyi-0.42.0b20251017 → ruyi-0.43.0a20251017}/ruyi/ruyipkg/__init__.py +0 -0
- {ruyi-0.42.0b20251017 → ruyi-0.43.0a20251017}/ruyi/ruyipkg/admin_checksum.py +0 -0
- {ruyi-0.42.0b20251017 → ruyi-0.43.0a20251017}/ruyi/ruyipkg/admin_cli.py +0 -0
- {ruyi-0.42.0b20251017 → ruyi-0.43.0a20251017}/ruyi/ruyipkg/atom.py +0 -0
- {ruyi-0.42.0b20251017 → ruyi-0.43.0a20251017}/ruyi/ruyipkg/augmented_pkg.py +0 -0
- {ruyi-0.42.0b20251017 → ruyi-0.43.0a20251017}/ruyi/ruyipkg/canonical_dump.py +0 -0
- {ruyi-0.42.0b20251017 → ruyi-0.43.0a20251017}/ruyi/ruyipkg/checksum.py +0 -0
- {ruyi-0.42.0b20251017 → ruyi-0.43.0a20251017}/ruyi/ruyipkg/cli_completion.py +0 -0
- {ruyi-0.42.0b20251017 → ruyi-0.43.0a20251017}/ruyi/ruyipkg/distfile.py +0 -0
- {ruyi-0.42.0b20251017 → ruyi-0.43.0a20251017}/ruyi/ruyipkg/entity.py +0 -0
- {ruyi-0.42.0b20251017 → ruyi-0.43.0a20251017}/ruyi/ruyipkg/entity_cli.py +0 -0
- {ruyi-0.42.0b20251017 → ruyi-0.43.0a20251017}/ruyi/ruyipkg/entity_provider.py +0 -0
- {ruyi-0.42.0b20251017 → ruyi-0.43.0a20251017}/ruyi/ruyipkg/fetcher.py +0 -0
- {ruyi-0.42.0b20251017 → ruyi-0.43.0a20251017}/ruyi/ruyipkg/host.py +0 -0
- {ruyi-0.42.0b20251017 → ruyi-0.43.0a20251017}/ruyi/ruyipkg/install.py +0 -0
- {ruyi-0.42.0b20251017 → ruyi-0.43.0a20251017}/ruyi/ruyipkg/install_cli.py +0 -0
- {ruyi-0.42.0b20251017 → ruyi-0.43.0a20251017}/ruyi/ruyipkg/list.py +0 -0
- {ruyi-0.42.0b20251017 → ruyi-0.43.0a20251017}/ruyi/ruyipkg/list_cli.py +0 -0
- {ruyi-0.42.0b20251017 → ruyi-0.43.0a20251017}/ruyi/ruyipkg/list_filter.py +0 -0
- {ruyi-0.42.0b20251017 → ruyi-0.43.0a20251017}/ruyi/ruyipkg/msg.py +0 -0
- {ruyi-0.42.0b20251017 → ruyi-0.43.0a20251017}/ruyi/ruyipkg/news.py +0 -0
- {ruyi-0.42.0b20251017 → ruyi-0.43.0a20251017}/ruyi/ruyipkg/news_cli.py +0 -0
- {ruyi-0.42.0b20251017 → ruyi-0.43.0a20251017}/ruyi/ruyipkg/news_store.py +0 -0
- {ruyi-0.42.0b20251017 → ruyi-0.43.0a20251017}/ruyi/ruyipkg/pkg_manifest.py +0 -0
- {ruyi-0.42.0b20251017 → ruyi-0.43.0a20251017}/ruyi/ruyipkg/profile.py +0 -0
- {ruyi-0.42.0b20251017 → ruyi-0.43.0a20251017}/ruyi/ruyipkg/profile_cli.py +0 -0
- {ruyi-0.42.0b20251017 → ruyi-0.43.0a20251017}/ruyi/ruyipkg/protocols.py +0 -0
- {ruyi-0.42.0b20251017 → ruyi-0.43.0a20251017}/ruyi/ruyipkg/repo.py +0 -0
- {ruyi-0.42.0b20251017 → ruyi-0.43.0a20251017}/ruyi/ruyipkg/state.py +0 -0
- {ruyi-0.42.0b20251017 → ruyi-0.43.0a20251017}/ruyi/ruyipkg/unpack.py +0 -0
- {ruyi-0.42.0b20251017 → ruyi-0.43.0a20251017}/ruyi/ruyipkg/unpack_method.py +0 -0
- {ruyi-0.42.0b20251017 → ruyi-0.43.0a20251017}/ruyi/ruyipkg/update_cli.py +0 -0
- {ruyi-0.42.0b20251017 → ruyi-0.43.0a20251017}/ruyi/telemetry/__init__.py +0 -0
- {ruyi-0.42.0b20251017 → ruyi-0.43.0a20251017}/ruyi/telemetry/event.py +0 -0
- {ruyi-0.42.0b20251017 → ruyi-0.43.0a20251017}/ruyi/telemetry/scope.py +0 -0
- {ruyi-0.42.0b20251017 → ruyi-0.43.0a20251017}/ruyi/telemetry/telemetry_cli.py +0 -0
- {ruyi-0.42.0b20251017 → ruyi-0.43.0a20251017}/ruyi/utils/__init__.py +0 -0
- {ruyi-0.42.0b20251017 → ruyi-0.43.0a20251017}/ruyi/utils/ar.py +0 -0
- {ruyi-0.42.0b20251017 → ruyi-0.43.0a20251017}/ruyi/utils/ci.py +0 -0
- {ruyi-0.42.0b20251017 → ruyi-0.43.0a20251017}/ruyi/utils/frontmatter.py +0 -0
- {ruyi-0.42.0b20251017 → ruyi-0.43.0a20251017}/ruyi/utils/git.py +0 -0
- {ruyi-0.42.0b20251017 → ruyi-0.43.0a20251017}/ruyi/utils/l10n.py +0 -0
- {ruyi-0.42.0b20251017 → ruyi-0.43.0a20251017}/ruyi/utils/markdown.py +0 -0
- {ruyi-0.42.0b20251017 → ruyi-0.43.0a20251017}/ruyi/utils/mounts.py +0 -0
- {ruyi-0.42.0b20251017 → ruyi-0.43.0a20251017}/ruyi/utils/nuitka.py +0 -0
- {ruyi-0.42.0b20251017 → ruyi-0.43.0a20251017}/ruyi/utils/porcelain.py +0 -0
- {ruyi-0.42.0b20251017 → ruyi-0.43.0a20251017}/ruyi/utils/prereqs.py +0 -0
- {ruyi-0.42.0b20251017 → ruyi-0.43.0a20251017}/ruyi/utils/ssl_patch.py +0 -0
- {ruyi-0.42.0b20251017 → ruyi-0.43.0a20251017}/ruyi/utils/templating.py +0 -0
- {ruyi-0.42.0b20251017 → ruyi-0.43.0a20251017}/ruyi/utils/toml.py +0 -0
- {ruyi-0.42.0b20251017 → ruyi-0.43.0a20251017}/ruyi/utils/url.py +0 -0
- {ruyi-0.42.0b20251017 → ruyi-0.43.0a20251017}/ruyi/utils/xdg_basedir.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: ruyi
|
|
3
|
-
Version: 0.
|
|
3
|
+
Version: 0.43.0a20251017
|
|
4
4
|
Summary: Package manager for RuyiSDK
|
|
5
5
|
License: Apache License
|
|
6
6
|
Version 2.0, January 2004
|
|
@@ -225,7 +225,6 @@ Requires-Dist: argcomplete (>=2.0.0)
|
|
|
225
225
|
Requires-Dist: arpy
|
|
226
226
|
Requires-Dist: fastjsonschema (>=2.15.1)
|
|
227
227
|
Requires-Dist: jinja2 (>=3,<4)
|
|
228
|
-
Requires-Dist: packaging (>=21)
|
|
229
228
|
Requires-Dist: pygit2 (>=1.6)
|
|
230
229
|
Requires-Dist: pyyaml (>=5.4)
|
|
231
230
|
Requires-Dist: requests (>=2,<3)
|
|
@@ -4,7 +4,7 @@ build-backend = "poetry.core.masonry.api"
|
|
|
4
4
|
|
|
5
5
|
[project]
|
|
6
6
|
name = "ruyi"
|
|
7
|
-
version = "0.
|
|
7
|
+
version = "0.43.0-alpha.20251017"
|
|
8
8
|
description = "Package manager for RuyiSDK"
|
|
9
9
|
keywords = ["ruyi", "ruyisdk"]
|
|
10
10
|
license = { file = "LICENSE-Apache.txt" }
|
|
@@ -33,7 +33,6 @@ dependencies = [
|
|
|
33
33
|
"arpy",
|
|
34
34
|
"fastjsonschema>=2.15.1",
|
|
35
35
|
"jinja2 (>=3, <4)",
|
|
36
|
-
"packaging>=21",
|
|
37
36
|
"pygit2>=1.6",
|
|
38
37
|
"pyyaml>=5.4",
|
|
39
38
|
"requests (>=2, <3)",
|
|
@@ -11,6 +11,7 @@ from ruyi.utils.global_mode import (
|
|
|
11
11
|
TRUTHY_ENV_VAR_VALUES,
|
|
12
12
|
is_env_var_truthy,
|
|
13
13
|
)
|
|
14
|
+
from ruyi.utils.node_info import probe_for_container_runtime
|
|
14
15
|
|
|
15
16
|
# NOTE: no imports that directly or indirectly pull in pygit2 should go here,
|
|
16
17
|
# because import of pygit2 will fail if done before ssl_patch. Notably this
|
|
@@ -32,6 +33,9 @@ def _is_allowed_to_run_as_root() -> bool:
|
|
|
32
33
|
# CI environments are usually considered to be controlled, and safe
|
|
33
34
|
# for root usage.
|
|
34
35
|
return True
|
|
36
|
+
if probe_for_container_runtime(os.environ) != "unknown":
|
|
37
|
+
# So are container environments.
|
|
38
|
+
return True
|
|
35
39
|
return False
|
|
36
40
|
|
|
37
41
|
|
|
@@ -65,7 +65,7 @@ class OOBE:
|
|
|
65
65
|
handler()
|
|
66
66
|
|
|
67
67
|
def _builtin_shell_completion_tip(self) -> None:
|
|
68
|
-
from ..
|
|
68
|
+
from ..utils.node_info import probe_for_shell
|
|
69
69
|
from .completion import SUPPORTED_SHELLS
|
|
70
70
|
|
|
71
71
|
# Only show the tip if we're not externally managed by a package manager,
|
|
@@ -3,8 +3,8 @@ from typing import Iterable, TypeAlias, TypedDict, TYPE_CHECKING
|
|
|
3
3
|
if TYPE_CHECKING:
|
|
4
4
|
from typing_extensions import NotRequired
|
|
5
5
|
|
|
6
|
+
from ..utils.node_info import NodeInfo
|
|
6
7
|
from .event import TelemetryEvent
|
|
7
|
-
from .node_info import NodeInfo
|
|
8
8
|
|
|
9
9
|
|
|
10
10
|
class AggregatedTelemetryEvent(TypedDict):
|
|
@@ -8,7 +8,7 @@ from typing import Callable, TYPE_CHECKING, cast
|
|
|
8
8
|
import uuid
|
|
9
9
|
|
|
10
10
|
from ..log import RuyiLogger
|
|
11
|
-
from .node_info import NodeInfo, gather_node_info
|
|
11
|
+
from ..utils.node_info import NodeInfo, gather_node_info
|
|
12
12
|
from .scope import TelemetryScope
|
|
13
13
|
from .store import TelemetryStore
|
|
14
14
|
|
|
@@ -8,10 +8,10 @@ from typing import Callable, Final, Iterable
|
|
|
8
8
|
import uuid
|
|
9
9
|
|
|
10
10
|
from ..log import RuyiLogger
|
|
11
|
+
from ..utils.node_info import NodeInfo
|
|
11
12
|
from ..utils.url import urljoin_for_sure
|
|
12
13
|
from .aggregate import UploadPayload, aggregate_events
|
|
13
14
|
from .event import TelemetryEvent, is_telemetry_event
|
|
14
|
-
from .node_info import NodeInfo
|
|
15
15
|
from .scope import TelemetryScope
|
|
16
16
|
|
|
17
17
|
# e.g. "run.202410201845.d06ca5d668e64fec833ed3e6eb926a2c.ndjson"
|
|
@@ -143,7 +143,7 @@ def _probe_cli_autocomplete(env: Mapping[str, str], argv: list[str]) -> bool:
|
|
|
143
143
|
if arg.startswith("--output-completion-script"):
|
|
144
144
|
return True
|
|
145
145
|
|
|
146
|
-
return "_ARGCOMPLETE" in
|
|
146
|
+
return "_ARGCOMPLETE" in env
|
|
147
147
|
|
|
148
148
|
|
|
149
149
|
class EnvGlobalModeProvider(GlobalModeProvider):
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import glob
|
|
2
2
|
import os
|
|
3
|
+
import pathlib
|
|
3
4
|
import platform
|
|
4
5
|
import re
|
|
5
6
|
import subprocess
|
|
@@ -10,7 +11,7 @@ import uuid
|
|
|
10
11
|
if TYPE_CHECKING:
|
|
11
12
|
from typing_extensions import NotRequired
|
|
12
13
|
|
|
13
|
-
from
|
|
14
|
+
from .ci import probe_for_ci
|
|
14
15
|
|
|
15
16
|
|
|
16
17
|
class NodeInfo(TypedDict):
|
|
@@ -161,6 +162,56 @@ def probe_for_shell(os_environ: Mapping[str, str]) -> str:
|
|
|
161
162
|
return "unknown"
|
|
162
163
|
|
|
163
164
|
|
|
165
|
+
def probe_for_container_runtime(os_environ: Mapping[str, str]) -> str:
|
|
166
|
+
"""Check if we are likely running in a container. Probes FS and environment
|
|
167
|
+
for signatures of known container runtimes."""
|
|
168
|
+
|
|
169
|
+
# check environment markers first
|
|
170
|
+
|
|
171
|
+
if "KUBERNETES_SERVICE_HOST" in os_environ:
|
|
172
|
+
return "kubernetes"
|
|
173
|
+
|
|
174
|
+
if "container" in os_environ:
|
|
175
|
+
v = os_environ["container"].lower()
|
|
176
|
+
if v == "oci":
|
|
177
|
+
return "other-oci-compliant"
|
|
178
|
+
# could be e.g. "lxc", "lxc-libvirt", "systemd-nspawn", etc.
|
|
179
|
+
return v
|
|
180
|
+
|
|
181
|
+
# check for filesystem markers
|
|
182
|
+
|
|
183
|
+
if os.path.exists("/run/.containerenv"):
|
|
184
|
+
return "podman"
|
|
185
|
+
# Docker must be checked after Podman
|
|
186
|
+
if os.path.exists("/.dockerenv"):
|
|
187
|
+
return "docker"
|
|
188
|
+
|
|
189
|
+
try:
|
|
190
|
+
v = pathlib.Path("/run/systemd/container").read_text(encoding="utf-8").strip()
|
|
191
|
+
if v:
|
|
192
|
+
return v.lower()
|
|
193
|
+
except Exception:
|
|
194
|
+
pass
|
|
195
|
+
|
|
196
|
+
if _probe_for_wsl():
|
|
197
|
+
return "wsl"
|
|
198
|
+
|
|
199
|
+
return "unknown"
|
|
200
|
+
|
|
201
|
+
|
|
202
|
+
def _probe_for_wsl() -> bool:
|
|
203
|
+
if sys.platform != "linux":
|
|
204
|
+
return False
|
|
205
|
+
# http://github.com/Microsoft/WSL/issues/423#issuecomment-221627364
|
|
206
|
+
for path in ("/proc/sys/kernel/osrelease", "/proc/version"):
|
|
207
|
+
try:
|
|
208
|
+
ver = pathlib.Path(path).read_text(encoding="utf-8")
|
|
209
|
+
except Exception:
|
|
210
|
+
continue
|
|
211
|
+
return "Microsoft" in ver or "WSL" in ver
|
|
212
|
+
return False
|
|
213
|
+
|
|
214
|
+
|
|
164
215
|
def gather_node_info(report_uuid: uuid.UUID | None = None) -> NodeInfo:
|
|
165
216
|
arch = platform.machine()
|
|
166
217
|
libc = probe_for_libc()
|
|
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
|