solverforge 0.6.2__tar.gz → 0.6.3__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.
Files changed (84) hide show
  1. {solverforge-0.6.2 → solverforge-0.6.3}/Cargo.lock +13 -13
  2. {solverforge-0.6.2 → solverforge-0.6.3}/Cargo.toml +8 -8
  3. {solverforge-0.6.2 → solverforge-0.6.3}/PKG-INFO +19 -13
  4. {solverforge-0.6.2 → solverforge-0.6.3}/README.md +18 -12
  5. {solverforge-0.6.2 → solverforge-0.6.3}/pyproject.toml +1 -1
  6. {solverforge-0.6.2 → solverforge-0.6.3}/python/solverforge/__init__.py +1 -1
  7. {solverforge-0.6.2 → solverforge-0.6.3}/LICENSE +0 -0
  8. {solverforge-0.6.2 → solverforge-0.6.3}/python/solverforge/_native.pyi +0 -0
  9. {solverforge-0.6.2 → solverforge-0.6.3}/python/solverforge/config.py +0 -0
  10. {solverforge-0.6.2 → solverforge-0.6.3}/python/solverforge/console.py +0 -0
  11. {solverforge-0.6.2 → solverforge-0.6.3}/python/solverforge/constraints.py +0 -0
  12. {solverforge-0.6.2 → solverforge-0.6.3}/python/solverforge/decorators.py +0 -0
  13. {solverforge-0.6.2 → solverforge-0.6.3}/python/solverforge/errors.py +0 -0
  14. {solverforge-0.6.2 → solverforge-0.6.3}/python/solverforge/events.py +0 -0
  15. {solverforge-0.6.2 → solverforge-0.6.3}/python/solverforge/fields.py +0 -0
  16. {solverforge-0.6.2 → solverforge-0.6.3}/python/solverforge/groups.py +0 -0
  17. {solverforge-0.6.2 → solverforge-0.6.3}/python/solverforge/joiner.py +0 -0
  18. {solverforge-0.6.2 → solverforge-0.6.3}/python/solverforge/manager.py +0 -0
  19. {solverforge-0.6.2 → solverforge-0.6.3}/python/solverforge/model.py +0 -0
  20. {solverforge-0.6.2 → solverforge-0.6.3}/python/solverforge/py.typed +0 -0
  21. {solverforge-0.6.2 → solverforge-0.6.3}/python/solverforge/score.py +0 -0
  22. {solverforge-0.6.2 → solverforge-0.6.3}/python/solverforge/solver.py +0 -0
  23. {solverforge-0.6.2 → solverforge-0.6.3}/python/solverforge/typing.py +0 -0
  24. {solverforge-0.6.2 → solverforge-0.6.3}/python/solverforge/ui.py +0 -0
  25. {solverforge-0.6.2 → solverforge-0.6.3}/rust-toolchain.toml +0 -0
  26. {solverforge-0.6.2 → solverforge-0.6.3}/src/bindings.rs +0 -0
  27. {solverforge-0.6.2 → solverforge-0.6.3}/src/callbacks/call.rs +0 -0
  28. {solverforge-0.6.2 → solverforge-0.6.3}/src/callbacks/mod.rs +0 -0
  29. {solverforge-0.6.2 → solverforge-0.6.3}/src/callbacks/registry.rs +0 -0
  30. {solverforge-0.6.2 → solverforge-0.6.3}/src/callbacks/threading.rs +0 -0
  31. {solverforge-0.6.2 → solverforge-0.6.3}/src/config.rs +0 -0
  32. {solverforge-0.6.2 → solverforge-0.6.3}/src/constraints/compiled.rs +0 -0
  33. {solverforge-0.6.2 → solverforge-0.6.3}/src/constraints/evaluate.rs +0 -0
  34. {solverforge-0.6.2 → solverforge-0.6.3}/src/constraints/incremental.rs +0 -0
  35. {solverforge-0.6.2 → solverforge-0.6.3}/src/constraints/list_precedence.rs +0 -0
  36. {solverforge-0.6.2 → solverforge-0.6.3}/src/constraints/matches.rs +0 -0
  37. {solverforge-0.6.2 → solverforge-0.6.3}/src/constraints/mod.rs +0 -0
  38. {solverforge-0.6.2 → solverforge-0.6.3}/src/constraints/state.rs +0 -0
  39. {solverforge-0.6.2 → solverforge-0.6.3}/src/constraints/stream_plan.rs +0 -0
  40. {solverforge-0.6.2 → solverforge-0.6.3}/src/descriptor/extractor.rs +0 -0
  41. {solverforge-0.6.2 → solverforge-0.6.3}/src/descriptor/mod.rs +0 -0
  42. {solverforge-0.6.2 → solverforge-0.6.3}/src/descriptor/variable.rs +0 -0
  43. {solverforge-0.6.2 → solverforge-0.6.3}/src/error.rs +0 -0
  44. {solverforge-0.6.2 → solverforge-0.6.3}/src/intern.rs +0 -0
  45. {solverforge-0.6.2 → solverforge-0.6.3}/src/lib.rs +0 -0
  46. {solverforge-0.6.2 → solverforge-0.6.3}/src/manager/candidate_trace.rs +0 -0
  47. {solverforge-0.6.2 → solverforge-0.6.3}/src/manager/events.rs +0 -0
  48. {solverforge-0.6.2 → solverforge-0.6.3}/src/manager/jobs.rs +0 -0
  49. {solverforge-0.6.2 → solverforge-0.6.3}/src/manager/mod.rs +0 -0
  50. {solverforge-0.6.2 → solverforge-0.6.3}/src/manager/provenance.rs +0 -0
  51. {solverforge-0.6.2 → solverforge-0.6.3}/src/proxy/entity.rs +0 -0
  52. {solverforge-0.6.2 → solverforge-0.6.3}/src/proxy/list.rs +0 -0
  53. {solverforge-0.6.2 → solverforge-0.6.3}/src/proxy/mod.rs +0 -0
  54. {solverforge-0.6.2 → solverforge-0.6.3}/src/proxy/solution.rs +0 -0
  55. {solverforge-0.6.2 → solverforge-0.6.3}/src/runtime/candidate_metric.rs +0 -0
  56. {solverforge-0.6.2 → solverforge-0.6.3}/src/runtime/dynamic_assignment_group.rs +0 -0
  57. {solverforge-0.6.2 → solverforge-0.6.3}/src/runtime/dynamic_provider.rs +0 -0
  58. {solverforge-0.6.2 → solverforge-0.6.3}/src/runtime/list_slots.rs +0 -0
  59. {solverforge-0.6.2 → solverforge-0.6.3}/src/runtime/mod.rs +0 -0
  60. {solverforge-0.6.2 → solverforge-0.6.3}/src/runtime/scalar_slots.rs +0 -0
  61. {solverforge-0.6.2 → solverforge-0.6.3}/src/schema/build.rs +0 -0
  62. {solverforge-0.6.2 → solverforge-0.6.3}/src/schema/compiled.rs +0 -0
  63. {solverforge-0.6.2 → solverforge-0.6.3}/src/schema/mod.rs +0 -0
  64. {solverforge-0.6.2 → solverforge-0.6.3}/src/schema/parse.rs +0 -0
  65. {solverforge-0.6.2 → solverforge-0.6.3}/src/schema/python.rs +0 -0
  66. {solverforge-0.6.2 → solverforge-0.6.3}/src/schema/runtime_plan.rs +0 -0
  67. {solverforge-0.6.2 → solverforge-0.6.3}/src/schema/types.rs +0 -0
  68. {solverforge-0.6.2 → solverforge-0.6.3}/src/schema/validate.rs +0 -0
  69. {solverforge-0.6.2 → solverforge-0.6.3}/src/score.rs +0 -0
  70. {solverforge-0.6.2 → solverforge-0.6.3}/src/solver/api.rs +0 -0
  71. {solverforge-0.6.2 → solverforge-0.6.3}/src/solver/console.rs +0 -0
  72. {solverforge-0.6.2 → solverforge-0.6.3}/src/solver/mod.rs +0 -0
  73. {solverforge-0.6.2 → solverforge-0.6.3}/src/solver/progress.rs +0 -0
  74. {solverforge-0.6.2 → solverforge-0.6.3}/src/solver/result.rs +0 -0
  75. {solverforge-0.6.2 → solverforge-0.6.3}/src/solver/solvable.rs +0 -0
  76. {solverforge-0.6.2 → solverforge-0.6.3}/src/state/callback_view.rs +0 -0
  77. {solverforge-0.6.2 → solverforge-0.6.3}/src/state/clone.rs +0 -0
  78. {solverforge-0.6.2 → solverforge-0.6.3}/src/state/entity_table.rs +0 -0
  79. {solverforge-0.6.2 → solverforge-0.6.3}/src/state/marshal.rs +0 -0
  80. {solverforge-0.6.2 → solverforge-0.6.3}/src/state/mod.rs +0 -0
  81. {solverforge-0.6.2 → solverforge-0.6.3}/src/state/solution.rs +0 -0
  82. {solverforge-0.6.2 → solverforge-0.6.3}/src/state/variables.rs +0 -0
  83. {solverforge-0.6.2 → solverforge-0.6.3}/src/ui.rs +0 -0
  84. {solverforge-0.6.2 → solverforge-0.6.3}/src/value.rs +0 -0
