deploynator 1.3.3__tar.gz → 1.3.4__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.
- {deploynator-1.3.3 → deploynator-1.3.4}/PKG-INFO +39 -6
- {deploynator-1.3.3 → deploynator-1.3.4}/README.md +38 -5
- {deploynator-1.3.3 → deploynator-1.3.4}/deploynator/__init__.py +1 -1
- {deploynator-1.3.3 → deploynator-1.3.4}/deploynator/__main__.py +5 -0
- {deploynator-1.3.3 → deploynator-1.3.4}/deploynator/_app.py +2 -0
- {deploynator-1.3.3 → deploynator-1.3.4}/deploynator/_deploy.py +6 -4
- {deploynator-1.3.3 → deploynator-1.3.4}/deploynator/_pypi.py +13 -3
- {deploynator-1.3.3 → deploynator-1.3.4}/.gitignore +0 -0
- {deploynator-1.3.3 → deploynator-1.3.4}/LICENSE +0 -0
- {deploynator-1.3.3 → deploynator-1.3.4}/deploynator/_changelog.py +0 -0
- {deploynator-1.3.3 → deploynator-1.3.4}/deploynator/_config.py +0 -0
- {deploynator-1.3.3 → deploynator-1.3.4}/deploynator/_docs.py +0 -0
- {deploynator-1.3.3 → deploynator-1.3.4}/deploynator/_git.py +0 -0
- {deploynator-1.3.3 → deploynator-1.3.4}/deploynator/_mcp_server.py +0 -0
- {deploynator-1.3.3 → deploynator-1.3.4}/deploynator/_models.py +0 -0
- {deploynator-1.3.3 → deploynator-1.3.4}/deploynator/_platforms.py +0 -0
- {deploynator-1.3.3 → deploynator-1.3.4}/deploynator/_readme.py +0 -0
- {deploynator-1.3.3 → deploynator-1.3.4}/deploynator/_runner.py +0 -0
- {deploynator-1.3.3 → deploynator-1.3.4}/deploynator/_semver.py +0 -0
- {deploynator-1.3.3 → deploynator-1.3.4}/deploynator/_toml.py +0 -0
- {deploynator-1.3.3 → deploynator-1.3.4}/example.deploynator.toml +0 -0
- {deploynator-1.3.3 → deploynator-1.3.4}/projects/deploynator.yaml +0 -0
- {deploynator-1.3.3 → deploynator-1.3.4}/projects/lazyown.yaml +0 -0
- {deploynator-1.3.3 → deploynator-1.3.4}/projects/template.yaml +0 -0
- {deploynator-1.3.3 → deploynator-1.3.4}/pyproject.toml +0 -0
- {deploynator-1.3.3 → deploynator-1.3.4}/specs/deploynator_toml_pipeline.spec.md +0 -0
- {deploynator-1.3.3 → deploynator-1.3.4}/tests/__init__.py +0 -0
- {deploynator-1.3.3 → deploynator-1.3.4}/tests/bdd_test_deploy.py +0 -0
- {deploynator-1.3.3 → deploynator-1.3.4}/tests/test_changelog.py +0 -0
- {deploynator-1.3.3 → deploynator-1.3.4}/tests/test_cli_mcp.py +0 -0
- {deploynator-1.3.3 → deploynator-1.3.4}/tests/test_config.py +0 -0
- {deploynator-1.3.3 → deploynator-1.3.4}/tests/test_deploy.py +0 -0
- {deploynator-1.3.3 → deploynator-1.3.4}/tests/test_init.py +0 -0
- {deploynator-1.3.3 → deploynator-1.3.4}/tests/test_install_example.py +0 -0
- {deploynator-1.3.3 → deploynator-1.3.4}/tests/test_models.py +0 -0
- {deploynator-1.3.3 → deploynator-1.3.4}/tests/test_path_deploy.py +0 -0
- {deploynator-1.3.3 → deploynator-1.3.4}/tests/test_pipeline.py +0 -0
- {deploynator-1.3.3 → deploynator-1.3.4}/tests/test_pypi.py +0 -0
- {deploynator-1.3.3 → deploynator-1.3.4}/tests/test_readme_footer.py +0 -0
- {deploynator-1.3.3 → deploynator-1.3.4}/tests/test_runner.py +0 -0
- {deploynator-1.3.3 → deploynator-1.3.4}/tests/test_semver.py +0 -0
- {deploynator-1.3.3 → deploynator-1.3.4}/tests/test_toml.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.5
|
|
2
2
|
Name: deploynator
|
|
3
|
-
Version: 1.3.
|
|
3
|
+
Version: 1.3.4
|
|
4
4
|
Summary: Multi-platform deployer for GitHub, GitLab, and Bitbucket
|
|
5
5
|
Project-URL: Homepage, https://github.com/grisuno/deploynator
|
|
6
6
|
Project-URL: Repository, https://github.com/grisuno/deploynator
|
|
@@ -260,22 +260,55 @@ Deployed with [deploynator](https://github.com/grisuno/deploynator)
|
|
|
260
260
|
## Knowledge Base
|
|
261
261
|
|
|
262
262
|
This project has been analyzed by [ReadMenator](https://github.com/grisuno/ReadMenator),
|
|
263
|
-
a zero-token polyglot static analysis tool.
|
|
263
|
+
a zero-token polyglot static analysis tool. Regenerate with
|
|
264
|
+
`pip install readmenator && readmenator . --rebuild`. Analysis outputs:
|
|
264
265
|
|
|
265
266
|
- **[KNOWLEDGE_BASE.md](./KNOWLEDGE_BASE.md)** -- Full architecture reference with all
|
|
266
267
|
classes, functions, imports, dependency graphs, UML class diagrams, security
|
|
267
|
-
audit findings, community analysis, and more.
|
|
268
|
+
audit findings, community analysis, taint paths, hotspots, cycles, and more.
|
|
268
269
|
- **[readmenator-agent/](./readmenator-agent/)** -- Agent-friendly, grep-optimized index.
|
|
269
270
|
- `INDEX.md` -- Quick reference: what each file does
|
|
271
|
+
- `SYMBOLS.md` -- Every symbol with file:line
|
|
272
|
+
- `ARCHITECTURE.md` -- Internal dependency pairs + external imports
|
|
270
273
|
- `API.md` -- Public function contracts
|
|
271
|
-
- `GOTCHAS.md` -- Change warnings
|
|
272
|
-
- `SECURITY.md` -- Findings by severity
|
|
274
|
+
- `GOTCHAS.md` -- Change warnings (blast radius, cycles, hotspots)
|
|
275
|
+
- `SECURITY.md` -- Findings by severity with fix hints
|
|
276
|
+
- `MEMORY.md` -- Rules, workflow, style, deliverables, session log
|
|
277
|
+
- `MANIFEST.json` -- Freshness (git_commit + source_fingerprint) + read order
|
|
278
|
+
- `KB_<subsystem>.md` -- Per-subsystem context
|
|
279
|
+
- `recipes/*.md` -- Grounded task guides (add-function, fix-cycle, ...)
|
|
273
280
|
- **[readmenator-wiki/](./readmenator-wiki/)** -- Navigable wiki (start here for the big picture).
|
|
274
281
|
- `index.md` -- Entry point: overview, reading order, god nodes, connections
|
|
275
282
|
- `community_*.md` -- One synthesis page per code community
|
|
283
|
+
- `connections.json` -- Typed bridges between communities
|
|
284
|
+
- `queries.md` -- Suggested questions + answer log
|
|
276
285
|
- `REPORT.md` -- Honest audit: coverage, confidence, limits
|
|
286
|
+
- **[readmenator-graphrag/](./readmenator-graphrag/)** -- Zero-token GraphRAG index.
|
|
287
|
+
- `index.json` + `REPORTS.md` -- Query with `readmenator . ask "<question>"`
|
|
288
|
+
- **[readmenator-apidocs/](./readmenator-apidocs/)** -- API reference (Sphinx/Doxygen style).
|
|
289
|
+
- `index.md` + `modules/*.md` -- Signatures, parameters, returns, raises, examples, call graphs
|
|
290
|
+
- `architecture.md` -- Tiered architecture + execution flows (control flow, call tree, sequence)
|
|
291
|
+
- `classes.md`, `genindex.md`, `COVERAGE.md` -- Hierarchy, A-Z index, doc coverage + warnings
|
|
292
|
+
- `index.html` + `api/` -- Offline searchable browser and machine-readable model (`api/index.json`, `api/modules/*.jsonl` one entity per line)
|
|
293
|
+
- **[readmenator-maps/](./readmenator-maps/)** -- Interactive gallery (`index.html`).
|
|
294
|
+
- 5 system maps: architecture, workflow, sequence, dataflow, lifecycle
|
|
295
|
+
- `graph-force.html` -- Force-graph explorer (2D/3D, reach, paths, lenses)
|
|
296
|
+
- `graph-bundle.html` -- Edge bundle explorer (circle + sphere)
|
|
297
|
+
- `components.html` -- Component diagrams
|
|
298
|
+
- **[docs/](./docs/)** -- Static site (GitHub Pages ready).
|
|
299
|
+
- Gallery copy + `llms.txt` (agent entry point) + `md/` docs + video
|
|
300
|
+
- **[readmenator-diagrams/](./readmenator-diagrams/)** -- Component diagrams.
|
|
301
|
+
- `analysis.json` + `graph LR` markdown + per-component pages + `index.html`
|
|
302
|
+
- **[readmenator-rules/](./readmenator-rules/)** -- Suggested Semgrep rules (`*.yml`),
|
|
303
|
+
`yara_rules.yar` (YARA-lite) + `exclusions.yaml` (false-positive blocklist)
|
|
304
|
+
- **[readmenator.mp4](./readmenator.mp4)** -- Cinematic synthwave overview video
|
|
305
|
+
- **[.cursorrules](./.cursorrules)** -- Generated AI assistant rules
|
|
306
|
+
- **[readmenator_audit.sarif](./readmenator_audit.sarif)** -- SARIF v2.1.0 audit (when security scan is on)
|
|
307
|
+
|
|
308
|
+
Cache (`.readmenator_cache/`), packaged agent skills (`.claude/skills/`), and the
|
|
309
|
+
GitHub wiki mirror are also produced on `run`/`--rebuild`.
|
|
277
310
|
|
|
278
311
|
AI agents: Read `readmenator-wiki/index.md` first for the big picture, then `readmenator-agent/INDEX.md` for grep-friendly lookup.
|
|
279
|
-
Developers: Read `KNOWLEDGE_BASE.md` for full architecture reference.
|
|
312
|
+
Developers: Read `KNOWLEDGE_BASE.md` for full architecture reference, open `readmenator-maps/index.html` for the visual gallery.
|
|
280
313
|
<!-- /readmenator-kb-link -->
|
|
281
314
|
|
|
@@ -226,22 +226,55 @@ Deployed with [deploynator](https://github.com/grisuno/deploynator)
|
|
|
226
226
|
## Knowledge Base
|
|
227
227
|
|
|
228
228
|
This project has been analyzed by [ReadMenator](https://github.com/grisuno/ReadMenator),
|
|
229
|
-
a zero-token polyglot static analysis tool.
|
|
229
|
+
a zero-token polyglot static analysis tool. Regenerate with
|
|
230
|
+
`pip install readmenator && readmenator . --rebuild`. Analysis outputs:
|
|
230
231
|
|
|
231
232
|
- **[KNOWLEDGE_BASE.md](./KNOWLEDGE_BASE.md)** -- Full architecture reference with all
|
|
232
233
|
classes, functions, imports, dependency graphs, UML class diagrams, security
|
|
233
|
-
audit findings, community analysis, and more.
|
|
234
|
+
audit findings, community analysis, taint paths, hotspots, cycles, and more.
|
|
234
235
|
- **[readmenator-agent/](./readmenator-agent/)** -- Agent-friendly, grep-optimized index.
|
|
235
236
|
- `INDEX.md` -- Quick reference: what each file does
|
|
237
|
+
- `SYMBOLS.md` -- Every symbol with file:line
|
|
238
|
+
- `ARCHITECTURE.md` -- Internal dependency pairs + external imports
|
|
236
239
|
- `API.md` -- Public function contracts
|
|
237
|
-
- `GOTCHAS.md` -- Change warnings
|
|
238
|
-
- `SECURITY.md` -- Findings by severity
|
|
240
|
+
- `GOTCHAS.md` -- Change warnings (blast radius, cycles, hotspots)
|
|
241
|
+
- `SECURITY.md` -- Findings by severity with fix hints
|
|
242
|
+
- `MEMORY.md` -- Rules, workflow, style, deliverables, session log
|
|
243
|
+
- `MANIFEST.json` -- Freshness (git_commit + source_fingerprint) + read order
|
|
244
|
+
- `KB_<subsystem>.md` -- Per-subsystem context
|
|
245
|
+
- `recipes/*.md` -- Grounded task guides (add-function, fix-cycle, ...)
|
|
239
246
|
- **[readmenator-wiki/](./readmenator-wiki/)** -- Navigable wiki (start here for the big picture).
|
|
240
247
|
- `index.md` -- Entry point: overview, reading order, god nodes, connections
|
|
241
248
|
- `community_*.md` -- One synthesis page per code community
|
|
249
|
+
- `connections.json` -- Typed bridges between communities
|
|
250
|
+
- `queries.md` -- Suggested questions + answer log
|
|
242
251
|
- `REPORT.md` -- Honest audit: coverage, confidence, limits
|
|
252
|
+
- **[readmenator-graphrag/](./readmenator-graphrag/)** -- Zero-token GraphRAG index.
|
|
253
|
+
- `index.json` + `REPORTS.md` -- Query with `readmenator . ask "<question>"`
|
|
254
|
+
- **[readmenator-apidocs/](./readmenator-apidocs/)** -- API reference (Sphinx/Doxygen style).
|
|
255
|
+
- `index.md` + `modules/*.md` -- Signatures, parameters, returns, raises, examples, call graphs
|
|
256
|
+
- `architecture.md` -- Tiered architecture + execution flows (control flow, call tree, sequence)
|
|
257
|
+
- `classes.md`, `genindex.md`, `COVERAGE.md` -- Hierarchy, A-Z index, doc coverage + warnings
|
|
258
|
+
- `index.html` + `api/` -- Offline searchable browser and machine-readable model (`api/index.json`, `api/modules/*.jsonl` one entity per line)
|
|
259
|
+
- **[readmenator-maps/](./readmenator-maps/)** -- Interactive gallery (`index.html`).
|
|
260
|
+
- 5 system maps: architecture, workflow, sequence, dataflow, lifecycle
|
|
261
|
+
- `graph-force.html` -- Force-graph explorer (2D/3D, reach, paths, lenses)
|
|
262
|
+
- `graph-bundle.html` -- Edge bundle explorer (circle + sphere)
|
|
263
|
+
- `components.html` -- Component diagrams
|
|
264
|
+
- **[docs/](./docs/)** -- Static site (GitHub Pages ready).
|
|
265
|
+
- Gallery copy + `llms.txt` (agent entry point) + `md/` docs + video
|
|
266
|
+
- **[readmenator-diagrams/](./readmenator-diagrams/)** -- Component diagrams.
|
|
267
|
+
- `analysis.json` + `graph LR` markdown + per-component pages + `index.html`
|
|
268
|
+
- **[readmenator-rules/](./readmenator-rules/)** -- Suggested Semgrep rules (`*.yml`),
|
|
269
|
+
`yara_rules.yar` (YARA-lite) + `exclusions.yaml` (false-positive blocklist)
|
|
270
|
+
- **[readmenator.mp4](./readmenator.mp4)** -- Cinematic synthwave overview video
|
|
271
|
+
- **[.cursorrules](./.cursorrules)** -- Generated AI assistant rules
|
|
272
|
+
- **[readmenator_audit.sarif](./readmenator_audit.sarif)** -- SARIF v2.1.0 audit (when security scan is on)
|
|
273
|
+
|
|
274
|
+
Cache (`.readmenator_cache/`), packaged agent skills (`.claude/skills/`), and the
|
|
275
|
+
GitHub wiki mirror are also produced on `run`/`--rebuild`.
|
|
243
276
|
|
|
244
277
|
AI agents: Read `readmenator-wiki/index.md` first for the big picture, then `readmenator-agent/INDEX.md` for grep-friendly lookup.
|
|
245
|
-
Developers: Read `KNOWLEDGE_BASE.md` for full architecture reference.
|
|
278
|
+
Developers: Read `KNOWLEDGE_BASE.md` for full architecture reference, open `readmenator-maps/index.html` for the visual gallery.
|
|
246
279
|
<!-- /readmenator-kb-link -->
|
|
247
280
|
|
|
@@ -28,6 +28,10 @@ def build_parser() -> argparse.ArgumentParser:
|
|
|
28
28
|
"--workdir", type=str, default="",
|
|
29
29
|
help="Working directory (default: current dir)",
|
|
30
30
|
)
|
|
31
|
+
parser.add_argument(
|
|
32
|
+
"--verbose", "-v", action="store_true",
|
|
33
|
+
help="Verbose output (twine --verbose, full command + untruncated errors)",
|
|
34
|
+
)
|
|
31
35
|
|
|
32
36
|
subparsers = parser.add_subparsers(dest="command", help="Available commands")
|
|
33
37
|
|
|
@@ -199,6 +203,7 @@ def main(argv: list[str] | None = None) -> NoReturn | None:
|
|
|
199
203
|
no_test=getattr(args, "no_test", False),
|
|
200
204
|
no_docs=getattr(args, "no_docs", False),
|
|
201
205
|
no_pypi=getattr(args, "no_pypi", False),
|
|
206
|
+
verbose=getattr(args, "verbose", False),
|
|
202
207
|
)
|
|
203
208
|
sys.exit(0 if all(r.success for r in results) else 1)
|
|
204
209
|
|
|
@@ -356,6 +356,7 @@ version:
|
|
|
356
356
|
no_test: bool = False,
|
|
357
357
|
no_docs: bool = False,
|
|
358
358
|
no_pypi: bool = False,
|
|
359
|
+
verbose: bool = False,
|
|
359
360
|
) -> list[DeployResult]:
|
|
360
361
|
base = os.getcwd()
|
|
361
362
|
ctype = CommitType.from_string(commit_type)
|
|
@@ -424,6 +425,7 @@ version:
|
|
|
424
425
|
run_docs=not no_docs,
|
|
425
426
|
force_bump=bump or None,
|
|
426
427
|
run_pypi=not no_pypi,
|
|
428
|
+
verbose=verbose,
|
|
427
429
|
)
|
|
428
430
|
results.append(result)
|
|
429
431
|
self._print_result(result)
|
|
@@ -107,6 +107,7 @@ class DeployOrchestrator:
|
|
|
107
107
|
run_docs: bool = True,
|
|
108
108
|
force_bump: Optional[str] = None,
|
|
109
109
|
run_pypi: bool = True,
|
|
110
|
+
verbose: bool = False,
|
|
110
111
|
) -> DeployResult:
|
|
111
112
|
repo_path = self._resolve_project_path(project)
|
|
112
113
|
|
|
@@ -334,7 +335,8 @@ class DeployOrchestrator:
|
|
|
334
335
|
print("[!] PyPI packaging detected but no credentials "
|
|
335
336
|
"(TWINE_PASSWORD/PYPI_TOKEN/~/.pypirc). Skipping upload.")
|
|
336
337
|
else:
|
|
337
|
-
ok, msg = self._pypi.run(repo_path, toml_cfg, new_version_str, token=token
|
|
338
|
+
ok, msg = self._pypi.run(repo_path, toml_cfg, new_version_str, token=token,
|
|
339
|
+
verbose=verbose)
|
|
338
340
|
print(f"[{'OK' if ok else 'FAIL'}] {msg}")
|
|
339
341
|
if not ok:
|
|
340
342
|
return DeployResult(
|
|
@@ -343,10 +345,10 @@ class DeployOrchestrator:
|
|
|
343
345
|
success=False,
|
|
344
346
|
platforms_pushed=platforms_pushed,
|
|
345
347
|
releases_created=releases_created,
|
|
346
|
-
error=msg[:2000],
|
|
348
|
+
error=msg if verbose else msg[:2000],
|
|
347
349
|
)
|
|
348
350
|
else:
|
|
349
|
-
ok, msg = self._pypi.run(repo_path, toml_cfg, new_version_str)
|
|
351
|
+
ok, msg = self._pypi.run(repo_path, toml_cfg, new_version_str, verbose=verbose)
|
|
350
352
|
print(f"[{'OK' if ok else 'FAIL'}] {msg}")
|
|
351
353
|
if not ok:
|
|
352
354
|
return DeployResult(
|
|
@@ -355,7 +357,7 @@ class DeployOrchestrator:
|
|
|
355
357
|
success=False,
|
|
356
358
|
platforms_pushed=platforms_pushed,
|
|
357
359
|
releases_created=releases_created,
|
|
358
|
-
error=msg[:2000],
|
|
360
|
+
error=msg if verbose else msg[:2000],
|
|
359
361
|
)
|
|
360
362
|
|
|
361
363
|
return DeployResult(
|
|
@@ -105,7 +105,7 @@ class PyPIRunner:
|
|
|
105
105
|
shutil.rmtree(target)
|
|
106
106
|
|
|
107
107
|
def run(self, project_path: str, toml: TomlConfig, version: str,
|
|
108
|
-
token: str | None = None) -> tuple[bool, str]:
|
|
108
|
+
token: str | None = None, verbose: bool = False) -> tuple[bool, str]:
|
|
109
109
|
if not self.is_packaging_project(project_path):
|
|
110
110
|
return True, "PyPI skipped: no packaging files"
|
|
111
111
|
try:
|
|
@@ -120,7 +120,10 @@ class PyPIRunner:
|
|
|
120
120
|
timeout=toml.pypi_timeout_s,
|
|
121
121
|
)
|
|
122
122
|
if build.returncode != 0:
|
|
123
|
-
|
|
123
|
+
raw = (build.stderr or build.stdout or "").strip()
|
|
124
|
+
if verbose and raw:
|
|
125
|
+
print(raw)
|
|
126
|
+
err = raw if verbose else raw[-2000:]
|
|
124
127
|
hint = "" if "build" not in err.lower() else " (pip install build)"
|
|
125
128
|
return False, f"PyPI build failed for {version}{hint}: {err}"
|
|
126
129
|
dist_dir = os.path.join(project_path, "dist")
|
|
@@ -128,11 +131,15 @@ class PyPIRunner:
|
|
|
128
131
|
if not artifacts:
|
|
129
132
|
return False, f"PyPI build produced no artifacts for {version}"
|
|
130
133
|
cmd = [sys.executable, "-m", "twine", "upload", "--non-interactive"]
|
|
134
|
+
if verbose:
|
|
135
|
+
cmd += ["--verbose"]
|
|
131
136
|
if toml.pypi_repo == "testpypi":
|
|
132
137
|
cmd += ["--repository", "testpypi"]
|
|
133
138
|
elif toml.pypi_repo not in ("pypi", "testpypi"):
|
|
134
139
|
cmd += ["--repository-url", toml.pypi_repo]
|
|
135
140
|
cmd += [os.path.join("dist", a) for a in artifacts]
|
|
141
|
+
if verbose:
|
|
142
|
+
print(f"[...] {subprocess.list2cmdline(cmd)} (cwd={project_path})")
|
|
136
143
|
env = dict(os.environ)
|
|
137
144
|
token = token or os.environ.get("PYPI_TOKEN")
|
|
138
145
|
if token and not os.environ.get("TWINE_PASSWORD"):
|
|
@@ -150,6 +157,9 @@ class PyPIRunner:
|
|
|
150
157
|
except subprocess.TimeoutExpired:
|
|
151
158
|
return False, f"PyPI upload timed out after {toml.pypi_timeout_s}s"
|
|
152
159
|
if upload.returncode != 0:
|
|
153
|
-
|
|
160
|
+
raw = (upload.stderr or upload.stdout or "").strip()
|
|
161
|
+
if verbose and raw:
|
|
162
|
+
print(raw)
|
|
163
|
+
err = raw if verbose else raw[-2000:]
|
|
154
164
|
return False, f"PyPI upload failed for {version}: {err}"
|
|
155
165
|
return True, f"PyPI uploaded {version}: {', '.join(artifacts)}"
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|