minitest-cli 0.16.1__tar.gz → 0.16.2__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.
- {minitest_cli-0.16.1 → minitest_cli-0.16.2}/PKG-INFO +1 -1
- {minitest_cli-0.16.1 → minitest_cli-0.16.2}/pyproject.toml +1 -1
- {minitest_cli-0.16.1 → minitest_cli-0.16.2}/src/minitest_cli/core/credentials.py +1 -0
- {minitest_cli-0.16.1 → minitest_cli-0.16.2}/src/minitest_cli/core/oauth.py +16 -18
- {minitest_cli-0.16.1 → minitest_cli-0.16.2}/src/minitest_cli/core/token_exchange.py +9 -2
- {minitest_cli-0.16.1 → minitest_cli-0.16.2}/tests/test_auth.py +20 -7
- {minitest_cli-0.16.1 → minitest_cli-0.16.2}/uv.lock +1 -1
- {minitest_cli-0.16.1 → minitest_cli-0.16.2}/.env.example +0 -0
- {minitest_cli-0.16.1 → minitest_cli-0.16.2}/.github/workflows/ci.yml +0 -0
- {minitest_cli-0.16.1 → minitest_cli-0.16.2}/.github/workflows/install-scripts.yml +0 -0
- {minitest_cli-0.16.1 → minitest_cli-0.16.2}/.github/workflows/release.yml +0 -0
- {minitest_cli-0.16.1 → minitest_cli-0.16.2}/.gitignore +0 -0
- {minitest_cli-0.16.1 → minitest_cli-0.16.2}/.opencode/skill/release/SKILL.md +0 -0
- {minitest_cli-0.16.1 → minitest_cli-0.16.2}/AGENTS.md +0 -0
- {minitest_cli-0.16.1 → minitest_cli-0.16.2}/README.md +0 -0
- {minitest_cli-0.16.1 → minitest_cli-0.16.2}/RELEASE.md +0 -0
- {minitest_cli-0.16.1 → minitest_cli-0.16.2}/install.ps1 +0 -0
- {minitest_cli-0.16.1 → minitest_cli-0.16.2}/install.sh +0 -0
- {minitest_cli-0.16.1 → minitest_cli-0.16.2}/pyrightconfig.json +0 -0
- {minitest_cli-0.16.1 → minitest_cli-0.16.2}/renovate.json +0 -0
- {minitest_cli-0.16.1 → minitest_cli-0.16.2}/src/minitest_cli/__init__.py +0 -0
- {minitest_cli-0.16.1 → minitest_cli-0.16.2}/src/minitest_cli/api/__init__.py +0 -0
- {minitest_cli-0.16.1 → minitest_cli-0.16.2}/src/minitest_cli/api/apps_manager_client.py +0 -0
- {minitest_cli-0.16.1 → minitest_cli-0.16.2}/src/minitest_cli/api/client.py +0 -0
- {minitest_cli-0.16.1 → minitest_cli-0.16.2}/src/minitest_cli/assets/__init__.py +0 -0
- {minitest_cli-0.16.1 → minitest_cli-0.16.2}/src/minitest_cli/assets/callback.html +0 -0
- {minitest_cli-0.16.1 → minitest_cli-0.16.2}/src/minitest_cli/commands/__init__.py +0 -0
- {minitest_cli-0.16.1 → minitest_cli-0.16.2}/src/minitest_cli/commands/app_knowledge.py +0 -0
- {minitest_cli-0.16.1 → minitest_cli-0.16.2}/src/minitest_cli/commands/app_knowledge_helpers.py +0 -0
- {minitest_cli-0.16.1 → minitest_cli-0.16.2}/src/minitest_cli/commands/apps.py +0 -0
- {minitest_cli-0.16.1 → minitest_cli-0.16.2}/src/minitest_cli/commands/apps_dependencies.py +0 -0
- {minitest_cli-0.16.1 → minitest_cli-0.16.2}/src/minitest_cli/commands/apps_helpers.py +0 -0
- {minitest_cli-0.16.1 → minitest_cli-0.16.2}/src/minitest_cli/commands/auth.py +0 -0
- {minitest_cli-0.16.1 → minitest_cli-0.16.2}/src/minitest_cli/commands/auth_api_key.py +0 -0
- {minitest_cli-0.16.1 → minitest_cli-0.16.2}/src/minitest_cli/commands/batch.py +0 -0
- {minitest_cli-0.16.1 → minitest_cli-0.16.2}/src/minitest_cli/commands/batch_helpers.py +0 -0
- {minitest_cli-0.16.1 → minitest_cli-0.16.2}/src/minitest_cli/commands/build.py +0 -0
- {minitest_cli-0.16.1 → minitest_cli-0.16.2}/src/minitest_cli/commands/build_helpers.py +0 -0
- {minitest_cli-0.16.1 → minitest_cli-0.16.2}/src/minitest_cli/commands/env.py +0 -0
- {minitest_cli-0.16.1 → minitest_cli-0.16.2}/src/minitest_cli/commands/env_helpers.py +0 -0
- {minitest_cli-0.16.1 → minitest_cli-0.16.2}/src/minitest_cli/commands/flow_types.py +0 -0
- {minitest_cli-0.16.1 → minitest_cli-0.16.2}/src/minitest_cli/commands/init.py +0 -0
- {minitest_cli-0.16.1 → minitest_cli-0.16.2}/src/minitest_cli/commands/init_playbook.py +0 -0
- {minitest_cli-0.16.1 → minitest_cli-0.16.2}/src/minitest_cli/commands/run.py +0 -0
- {minitest_cli-0.16.1 → minitest_cli-0.16.2}/src/minitest_cli/commands/run_display.py +0 -0
- {minitest_cli-0.16.1 → minitest_cli-0.16.2}/src/minitest_cli/commands/run_helpers.py +0 -0
- {minitest_cli-0.16.1 → minitest_cli-0.16.2}/src/minitest_cli/commands/run_targets.py +0 -0
- {minitest_cli-0.16.1 → minitest_cli-0.16.2}/src/minitest_cli/commands/skill.py +0 -0
- {minitest_cli-0.16.1 → minitest_cli-0.16.2}/src/minitest_cli/commands/test_file.py +0 -0
- {minitest_cli-0.16.1 → minitest_cli-0.16.2}/src/minitest_cli/commands/test_file_helpers.py +0 -0
- {minitest_cli-0.16.1 → minitest_cli-0.16.2}/src/minitest_cli/commands/test_file_list.py +0 -0
- {minitest_cli-0.16.1 → minitest_cli-0.16.2}/src/minitest_cli/commands/test_profile.py +0 -0
- {minitest_cli-0.16.1 → minitest_cli-0.16.2}/src/minitest_cli/commands/test_profile_default.py +0 -0
- {minitest_cli-0.16.1 → minitest_cli-0.16.2}/src/minitest_cli/commands/test_profile_helpers.py +0 -0
- {minitest_cli-0.16.1 → minitest_cli-0.16.2}/src/minitest_cli/commands/test_profile_list.py +0 -0
- {minitest_cli-0.16.1 → minitest_cli-0.16.2}/src/minitest_cli/commands/upgrade.py +0 -0
- {minitest_cli-0.16.1 → minitest_cli-0.16.2}/src/minitest_cli/commands/user_story.py +0 -0
- {minitest_cli-0.16.1 → minitest_cli-0.16.2}/src/minitest_cli/commands/user_story_bindings.py +0 -0
- {minitest_cli-0.16.1 → minitest_cli-0.16.2}/src/minitest_cli/commands/user_story_criteria.py +0 -0
- {minitest_cli-0.16.1 → minitest_cli-0.16.2}/src/minitest_cli/commands/user_story_helpers.py +0 -0
- {minitest_cli-0.16.1 → minitest_cli-0.16.2}/src/minitest_cli/commands/user_story_modify.py +0 -0
- {minitest_cli-0.16.1 → minitest_cli-0.16.2}/src/minitest_cli/commands/user_story_profiles.py +0 -0
- {minitest_cli-0.16.1 → minitest_cli-0.16.2}/src/minitest_cli/core/__init__.py +0 -0
- {minitest_cli-0.16.1 → minitest_cli-0.16.2}/src/minitest_cli/core/app_context.py +0 -0
- {minitest_cli-0.16.1 → minitest_cli-0.16.2}/src/minitest_cli/core/auth.py +0 -0
- {minitest_cli-0.16.1 → minitest_cli-0.16.2}/src/minitest_cli/core/config.py +0 -0
- {minitest_cli-0.16.1 → minitest_cli-0.16.2}/src/minitest_cli/core/tenants.py +0 -0
- {minitest_cli-0.16.1 → minitest_cli-0.16.2}/src/minitest_cli/main.py +0 -0
- {minitest_cli-0.16.1 → minitest_cli-0.16.2}/src/minitest_cli/models/__init__.py +0 -0
- {minitest_cli-0.16.1 → minitest_cli-0.16.2}/src/minitest_cli/models/app.py +0 -0
- {minitest_cli-0.16.1 → minitest_cli-0.16.2}/src/minitest_cli/models/app_env_vars.py +0 -0
- {minitest_cli-0.16.1 → minitest_cli-0.16.2}/src/minitest_cli/models/base.py +0 -0
- {minitest_cli-0.16.1 → minitest_cli-0.16.2}/src/minitest_cli/models/batch.py +0 -0
- {minitest_cli-0.16.1 → minitest_cli-0.16.2}/src/minitest_cli/models/build.py +0 -0
- {minitest_cli-0.16.1 → minitest_cli-0.16.2}/src/minitest_cli/models/story_run.py +0 -0
- {minitest_cli-0.16.1 → minitest_cli-0.16.2}/src/minitest_cli/models/targets.py +0 -0
- {minitest_cli-0.16.1 → minitest_cli-0.16.2}/src/minitest_cli/models/user_story.py +0 -0
- {minitest_cli-0.16.1 → minitest_cli-0.16.2}/src/minitest_cli/utils/__init__.py +0 -0
- {minitest_cli-0.16.1 → minitest_cli-0.16.2}/src/minitest_cli/utils/mermaid.py +0 -0
- {minitest_cli-0.16.1 → minitest_cli-0.16.2}/src/minitest_cli/utils/output.py +0 -0
- {minitest_cli-0.16.1 → minitest_cli-0.16.2}/src/minitest_cli/utils/skill_refresh.py +0 -0
- {minitest_cli-0.16.1 → minitest_cli-0.16.2}/src/minitest_cli/utils/update_check.py +0 -0
- {minitest_cli-0.16.1 → minitest_cli-0.16.2}/tests/__init__.py +0 -0
- {minitest_cli-0.16.1 → minitest_cli-0.16.2}/tests/test_app_knowledge_commands.py +0 -0
- {minitest_cli-0.16.1 → minitest_cli-0.16.2}/tests/test_apps_commands.py +0 -0
- {minitest_cli-0.16.1 → minitest_cli-0.16.2}/tests/test_apps_dependencies.py +0 -0
- {minitest_cli-0.16.1 → minitest_cli-0.16.2}/tests/test_auth_api_key.py +0 -0
- {minitest_cli-0.16.1 → minitest_cli-0.16.2}/tests/test_auth_commands.py +0 -0
- {minitest_cli-0.16.1 → minitest_cli-0.16.2}/tests/test_batch_commands.py +0 -0
- {minitest_cli-0.16.1 → minitest_cli-0.16.2}/tests/test_build_commands.py +0 -0
- {minitest_cli-0.16.1 → minitest_cli-0.16.2}/tests/test_code_quality.py +0 -0
- {minitest_cli-0.16.1 → minitest_cli-0.16.2}/tests/test_env.py +0 -0
- {minitest_cli-0.16.1 → minitest_cli-0.16.2}/tests/test_flow_types_commands.py +0 -0
- {minitest_cli-0.16.1 → minitest_cli-0.16.2}/tests/test_init_command.py +0 -0
- {minitest_cli-0.16.1 → minitest_cli-0.16.2}/tests/test_mermaid.py +0 -0
- {minitest_cli-0.16.1 → minitest_cli-0.16.2}/tests/test_run_commands.py +0 -0
- {minitest_cli-0.16.1 → minitest_cli-0.16.2}/tests/test_skill_command.py +0 -0
- {minitest_cli-0.16.1 → minitest_cli-0.16.2}/tests/test_test_file_commands.py +0 -0
- {minitest_cli-0.16.1 → minitest_cli-0.16.2}/tests/test_test_profile_commands.py +0 -0
- {minitest_cli-0.16.1 → minitest_cli-0.16.2}/tests/test_upgrade_command.py +0 -0
- {minitest_cli-0.16.1 → minitest_cli-0.16.2}/tests/test_user_story_bindings_commands.py +0 -0
- {minitest_cli-0.16.1 → minitest_cli-0.16.2}/tests/test_user_story_commands.py +0 -0
- {minitest_cli-0.16.1 → minitest_cli-0.16.2}/tests/test_version.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: minitest-cli
|
|
3
|
-
Version: 0.16.
|
|
3
|
+
Version: 0.16.2
|
|
4
4
|
Summary: Minitest CLI – command-line interface for the Minitest testing platform
|
|
5
5
|
Project-URL: Homepage, https://minitap.ai/
|
|
6
6
|
Project-URL: Source, https://github.com/minitap-ai/minitest-cli
|
|
@@ -31,19 +31,27 @@ _ASSETS = importlib.resources.files("minitest_cli.assets")
|
|
|
31
31
|
def refresh_token(settings: Settings, creds: Credentials) -> Credentials | None:
|
|
32
32
|
"""Refresh an expired access token, saving new credentials to disk.
|
|
33
33
|
|
|
34
|
-
|
|
35
|
-
|
|
34
|
+
OAuth sessions must refresh against the same client that created them, so a
|
|
35
|
+
persisted client_id is required. Returns None on a transient failure. Raises
|
|
36
|
+
SessionRevokedError when the token can never succeed (missing client_id, or a
|
|
37
|
+
4xx rejection) so callers can clear it and re-login.
|
|
36
38
|
"""
|
|
37
39
|
if not settings.supabase_url or not settings.supabase_publishable_key:
|
|
38
40
|
return None
|
|
41
|
+
if not creds.client_id:
|
|
42
|
+
raise SessionRevokedError
|
|
39
43
|
|
|
40
44
|
supabase_url = settings.supabase_url.rstrip("/")
|
|
41
45
|
try:
|
|
42
46
|
response = httpx.post(
|
|
43
|
-
f"{supabase_url}/auth/v1/token
|
|
44
|
-
|
|
47
|
+
f"{supabase_url}/auth/v1/oauth/token",
|
|
48
|
+
data={
|
|
49
|
+
"grant_type": "refresh_token",
|
|
50
|
+
"refresh_token": creds.refresh_token,
|
|
51
|
+
"client_id": creds.client_id,
|
|
52
|
+
},
|
|
45
53
|
headers={
|
|
46
|
-
"Content-Type": "application/
|
|
54
|
+
"Content-Type": "application/x-www-form-urlencoded",
|
|
47
55
|
"apikey": settings.supabase_publishable_key,
|
|
48
56
|
},
|
|
49
57
|
timeout=15.0,
|
|
@@ -64,21 +72,11 @@ def refresh_token(settings: Settings, creds: Credentials) -> Credentials | None:
|
|
|
64
72
|
if not isinstance(data, dict):
|
|
65
73
|
return None
|
|
66
74
|
|
|
67
|
-
return parse_and_save_token_response(settings, data)
|
|
75
|
+
return parse_and_save_token_response(settings, data, creds.client_id)
|
|
68
76
|
|
|
69
77
|
|
|
70
78
|
def oauth_pkce_login(settings: Settings) -> Credentials:
|
|
71
|
-
"""Run the full OAuth PKCE login flow via Supabase's OAuth2 server.
|
|
72
|
-
|
|
73
|
-
Steps:
|
|
74
|
-
1. Start local callback server
|
|
75
|
-
2. Dynamically register an OAuth2 client with Supabase
|
|
76
|
-
3. Generate PKCE code verifier + challenge
|
|
77
|
-
4. Open browser to Supabase authorize endpoint (shows hosted sign-in page)
|
|
78
|
-
5. Wait for callback with authorization code
|
|
79
|
-
6. Exchange code + verifier for tokens at Supabase token endpoint
|
|
80
|
-
7. Save and return credentials
|
|
81
|
-
"""
|
|
79
|
+
"""Run the full OAuth PKCE login flow via Supabase's OAuth2 server."""
|
|
82
80
|
supabase_url = settings.supabase_url.rstrip("/")
|
|
83
81
|
|
|
84
82
|
# PKCE challenge: base64url(sha256(verifier)) without padding
|
|
@@ -191,7 +189,7 @@ def oauth_pkce_login(settings: Settings) -> Credentials:
|
|
|
191
189
|
if not isinstance(response_data, dict):
|
|
192
190
|
auth_error("Token exchange returned unexpected response format.")
|
|
193
191
|
|
|
194
|
-
creds = parse_and_save_token_response(settings, response_data)
|
|
192
|
+
creds = parse_and_save_token_response(settings, response_data, client_id)
|
|
195
193
|
if creds is None:
|
|
196
194
|
auth_error("Failed to parse token response.")
|
|
197
195
|
|
|
@@ -43,8 +43,14 @@ def get_apikey_header(settings: Settings) -> str:
|
|
|
43
43
|
)
|
|
44
44
|
|
|
45
45
|
|
|
46
|
-
def parse_and_save_token_response(
|
|
47
|
-
|
|
46
|
+
def parse_and_save_token_response(
|
|
47
|
+
settings: Settings, data: dict[str, Any], client_id: str | None = None
|
|
48
|
+
) -> Credentials | None:
|
|
49
|
+
"""Parse a Supabase token response and persist credentials.
|
|
50
|
+
|
|
51
|
+
client_id is the OAuth client that owns the session; it must be persisted
|
|
52
|
+
so refresh_token can re-authenticate against the same client.
|
|
53
|
+
"""
|
|
48
54
|
try:
|
|
49
55
|
user = data.get("user", {})
|
|
50
56
|
if not isinstance(user, dict):
|
|
@@ -65,6 +71,7 @@ def parse_and_save_token_response(settings: Settings, data: dict[str, Any]) -> C
|
|
|
65
71
|
expires_at=time.time() + int(expires_in),
|
|
66
72
|
user_id=user_id,
|
|
67
73
|
email=email,
|
|
74
|
+
client_id=client_id,
|
|
68
75
|
)
|
|
69
76
|
save_credentials(settings, creds)
|
|
70
77
|
return creds
|
|
@@ -45,6 +45,7 @@ def _make_credentials(**overrides):
|
|
|
45
45
|
"expires_at": time.time() + 3600, # 1 hour from now
|
|
46
46
|
"user_id": "user-789",
|
|
47
47
|
"email": "test@example.com",
|
|
48
|
+
"client_id": "client-abc",
|
|
48
49
|
}
|
|
49
50
|
defaults.update(overrides)
|
|
50
51
|
return Credentials(**defaults)
|
|
@@ -283,10 +284,19 @@ class TestRefreshToken:
|
|
|
283
284
|
assert result is not None
|
|
284
285
|
assert result.access_token == "new-access"
|
|
285
286
|
assert result.refresh_token == "new-refresh"
|
|
286
|
-
|
|
287
|
+
assert result.client_id == "client-abc"
|
|
287
288
|
loaded = load_credentials(settings)
|
|
288
289
|
assert loaded is not None
|
|
289
290
|
assert loaded.access_token == "new-access"
|
|
291
|
+
assert loaded.client_id == "client-abc"
|
|
292
|
+
|
|
293
|
+
def test_raises_session_revoked_without_client_id(self, tmp_path):
|
|
294
|
+
"""A session stored before client_id was persisted can never refresh."""
|
|
295
|
+
settings = _make_settings(tmp_path)
|
|
296
|
+
legacy_creds = _make_credentials(client_id=None)
|
|
297
|
+
|
|
298
|
+
with pytest.raises(SessionRevokedError):
|
|
299
|
+
refresh_token(settings, legacy_creds)
|
|
290
300
|
|
|
291
301
|
def test_returns_none_on_transient_network_error(self, tmp_path):
|
|
292
302
|
"""A network-level failure is transient — creds are worth keeping and retrying."""
|
|
@@ -320,9 +330,10 @@ class TestRefreshToken:
|
|
|
320
330
|
settings = _make_settings(tmp_path, supabase_publishable_key="")
|
|
321
331
|
assert refresh_token(settings, _make_credentials()) is None
|
|
322
332
|
|
|
323
|
-
def
|
|
333
|
+
def test_refreshes_against_oauth_endpoint_with_client_id(self, tmp_path):
|
|
334
|
+
"""OAuth sessions must refresh at /oauth/token with the owning client_id."""
|
|
324
335
|
settings = _make_settings(tmp_path)
|
|
325
|
-
old_creds = _make_credentials(refresh_token="my-refresh")
|
|
336
|
+
old_creds = _make_credentials(refresh_token="my-refresh", client_id="client-xyz")
|
|
326
337
|
|
|
327
338
|
mock_response = MagicMock()
|
|
328
339
|
mock_response.status_code = 200
|
|
@@ -332,16 +343,18 @@ class TestRefreshToken:
|
|
|
332
343
|
"expires_in": 3600,
|
|
333
344
|
"user": {"id": "u", "email": "e@e.com"},
|
|
334
345
|
}
|
|
335
|
-
mock_response.raise_for_status = MagicMock()
|
|
336
346
|
|
|
337
347
|
with patch("minitest_cli.core.oauth.httpx.post", return_value=mock_response) as mock_post:
|
|
338
348
|
refresh_token(settings, old_creds)
|
|
339
349
|
|
|
340
350
|
mock_post.assert_called_once()
|
|
341
351
|
call_args = mock_post.call_args
|
|
342
|
-
assert
|
|
343
|
-
assert call_args.kwargs["
|
|
344
|
-
|
|
352
|
+
assert call_args.args[0].endswith("/auth/v1/oauth/token")
|
|
353
|
+
assert call_args.kwargs["data"] == {
|
|
354
|
+
"grant_type": "refresh_token",
|
|
355
|
+
"refresh_token": "my-refresh",
|
|
356
|
+
"client_id": "client-xyz",
|
|
357
|
+
}
|
|
345
358
|
|
|
346
359
|
|
|
347
360
|
class TestDecodeJwtClaims:
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{minitest_cli-0.16.1 → minitest_cli-0.16.2}/src/minitest_cli/commands/app_knowledge_helpers.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{minitest_cli-0.16.1 → minitest_cli-0.16.2}/src/minitest_cli/commands/test_profile_default.py
RENAMED
|
File without changes
|
{minitest_cli-0.16.1 → minitest_cli-0.16.2}/src/minitest_cli/commands/test_profile_helpers.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{minitest_cli-0.16.1 → minitest_cli-0.16.2}/src/minitest_cli/commands/user_story_bindings.py
RENAMED
|
File without changes
|
{minitest_cli-0.16.1 → minitest_cli-0.16.2}/src/minitest_cli/commands/user_story_criteria.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
{minitest_cli-0.16.1 → minitest_cli-0.16.2}/src/minitest_cli/commands/user_story_profiles.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|