@@ -560,9 +560,9 @@ checksum = "8ed6a63f02c8539c91a8685a86f4099661ba3da017932f6ebbea6de3f0fa7c90"
560
560
 
561
561
  [[package]]
562
562
  name = "solverforge-bridge"
563
- version = "0.19.0"
563
+ version = "0.19.1"
564
564
  source = "registry+https://github.com/rust-lang/crates.io-index"
565
- checksum = "f47d5b1bc4e9ea86acf24e3e71f971161bc5c1eba09d4b7105a25542045ed59a"
565
+ checksum = "6bc1bbd14aa7b23a845359b408747b6b783ed31529f1b2cfa12512d425e305f5"
566
566
  dependencies = [
567
567
  "solverforge-config",
568
568
  "solverforge-core",
@@ -572,9 +572,9 @@ dependencies = [
572
572
 
573
573
  [[package]]
574
574
  name = "solverforge-config"
575
- version = "0.19.0"
575
+ version = "0.19.1"
576
576
  source = "registry+https://github.com/rust-lang/crates.io-index"
577
- checksum = "a94f2ff36fc3513dd17473fea8402a7908470b0d18132862e938b402d4cc3dce"
577
+ checksum = "3251fc0471e05f2c05f9148f648618aa8d021fa4dff9af626ac7f05843f114f8"
578
578
  dependencies = [
579
579
  "serde",
580
580
  "serde_yaml",
@@ -585,9 +585,9 @@ dependencies = [
585
585
 
586
586
  [[package]]
587
587
  name = "solverforge-console"
588
- version = "0.19.0"
588
+ version = "0.19.1"
589
589
  source = "registry+https://github.com/rust-lang/crates.io-index"
590
- checksum = "5ecece452a5533bda0f129188cf5284b06b5f0f4b32b6334521e5dbcefa2a318"
590
+ checksum = "42794d46f6685a00e9387a67b0037d49321f7e34796cd5a97b8fd99a72e20377"
591
591
  dependencies = [
592
592
  "num-format",
593
593
  "owo-colors",
@@ -597,18 +597,18 @@ dependencies = [
597
597
 
598
598
  [[package]]
599
599
  name = "solverforge-core"
600
- version = "0.19.0"
600
+ version = "0.19.1"
601
601
  source = "registry+https://github.com/rust-lang/crates.io-index"
602
- checksum = "75396bba5cd24cd16c77477e7ef93dac5643026998904aa862c1bd3f70a5a04f"
602
+ checksum = "32858c2be2505640f60a0bcee902a29e7b9dd136aec49928601ca8764920cb79"
603
603
  dependencies = [
604
604
  "thiserror",
605
605
  ]
606
606
 
607
607
  [[package]]
608
608
  name = "solverforge-scoring"
609
- version = "0.19.0"
609
+ version = "0.19.1"
610
610
  source = "registry+https://github.com/rust-lang/crates.io-index"
611
- checksum = "85df4f001bed630512b2205334113c1766d80ac8b7f4a5da1c2c63f680db1494"
611
+ checksum = "50bd20153f578099fe768873f8d5c07f8e4a56e79bb3da4611776ca5f65941e4"
612
612
  dependencies = [
613
613
  "solverforge-core",
614
614
  "thiserror",
@@ -616,9 +616,9 @@ dependencies = [
616
616
 
617
617
  [[package]]
618
618
  name = "solverforge-solver"
619
- version = "0.19.0"
619
+ version = "0.19.1"
620
620
  source = "registry+https://github.com/rust-lang/crates.io-index"
621
- checksum = "606d50e70307c448f09370028d7ec02172066899896fd8142dd59886b0cb555e"
621
+ checksum = "ae2870ba2c94f03150870d84224fc009936071f9e9313161979473735e059988"
622
622
  dependencies = [
623
623
  "rand",
624
624
  "rand_chacha",
@@ -644,7 +644,7 @@ dependencies = [
644
644
 
645
645
  [[package]]
646
646
  name = "solverforge_py"
647
- version = "0.6.2"
647
+ version = "0.6.3"
648
648
  dependencies = [
649
649
  "indexmap",
650
650
  "once_cell",
@@ -1,6 +1,6 @@
1
1
  [package]
2
2
  name = "solverforge_py"
3
- version = "0.6.2"
3
+ version = "0.6.3"
4
4
  edition = "2021"
5
5
  license = "Apache-2.0"
6
6
  rust-version = "1.95"
@@ -26,7 +26,7 @@ name = "solverforge_py"
26
26
  crate-type = ["cdylib", "rlib"]
27
27
 
28
28
  [package.metadata.solverforge]
29
- version = "0.19.0"
29
+ version = "0.19.1"
30
30
 
31
31
  [dependencies]
32
32
  indexmap = "2.12.1"
@@ -42,12 +42,12 @@ toml = "0.9.8"
42
42
  tracing = "0.1.44"
43
43
  tracing-subscriber = { version = "0.3.23", features = ["env-filter"] }
44
44
 
45
- solverforge-config = { version = "=0.19.0" }
46
- solverforge-bridge = { version = "=0.19.0" }
47
- solverforge-console = { version = "=0.19.0", features = ["verbose-logging"] }
48
- solverforge-core = { version = "=0.19.0" }
49
- solverforge-scoring = { version = "=0.19.0" }
50
- solverforge-solver = { version = "=0.19.0" }
45
+ solverforge-config = { version = "=0.19.1" }
46
+ solverforge-bridge = { version = "=0.19.1" }
47
+ solverforge-console = { version = "=0.19.1", features = ["verbose-logging"] }
48
+ solverforge-core = { version = "=0.19.1" }
49
+ solverforge-scoring = { version = "=0.19.1" }
50
+ solverforge-solver = { version = "=0.19.1" }
51
51
  solverforge-ui = { version = "=0.7.0", default-features = false }
52
52
 
53
53
  [dev-dependencies]
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: solverforge
3
- Version: 0.6.2
3
+ Version: 0.6.3
4
4
  Classifier: Development Status :: 3 - Alpha
5
5
  Classifier: Intended Audience :: Developers
6
6
  Classifier: Intended Audience :: Science/Research
@@ -39,10 +39,10 @@ The native extension owns the working solution state in Rust so SolverForge can
39
39
  clone, mutate, and snapshot solutions safely. Python callbacks are the single
40
40
  constraint authoring surface.
41
41
 
42
- The package targets CPython 3.14 and Rust 1.95.0. This checkout consumes the
43
- published SolverForge Rust crates `0.19.0` and pins `solverforge-ui` to `0.7.0`
44
- through exact crates.io versions in `Cargo.toml` and registry checksums in
45
- `Cargo.lock`; it has no local path or Git dependency override. The `solverforge`
42
+ The package targets CPython 3.14 and Rust 1.95.0. This checkout targets the
43
+ SolverForge Rust crates `0.19.1` and pins `solverforge-ui` to `0.7.0` through
44
+ exact crates.io versions in `Cargo.toml` and registry checksums in `Cargo.lock`.
45
+ There is no local path or Git dependency override. The `solverforge`
46
46
  `0.6.x` line is the current dynamic binding architecture and intentionally
47
47
  supersedes the older incompatible `0.2.x` and `0.3.0` artifacts in the same PyPI
48
48
  namespace. Those older artifacts exposed `SolverFactory`, `PlanningVariable`,
@@ -50,12 +50,12 @@ Java service requirements, and other APIs that are not part of this package.
50
50
 
51
51
  ## Installation
52
52
 
53
- The package version prepared by this checkout is `solverforge` `0.6.2`, built
54
- on the exact published and locked SolverForge Rust `0.19.0` registry dependency
55
- base. Install the matching package after publication with:
53
+ The package version prepared by this checkout is `solverforge` `0.6.3`, targeting
54
+ the published and locked SolverForge Rust `0.19.1` registry dependency base.
55
+ Install the matching package after its Python release with:
56
56
 
57
57
  ```sh
58
- python3.14 -m pip install "solverforge==0.6.2"
58
+ python3.14 -m pip install "solverforge==0.6.3"
59
59
  ```
60
60
 
61
61
  The installable wheel contains the core `solverforge` package, native extension,
@@ -80,7 +80,7 @@ installed package without `PYTHONPATH` or an editable checkout:
80
80
  ```sh
81
81
  python3.14 -m venv .venv-examples
82
82
  . .venv-examples/bin/activate
83
- python -m pip install "solverforge[examples]==0.6.2"
83
+ python -m pip install "solverforge[examples]==0.6.3"
84
84
  python examples/nqueens.py
85
85
  python -m examples.solverforge_hospital
86
86
  python -m examples.solverforge_deliveries
@@ -187,9 +187,13 @@ Run `make help` for focused targets such as `make test-hospital`,
187
187
  `list_cheapest_insertion`, `list_regret_insertion`, `list_clarke_wright`, and
188
188
  `list_k_opt`, with the final two requiring their respective savings and route
189
189
  metadata bundles. These are core graph nodes over the immutable runtime
190
- model. An explicit `group_name` phase obeys its configured obligation and
191
- termination; required-only completion belongs solely to upstream omitted
192
- defaults. Default local search is assembled only when the top-level
190
+ model. All configured limits remain binding during construction. A solve
191
+ publishes a best or completed solution only after every list element,
192
+ required assignment row, and non-optional scalar variable is assigned; if a
193
+ limit is reached first, a direct solve raises and a retained job enters
194
+ `FAILED` without exposing a partial snapshot. Omitted construction still
195
+ resolves required and optional stages in core, but required work never
196
+ bypasses a configured limit. Default local search is assembled only when the top-level
193
197
  termination has an effective finite limit, so an empty or invalid termination
194
198
  cannot accidentally create an unbounded solve. There is no wrapper assignment
195
199
  placer, required stream, phase tree, TLS slot state, synthetic metric, or
@@ -197,6 +201,8 @@ Run `make help` for focused targets such as `make test-hospital`,
197
201
  - `SolverManager` is backed by upstream retained jobs, statuses, events, and
198
202
  snapshots. `SolverManager.solve(...)` returns `JobHandle(job_id=...)`; the
199
203
  manager supports pause, resume, cancel, delete, and exact snapshot reads.
204
+ A pause before mandatory construction completes remains resumable internal
205
+ state and does not expose an incomplete solution snapshot.
200
206
  Retained event payloads read current score from the attached solution snapshot
201
207
  when present. Long-running phases publish progress at the shared upstream
202
208
  cadence, and telemetry includes the current phase type, index, counters, and
@@ -8,10 +8,10 @@ The native extension owns the working solution state in Rust so SolverForge can
8
8
  clone, mutate, and snapshot solutions safely. Python callbacks are the single
9
9
  constraint authoring surface.
10
10
 
11
- The package targets CPython 3.14 and Rust 1.95.0. This checkout consumes the
12
- published SolverForge Rust crates `0.19.0` and pins `solverforge-ui` to `0.7.0`
13
- through exact crates.io versions in `Cargo.toml` and registry checksums in
14
- `Cargo.lock`; it has no local path or Git dependency override. The `solverforge`
11
+ The package targets CPython 3.14 and Rust 1.95.0. This checkout targets the
12
+ SolverForge Rust crates `0.19.1` and pins `solverforge-ui` to `0.7.0` through
13
+ exact crates.io versions in `Cargo.toml` and registry checksums in `Cargo.lock`.
14
+ There is no local path or Git dependency override. The `solverforge`
15
15
  `0.6.x` line is the current dynamic binding architecture and intentionally
16
16
  supersedes the older incompatible `0.2.x` and `0.3.0` artifacts in the same PyPI
17
17
  namespace. Those older artifacts exposed `SolverFactory`, `PlanningVariable`,
@@ -19,12 +19,12 @@ Java service requirements, and other APIs that are not part of this package.
19
19
 
20
20
  ## Installation
21
21
 
22
- The package version prepared by this checkout is `solverforge` `0.6.2`, built
23
- on the exact published and locked SolverForge Rust `0.19.0` registry dependency
24
- base. Install the matching package after publication with:
22
+ The package version prepared by this checkout is `solverforge` `0.6.3`, targeting
23
+ the published and locked SolverForge Rust `0.19.1` registry dependency base.
24
+ Install the matching package after its Python release with:
25
25
 
26
26
  ```sh
27
- python3.14 -m pip install "solverforge==0.6.2"
27
+ python3.14 -m pip install "solverforge==0.6.3"
28
28
  ```
29
29
 
30
30
  The installable wheel contains the core `solverforge` package, native extension,
@@ -49,7 +49,7 @@ installed package without `PYTHONPATH` or an editable checkout:
49
49
  ```sh
50
50
  python3.14 -m venv .venv-examples
51
51
  . .venv-examples/bin/activate
52
- python -m pip install "solverforge[examples]==0.6.2"
52
+ python -m pip install "solverforge[examples]==0.6.3"
53
53
  python examples/nqueens.py
54
54
  python -m examples.solverforge_hospital
55
55
  python -m examples.solverforge_deliveries
@@ -156,9 +156,13 @@ Run `make help` for focused targets such as `make test-hospital`,
156
156
  `list_cheapest_insertion`, `list_regret_insertion`, `list_clarke_wright`, and
157
157
  `list_k_opt`, with the final two requiring their respective savings and route
158
158
  metadata bundles. These are core graph nodes over the immutable runtime
159
- model. An explicit `group_name` phase obeys its configured obligation and
160
- termination; required-only completion belongs solely to upstream omitted
161
- defaults. Default local search is assembled only when the top-level
159
+ model. All configured limits remain binding during construction. A solve
160
+ publishes a best or completed solution only after every list element,
161
+ required assignment row, and non-optional scalar variable is assigned; if a
162
+ limit is reached first, a direct solve raises and a retained job enters
163
+ `FAILED` without exposing a partial snapshot. Omitted construction still
164
+ resolves required and optional stages in core, but required work never
165
+ bypasses a configured limit. Default local search is assembled only when the top-level
162
166
  termination has an effective finite limit, so an empty or invalid termination
163
167
  cannot accidentally create an unbounded solve. There is no wrapper assignment
164
168
  placer, required stream, phase tree, TLS slot state, synthetic metric, or
@@ -166,6 +170,8 @@ Run `make help` for focused targets such as `make test-hospital`,
166
170
  - `SolverManager` is backed by upstream retained jobs, statuses, events, and
167
171
  snapshots. `SolverManager.solve(...)` returns `JobHandle(job_id=...)`; the
168
172
  manager supports pause, resume, cancel, delete, and exact snapshot reads.
173
+ A pause before mandatory construction completes remains resumable internal
174
+ state and does not expose an incomplete solution snapshot.
169
175
  Retained event payloads read current score from the attached solution snapshot
170
176
  when present. Long-running phases publish progress at the shared upstream
171
177
  cadence, and telemetry includes the current phase type, index, counters, and
@@ -4,7 +4,7 @@ build-backend = "maturin"
4
4
 
5
5
  [project]
6
6
  name = "solverforge"
7
- version = "0.6.2"
7
+ version = "0.6.3"
8
8
  description = "Dynamic Python bindings for the SolverForge constraint solver."
9
9
  readme = "README.md"
10
10
  license = { text = "Apache-2.0" }
@@ -40,7 +40,7 @@ from .manager import JobHandle, SolverManager
40
40
  from .score import HardMediumSoftScore, HardSoftDecimalScore, HardSoftScore, SoftScore
41
41
  from .solver import Solver
42
42
 
43
- __version__ = "0.6.2"
43
+ __version__ = "0.6.3"
44
44
 
45
45
  __all__ = [
46
46
  "CallbackError",
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes