apcore-cli 0.12.0__tar.gz → 0.12.1__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.
- {apcore_cli-0.12.0 → apcore_cli-0.12.1}/CHANGELOG.md +12 -0
- {apcore_cli-0.12.0 → apcore_cli-0.12.1}/PKG-INFO +3 -3
- {apcore_cli-0.12.0 → apcore_cli-0.12.1}/pyproject.toml +3 -3
- {apcore_cli-0.12.0 → apcore_cli-0.12.1}/src/apcore_cli/acl_loader.py +14 -40
- {apcore_cli-0.12.0 → apcore_cli-0.12.1}/tests/test_acl_loader.py +14 -8
- {apcore_cli-0.12.0 → apcore_cli-0.12.1}/.github/CODEOWNERS +0 -0
- {apcore_cli-0.12.0 → apcore_cli-0.12.1}/.github/copilot-ignore +0 -0
- {apcore_cli-0.12.0 → apcore_cli-0.12.1}/.github/workflows/ci.yml +0 -0
- {apcore_cli-0.12.0 → apcore_cli-0.12.1}/.gitignore +0 -0
- {apcore_cli-0.12.0 → apcore_cli-0.12.1}/.gitmessage +0 -0
- {apcore_cli-0.12.0 → apcore_cli-0.12.1}/.pre-commit-config.yaml +0 -0
- {apcore_cli-0.12.0 → apcore_cli-0.12.1}/CLAUDE.md +0 -0
- {apcore_cli-0.12.0 → apcore_cli-0.12.1}/LICENSE +0 -0
- {apcore_cli-0.12.0 → apcore_cli-0.12.1}/Makefile +0 -0
- {apcore_cli-0.12.0 → apcore_cli-0.12.1}/README.md +0 -0
- {apcore_cli-0.12.0 → apcore_cli-0.12.1}/examples/README.md +0 -0
- {apcore_cli-0.12.0 → apcore_cli-0.12.1}/examples/extensions/math/add.py +0 -0
- {apcore_cli-0.12.0 → apcore_cli-0.12.1}/examples/extensions/math/multiply.py +0 -0
- {apcore_cli-0.12.0 → apcore_cli-0.12.1}/examples/extensions/sysutil/disk.py +0 -0
- {apcore_cli-0.12.0 → apcore_cli-0.12.1}/examples/extensions/sysutil/env.py +0 -0
- {apcore_cli-0.12.0 → apcore_cli-0.12.1}/examples/extensions/sysutil/info.py +0 -0
- {apcore_cli-0.12.0 → apcore_cli-0.12.1}/examples/extensions/text/reverse.py +0 -0
- {apcore_cli-0.12.0 → apcore_cli-0.12.1}/examples/extensions/text/upper.py +0 -0
- {apcore_cli-0.12.0 → apcore_cli-0.12.1}/examples/extensions/text/wordcount.py +0 -0
- {apcore_cli-0.12.0 → apcore_cli-0.12.1}/examples/run_examples.sh +0 -0
- {apcore_cli-0.12.0 → apcore_cli-0.12.1}/planning/approval-gate.md +0 -0
- {apcore_cli-0.12.0 → apcore_cli-0.12.1}/planning/config-resolver.md +0 -0
- {apcore_cli-0.12.0 → apcore_cli-0.12.1}/planning/core-dispatcher.md +0 -0
- {apcore_cli-0.12.0 → apcore_cli-0.12.1}/planning/discovery.md +0 -0
- {apcore_cli-0.12.0 → apcore_cli-0.12.1}/planning/exposure-filtering.md +0 -0
- {apcore_cli-0.12.0 → apcore_cli-0.12.1}/planning/grouped-commands.md +0 -0
- {apcore_cli-0.12.0 → apcore_cli-0.12.1}/planning/output-formatter.md +0 -0
- {apcore_cli-0.12.0 → apcore_cli-0.12.1}/planning/overview.md +0 -0
- {apcore_cli-0.12.0 → apcore_cli-0.12.1}/planning/schema-parser.md +0 -0
- {apcore_cli-0.12.0 → apcore_cli-0.12.1}/planning/security-manager.md +0 -0
- {apcore_cli-0.12.0 → apcore_cli-0.12.1}/planning/shell-integration.md +0 -0
- {apcore_cli-0.12.0 → apcore_cli-0.12.1}/planning/state.json +0 -0
- {apcore_cli-0.12.0 → apcore_cli-0.12.1}/src/apcore_cli/__init__.py +0 -0
- {apcore_cli-0.12.0 → apcore_cli-0.12.1}/src/apcore_cli/__main__.py +0 -0
- {apcore_cli-0.12.0 → apcore_cli-0.12.1}/src/apcore_cli/_sandbox_runner.py +0 -0
- {apcore_cli-0.12.0 → apcore_cli-0.12.1}/src/apcore_cli/acl_cmd.py +0 -0
- {apcore_cli-0.12.0 → apcore_cli-0.12.1}/src/apcore_cli/approval.py +0 -0
- {apcore_cli-0.12.0 → apcore_cli-0.12.1}/src/apcore_cli/builtin_group.py +0 -0
- {apcore_cli-0.12.0 → apcore_cli-0.12.1}/src/apcore_cli/cli.py +0 -0
- {apcore_cli-0.12.0 → apcore_cli-0.12.1}/src/apcore_cli/config.py +0 -0
- {apcore_cli-0.12.0 → apcore_cli-0.12.1}/src/apcore_cli/discovery.py +0 -0
- {apcore_cli-0.12.0 → apcore_cli-0.12.1}/src/apcore_cli/display_helpers.py +0 -0
- {apcore_cli-0.12.0 → apcore_cli-0.12.1}/src/apcore_cli/exit_codes.py +0 -0
- {apcore_cli-0.12.0 → apcore_cli-0.12.1}/src/apcore_cli/exposure.py +0 -0
- {apcore_cli-0.12.0 → apcore_cli-0.12.1}/src/apcore_cli/factory.py +0 -0
- {apcore_cli-0.12.0 → apcore_cli-0.12.1}/src/apcore_cli/init_cmd.py +0 -0
- {apcore_cli-0.12.0 → apcore_cli-0.12.1}/src/apcore_cli/openapi_cmd.py +0 -0
- {apcore_cli-0.12.0 → apcore_cli-0.12.1}/src/apcore_cli/openapi_source.py +0 -0
- {apcore_cli-0.12.0 → apcore_cli-0.12.1}/src/apcore_cli/output.py +0 -0
- {apcore_cli-0.12.0 → apcore_cli-0.12.1}/src/apcore_cli/ref_resolver.py +0 -0
- {apcore_cli-0.12.0 → apcore_cli-0.12.1}/src/apcore_cli/schema_parser.py +0 -0
- {apcore_cli-0.12.0 → apcore_cli-0.12.1}/src/apcore_cli/security/__init__.py +0 -0
- {apcore_cli-0.12.0 → apcore_cli-0.12.1}/src/apcore_cli/security/audit.py +0 -0
- {apcore_cli-0.12.0 → apcore_cli-0.12.1}/src/apcore_cli/security/auth.py +0 -0
- {apcore_cli-0.12.0 → apcore_cli-0.12.1}/src/apcore_cli/security/config_encryptor.py +0 -0
- {apcore_cli-0.12.0 → apcore_cli-0.12.1}/src/apcore_cli/security/sandbox.py +0 -0
- {apcore_cli-0.12.0 → apcore_cli-0.12.1}/src/apcore_cli/shell.py +0 -0
- {apcore_cli-0.12.0 → apcore_cli-0.12.1}/src/apcore_cli/strategy.py +0 -0
- {apcore_cli-0.12.0 → apcore_cli-0.12.1}/src/apcore_cli/system_cmd.py +0 -0
- {apcore_cli-0.12.0 → apcore_cli-0.12.1}/src/apcore_cli/system_usage.py +0 -0
- {apcore_cli-0.12.0 → apcore_cli-0.12.1}/src/apcore_cli/validate.py +0 -0
- {apcore_cli-0.12.0 → apcore_cli-0.12.1}/tests/__init__.py +0 -0
- {apcore_cli-0.12.0 → apcore_cli-0.12.1}/tests/conformance/__init__.py +0 -0
- {apcore_cli-0.12.0 → apcore_cli-0.12.1}/tests/conformance/test_apcli_visibility.py +0 -0
- {apcore_cli-0.12.0 → apcore_cli-0.12.1}/tests/conformance/test_snake_case_kwargs.py +0 -0
- {apcore_cli-0.12.0 → apcore_cli-0.12.1}/tests/conftest.py +0 -0
- {apcore_cli-0.12.0 → apcore_cli-0.12.1}/tests/shell_test_utils.py +0 -0
- {apcore_cli-0.12.0 → apcore_cli-0.12.1}/tests/test_acl_cmd.py +0 -0
- {apcore_cli-0.12.0 → apcore_cli-0.12.1}/tests/test_apcli_integration.py +0 -0
- {apcore_cli-0.12.0 → apcore_cli-0.12.1}/tests/test_approval.py +0 -0
- {apcore_cli-0.12.0 → apcore_cli-0.12.1}/tests/test_bugfixes.py +0 -0
- {apcore_cli-0.12.0 → apcore_cli-0.12.1}/tests/test_builtin_group.py +0 -0
- {apcore_cli-0.12.0 → apcore_cli-0.12.1}/tests/test_cli.py +0 -0
- {apcore_cli-0.12.0 → apcore_cli-0.12.1}/tests/test_config.py +0 -0
- {apcore_cli-0.12.0 → apcore_cli-0.12.1}/tests/test_discovery.py +0 -0
- {apcore_cli-0.12.0 → apcore_cli-0.12.1}/tests/test_discovery_fe13.py +0 -0
- {apcore_cli-0.12.0 → apcore_cli-0.12.1}/tests/test_display_helpers.py +0 -0
- {apcore_cli-0.12.0 → apcore_cli-0.12.1}/tests/test_e2e.py +0 -0
- {apcore_cli-0.12.0 → apcore_cli-0.12.1}/tests/test_exit_codes.py +0 -0
- {apcore_cli-0.12.0 → apcore_cli-0.12.1}/tests/test_exposure.py +0 -0
- {apcore_cli-0.12.0 → apcore_cli-0.12.1}/tests/test_factory_fe13.py +0 -0
- {apcore_cli-0.12.0 → apcore_cli-0.12.1}/tests/test_init_cmd.py +0 -0
- {apcore_cli-0.12.0 → apcore_cli-0.12.1}/tests/test_integration.py +0 -0
- {apcore_cli-0.12.0 → apcore_cli-0.12.1}/tests/test_list_command_filters.py +0 -0
- {apcore_cli-0.12.0 → apcore_cli-0.12.1}/tests/test_openapi_cmd.py +0 -0
- {apcore_cli-0.12.0 → apcore_cli-0.12.1}/tests/test_openapi_source.py +0 -0
- {apcore_cli-0.12.0 → apcore_cli-0.12.1}/tests/test_output.py +0 -0
- {apcore_cli-0.12.0 → apcore_cli-0.12.1}/tests/test_output_format_exec.py +0 -0
- {apcore_cli-0.12.0 → apcore_cli-0.12.1}/tests/test_output_format_markdown_skill.py +0 -0
- {apcore_cli-0.12.0 → apcore_cli-0.12.1}/tests/test_public_api.py +0 -0
- {apcore_cli-0.12.0 → apcore_cli-0.12.1}/tests/test_ref_resolver.py +0 -0
- {apcore_cli-0.12.0 → apcore_cli-0.12.1}/tests/test_sandbox_runner.py +0 -0
- {apcore_cli-0.12.0 → apcore_cli-0.12.1}/tests/test_schema_parser.py +0 -0
- {apcore_cli-0.12.0 → apcore_cli-0.12.1}/tests/test_security/__init__.py +0 -0
- {apcore_cli-0.12.0 → apcore_cli-0.12.1}/tests/test_security/test_audit.py +0 -0
- {apcore_cli-0.12.0 → apcore_cli-0.12.1}/tests/test_security/test_auth.py +0 -0
- {apcore_cli-0.12.0 → apcore_cli-0.12.1}/tests/test_security/test_config_encryptor.py +0 -0
- {apcore_cli-0.12.0 → apcore_cli-0.12.1}/tests/test_security/test_sandbox.py +0 -0
- {apcore_cli-0.12.0 → apcore_cli-0.12.1}/tests/test_shell.py +0 -0
- {apcore_cli-0.12.0 → apcore_cli-0.12.1}/tests/test_strategy.py +0 -0
- {apcore_cli-0.12.0 → apcore_cli-0.12.1}/tests/test_system_cmd.py +0 -0
- {apcore_cli-0.12.0 → apcore_cli-0.12.1}/tests/test_system_usage.py +0 -0
- {apcore_cli-0.12.0 → apcore_cli-0.12.1}/tests/test_toolkit_integration.py +0 -0
- {apcore_cli-0.12.0 → apcore_cli-0.12.1}/tests/test_validate.py +0 -0
|
@@ -5,6 +5,18 @@ All notable changes to apcore-cli (Python SDK) will be documented in this file.
|
|
|
5
5
|
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/),
|
|
6
6
|
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
|
|
7
7
|
|
|
8
|
+
## [0.12.1] - 2026-09-24
|
|
9
|
+
|
|
10
|
+
Patch release. Bumps the required `apcore` floor to `0.31.0` and `apcore-toolkit` to `[http-proxy]>=0.12.0`. All 1021 tests pass (6 xfailed).
|
|
11
|
+
|
|
12
|
+
### Changed
|
|
13
|
+
|
|
14
|
+
- **`load_cli_acl` no longer rebuilds the ACL to attach the §4.8 audit callback.** apcore 0.31.0 (decision D-66) makes `ACL.load(path, audit_logger=…)` accept the callback directly; the `ACL(src.rules, src.default_effect, audit_logger=…)` rebuild this SDK relied on — the only lossless way to attach one before this release — is gone. `reload()` is now available on the ACL `load_cli_acl` returns whether or not `acl.audit.enabled` is set; previously it raised `ACLRuleError` on the auditing path.
|
|
15
|
+
|
|
16
|
+
### Security
|
|
17
|
+
|
|
18
|
+
- **`apcli openapi scan|generate` inherits apcore-toolkit 0.12.0's `$ref` sibling-key fix.** `OpenAPIScanner` (imported, never reimplemented, by `openapi_cmd.py`/`openapi_source.py`) previously discarded a `$ref` node's sibling keys during schema resolution, dropping `x-sensitive` and letting a field an OpenAPI document marked sensitive reach apcore with nothing to redact on. Fixed upstream; no code change was needed here.
|
|
19
|
+
|
|
8
20
|
## [0.12.0] - 2026-09-05
|
|
9
21
|
|
|
10
22
|
Two features: **FE-14 ACL Governance** and **FE-15a OpenAPI Import**. Bumps the required `apcore` floor to `0.30.0` and `apcore-toolkit` to `[http-proxy]>=0.11.1`. Full suite: 1004 passed, 5 xfailed (815 → 1004; 189 new tests). `APCLI_SUBCOMMAND_NAMES` grows from 13 to 15.
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.5
|
|
2
2
|
Name: apcore-cli
|
|
3
|
-
Version: 0.12.
|
|
3
|
+
Version: 0.12.1
|
|
4
4
|
Summary: Terminal adapter for apcore — execute AI-Perceivable modules from the command line
|
|
5
5
|
Project-URL: Homepage, https://aiperceivable.com
|
|
6
6
|
Project-URL: Repository, https://github.com/aiperceivable/apcore-cli-python
|
|
@@ -21,8 +21,8 @@ Classifier: Programming Language :: Python :: 3.13
|
|
|
21
21
|
Classifier: Topic :: Scientific/Engineering :: Artificial Intelligence
|
|
22
22
|
Classifier: Topic :: Software Development :: Libraries :: Python Modules
|
|
23
23
|
Requires-Python: >=3.11
|
|
24
|
-
Requires-Dist: apcore-toolkit[http-proxy]>=0.
|
|
25
|
-
Requires-Dist: apcore>=0.
|
|
24
|
+
Requires-Dist: apcore-toolkit[http-proxy]>=0.12.0
|
|
25
|
+
Requires-Dist: apcore>=0.31.0
|
|
26
26
|
Requires-Dist: click>=8.1
|
|
27
27
|
Requires-Dist: cryptography>=41.0
|
|
28
28
|
Requires-Dist: jsonschema>=4.20
|
|
@@ -4,7 +4,7 @@ build-backend = "hatchling.build"
|
|
|
4
4
|
|
|
5
5
|
[project]
|
|
6
6
|
name = "apcore-cli"
|
|
7
|
-
version = "0.12.
|
|
7
|
+
version = "0.12.1"
|
|
8
8
|
description = "Terminal adapter for apcore — execute AI-Perceivable modules from the command line"
|
|
9
9
|
readme = "README.md"
|
|
10
10
|
license = "Apache-2.0"
|
|
@@ -26,8 +26,8 @@ classifiers = [
|
|
|
26
26
|
"Environment :: Console",
|
|
27
27
|
]
|
|
28
28
|
dependencies = [
|
|
29
|
-
"apcore>=0.
|
|
30
|
-
"apcore-toolkit[http-proxy]>=0.
|
|
29
|
+
"apcore>=0.31.0",
|
|
30
|
+
"apcore-toolkit[http-proxy]>=0.12.0",
|
|
31
31
|
"click>=8.1",
|
|
32
32
|
"jsonschema>=4.20",
|
|
33
33
|
"rich>=13.0",
|
|
@@ -210,32 +210,13 @@ def make_acl_audit_logger(*, include_denied: bool = True) -> Callable[[AuditEntr
|
|
|
210
210
|
def load_cli_acl(root: str, *, audit_enabled: bool = True, include_denied: bool = True) -> ACL | None:
|
|
211
211
|
"""Load an :class:`~apcore.ACL` from *root*, or ``None`` for no enforcement.
|
|
212
212
|
|
|
213
|
-
|
|
214
|
-
§4.8
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
is the only lossless way to attach one. Two things about that sequence are
|
|
221
|
-
load-bearing:
|
|
222
|
-
|
|
223
|
-
1. ``default_effect`` is carried from ``src``, **never** a literal. A file
|
|
224
|
-
may legitimately declare ``default_effect: allow``, and passing the
|
|
225
|
-
constructor's own ``"deny"`` default would silently invert the governing
|
|
226
|
-
verdict for every call no rule matched — a rule set that grants by
|
|
227
|
-
default would start denying, with nothing in the output saying so.
|
|
228
|
-
2. The rebuilt ACL **loses** :meth:`~apcore.ACL.reload`, which needs the
|
|
229
|
-
``_yaml_path`` only ``ACL.load`` sets. This is accepted rather than
|
|
230
|
-
worked around: no apcore-cli SDK calls ``reload()`` on any path, and
|
|
231
|
-
writing the private attribute to fake the provenance would make
|
|
232
|
-
``reload()`` claim a file the object was not in fact loaded from. An
|
|
233
|
-
embedder that needs reloading passes its own ACL to
|
|
234
|
-
``create_cli(acl=…)``, which §4.2 attaches unchanged.
|
|
235
|
-
|
|
236
|
-
With auditing disabled the ``ACL.load`` result is returned **directly** —
|
|
237
|
-
no rebuild, no callback — so the ``reload()`` caveat applies only to the
|
|
238
|
-
auditing path.
|
|
213
|
+
``ACL.load`` takes ``audit_logger`` directly (apcore 0.31.0, D-66), so the
|
|
214
|
+
§4.8 callback is attached in the same call that parses the file — no
|
|
215
|
+
rebuild, and :meth:`~apcore.ACL.reload` stays available on the returned
|
|
216
|
+
object. (An earlier revision rebuilt the ACL via
|
|
217
|
+
``ACL(src.rules, src.default_effect, audit_logger=…)`` to attach the
|
|
218
|
+
callback after the fact, which lost ``reload()`` in the process; that
|
|
219
|
+
workaround is gone now that apcore accepts the callback at load time.)
|
|
239
220
|
|
|
240
221
|
Args:
|
|
241
222
|
root: Resolved ACL root (file or directory).
|
|
@@ -259,20 +240,13 @@ def load_cli_acl(root: str, *, audit_enabled: bool = True, include_denied: bool
|
|
|
259
240
|
if acl_file is None:
|
|
260
241
|
logger.debug("No ACL at '%s' — enforcement stays off.", root)
|
|
261
242
|
return None
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
src.default_effect,
|
|
270
|
-
audit_logger=make_acl_audit_logger(include_denied=include_denied),
|
|
271
|
-
)
|
|
272
|
-
logger.debug(
|
|
273
|
-
"ACL audit callback installed (include_denied=%s); reload() is unavailable on the rebuilt ACL.",
|
|
274
|
-
include_denied,
|
|
275
|
-
)
|
|
243
|
+
audit_logger = make_acl_audit_logger(include_denied=include_denied) if audit_enabled else None
|
|
244
|
+
acl = _ACL.load(acl_file, audit_logger=audit_logger)
|
|
245
|
+
logger.info("ACL loaded from %s (%d rules).", acl_file, len(acl.rules))
|
|
246
|
+
if audit_enabled:
|
|
247
|
+
logger.debug("ACL audit callback installed (include_denied=%s).", include_denied)
|
|
248
|
+
else:
|
|
249
|
+
logger.debug("acl.audit.enabled is false — no audit callback installed.")
|
|
276
250
|
return acl
|
|
277
251
|
|
|
278
252
|
|
|
@@ -659,8 +659,8 @@ class TestAuditWiring:
|
|
|
659
659
|
real_load = _ACL.load
|
|
660
660
|
captured: dict[str, object] = {}
|
|
661
661
|
|
|
662
|
-
def _spy(path: str):
|
|
663
|
-
result = real_load(path)
|
|
662
|
+
def _spy(path: str, audit_logger=None):
|
|
663
|
+
result = real_load(path, audit_logger=audit_logger)
|
|
664
664
|
captured["acl"] = result
|
|
665
665
|
return result
|
|
666
666
|
|
|
@@ -678,14 +678,20 @@ class TestAuditWiring:
|
|
|
678
678
|
assert acl.check_access("@external", "db.migrate", None).access == "allow"
|
|
679
679
|
assert _audit_records(audit_path) == []
|
|
680
680
|
|
|
681
|
-
def
|
|
682
|
-
"""§4.8 requirement 2
|
|
683
|
-
from apcore.errors import ACLRuleError
|
|
681
|
+
def test_auditing_path_reload_works(self, workdir, audit_path):
|
|
682
|
+
"""§4.8 requirement 2, updated for apcore 0.31.0 (D-66).
|
|
684
683
|
|
|
684
|
+
``ACL.load`` now takes ``audit_logger`` directly, so the auditing path
|
|
685
|
+
no longer rebuilds the ACL — ``reload()`` stays available, and the
|
|
686
|
+
installed audit callback survives it (apcore's own §6.3.2
|
|
687
|
+
requirement 7).
|
|
688
|
+
"""
|
|
685
689
|
_write_acl_dir(workdir)
|
|
686
|
-
|
|
687
|
-
|
|
688
|
-
|
|
690
|
+
acl = load_cli_acl(str(workdir / "acl"), audit_enabled=True)
|
|
691
|
+
acl.reload()
|
|
692
|
+
|
|
693
|
+
acl.check_access("@external", "system.control.disable", None)
|
|
694
|
+
assert [r["decision"] for r in _audit_records(audit_path)] == ["deny"]
|
|
689
695
|
|
|
690
696
|
def test_allow_default_survives_the_rebuild(self, workdir, audit_path):
|
|
691
697
|
"""T-ACL-27b: `default_effect: allow` + auditing enabled.
|
|
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
|